OSDN Git Service

libtest:ライブラリテスト用ソースを追加。
[chnosproject/CHNOSProject.git] / CHNOSProject / chn / chnlib.c
1 //\r
2 //  chnlib.c\r
3 //  AI003\r
4 //\r
5 //  Created by 西田 耀 on 13/01/28.\r
6 //  Copyright (c) 2013年 Hikaru Nishida. All rights reserved.\r
7 //\r
8 \r
9 //\r
10 //Include headers\r
11 //\r
12 \r
13 #include <stdio.h>\r
14 #include <stdarg.h>\r
15 #include <stdlib.h>\r
16 #include <string.h>\r
17 \r
18 #include "chnlib.h"\r
19 \r
20 //\r
21 //Define static values\r
22 //\r
23 int CHNLIB_Debug_PrintStructureData_RecursiveCounter;\r
24 \r
25 //\r
26 //Declare internal functions\r
27 //\r
28 const char *CHNLIB_Debug_Internal_GetStructTypeNameByID(uint typeid);\r
29 void CHNLIB_Debug_Internal_PrintStructureDataSub(void *structure, uint level);\r
30 void CHNLIB_Debug_Internal_PrintIndent(int level);\r
31 \r
32 //\r
33 //Define types\r
34 //\r
35 \r
36 //\r
37 //Functions\r
38 //\r
39 \r
40 void CHNLIB_Debug(const char format[], const char filename[], int line, const char funcname[], ...)\r
41 {\r
42     char s[CHNLIB_MAX_STRING_LENGTH];\r
43     va_list varg;\r
44     \r
45     fprintf(stdout, "CHNLIB:Debug:%s@%s:%d:", funcname, filename, line);\r
46     \r
47     va_start(varg, funcname);\r
48     vsnprintf(s, sizeof(s), format, varg);\r
49     va_end(varg);\r
50     \r
51     fputs(s, stdout);\r
52     fputs("\n", stdout);\r
53         \r
54         fflush(stdout);\r
55         \r
56     return;\r
57 }\r
58 \r
59 void CHNLIB_Debug_PrintStructureData(void *structure, uint level)\r
60 {\r
61     //level == 0:全階層\r
62     //level >= 1:level階層まで\r
63 \r
64     CHNLIB_Debug_PrintStructureData_RecursiveCounter = level - 1;\r
65     \r
66     CHNLIB_Debug_Internal_PrintStructureDataSub(structure, 0);\r
67     \r
68     return;\r
69 }\r
70 \r
71 void CHNLIB_ReportError(const char format[], const char filename[], int line, const char funcname[], ...)\r
72 {\r
73     char s[CHNLIB_MAX_STRING_LENGTH];\r
74     va_list varg;\r
75     \r
76     fprintf(stderr, "CHNLIB:Error:%s@%s:%d:", funcname, filename, line);\r
77     \r
78     va_start(varg, funcname);\r
79     vsnprintf(s, sizeof(s), format, varg);\r
80     va_end(varg);\r
81     \r
82     fputs(s, stderr);\r
83         fputs("\n", stderr);\r
84     \r
85     return;\r
86 }\r
87 \r
88 void CHNLIB_StructureHeader_Initialize(CHNLIB_StructureHeader *header, uint typeid)\r
89 {\r
90     if(header == NULL){\r
91         CHNLIB_ReportError("Null structure.", __FILE__, __LINE__, __FUNCTION__);\r
92         return;\r
93     }\r
94     \r
95     header->signature = CHNLIB_STRUCTURE_SIGNATURE;\r
96     header->typeid = typeid;\r
97     return;\r
98 }\r
99 \r
100 uint CHNLIB_StructureHeader_GetTypeID(const void *structure)\r
101 {\r
102     CHNLIB_StructureHeader *strhead;\r
103     \r
104     if(structure == NULL){\r
105         return CHNLIB_STRUCT_ID_Null;\r
106     }\r
107     \r
108     strhead = (CHNLIB_StructureHeader *)structure;\r
109     if(strhead->signature == CHNLIB_STRUCTURE_SIGNATURE){\r
110         return strhead->typeid;\r
111     }\r
112     return CHNLIB_STRUCT_ID_Null;\r
113 }\r
114 \r
115 void *CHNLIB_System_AllocateMemory_Strict(int size, const char filename[], int line, const char funcname[])\r
116 {\r
117     void *p;\r
118     \r
119     p = malloc(size);\r
120     if(p == NULL){\r
121         CHNLIB_ReportError("An attempt to allocate memory %d bytes in %s@%s:%d: is failed. Abort.", __FILE__, __LINE__, __FUNCTION__, size, filename, line, funcname);\r
122         exit(EXIT_FAILURE);\r
123     }\r
124     \r
125 #ifdef DEBUG_MEMORY_ALLOCATION\r
126     CHNLIB_Debug("Request allocation %d bytes ->[%p].", __FILE__, __LINE__, __FUNCTION__, size, p);\r
127 #endif\r
128     \r
129     memset(p, 0, size);\r
130 \r
131     return p;\r
132 }\r
133 \r
134 void CHNLIB_System_FreeMemory(void *p, const char filename[], int line, const char funcname[])\r
135 {\r
136     if(p == NULL){\r
137         CHNLIB_ReportError("An attempt to free NULL memory in %s@%s:%d:. Ignore.", __FILE__, __LINE__, __FUNCTION__, filename, line, funcname);\r
138         return;\r
139     }\r
140     \r
141 #ifdef DEBUG_MEMORY_ALLOCATION\r
142     CHNLIB_Debug("Request ƒree memory [%p].", __FILE__, __LINE__, __FUNCTION__, p);\r
143 #endif\r
144     \r
145     free(p);\r
146     \r
147     return;\r
148 \r
149 }\r
150 \r
151 //\r
152 //Internal functions\r
153 //\r
154 \r
155 const char *CHNLIB_Debug_Internal_GetStructTypeNameByID(uint typeid)\r
156 {\r
157     switch(typeid){\r
158         case CHNLIB_STRUCT_ID_Null:\r
159             return "Null";\r
160         case CHNLIB_STRUCT_ID_UIPArray:\r
161             return "UIPArray";\r
162         case CHNLIB_STRUCT_ID_String:\r
163             return "String";\r
164     }\r
165     return "Unknown";\r
166 }\r
167 \r
168 void CHNLIB_Debug_Internal_PrintStructureDataSub(void *structure, uint level)\r
169 {\r
170     int typeid, i, j;\r
171     void *p;\r
172     \r
173     typeid = CHNLIB_StructureHeader_GetTypeID(structure);\r
174     \r
175     switch(typeid){\r
176         case CHNLIB_STRUCT_ID_UIPArray:\r
177             i = CHNLIB_UIPArray_GetNumberOfDatas(structure);\r
178             CHNLIB_Debug_Internal_PrintIndent(level);\r
179             CHNLIB_Debug("%s[%p]:Number of datas=%d", "", 0, "", CHNLIB_Debug_Internal_GetStructTypeNameByID(typeid), structure, i);\r
180             for(j = 0; j < i; j++){\r
181                 p = CHNLIB_UIPArray_GetPointerByIndex(structure, j);\r
182                 CHNLIB_Debug_Internal_PrintIndent(level);\r
183                 CHNLIB_Debug("%s[%p]:[%d]=(%u,[%p])", "", 0, "", CHNLIB_Debug_Internal_GetStructTypeNameByID(typeid), structure, j, CHNLIB_UIPArray_GetData32ByIndex(structure, j), p);\r
184                 if(CHNLIB_Debug_PrintStructureData_RecursiveCounter != 0){\r
185                     CHNLIB_Debug_Internal_PrintStructureDataSub(p, level + 1);\r
186                 }\r
187             }\r
188             break;\r
189         case CHNLIB_STRUCT_ID_String:\r
190             CHNLIB_Debug_Internal_PrintIndent(level);\r
191             CHNLIB_Debug("%s[%p]:[%s]", "", 0, "", CHNLIB_Debug_Internal_GetStructTypeNameByID(typeid), structure, CHNLIB_String_GetReferencePointerOfCString(structure));\r
192             break;\r
193         default:\r
194             CHNLIB_Debug_Internal_PrintIndent(level);\r
195             CHNLIB_Debug("%s[%p]:NULL structure or not implemented.", "", 0, "", CHNLIB_Debug_Internal_GetStructTypeNameByID(typeid), structure);\r
196             break;\r
197     }\r
198     return;\r
199 }\r
200 \r
201 void CHNLIB_Debug_Internal_PrintIndent(int level)\r
202 {\r
203     int i;\r
204     \r
205     for(i = 0; i < level; i++){\r
206         fputs("    ", stdout);\r
207     }\r
208         \r
209     return;\r
210 }\r