OSDN Git Service

libtest:ライブラリテスト用ソースを追加。
[chnosproject/CHNOSProject.git] / CHNOSProject / chn / chnlib02.c
index e37e969..160ecab 100644 (file)
@@ -93,6 +93,58 @@ int CHNLIB_UIPArray_GetSeparatedStringByUIPArray(CHNLIB_UIPArray **separated, co
     return 0;\r
 }\r
 \r
+int CHNLIB_UIPArray_GetSeparatedUTF8Character(CHNLIB_UIPArray **separated, const CHNLIB_String *s){\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
+    \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
+    \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, i));\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
+        }\r
+    }\r
+    \r
+    return 0;\r
+}\r
+\r
+\r
 CHNLIB_String *CHNLIB_ReadLine(FILE *fp)\r
 {\r
     char s[CHNLIB_MAX_STRING_LENGTH];\r