OSDN Git Service

chnlib:構造体のハッシュ値取得を実装。検索の高速化に利用する予定。文字列の連結・コピーも実装。合わせてlibtestも更新。
[chnosproject/CHNOSProject.git] / CHNOSProject / chn / chnlib.h
1 //\r
2 //  chnlib.h\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 #ifndef AI003_chnlib_h\r
10 #define AI003_chnlib_h\r
11 \r
12 //\r
13 //Set compile environment\r
14 //\r
15 \r
16 #define CHNLIB_MAKE_GCC_MAC\r
17 //#define CHNLIB_MAKE_BCC_WIN\r
18 \r
19 #ifdef CHNLIB_MAKE_BCC_WIN\r
20 #define DEBUG\r
21 #ifndef __FUNCTION__\r
22 #define __FUNCTION__    "Unknown"\r
23 #endif\r
24 #endif\r
25 \r
26 #define CHNLIB_DEBUG_ARGUMENTS  __FILE__, __LINE__, __FUNCTION__\r
27 \r
28 #ifdef DEBUG\r
29 //#define DEBUG_MEMORY_ALLOCATION\r
30 //#define DEBUG_MEMORY_REFERENCE_COUNT\r
31 //#define DEBUG_STRING_STRICT\r
32 #endif\r
33 \r
34 //\r
35 //Define types\r
36 //\r
37 \r
38 typedef unsigned char uchar;\r
39 typedef unsigned short ushort;\r
40 typedef unsigned int uint;\r
41 \r
42 typedef struct CHNLIB_STRUCTURE_HEADER CHNLIB_StructureHeader;\r
43 struct CHNLIB_STRUCTURE_HEADER {\r
44     //ライブラリ共通構造体ヘッダ\r
45     uint signature;\r
46     uint typeid;\r
47     uint referenceCount;\r
48     void (*destructor)(void **structrue);\r
49     uint (*getHash)(const void *structure);\r
50 };\r
51 \r
52 //\r
53 //Define library values\r
54 //\r
55 \r
56 #define CHNLIB_STRUCTURE_SIGNATURE  ((uint)0x4C4E4843)  //"CHNL"(Little Endian)\r
57 \r
58 #define False   0\r
59 #define True    1\r
60 \r
61 #define CHNLIB_STRUCT_ID_Null       0\r
62 #define CHNLIB_STRUCT_ID_UIPArray   1\r
63 #define CHNLIB_STRUCT_ID_String     2\r
64 \r
65 #define CHNLIB_MAX_STRING_LENGTH        4096\r
66 \r
67 #define CHNLIB_UIPArray_INDEX_NOTFOUND  -1\r
68 \r
69 #define retain(structure)   CHNLIB_Retain((void **) &structure)\r
70 #define release(structure)  CHNLIB_Release((void **) &structure)\r
71 #define autorelease(structure)  CHNLIB_AutoRelease(structure)\r
72 \r
73 //\r
74 //Declare library functions\r
75 //\r
76 //@chnlib.c\r
77 void CHNLIB_Debug(const char format[], const char filename[], int line, const char funcname[], ...);\r
78 void CHNLIB_Debug_PrintStructureData(void *structure, uint level);\r
79 void CHNLIB_ReportError(const char format[], const char filename[], int line, const char funcname[], ...);  //("", CHNLIB_DEBUG_ARGUMENTS);\r
80 void CHNLIB_StructureHeader_Initialize(CHNLIB_StructureHeader *header, uint typeid);\r
81 uint CHNLIB_StructureHeader_GetTypeID(const void *structure);\r
82 uint CHNLIB_StructureHeader_GetHash(const void *structure);\r
83 void *CHNLIB_System_AllocateMemory_Strict(int size, const char filename[], int line, const char funcname[]);\r
84 void CHNLIB_System_FreeMemory(void *p, const char filename[], int line, const char funcname[]);\r
85 void CHNLIB_Retain(void **structure);\r
86 void CHNLIB_Release(void **structure);\r
87 void *CHNLIB_AutoRelease(void *structure);\r
88 //@chnlib00.c\r
89 typedef struct CHNLIB_UIPARRAY CHNLIB_UIPArray;\r
90 struct CHNLIB_UIP_ARRAY;\r
91 //----配列の初期化\r
92 CHNLIB_UIPArray *CHNLIB_UIPArray_Initialize(void);\r
93 //----データの追加\r
94 int CHNLIB_UIPArray_AppendLast(CHNLIB_UIPArray **array, uint data32, void *pointer);\r
95 int CHNLIB_UIPArray_AppendLast_ProtectFromDuplication(CHNLIB_UIPArray **array, uint data32, void *pointer, int (*IsDuplicated)(const void *listtag, const void *newtag));\r
96 //----データの削除\r
97 int CHNLIB_UIPArray_RemoveByIndex(CHNLIB_UIPArray **array, int index);\r
98 //----配列の解放\r
99 void CHNLIB_UIPArray_FreeOnlyArray(CHNLIB_UIPArray **array);\r
100 void CHNLIB_UIPArray_FreeOnlyAllPointer(CHNLIB_UIPArray *array);\r
101 void CHNLIB_UIPArray_FreeOnlySelectedPointer(CHNLIB_UIPArray *array);\r
102 void CHNLIB_UIPArray_FreeAll(CHNLIB_UIPArray **array);\r
103 void CHNLIB_UIPArray_FreeSelectedAll(CHNLIB_UIPArray **array);\r
104 //----配列要素数取得\r
105 int CHNLIB_UIPArray_GetNumberOfDatas(const CHNLIB_UIPArray *array);\r
106 //----Data32取得・設定\r
107 uint CHNLIB_UIPArray_GetData32ByIndex(const CHNLIB_UIPArray *array, int index);\r
108 uint CHNLIB_UIPArray_SetData32ByIndex(CHNLIB_UIPArray *array, int index, uint data32);\r
109 //----Pointer取得・設定\r
110 void *CHNLIB_UIPArray_GetPointerByIndex(const CHNLIB_UIPArray *array, int index);\r
111 void *CHNLIB_UIPArray_GetPointerByData32(const CHNLIB_UIPArray *array, uint data32);\r
112 //----Index取得\r
113 int CHNLIB_UIPArray_GetIndexByData32(const CHNLIB_UIPArray *array, uint data32);\r
114 //----配列のコピー\r
115 CHNLIB_UIPArray *CHNLIB_UIPArray_CopyArray(const CHNLIB_UIPArray *source);\r
116 //----配列のソートしたものを新たに取得\r
117 CHNLIB_UIPArray *CHNLIB_UIPArray_GetSortedInDescendingOrderByData32(const CHNLIB_UIPArray *array);\r
118 \r
119 //@chnlib01.c\r
120 typedef struct CHNLIB_STRING CHNLIB_String;\r
121 struct CHNLIB_STRING;\r
122 //----文字列の初期化\r
123 CHNLIB_String *CHNLIB_String_Initialize(const char str[]);\r
124 CHNLIB_String *CHNLIB_String_InitializeWithFormat(const char format[], ...);\r
125 //----文字列の解放\r
126 void CHNLIB_String_Free(CHNLIB_String *strtag);\r
127 //----文字列の設定\r
128 int CHNLIB_String_SetStringFromCString(CHNLIB_String *strtag, const char s[]);\r
129 //----文字列の表示\r
130 int CHNLIB_String_Print(CHNLIB_String *strtag);\r
131 //----文字列の参照の取得\r
132 const char *CHNLIB_String_GetReferencePointerOfCString(const CHNLIB_String *strtag);\r
133 //----文字列の切り出し\r
134 CHNLIB_String *CHNLIB_String_ExtractByLength(const CHNLIB_String *strtag, int start, int len);\r
135 //----文字列の連結\r
136 CHNLIB_String *CHNLIB_String_Concatenate(const CHNLIB_String *s1, const CHNLIB_String *s2);\r
137 //----文字列の長さを取得\r
138 int CHNLIB_String_GetLength(const CHNLIB_String *strtag);\r
139 //----末尾の改行文字を削除\r
140 void CHNLIB_String_DeleteLastCRLF(CHNLIB_String *strtag);\r
141 //----文字列の比較\r
142 int CHNLIB_String_CompareStringWithCString(const CHNLIB_String *s, const char search[]);\r
143 int CHNLIB_String_CompareString_Strict(const CHNLIB_String *s, const CHNLIB_String *search);\r
144 //----文字列の出現回数を取得\r
145 uint CHNLIB_String_GetCountOfContain(const CHNLIB_String *s, const CHNLIB_String *search);\r
146 //----文字列のコピーを作成\r
147 CHNLIB_String *CHNLIB_String_Copy(const CHNLIB_String *s);\r
148 //----低レベルCString関数\r
149 int CHNLIB_CString_GetByteLength(const char s[]);\r
150 void CHNLIB_CString_DeleteLastCRLF(char s[]);\r
151 char *CHNLIB_CString_ExtractByLength(const char s[], int start, int len);\r
152 int CHNLIB_CString_CompareString(const char s[], const char search[]);\r
153 int CHNLIB_CString_CompareString_Strict(const char s[], const char search[]);\r
154 int CHNLIB_CString_CompareString_LeftHand(const char s[], const char search[]);\r
155 char *CHNLIB_CString_Copy(const char s[]);\r
156 char *CHNLIB_CString_Concatenate(const char s1[], const char s2[]);\r
157 //@chnlib02.c\r
158 int CHNLIB_String_Search_UIPArrayStringLocation(const CHNLIB_String *s, int s_start, const CHNLIB_UIPArray *list, int *location);\r
159 int CHNLIB_UIPArray_GetSeparatedStringByUIPArray(CHNLIB_UIPArray **separated, const CHNLIB_UIPArray *list, const CHNLIB_String *s);\r
160 int CHNLIB_UIPArray_GetSeparatedUTF8Character(CHNLIB_UIPArray **separated, const CHNLIB_String *s);\r
161 CHNLIB_String *CHNLIB_ReadLine(FILE *fp);\r
162 \r
163 //@chnlib03.c\r
164 void CHNLIB_Environment_SetCurrentWorkingDirectory(const char apppath[]);\r
165 const char *CHNLIB_Environment_GetFilenameFromPath(const char path[]);\r
166 \r
167 //@chnlib05.c\r
168 int CHNLIB_UTF8_GetCharacterType(char c);\r
169 int CHNLIB_UTF8_GetStringLengthByCharacter(const char s[]);\r
170 uint CHNLIB_UTF8_GetNextUnicodeOfCharacter(const char s[], const char **next);\r
171 int CHNLIB_UTF8_CompareString(const char s[], const char search[]);\r
172 int CHNLIB_UTF8_CompareString_LeftHand(const char s[], const char search[]);\r
173 int CHNLIB_UTF8_GetByteSizeFromLengthByCharacter(const char s[], int start, int end);\r
174 uint CHNLIB_UTF8_GetCountOfContain(const char s[], const char search[]);\r
175 \r
176 #endif\r