OSDN Git Service

chnlib:CHNLIB_UUID(UUIDv4), メルセンヌ・ツイスターを利用した乱数生成器CHNLIB_RandomGeneratorMTを追加。
[chnosproject/CHNOSProject.git] / CHNOSProject / chn / chnlib02.c
index 459ed8d..39d5d22 100644 (file)
@@ -35,7 +35,7 @@ int CHNLIB_String_Search_UIPArrayStringLocation(const CHNLIB_String *s, int s_st
         return CHNLIB_UIPArray_INDEX_NOTFOUND;\r
     }\r
     cstr_s = CHNLIB_String_GetReferencePointerOfCString(s);\r
-    i_max = CHNLIB_CString_GetLength(cstr_s);\r
+    i_max = CHNLIB_CString_GetByteLength(cstr_s);\r
     \r
     j_max = CHNLIB_UIPArray_GetNumberOfDatas(list);\r
     for(i = s_start; i < i_max; i++){\r
@@ -62,7 +62,9 @@ int CHNLIB_UIPArray_GetSeparatedStringByUIPArray(CHNLIB_UIPArray **separated, co
 {\r
     //listにある文字列でsを分割し、その結果をseparatedに追加する。\r
     //listに存在する文字列は新しくメモリを確保せず、リスト中のStringタグへのポインタをseparatedに記録する。\r
-    //従ってseparatedを解放する際は、listのdata32をすべてTrueにした上で、CHNLIB_UIPArray_FreeSelectedAllを利用するべきである。\r
+    ////従ってseparatedを解放する際は、listのdata32をすべてTrueにした上で、CHNLIB_UIPArray_FreeSelectedAllを利用するべきである。\r
+    //referenceCountは、list中の文字列は2以上になり、listにない文字列は1となる。\r
+    //従って、separatedをreleaseすれば、安全に解放できる。\r
     //listにない文字列はdata32==False(0)\r
     //listにある文字列はdata32==tag->data32\r
     int index, end, end_end, location;\r
@@ -79,14 +81,14 @@ int CHNLIB_UIPArray_GetSeparatedStringByUIPArray(CHNLIB_UIPArray **separated, co
             //もうリストの文字列はない\r
             if(end != end_end){\r
                 //でもまだ文字列は残っている\r
-                CHNLIB_UIPArray_AppendLast(separated, False, CHNLIB_String_ExtractByLength(s, end, CHNLIB_MAX_STRING_LENGTH));\r
+                CHNLIB_UIPArray_AppendLast(separated, False, autorelease(CHNLIB_String_ExtractByLength(s, end, CHNLIB_MAX_STRING_LENGTH)));\r
             }\r
             break;\r
         }\r
         //リストの文字列が見つかった\r
         if(location != 0){\r
             //リストの文字列の前に、リストにない文字列がある\r
-            CHNLIB_UIPArray_AppendLast(separated, False, CHNLIB_String_ExtractByLength(s, end, location));\r
+            CHNLIB_UIPArray_AppendLast(separated, False, autorelease(CHNLIB_String_ExtractByLength(s, end, location)));\r
             end += location;\r
         }\r
         CHNLIB_UIPArray_AppendLast(separated, CHNLIB_UIPArray_GetData32ByIndex(list, index), CHNLIB_UIPArray_GetPointerByIndex(list, index));\r
@@ -95,60 +97,37 @@ 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
+int CHNLIB_UIPArray_GetSeparatedUTF8Character(CHNLIB_UIPArray **separated, const CHNLIB_String *s)\r
+{\r
+    //[UTF-8]\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
+    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, autorelease(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
+    //改行文字を削除して、読み込んだ文字列一行を返す。\r
     char s[CHNLIB_MAX_STRING_LENGTH];\r
     \r
     if(fgets(s, sizeof(s), fp) == NULL){\r
@@ -160,4 +139,19 @@ CHNLIB_String *CHNLIB_ReadLine(FILE *fp)
     return CHNLIB_String_Initialize(s);\r
 }\r
 \r
+CHNLIB_UUID *CHNLIB_GenerateUUIDVersion4WithRandomGeneratorMT(CHNLIB_RandomGeneratorMT *mt)\r
+{\r
+    //mtが有効でない場合、NullUUIDを返す。\r
+    CHNLIB_UUID *uuid;\r
+    \r
+    uuid = CHNLIB_UUID_Initialise();\r
+    \r
+    if(CHNLIB_StructureHeader_GetTypeID(mt) != CHNLIB_STRUCT_ID_RandomGeneratorMT){\r
+        return uuid;\r
+    }\r
+    \r
+    CHNLIB_UUID_SetValueAsUUIDVersion4CompatibleWithRFC4122(uuid, CHNLIB_RandomGeneratorMT_GetRandomUnsignedInteger32(mt), CHNLIB_RandomGeneratorMT_GetRandomUnsignedInteger32(mt), CHNLIB_RandomGeneratorMT_GetRandomUnsignedInteger32(mt), CHNLIB_RandomGeneratorMT_GetRandomUnsignedInteger32(mt));\r
+    \r
+    return uuid;\r
+}\r
 \r