5 // Created by 西田 耀 on 13/02/03.
\r
6 // Copyright (c) 2013年 Hikaru Nishida. All rights reserved.
\r
9 //String関連のうち、このソースファイルで完結する関数群
\r
25 //Define static values
\r
27 char *CHNLIB_String_Intenal_NullCString = "";
\r
30 //Declare internal functions
\r
33 CHNLIB_String *CHNLIB_String_Internal_Allocate(void);
\r
39 struct CHNLIB_STRING {
\r
41 CHNLIB_StructureHeader header;
\r
46 //Functions(CHNLIB_String)
\r
49 CHNLIB_String *CHNLIB_String_Initialize(const char str[])
\r
51 //指定された引数strと等価なStringを確保し返す。
\r
52 //str==NULLの時は、NULLポインタへの参照を持つStringを返す。
\r
53 CHNLIB_String *strtag;
\r
55 strtag = CHNLIB_String_Internal_Allocate();
\r
58 CHNLIB_String_SetStringFromCString(strtag, str);
\r
63 void CHNLIB_String_Free(CHNLIB_String *strtag)
\r
66 if(CHNLIB_StructureHeader_GetTypeID(strtag) != CHNLIB_STRUCT_ID_String){
\r
70 if(strtag->str != NULL){
\r
71 CHNLIB_System_FreeMemory(strtag->str, CHNLIB_DEBUG_ARGUMENTS);
\r
73 strtag->header.typeid = CHNLIB_STRUCT_ID_Null;
\r
74 strtag->header.signature = 0;
\r
75 CHNLIB_System_FreeMemory(strtag, CHNLIB_DEBUG_ARGUMENTS);
\r
80 int CHNLIB_String_SetStringFromCString(CHNLIB_String *strtag, const char s[])
\r
82 //strtagにsと等価な文字列を代入する。
\r
83 //strtag==Invalid || s==NULLのときは何もしない。
\r
86 if(CHNLIB_StructureHeader_GetTypeID(strtag) != CHNLIB_STRUCT_ID_String){
\r
94 size = CHNLIB_CString_GetByteLength(s) + 1;
\r
95 if(strtag->str != NULL){
\r
96 CHNLIB_System_FreeMemory(strtag->str, CHNLIB_DEBUG_ARGUMENTS);
\r
98 strtag->str = CHNLIB_System_AllocateMemory_Strict(size, CHNLIB_DEBUG_ARGUMENTS);
\r
99 for(i = 0; i < size - 1; i++){
\r
100 strtag->str[i] = s[i];
\r
102 strtag->str[i] = '\0';
\r
106 int CHNLIB_String_Print(CHNLIB_String *strtag)
\r
108 //strtagが格納している文字列を標準出力に出力する。
\r
109 if(CHNLIB_StructureHeader_GetTypeID(strtag) != CHNLIB_STRUCT_ID_String){
\r
112 if(strtag->str == NULL){
\r
116 return fputs(strtag->str, stdout);
\r
119 const char *CHNLIB_String_GetReferencePointerOfCString(const CHNLIB_String *strtag)
\r
121 //strtagが格納している文字列へのポインタを返す。
\r
122 //strtag->str==NULLの場合、constな空文字へのポインタを返す。
\r
123 if(CHNLIB_StructureHeader_GetTypeID(strtag) != CHNLIB_STRUCT_ID_String){
\r
127 if(strtag->str == NULL){
\r
128 return CHNLIB_String_Intenal_NullCString;
\r
131 return (const char *)strtag->str;
\r
134 CHNLIB_String *CHNLIB_String_ExtractByLength(const CHNLIB_String *strtag, int start, int len)
\r
136 //strtagが格納している文字列sについて、
\r
137 //s[start]からs[start + len - 1]の文字を含む文字列と等価なStringを確保し返す。
\r
138 //lenに満たずにsが終端文字を迎えた場合は、sの終端文字直前までの文字列がコピーされる。
\r
139 //(len < 0)のときは、NULLを返す。また、結果として(len < 0)となった時も同様にNULLを返す。
\r
141 CHNLIB_String *retstrtag;
\r
143 retstr = CHNLIB_CString_ExtractByLength(strtag->str, start, len);
\r
145 if(retstr == NULL){
\r
149 retstrtag = CHNLIB_String_Initialize(NULL);
\r
150 retstrtag->str = retstr;
\r
155 int CHNLIB_String_GetLength(const CHNLIB_String *strtag)
\r
157 if(CHNLIB_StructureHeader_GetTypeID(strtag) != CHNLIB_STRUCT_ID_String){
\r
161 return CHNLIB_CString_GetByteLength(strtag->str);
\r
164 void CHNLIB_String_DeleteLastCRLF(CHNLIB_String *strtag)
\r
166 if(CHNLIB_StructureHeader_GetTypeID(strtag) != CHNLIB_STRUCT_ID_String){
\r
170 CHNLIB_CString_DeleteLastCRLF(strtag->str);
\r
175 int CHNLIB_String_CompareStringWithCString(const CHNLIB_String *s, const char search[])
\r
177 return CHNLIB_CString_CompareString(CHNLIB_String_GetReferencePointerOfCString(s), search);
\r
180 int CHNLIB_String_CompareString_Strict(const CHNLIB_String *s, const CHNLIB_String *search)
\r
182 return CHNLIB_CString_CompareString_Strict(CHNLIB_String_GetReferencePointerOfCString(s), CHNLIB_String_GetReferencePointerOfCString(search));
\r
185 uint CHNLIB_String_GetCountOfContain(const CHNLIB_String *s, const CHNLIB_String *search)
\r
187 return CHNLIB_UTF8_GetCountOfContain(CHNLIB_String_GetReferencePointerOfCString(s), CHNLIB_String_GetReferencePointerOfCString(search));
\r
191 //Functions(CString(char[]))
\r
194 int CHNLIB_CString_GetByteLength(const char s[])
\r
197 //終端文字を除いた、文字列本体のバイト数を返す。
\r
204 for(i = 0; s[i] != 0x00; i++){
\r
211 void CHNLIB_CString_DeleteLastCRLF(char s[])
\r
213 //末尾のLF, CR/LFを\0に置換する
\r
221 for(i = 0; s[i] != '\0'; i++){
\r
223 if(crlf == -1 || crlf + 1 != i){
\r
228 if(crlf == -1 || crlf + 1 != i){
\r
234 for(i = crlf; s[i] != '\0'; i++){
\r
241 char *CHNLIB_CString_ExtractByLength(const char s[], int start, int len)
\r
243 //s[start]からs[start + len - 1]の文字を含む文字列を、新たにメモリを確保して書き込み、その先頭アドレスを返す。
\r
244 //lenに満たずにsが終端文字を迎えた場合は、sの終端文字直前までの文字列がコピーされる。
\r
245 //(len < 0)のときは、NULLを返す。また、結果として(len < 0)となった時も同様にNULLを返す。
\r
251 CHNLIB_ReportError("Null s[]\n", CHNLIB_DEBUG_ARGUMENTS);
\r
255 i = CHNLIB_CString_GetByteLength(s) + 1;
\r
265 str = CHNLIB_System_AllocateMemory_Strict(i, CHNLIB_DEBUG_ARGUMENTS);
\r
267 for(i = 0; s[i + start] != '\0'; i++){
\r
272 utf8type = CHNLIB_UTF8_GetCharacterType(s[i + start]);
\r
273 if(len < utf8type){
\r
278 str[i] = s[i + start];
\r
285 int CHNLIB_CString_CompareString(const char s[], const char search[])
\r
287 //s[]の先頭からsearch[]と比較し、searchの終端まで一致したらTrue, 一致しなかったらFalseを返す。
\r
288 //終端文字'\0'はカウントしない。
\r
289 //search[]に含まれる文字(終端文字除く)がすべて入っていれば一致とみなす。
\r
292 if(s == NULL || search == NULL){
\r
293 CHNLIB_ReportError("Null str.\n", CHNLIB_DEBUG_ARGUMENTS);
\r
297 for(i = 0; search[i] != '\0'; i++){
\r
298 if(s[i] != search[i]){
\r
305 int CHNLIB_CString_CompareString_Strict(const char s[], const char search[])
\r
307 //二つの文字列が終端文字までを含めて完全に一致するかどうか調べる。一致していればTrueを返す。
\r
308 //StrictよりExactの方が適する?<関数名
\r
311 if(s == NULL || search == NULL){
\r
312 CHNLIB_ReportError("Null str.\n", CHNLIB_DEBUG_ARGUMENTS);
\r
316 for(i = 0; search[i] != '\0'; i++){
\r
317 if(s[i] != search[i]){
\r
327 int CHNLIB_CString_CompareString_LeftHand(const char s[], const char search[])
\r
329 //二つの文字列がどの程度一致するか調べる。前方一致。
\r
330 //戻り値は、終端文字を除く、同一だったバイト数。
\r
333 if(s == NULL || search == NULL){
\r
334 CHNLIB_ReportError("Null str.\n", CHNLIB_DEBUG_ARGUMENTS);
\r
338 for(i = 0; search[i] != '\0'; i++){
\r
339 if(s[i] != search[i]){
\r
348 //Internal functions
\r
351 CHNLIB_String *CHNLIB_String_Internal_Allocate(void)
\r
353 CHNLIB_String *tag;
\r
355 tag = (CHNLIB_String *)CHNLIB_System_AllocateMemory_Strict(sizeof(CHNLIB_String), CHNLIB_DEBUG_ARGUMENTS);
\r
357 CHNLIB_StructureHeader_Initialize(&tag->header, CHNLIB_STRUCT_ID_String);
\r