5 // Created by 西田 耀 on 13/01/28.
\r
6 // Copyright (c) 2013年 Hikaru Nishida. All rights reserved.
\r
21 //Define static values
\r
23 int CHNLIB_Debug_PrintStructureData_RecursiveCounter;
\r
26 //Declare internal functions
\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
40 void CHNLIB_Debug(const char format[], const char filename[], int line, const char funcname[], ...)
\r
42 char s[CHNLIB_MAX_STRING_LENGTH];
\r
45 fprintf(stdout, "CHNLIB:Debug:%s@%s:%d:", funcname, filename, line);
\r
47 va_start(varg, funcname);
\r
48 vsnprintf(s, sizeof(s), format, varg);
\r
52 fputs("\n", stdout);
\r
59 void CHNLIB_Debug_PrintStructureData(void *structure, uint level)
\r
62 //level >= 1:level階層まで
\r
64 CHNLIB_Debug_PrintStructureData_RecursiveCounter = level - 1;
\r
66 CHNLIB_Debug_Internal_PrintStructureDataSub(structure, 0);
\r
71 void CHNLIB_ReportError(const char format[], const char filename[], int line, const char funcname[], ...)
\r
73 char s[CHNLIB_MAX_STRING_LENGTH];
\r
76 fprintf(stderr, "CHNLIB:Error:%s@%s:%d:", funcname, filename, line);
\r
78 va_start(varg, funcname);
\r
79 vsnprintf(s, sizeof(s), format, varg);
\r
83 fputs("\n", stderr);
\r
88 void CHNLIB_StructureHeader_Initialize(CHNLIB_StructureHeader *header, uint typeid)
\r
91 CHNLIB_ReportError("Null structure.", __FILE__, __LINE__, __FUNCTION__);
\r
95 header->signature = CHNLIB_STRUCTURE_SIGNATURE;
\r
96 header->typeid = typeid;
\r
100 uint CHNLIB_StructureHeader_GetTypeID(const void *structure)
\r
102 CHNLIB_StructureHeader *strhead;
\r
104 if(structure == NULL){
\r
105 return CHNLIB_STRUCT_ID_Null;
\r
108 strhead = (CHNLIB_StructureHeader *)structure;
\r
109 if(strhead->signature == CHNLIB_STRUCTURE_SIGNATURE){
\r
110 return strhead->typeid;
\r
112 return CHNLIB_STRUCT_ID_Null;
\r
115 void *CHNLIB_System_AllocateMemory_Strict(int size, const char filename[], int line, const char funcname[])
\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
125 #ifdef DEBUG_MEMORY_ALLOCATION
\r
126 CHNLIB_Debug("Request allocation %d bytes ->[%p].", __FILE__, __LINE__, __FUNCTION__, size, p);
\r
129 memset(p, 0, size);
\r
134 void CHNLIB_System_FreeMemory(void *p, const char filename[], int line, const char funcname[])
\r
137 CHNLIB_ReportError("An attempt to free NULL memory in %s@%s:%d:. Ignore.", __FILE__, __LINE__, __FUNCTION__, filename, line, funcname);
\r
141 #ifdef DEBUG_MEMORY_ALLOCATION
\r
142 CHNLIB_Debug("Request ƒree memory [%p].", __FILE__, __LINE__, __FUNCTION__, p);
\r
152 //Internal functions
\r
155 const char *CHNLIB_Debug_Internal_GetStructTypeNameByID(uint typeid)
\r
158 case CHNLIB_STRUCT_ID_Null:
\r
160 case CHNLIB_STRUCT_ID_UIPArray:
\r
162 case CHNLIB_STRUCT_ID_String:
\r
168 void CHNLIB_Debug_Internal_PrintStructureDataSub(void *structure, uint level)
\r
173 typeid = CHNLIB_StructureHeader_GetTypeID(structure);
\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
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
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
201 void CHNLIB_Debug_Internal_PrintIndent(int level)
\r
205 for(i = 0; i < level; i++){
\r
206 fputs(" ", stdout);
\r