OSDN Git Service

AI003:AI_Think_SlideLookUpWordByHistoryを修正中。
[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     //候補単語は、新たに確保されたUIPArrayに格納され、そのArrayへのポインタを返す。\r
88     //data32=入力文字列中に含まれる候補単語の数。\r
89     //pointer=候補単語を示すCHNLIB_String.\r
90     //[UTF-8]\r
91     CHNLIB_UIPArray *candidatewordlist;\r
92     int i, i_max;\r
93     int j, j_max;\r
94     int k, k_max;\r
95     const char *cstr_input, *cstrp_input;\r
96     const char *cstr_history, *cstrp_history;\r
97     int candidatelength, templength;\r
98     int cstrp_input_length;\r
99     \r
100     candidatewordlist = CHNLIB_UIPArray_Initialize();\r
101     i_max = CHNLIB_UIPArray_GetNumberOfDatas(WorkingSet.InputHistory);\r
102     \r
103     cstr_input = CHNLIB_String_GetReferencePointerOfCString(input);\r
104     k_max = CHNLIB_UTF8_GetStringLengthByCharacter(cstr_input);\r
105     cstrp_input = cstr_input;\r
106     \r
107     for(k = 0; k < k_max; k++){\r
108         //input character loop\r
109         candidatelength = 0;\r
110         cstrp_input_length = CHNLIB_UTF8_GetStringLengthByCharacter(cstrp_input);\r
111         for(i = 0; i < i_max; i++){\r
112             //history entry loop\r
113             cstr_history = CHNLIB_String_GetReferencePointerOfCString(CHNLIB_UIPArray_GetPointerByIndex(WorkingSet.InputHistory, i));\r
114             j_max = CHNLIB_UTF8_GetStringLengthByCharacter(cstr_history);\r
115             cstrp_history = cstr_history;\r
116             \r
117             for(j = 0; j < j_max; j++){\r
118                 //history character loop\r
119                 templength = CHNLIB_UTF8_CompareString_LeftHand(cstrp_history, cstrp_input);\r
120                 if(templength > candidatelength && templength != cstrp_input_length){\r
121                     //前方一致の長さが、これまで見つかった単語よりも長く、かつ入力文字列の検索部分の全長ではない場合、\r
122                     //単語の候補とする。\r
123                     candidatelength = templength;\r
124                 }\r
125                 CHNLIB_UTF8_GetNextUnicodeOfCharacter(cstrp_history, &cstrp_history);\r
126             }\r
127         }\r
128         if(candidatelength > 0){\r
129             CHNLIB_UIPArray_AppendLast_ProtectFromDuplication(&candidatewordlist, 0, CHNLIB_String_ExtractByLength(input, CHNLIB_UTF8_GetByteSizeFromLengthByCharacter(cstr_input, 0, k - 1), CHNLIB_UTF8_GetByteSizeFromLengthByCharacter(cstrp_input, 0, candidatelength - 1)), &AI_Memory_AddRootWordData_IsDuplicated);\r
130         }\r
131         CHNLIB_UTF8_GetNextUnicodeOfCharacter(cstrp_input, &cstrp_input);\r
132     }\r
133     \r
134     //各候補単語が入力文字列にいくつ含まれているかをdata32に保存する。\r
135     i_max = CHNLIB_UIPArray_GetNumberOfDatas(candidatewordlist);\r
136     for(i = 0; i < i_max; i++){\r
137         CHNLIB_UIPArray_SetData32ByIndex(candidatewordlist, i, CHNLIB_String_GetCountOfContain(input, CHNLIB_UIPArray_GetPointerByIndex(candidatewordlist, i)));\r
138     }\r
139     \r
140     return candidatewordlist;\r
141 }\r
142 \r
143 void AI_Memory_AddRootWordData(CHNLIB_String *tag)\r
144 {\r
145     //WorkingSet.RootWordListに文字列を追加する。\r
146     //重複がある場合は警告を出し、追加しない。\r
147     int i, i_max;\r
148     \r
149     i_max = CHNLIB_UIPArray_GetNumberOfDatas(WorkingSet.RootWordList);\r
150     for(i = 0; i < i_max; i++){\r
151         if(CHNLIB_String_CompareString_Strict(CHNLIB_UIPArray_GetPointerByIndex(WorkingSet.RootWordList, i), tag)){\r
152             CHNLIB_ReportError("Word[%s] has already existed.", CHNLIB_DEBUG_ARGUMENTS, CHNLIB_String_GetReferencePointerOfCString(tag));\r
153             return;\r
154         }\r
155     }\r
156     \r
157     CHNLIB_UIPArray_AppendLast(&WorkingSet.RootWordList, i_max, tag);\r
158     \r
159     CHNLIB_UIPArray_AppendLast_ProtectFromDuplication(&WorkingSet.RootWordList, CHNLIB_UIPArray_GetNumberOfDatas(WorkingSet.RootWordList), tag, &AI_Memory_AddRootWordData_IsDuplicated);\r
160     \r
161     return;\r
162 }\r
163 \r
164 int AI_Memory_AddRootWordData_IsDuplicated(const void *listtag, const void *newtag)\r
165 {\r
166     //CHNLIB_UIPArray_AppendLast_ProtectFromDuplicationに渡す関数ポインタ。\r
167     if(CHNLIB_StructureHeader_GetTypeID(listtag) != CHNLIB_STRUCT_ID_String){\r
168         return False;\r
169     }\r
170     if(CHNLIB_String_CompareString_Strict(listtag, newtag)){\r
171         CHNLIB_ReportError("Word[%s] has already existed.", CHNLIB_DEBUG_ARGUMENTS, CHNLIB_String_GetReferencePointerOfCString(newtag));\r
172         return True;\r
173     }\r
174     return False;\r
175 }\r
176 \r
177 void AI_System_InitializeSystemWorkingSet(void)\r
178 {\r
179     //WorkingSetを初期化する。\r
180     WorkingSet.SystemWordList0 = CHNLIB_UIPArray_Initialize();\r
181     CHNLIB_UIPArray_AppendLast(&WorkingSet.SystemWordList0, True, CHNLIB_String_Initialize(":"));\r
182     CHNLIB_UIPArray_AppendLast(&WorkingSet.SystemWordList0, True, CHNLIB_String_Initialize(","));\r
183     \r
184     WorkingSet.InputHistory = CHNLIB_UIPArray_Initialize();\r
185     \r
186     return;\r
187 }\r
188 \r
189 void AI_System_LoadMemory(const char configfilename[])\r
190 {\r
191     //指定されたファイル名のテキストファイルから設定を読み出す。\r
192     FILE *fp;\r
193     CHNLIB_String *line, *currentfilename;\r
194     int i;\r
195     \r
196     fp = fopen(configfilename, "rb");\r
197     currentfilename = CHNLIB_ReadLine(fp);\r
198     fclose(fp);\r
199     \r
200     fp = fopen(CHNLIB_String_GetReferencePointerOfCString(currentfilename), "rb");\r
201     \r
202     WorkingSet.RootWordList = CHNLIB_UIPArray_Initialize();\r
203     for(i = 1; ;i++){\r
204         line = CHNLIB_ReadLine(fp);\r
205         if(line == NULL){\r
206             break;\r
207         }\r
208         CHNLIB_UIPArray_AppendLast(&WorkingSet.RootWordList, i, line);\r
209         //CHNLIB_String_Free(line);リストに登録している実体なので解放の必要なし!\r
210     }\r
211     fclose(fp);\r
212     CHNLIB_String_Free(currentfilename);\r
213     \r
214     //CHNLIB_Debug_PrintStructureData(WorkingSet.RootWordList, 0);\r
215     \r
216     return;\r
217 }\r