5 // Created by 西田 耀 on 13/02/09.
\r
6 // Copyright (c) 2013年 Hikaru Nishida. All rights reserved.
\r
22 int CHNLIB_String_Search_UIPArrayStringLocation(const CHNLIB_String *s, int s_start, const CHNLIB_UIPArray *list, int *location)
\r
24 //文字列&s[s_start]に含まれている中で最も左側にある、Array内のStringタグの文字列のArrayにおける添字と、その文字列が開始する、文字列&s[s_start]中の添字を返す。
\r
25 //locaton!=NULLの時、*locationに、発見された文字列の最初のバイトの&s[s_start]における添字が代入される。
\r
26 //Arrayの文字列がすべて見つからなかった場合、AI_ARRAY_INDEX_NOTFOUNDを返す。そのときの*locatonには0が代入される。
\r
27 int i, i_max, j, j_max;
\r
31 if(s == NULL || list == NULL){
\r
32 if(location != NULL){
\r
35 return CHNLIB_UIPArray_INDEX_NOTFOUND;
\r
37 cstr_s = CHNLIB_String_GetReferencePointerOfCString(s);
\r
38 i_max = CHNLIB_CString_GetByteLength(cstr_s);
\r
40 j_max = CHNLIB_UIPArray_GetNumberOfDatas(list);
\r
41 for(i = s_start; i < i_max; i++){
\r
42 for(j = 0; j < j_max; j++){
\r
43 tag = (CHNLIB_String *)CHNLIB_UIPArray_GetPointerByIndex(list, j);
\r
44 if(CHNLIB_StructureHeader_GetTypeID(tag) == CHNLIB_STRUCT_ID_String){
\r
45 if(CHNLIB_CString_CompareString(&cstr_s[i], CHNLIB_String_GetReferencePointerOfCString(tag))){
\r
46 if(location != NULL){
\r
47 *location = i - s_start;
\r
55 if(location != NULL){
\r
58 return CHNLIB_UIPArray_INDEX_NOTFOUND;
\r
61 int CHNLIB_UIPArray_GetSeparatedStringByUIPArray(CHNLIB_UIPArray **separated, const CHNLIB_UIPArray *list, const CHNLIB_String *s)
\r
63 //listにある文字列でsを分割し、その結果をseparatedに追加する。
\r
64 //listに存在する文字列は新しくメモリを確保せず、リスト中のStringタグへのポインタをseparatedに記録する。
\r
65 ////従ってseparatedを解放する際は、listのdata32をすべてTrueにした上で、CHNLIB_UIPArray_FreeSelectedAllを利用するべきである。
\r
66 //referenceCountは、list中の文字列は2以上になり、listにない文字列は1となる。
\r
67 //従って、separatedをreleaseすれば、安全に解放できる。
\r
68 //listにない文字列はdata32==False(0)
\r
69 //listにある文字列はdata32==tag->data32
\r
70 int index, end, end_end, location;
\r
77 end_end = CHNLIB_String_GetLength(s);
\r
79 index = CHNLIB_String_Search_UIPArrayStringLocation(s, end, list, &location);
\r
80 if(index == CHNLIB_UIPArray_INDEX_NOTFOUND){
\r
84 CHNLIB_UIPArray_AppendLast(separated, False, autorelease(CHNLIB_String_ExtractByLength(s, end, CHNLIB_MAX_STRING_LENGTH)));
\r
90 //リストの文字列の前に、リストにない文字列がある
\r
91 CHNLIB_UIPArray_AppendLast(separated, False, autorelease(CHNLIB_String_ExtractByLength(s, end, location)));
\r
94 CHNLIB_UIPArray_AppendLast(separated, CHNLIB_UIPArray_GetData32ByIndex(list, index), CHNLIB_UIPArray_GetPointerByIndex(list, index));
\r
95 end += CHNLIB_String_GetLength(CHNLIB_UIPArray_GetPointerByIndex(list, index));
\r
100 int CHNLIB_UIPArray_GetSeparatedUTF8Character(CHNLIB_UIPArray **separated, const CHNLIB_String *s)
\r
103 //文字列sを、UTF-8の一文字ごとに分割し、その文字のUnicodeをdata32、その一文字に該当するStringをpointerに格納し、separatedに追加する形で返す。
\r
104 //不完全なUTF-8文字列は無視される。
\r
105 const char *p, *q, *p_base;
\r
108 if(separated == NULL || CHNLIB_StructureHeader_GetTypeID(s) != CHNLIB_STRUCT_ID_String){
\r
112 p_base = CHNLIB_String_GetReferencePointerOfCString(s);;
\r
116 u = CHNLIB_UTF8_GetNextUnicodeOfCharacter(p, &q);
\r
121 CHNLIB_UIPArray_AppendLast(separated, u, autorelease(CHNLIB_String_ExtractByLength(s, (int)(p - p_base), (int)(q - p))));
\r
128 CHNLIB_String *CHNLIB_ReadLine(FILE *fp)
\r
130 //改行文字を削除して、読み込んだ文字列一行を返す。
\r
131 char s[CHNLIB_MAX_STRING_LENGTH];
\r
133 if(fgets(s, sizeof(s), fp) == NULL){
\r
137 CHNLIB_CString_DeleteLastCRLF(s);
\r
139 return CHNLIB_String_Initialize(s);
\r