X-Git-Url: http://git.osdn.net/view?a=blobdiff_plain;f=CHNOSProject%2Fchn%2Fchnlib02.c;h=39d5d22bba736badc3f34d075fb3f6bd784458a1;hb=f1b1537c613260de4c7e0bb7f11bac11ca96a759;hp=459ed8d19e091e2b4e537652002fb43a67d86906;hpb=a0956e5b600135d63ba7b003ddc1e21daac59082;p=chnosproject%2FCHNOSProject.git diff --git a/CHNOSProject/chn/chnlib02.c b/CHNOSProject/chn/chnlib02.c index 459ed8d..39d5d22 100644 --- a/CHNOSProject/chn/chnlib02.c +++ b/CHNOSProject/chn/chnlib02.c @@ -35,7 +35,7 @@ int CHNLIB_String_Search_UIPArrayStringLocation(const CHNLIB_String *s, int s_st return CHNLIB_UIPArray_INDEX_NOTFOUND; } cstr_s = CHNLIB_String_GetReferencePointerOfCString(s); - i_max = CHNLIB_CString_GetLength(cstr_s); + i_max = CHNLIB_CString_GetByteLength(cstr_s); j_max = CHNLIB_UIPArray_GetNumberOfDatas(list); for(i = s_start; i < i_max; i++){ @@ -62,7 +62,9 @@ int CHNLIB_UIPArray_GetSeparatedStringByUIPArray(CHNLIB_UIPArray **separated, co { //listにある文字列でsを分割し、その結果をseparatedに追加する。 //listに存在する文字列は新しくメモリを確保せず、リスト中のStringタグへのポインタをseparatedに記録する。 - //従ってseparatedを解放する際は、listのdata32をすべてTrueにした上で、CHNLIB_UIPArray_FreeSelectedAllを利用するべきである。 + ////従ってseparatedを解放する際は、listのdata32をすべてTrueにした上で、CHNLIB_UIPArray_FreeSelectedAllを利用するべきである。 + //referenceCountは、list中の文字列は2以上になり、listにない文字列は1となる。 + //従って、separatedをreleaseすれば、安全に解放できる。 //listにない文字列はdata32==False(0) //listにある文字列はdata32==tag->data32 int index, end, end_end, location; @@ -79,14 +81,14 @@ int CHNLIB_UIPArray_GetSeparatedStringByUIPArray(CHNLIB_UIPArray **separated, co //もうリストの文字列はない if(end != end_end){ //でもまだ文字列は残っている - CHNLIB_UIPArray_AppendLast(separated, False, CHNLIB_String_ExtractByLength(s, end, CHNLIB_MAX_STRING_LENGTH)); + CHNLIB_UIPArray_AppendLast(separated, False, autorelease(CHNLIB_String_ExtractByLength(s, end, CHNLIB_MAX_STRING_LENGTH))); } break; } //リストの文字列が見つかった if(location != 0){ //リストの文字列の前に、リストにない文字列がある - CHNLIB_UIPArray_AppendLast(separated, False, CHNLIB_String_ExtractByLength(s, end, location)); + CHNLIB_UIPArray_AppendLast(separated, False, autorelease(CHNLIB_String_ExtractByLength(s, end, location))); end += location; } CHNLIB_UIPArray_AppendLast(separated, CHNLIB_UIPArray_GetData32ByIndex(list, index), CHNLIB_UIPArray_GetPointerByIndex(list, index)); @@ -95,60 +97,37 @@ int CHNLIB_UIPArray_GetSeparatedStringByUIPArray(CHNLIB_UIPArray **separated, co return 0; } -int CHNLIB_UIPArray_GetSeparatedUTF8Character(CHNLIB_UIPArray **separated, const CHNLIB_String *s){ +int CHNLIB_UIPArray_GetSeparatedUTF8Character(CHNLIB_UIPArray **separated, const CHNLIB_String *s) +{ + //[UTF-8] //文字列sを、UTF-8の一文字ごとに分割し、その文字のUnicodeをdata32、その一文字に該当するStringをpointerに格納し、separatedに追加する形で返す。 //不完全なUTF-8文字列は無視される。 - const char *refstr; - int i, i_max, type; - int phase, start; - uint unicode; + const char *p, *q, *p_base; + uint u; if(separated == NULL || CHNLIB_StructureHeader_GetTypeID(s) != CHNLIB_STRUCT_ID_String){ return 1; } - refstr = CHNLIB_String_GetReferencePointerOfCString(s); - i_max = CHNLIB_String_GetLength(s); + p_base = CHNLIB_String_GetReferencePointerOfCString(s);; + p = p_base; - phase = 0; - unicode = 0; - for(i = 0; i < i_max; i++){ - type = CHNLIB_UTF8_GetCharacterType(refstr[i]); - switch (type) { - case 1: - CHNLIB_UIPArray_AppendLast(separated, refstr[i], CHNLIB_String_ExtractByLength(s, i, 1)); - phase = 0; - unicode = 0; - break; - - case 0: - if(phase > 0){ - unicode <<= 6; - unicode |= (refstr[i] & 0x3f); - phase--; - if(phase == 0){ - //一文字完成 - CHNLIB_UIPArray_AppendLast(separated, unicode, CHNLIB_String_ExtractByLength(s, start, i - start + 1)); - } - } - break; - - case 2: - case 3: - case 4: - start = i; - unicode = (refstr[i] << (type + 1)) >> (type + 1); - phase = type - 1; - break; + for(;;){ + u = CHNLIB_UTF8_GetNextUnicodeOfCharacter(p, &q); + if(u == 0){ + //終端文字 + break; } + CHNLIB_UIPArray_AppendLast(separated, u, autorelease(CHNLIB_String_ExtractByLength(s, (int)(p - p_base), (int)(q - p)))); + p = q; } return 0; } - CHNLIB_String *CHNLIB_ReadLine(FILE *fp) { + //改行文字を削除して、読み込んだ文字列一行を返す。 char s[CHNLIB_MAX_STRING_LENGTH]; if(fgets(s, sizeof(s), fp) == NULL){ @@ -160,4 +139,19 @@ CHNLIB_String *CHNLIB_ReadLine(FILE *fp) return CHNLIB_String_Initialize(s); } +CHNLIB_UUID *CHNLIB_GenerateUUIDVersion4WithRandomGeneratorMT(CHNLIB_RandomGeneratorMT *mt) +{ + //mtが有効でない場合、NullUUIDを返す。 + CHNLIB_UUID *uuid; + + uuid = CHNLIB_UUID_Initialise(); + + if(CHNLIB_StructureHeader_GetTypeID(mt) != CHNLIB_STRUCT_ID_RandomGeneratorMT){ + return uuid; + } + + CHNLIB_UUID_SetValueAsUUIDVersion4CompatibleWithRFC4122(uuid, CHNLIB_RandomGeneratorMT_GetRandomUnsignedInteger32(mt), CHNLIB_RandomGeneratorMT_GetRandomUnsignedInteger32(mt), CHNLIB_RandomGeneratorMT_GetRandomUnsignedInteger32(mt), CHNLIB_RandomGeneratorMT_GetRandomUnsignedInteger32(mt)); + + return uuid; +}