OSDN Git Service

debug系関数の引数の一部マクロ化。
[chnosproject/CHNOSProject.git] / CHNOSProject / AI003 / AI003 / main.c
1 //\r
2 //  main.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 "core.h"\r
15 \r
16 //\r
17 //Define static values\r
18 //\r
19 \r
20 AI_WorkingSet WorkingSet;\r
21 \r
22 int main(int argc, const char * argv[])\r
23 {\r
24     //エントリポイント\r
25     int i, i_max;\r
26     CHNLIB_String *input, *temp;\r
27     CHNLIB_UIPArray *separated;\r
28     int passthink;\r
29     \r
30     CHNLIB_Environment_SetCurrentWorkingDirectory(argv[0]);\r
31     \r
32     CHNLIB_Debug("Hello, World.", CHNLIB_DEBUG_ARGUMENTS);\r
33     \r
34     AI_System_InitializeSystemWorkingSet();\r
35     \r
36     AI_System_LoadMemory(AI_CONFIG_FILE_NAME);\r
37 \r
38     for(;;){\r
39         passthink = False;\r
40         input = CHNLIB_ReadLine(stdin);\r
41 \r
42         if(CHNLIB_String_CompareStringWithCString(input, "::")){\r
43             //システムコマンド解釈\r
44             passthink = True;\r
45             separated = CHNLIB_UIPArray_Initialize();\r
46             CHNLIB_UIPArray_GetSeparatedStringByUIPArray(&separated, WorkingSet.SystemWordList0, input);\r
47             \r
48             temp = CHNLIB_UIPArray_GetPointerByIndex(separated, 2);\r
49             if(temp != NULL){\r
50                 if(CHNLIB_String_CompareStringWithCString(temp, "info")){\r
51                     printf("AI internal information:\n");\r
52                 } else if(CHNLIB_String_CompareStringWithCString(temp, "exit")){\r
53                     break;\r
54                 } else if(CHNLIB_String_CompareStringWithCString(temp, "wordlist")){\r
55                     i_max = CHNLIB_UIPArray_GetNumberOfDatas(WorkingSet.RootWordList);\r
56                     for(i = 0; i < i_max; i++){\r
57                         printf("word%3d:%s\n", i, CHNLIB_String_GetReferencePointerOfCString(CHNLIB_UIPArray_GetPointerByIndex(WorkingSet.RootWordList, i)));\r
58                     }\r
59                 } else{\r
60                     passthink = False;\r
61                 }\r
62             }\r
63             \r
64             CHNLIB_UIPArray_FreeSelectedAll(&separated);\r
65         }\r
66         \r
67         if(!passthink){\r
68             //AIへの入力\r
69             separated = CHNLIB_UIPArray_Initialize();\r
70             separated = AI_Think_SlideLookUpWordByHistory(input);\r
71             i_max = CHNLIB_UIPArray_GetNumberOfDatas(separated);\r
72             printf("Index(Decimal),CountOfContain(Decimal), String\n");\r
73             for(i = 0; i < i_max; i++){\r
74                 printf("%d,%d,%s\n", i, CHNLIB_UIPArray_GetData32ByIndex(separated, i), CHNLIB_String_GetReferencePointerOfCString(CHNLIB_UIPArray_GetPointerByIndex(separated, i)));\r
75             }\r
76             CHNLIB_UIPArray_FreeAll(&separated);\r
77             CHNLIB_UIPArray_AppendLast(&WorkingSet.InputHistory, CHNLIB_UIPArray_GetNumberOfDatas(WorkingSet.InputHistory), input);\r
78         }\r
79     }\r
80     \r
81     return 0;\r
82 }\r
83 \r
84 CHNLIB_UIPArray *AI_Think_SlideLookUpWordByHistory(CHNLIB_String *input)\r
85 {\r
86     //入力文字列と履歴文字列を照らし合わせ、単語の候補を抜き出す。\r
87     CHNLIB_UIPArray *candidatewordlist;\r
88     int i, i_max;\r
89     int j, j_max;\r
90     int k, k_max;\r
91     int candidatelength, templength;\r
92     const char *cstr_input, *cstr_history;\r
93     \r
94     candidatewordlist = CHNLIB_UIPArray_Initialize();\r
95     \r
96     i_max = CHNLIB_UIPArray_GetNumberOfDatas(WorkingSet.InputHistory);\r
97     \r
98     cstr_input = CHNLIB_String_GetReferencePointerOfCString(input);\r
99     k_max = CHNLIB_CString_GetLength(cstr_input);\r
100 \r
101     for(k = 0; k < k_max; k++){\r
102         //**UTF-8 only\r
103         //UTF-8のマルチバイト部分でないことを確認\r
104         if(CHNLIB_UTF8_GetCharacterType(cstr_input[k]) != 0){\r
105             //****\r
106             candidatelength = 0;\r
107             for(i = 0; i < i_max; i++){\r
108                 cstr_history = CHNLIB_String_GetReferencePointerOfCString(CHNLIB_UIPArray_GetPointerByIndex(WorkingSet.InputHistory, i));\r
109                 j_max = CHNLIB_CString_GetLength(cstr_history);\r
110                 for(j = 0; j < j_max; j++){\r
111                     templength = CHNLIB_CString_CompareString_LeftHand(&cstr_history[j], &cstr_input[k]);\r
112                     if(templength > candidatelength && templength != (k_max - k)){\r
113                         //前方一致の長さが、\r
114                         //これまで見つかった単語よりも長く、かつ\r
115                         //入力文字列の検索部分の全長ではない場合、\r
116                         //単語の候補とする。\r
117                         candidatelength = templength;\r
118                     }\r
119                 }\r
120             }\r
121             if(candidatelength > 0){\r
122                 //AI_Memory_AddRootWordData(CHNLIB_String_ExtractByLength(input, k, candidatelength));\r
123                 CHNLIB_UIPArray_AppendLast_ProtectFromDuplication(&candidatewordlist, 0, CHNLIB_String_ExtractByLength(input, k, candidatelength), &AI_Memory_AddRootWordData_IsDuplicated);\r
124             }\r
125         }\r
126     }\r
127     \r
128     //各候補単語が入力文字列にいくつ含まれているかをdata32に保存する。\r
129     i_max = CHNLIB_UIPArray_GetNumberOfDatas(candidatewordlist);\r
130     for(i = 0; i < i_max; i++){\r
131         CHNLIB_UIPArray_SetData32ByIndex(candidatewordlist, i, CHNLIB_String_GetCountOfContain(input, CHNLIB_UIPArray_GetPointerByIndex(candidatewordlist, i)));\r
132     }\r
133     \r
134     return candidatewordlist;\r
135 }\r
136 \r
137 void AI_Memory_AddRootWordData(CHNLIB_String *tag)\r
138 {\r
139     //WorkingSet.RootWordListに文字列を追加する。\r
140     //重複がある場合は警告を出し、追加しない。\r
141     int i, i_max;\r
142     \r
143     i_max = CHNLIB_UIPArray_GetNumberOfDatas(WorkingSet.RootWordList);\r
144     for(i = 0; i < i_max; i++){\r
145         if(CHNLIB_String_CompareString_Strict(CHNLIB_UIPArray_GetPointerByIndex(WorkingSet.RootWordList, i), tag)){\r
146             CHNLIB_ReportError("Word[%s] has already existed.", CHNLIB_DEBUG_ARGUMENTS, CHNLIB_String_GetReferencePointerOfCString(tag));\r
147             return;\r
148         }\r
149     }\r
150     \r
151     CHNLIB_UIPArray_AppendLast(&WorkingSet.RootWordList, i_max, tag);\r
152     \r
153     CHNLIB_UIPArray_AppendLast_ProtectFromDuplication(&WorkingSet.RootWordList, CHNLIB_UIPArray_GetNumberOfDatas(WorkingSet.RootWordList), tag, &AI_Memory_AddRootWordData_IsDuplicated);\r
154     \r
155     return;\r
156 }\r
157 \r
158 int AI_Memory_AddRootWordData_IsDuplicated(const void *listtag, const void *newtag)\r
159 {\r
160     //CHNLIB_UIPArray_AppendLast_ProtectFromDuplicationに渡す関数ポインタ。\r
161     if(CHNLIB_StructureHeader_GetTypeID(listtag) != CHNLIB_STRUCT_ID_String){\r
162         return False;\r
163     }\r
164     if(CHNLIB_String_CompareString_Strict(listtag, newtag)){\r
165         CHNLIB_ReportError("Word[%s] has already existed.", CHNLIB_DEBUG_ARGUMENTS, CHNLIB_String_GetReferencePointerOfCString(newtag));\r
166         return True;\r
167     }\r
168     return False;\r
169 }\r
170 \r
171 void AI_System_InitializeSystemWorkingSet(void)\r
172 {\r
173     //WorkingSetを初期化する。\r
174     WorkingSet.SystemWordList0 = CHNLIB_UIPArray_Initialize();\r
175     CHNLIB_UIPArray_AppendLast(&WorkingSet.SystemWordList0, True, CHNLIB_String_Initialize(":"));\r
176     CHNLIB_UIPArray_AppendLast(&WorkingSet.SystemWordList0, True, CHNLIB_String_Initialize(","));\r
177     \r
178     WorkingSet.InputHistory = CHNLIB_UIPArray_Initialize();\r
179     \r
180     return;\r
181 }\r
182 \r
183 void AI_System_LoadMemory(const char configfilename[])\r
184 {\r
185     //指定されたファイル名のテキストファイルから設定を読み出す。\r
186     FILE *fp;\r
187     CHNLIB_String *line, *currentfilename;\r
188     int i;\r
189     \r
190     fp = fopen(configfilename, "rb");\r
191     currentfilename = CHNLIB_ReadLine(fp);\r
192     fclose(fp);\r
193     \r
194     fp = fopen(CHNLIB_String_GetReferencePointerOfCString(currentfilename), "rb");\r
195     \r
196     WorkingSet.RootWordList = CHNLIB_UIPArray_Initialize();\r
197     for(i = 1; ;i++){\r
198         line = CHNLIB_ReadLine(fp);\r
199         if(line == NULL){\r
200             break;\r
201         }\r
202         CHNLIB_UIPArray_AppendLast(&WorkingSet.RootWordList, i, line);\r
203         //CHNLIB_String_Free(line);リストに登録している実体なので解放の必要なし!\r
204     }\r
205     fclose(fp);\r
206     CHNLIB_String_Free(currentfilename);\r
207     \r
208     //CHNLIB_Debug_PrintStructureData(WorkingSet.RootWordList, 0);\r
209     \r
210     return;\r
211 }\r