return 0;\r
}\r
\r
-int CHNLIB_UIPArray_GetSeparatedUTF8Character(CHNLIB_UIPArray **separated, const CHNLIB_String *s){\r
+int CHNLIB_UIPArray_GetSeparatedUTF8Character(CHNLIB_UIPArray **separated, const CHNLIB_String *s)\r
+{\r
//文字列sを、UTF-8の一文字ごとに分割し、その文字のUnicodeをdata32、その一文字に該当するStringをpointerに格納し、separatedに追加する形で返す。\r
//不完全なUTF-8文字列は無視される。\r
- const char *refstr;\r
- int i, i_max, type;\r
- int phase, start;\r
- uint unicode;\r
+ //[UTF-8]\r
+ const char *p, *q, *p_base;\r
+ uint u;\r
\r
if(separated == NULL || CHNLIB_StructureHeader_GetTypeID(s) != CHNLIB_STRUCT_ID_String){\r
return 1;\r
}\r
\r
- refstr = CHNLIB_String_GetReferencePointerOfCString(s);\r
- i_max = CHNLIB_String_GetLength(s);\r
+ p_base = CHNLIB_String_GetReferencePointerOfCString(s);;\r
+ p = p_base;\r
\r
- phase = 0;\r
- unicode = 0;\r
- for(i = 0; i < i_max; i++){\r
- type = CHNLIB_UTF8_GetCharacterType(refstr[i]);\r
- switch (type) {\r
- case 1:\r
- CHNLIB_UIPArray_AppendLast(separated, refstr[i], CHNLIB_String_ExtractByLength(s, i, 1));\r
- phase = 0;\r
- unicode = 0;\r
- break;\r
- \r
- case 0:\r
- if(phase > 0){\r
- unicode <<= 6;\r
- unicode |= (refstr[i] & 0x3f);\r
- phase--;\r
- if(phase == 0){\r
- //一文字完成\r
- CHNLIB_UIPArray_AppendLast(separated, unicode, CHNLIB_String_ExtractByLength(s, start, i - start + 1));\r
- }\r
- }\r
- break;\r
- \r
- case 2:\r
- case 3:\r
- case 4:\r
- start = i;\r
- unicode = (refstr[i] << (type + 1)) >> (type + 1);\r
- phase = type - 1;\r
- break;\r
+ for(;;){\r
+ u = CHNLIB_UTF8_GetNextUnicodeOfCharacter(p, &q);\r
+ if(u == 0){\r
+ //終端文字\r
+ break;\r
}\r
+ CHNLIB_UIPArray_AppendLast(separated, u, CHNLIB_String_ExtractByLength(s, (int)(p - p_base), (int)(q - p)));\r
+ p = q;\r
}\r
\r
return 0;\r
}\r
\r
-\r
CHNLIB_String *CHNLIB_ReadLine(FILE *fp)\r
{\r
char s[CHNLIB_MAX_STRING_LENGTH];\r