OSDN Git Service

libtest:ライブラリテスト用ソースを追加。
[chnosproject/CHNOSProject.git] / CHNOSProject / chn / chnlib02.c
1 //\r
2 //  chnlib02.c\r
3 //  AI003\r
4 //\r
5 //  Created by 西田 耀 on 13/02/09.\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 "chnlib.h"\r
15 \r
16 //\r
17 //Functions\r
18 //\r
19 \r
20 int CHNLIB_String_Search_UIPArrayStringLocation(const CHNLIB_String *s, int s_start, const CHNLIB_UIPArray *list, int *location)\r
21 {\r
22     //文字列&s[s_start]に含まれている中で最も左側にある、Array内のStringタグの文字列のArrayにおける添字と、その文字列が開始する、文字列&s[s_start]中の添字を返す。\r
23     //locaton!=NULLの時、*locationに、発見された文字列の最初のバイトの&s[s_start]における添字が代入される。\r
24     //Arrayの文字列がすべて見つからなかった場合、AI_ARRAY_INDEX_NOTFOUNDを返す。そのときの*locatonには0が代入される。\r
25     int i, i_max, j, j_max;\r
26     CHNLIB_String *tag;\r
27     const char *cstr_s;\r
28     \r
29     if(s == NULL || list == NULL){\r
30         if(location != NULL){\r
31             *location = 0;\r
32         }\r
33         return CHNLIB_UIPArray_INDEX_NOTFOUND;\r
34     }\r
35     cstr_s = CHNLIB_String_GetReferencePointerOfCString(s);\r
36     i_max = CHNLIB_CString_GetLength(cstr_s);\r
37     \r
38     j_max = CHNLIB_UIPArray_GetNumberOfDatas(list);\r
39     for(i = s_start; i < i_max; i++){\r
40         for(j = 0; j < j_max; j++){\r
41             tag = (CHNLIB_String *)CHNLIB_UIPArray_GetPointerByIndex(list, j);\r
42             if(CHNLIB_StructureHeader_GetTypeID(tag) == CHNLIB_STRUCT_ID_String){\r
43                 if(CHNLIB_CString_CompareString(&cstr_s[i], CHNLIB_String_GetReferencePointerOfCString(tag))){\r
44                     if(location != NULL){\r
45                         *location = i - s_start;\r
46                     }\r
47                     return j;\r
48                 }\r
49             }\r
50         }\r
51     }\r
52     \r
53     if(location != NULL){\r
54         *location = 0;\r
55     }\r
56     return CHNLIB_UIPArray_INDEX_NOTFOUND;\r
57 }\r
58 \r
59 int CHNLIB_UIPArray_GetSeparatedStringByUIPArray(CHNLIB_UIPArray **separated, const CHNLIB_UIPArray *list, const CHNLIB_String *s)\r
60 {\r
61     //listにある文字列でsを分割し、その結果をseparatedに追加する。\r
62     //listに存在する文字列は新しくメモリを確保せず、リスト中のStringタグへのポインタをseparatedに記録する。\r
63     //従ってseparatedを解放する際は、listのdata32をすべてTrueにした上で、CHNLIB_UIPArray_FreeSelectedAllを利用するべきである。\r
64     //listにない文字列はdata32==False(0)\r
65     //listにある文字列はdata32==tag->data32\r
66     int index, end, end_end, location;\r
67     \r
68     if(s == NULL){\r
69         return 1;\r
70     }\r
71    \r
72     end = 0;\r
73     end_end = CHNLIB_String_GetLength(s);\r
74     for(;;){\r
75         index = CHNLIB_String_Search_UIPArrayStringLocation(s, end, list, &location);\r
76         if(index == CHNLIB_UIPArray_INDEX_NOTFOUND){\r
77             //もうリストの文字列はない\r
78             if(end != end_end){\r
79                 //でもまだ文字列は残っている\r
80                 CHNLIB_UIPArray_AppendLast(separated, False, CHNLIB_String_ExtractByLength(s, end, CHNLIB_MAX_STRING_LENGTH));\r
81             }\r
82             break;\r
83         }\r
84         //リストの文字列が見つかった\r
85         if(location != 0){\r
86             //リストの文字列の前に、リストにない文字列がある\r
87             CHNLIB_UIPArray_AppendLast(separated, False, CHNLIB_String_ExtractByLength(s, end, location));\r
88             end += location;\r
89         }\r
90         CHNLIB_UIPArray_AppendLast(separated, CHNLIB_UIPArray_GetData32ByIndex(list, index), CHNLIB_UIPArray_GetPointerByIndex(list, index));\r
91         end += CHNLIB_String_GetLength(CHNLIB_UIPArray_GetPointerByIndex(list, index));\r
92     }\r
93     return 0;\r
94 }\r
95 \r
96 int CHNLIB_UIPArray_GetSeparatedUTF8Character(CHNLIB_UIPArray **separated, const CHNLIB_String *s){\r
97     //文字列sを、UTF-8の一文字ごとに分割し、その文字のUnicodeをdata32、その一文字に該当するStringをpointerに格納し、separatedに追加する形で返す。\r
98     //不完全なUTF-8文字列は無視される。\r
99     const char *refstr;\r
100     int i, i_max, type;\r
101     int phase, start;\r
102     uint unicode;\r
103     \r
104     if(separated == NULL || CHNLIB_StructureHeader_GetTypeID(s) != CHNLIB_STRUCT_ID_String){\r
105         return 1;\r
106     }\r
107     \r
108     refstr = CHNLIB_String_GetReferencePointerOfCString(s);\r
109     i_max = CHNLIB_String_GetLength(s);\r
110     \r
111     phase = 0;\r
112     unicode = 0;\r
113     for(i = 0; i < i_max; i++){\r
114         type = CHNLIB_UTF8_GetCharacterType(refstr[i]);\r
115         switch (type) {\r
116             case 1:\r
117                 CHNLIB_UIPArray_AppendLast(separated, refstr[i], CHNLIB_String_ExtractByLength(s, i, i));\r
118                 phase = 0;\r
119                 unicode = 0;\r
120                 break;\r
121                 \r
122             case 0:\r
123                 if(phase > 0){\r
124                     unicode <<= 6;\r
125                     unicode |= (refstr[i] & 0x3f);\r
126                     phase--;\r
127                     if(phase == 0){\r
128                         //一文字完成\r
129                         CHNLIB_UIPArray_AppendLast(separated, unicode, CHNLIB_String_ExtractByLength(s, start, i - start + 1));\r
130                     }\r
131                 }\r
132                 break;\r
133                 \r
134             case 2:\r
135             case 3:\r
136             case 4:\r
137                 start = i;\r
138                 unicode = (refstr[i] << (type + 1)) >> (type + 1);\r
139                 phase = type - 1;\r
140                 break;\r
141         }\r
142     }\r
143     \r
144     return 0;\r
145 }\r
146 \r
147 \r
148 CHNLIB_String *CHNLIB_ReadLine(FILE *fp)\r
149 {\r
150     char s[CHNLIB_MAX_STRING_LENGTH];\r
151     \r
152     if(fgets(s, sizeof(s), fp) == NULL){\r
153         return NULL;\r
154     }\r
155     \r
156     CHNLIB_CString_DeleteLastCRLF(s);\r
157     \r
158     return CHNLIB_String_Initialize(s);\r
159 }\r
160 \r
161 \r