OSDN Git Service

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