OSDN Git Service

chnlib:CHNLIB_UUID(UUIDv4), メルセンヌ・ツイスターを利用した乱数生成器CHNLIB_RandomGeneratorMTを追加。
[chnosproject/CHNOSProject.git] / CHNOSProject / chn / chnlib02.c
index 5a3e48c..39d5d22 100644 (file)
@@ -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
@@ -116,7 +118,7 @@ int CHNLIB_UIPArray_GetSeparatedUTF8Character(CHNLIB_UIPArray **separated, const
             //終端文字\r
             break;\r
         }\r
-        CHNLIB_UIPArray_AppendLast(separated, u, CHNLIB_String_ExtractByLength(s, (int)(p - p_base), (int)(q - p)));\r
+        CHNLIB_UIPArray_AppendLast(separated, u, autorelease(CHNLIB_String_ExtractByLength(s, (int)(p - p_base), (int)(q - p))));\r
         p = q;\r
     }\r
     \r
@@ -125,6 +127,7 @@ int CHNLIB_UIPArray_GetSeparatedUTF8Character(CHNLIB_UIPArray **separated, const
 \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
@@ -136,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