5 // Created by 西田 耀 on 13/02/09.
\r
6 // Copyright (c) 2013年 Hikaru Nishida. All rights reserved.
\r
20 int CHNLIB_String_Search_UIPArrayStringLocation(const CHNLIB_String *s, int s_start, const CHNLIB_UIPArray *list, int *location)
\r
22 //文字列&s[s_start]に含まれている中で最も左側にある、Array内のStringタグの文字列のArrayにおける添字と、その文字列が開始する、文字列&s[s_start]中の添字を返す。
\r
23 //locaton!=NULLの時、*locationに、発見された文字列の最初のバイトの&s[s_start]における添字が代入される。
\r
24 //Arrayの文字列がすべて見つからなかった場合、AI_ARRAY_INDEX_NOTFOUNDを返す。そのときの*locatonには0が代入される。
\r
25 int i, i_max, j, j_max;
\r
29 if(s == NULL || list == NULL){
\r
30 if(location != NULL){
\r
33 return CHNLIB_UIPArray_INDEX_NOTFOUND;
\r
35 cstr_s = CHNLIB_String_GetReferencePointerOfCString(s);
\r
36 i_max = CHNLIB_CString_GetLength(cstr_s);
\r
38 j_max = CHNLIB_UIPArray_GetNumberOfDatas(list);
\r
39 for(i = s_start; i < i_max; i++){
\r
40 for(j = 0; j < j_max; j++){
\r
41 tag = (CHNLIB_String *)CHNLIB_UIPArray_GetPointerByIndex(list, j);
\r
42 if(CHNLIB_StructureHeader_GetTypeID(tag) == CHNLIB_STRUCT_ID_String){
\r
43 if(CHNLIB_CString_CompareString(&cstr_s[i], CHNLIB_String_GetReferencePointerOfCString(tag))){
\r
44 if(location != NULL){
\r
45 *location = i - s_start;
\r
53 if(location != NULL){
\r
56 return CHNLIB_UIPArray_INDEX_NOTFOUND;
\r
59 int CHNLIB_UIPArray_GetSeparatedStringByUIPArray(CHNLIB_UIPArray **separated, const CHNLIB_UIPArray *list, const CHNLIB_String *s)
\r
61 //listにある文字列でsを分割し、その結果をseparatedに追加する。
\r
62 //listに存在する文字列は新しくメモリを確保せず、リスト中のStringタグへのポインタをseparatedに記録する。
\r
63 //従ってseparatedを解放する際は、listのdata32をすべてTrueにした上で、CHNLIB_UIPArray_FreeSelectedAllを利用するべきである。
\r
64 //listにない文字列はdata32==False(0)
\r
65 //listにある文字列はdata32==tag->data32
\r
66 int index, end, end_end, location;
\r
73 end_end = CHNLIB_String_GetLength(s);
\r
75 index = CHNLIB_String_Search_UIPArrayStringLocation(s, end, list, &location);
\r
76 if(index == CHNLIB_UIPArray_INDEX_NOTFOUND){
\r
80 CHNLIB_UIPArray_AppendLast(separated, False, CHNLIB_String_ExtractByLength(s, end, CHNLIB_MAX_STRING_LENGTH));
\r
86 //リストの文字列の前に、リストにない文字列がある
\r
87 CHNLIB_UIPArray_AppendLast(separated, False, CHNLIB_String_ExtractByLength(s, end, location));
\r
90 CHNLIB_UIPArray_AppendLast(separated, CHNLIB_UIPArray_GetData32ByIndex(list, index), CHNLIB_UIPArray_GetPointerByIndex(list, index));
\r
91 end += CHNLIB_String_GetLength(CHNLIB_UIPArray_GetPointerByIndex(list, index));
\r
96 int CHNLIB_UIPArray_GetSeparatedUTF8Character(CHNLIB_UIPArray **separated, const CHNLIB_String *s){
\r
97 //文字列sを、UTF-8の一文字ごとに分割し、その文字のUnicodeをdata32、その一文字に該当するStringをpointerに格納し、separatedに追加する形で返す。
\r
98 //不完全なUTF-8文字列は無視される。
\r
100 int i, i_max, type;
\r
104 if(separated == NULL || CHNLIB_StructureHeader_GetTypeID(s) != CHNLIB_STRUCT_ID_String){
\r
108 refstr = CHNLIB_String_GetReferencePointerOfCString(s);
\r
109 i_max = CHNLIB_String_GetLength(s);
\r
113 for(i = 0; i < i_max; i++){
\r
114 type = CHNLIB_UTF8_GetCharacterType(refstr[i]);
\r
117 CHNLIB_UIPArray_AppendLast(separated, refstr[i], CHNLIB_String_ExtractByLength(s, i, i));
\r
125 unicode |= (refstr[i] & 0x3f);
\r
129 CHNLIB_UIPArray_AppendLast(separated, unicode, CHNLIB_String_ExtractByLength(s, start, i - start + 1));
\r
138 unicode = (refstr[i] << (type + 1)) >> (type + 1);
\r
148 CHNLIB_String *CHNLIB_ReadLine(FILE *fp)
\r
150 char s[CHNLIB_MAX_STRING_LENGTH];
\r
152 if(fgets(s, sizeof(s), fp) == NULL){
\r
156 CHNLIB_CString_DeleteLastCRLF(s);
\r
158 return CHNLIB_String_Initialize(s);
\r