5 // Created by 西田 耀 on 13/02/03.
\r
6 // Copyright (c) 2013年 Hikaru Nishida. All rights reserved.
\r
9 //String関連のうち、このソースファイルで完結する関数群
\r
25 //Declare internal functions
\r
28 CHNLIB_String *CHNLIB_String_Internal_Allocate(void);
\r
34 struct CHNLIB_STRING {
\r
36 CHNLIB_StructureHeader header;
\r
41 //Functions(CHNLIB_String)
\r
44 CHNLIB_String *CHNLIB_String_Initialize(const char str[])
\r
46 //指定された引数strと等価なStringを確保し返す。
\r
47 //str==NULLの時は、NULLポインタへの参照を持つStringを返す。
\r
48 CHNLIB_String *strtag;
\r
50 strtag = CHNLIB_String_Internal_Allocate();
\r
53 CHNLIB_String_SetStringFromCString(strtag, str);
\r
58 void CHNLIB_String_Free(CHNLIB_String *strtag)
\r
62 if(CHNLIB_StructureHeader_GetTypeID(strtag) != CHNLIB_STRUCT_ID_String){
\r
66 if(strtag->str != NULL){
\r
67 CHNLIB_System_FreeMemory(strtag->str, CHNLIB_DEBUG_ARGUMENTS);
\r
69 strtag->header.typeid = CHNLIB_STRUCT_ID_Null;
\r
70 strtag->header.signature = 0;
\r
71 CHNLIB_System_FreeMemory(strtag, CHNLIB_DEBUG_ARGUMENTS);
\r
76 int CHNLIB_String_SetStringFromCString(CHNLIB_String *strtag, const char s[])
\r
78 //strtagにsと等価な文字列を代入する。
\r
79 //strtag==Invalid || s==NULLのときは何もしない。
\r
82 if(CHNLIB_StructureHeader_GetTypeID(strtag) != CHNLIB_STRUCT_ID_String){
\r
90 size = CHNLIB_CString_GetLength(s) + 1;
\r
91 if(strtag->str != NULL){
\r
92 CHNLIB_System_FreeMemory(strtag->str, CHNLIB_DEBUG_ARGUMENTS);
\r
94 strtag->str = CHNLIB_System_AllocateMemory_Strict(size, CHNLIB_DEBUG_ARGUMENTS);
\r
95 for(i = 0; i < size - 1; i++){
\r
96 strtag->str[i] = s[i];
\r
98 strtag->str[i] = '\0';
\r
102 int CHNLIB_String_Print(CHNLIB_String *strtag)
\r
104 //strtagが格納している文字列を標準出力に出力する。
\r
105 if(CHNLIB_StructureHeader_GetTypeID(strtag) != CHNLIB_STRUCT_ID_String){
\r
108 if(strtag->str == NULL){
\r
112 return fputs(strtag->str, stdout);
\r
115 const char *CHNLIB_String_GetReferencePointerOfCString(const CHNLIB_String *strtag)
\r
117 //strtagが格納している文字列へのポインタを返す。
\r
118 //strtag==Invalidの場合、NULLを返す。
\r
119 if(CHNLIB_StructureHeader_GetTypeID(strtag) != CHNLIB_STRUCT_ID_String){
\r
123 return (const char *)strtag->str;
\r
126 CHNLIB_String *CHNLIB_String_ExtractByLength(const CHNLIB_String *strtag, int start, int len)
\r
128 //strtagが格納している文字列sについて、
\r
129 //s[start]からs[start + len - 1]の文字を含む文字列と等価なStringを確保し返す。
\r
130 //lenに満たずにsが終端文字を迎えた場合は、sの終端文字直前までの文字列がコピーされる。
\r
131 //(len < 0)のときは、NULLを返す。また、結果として(len < 0)となった時も同様にNULLを返す。
\r
133 CHNLIB_String *retstrtag;
\r
135 retstr = CHNLIB_CString_ExtractByLength(strtag->str, start, len);
\r
137 if(retstr == NULL){
\r
141 retstrtag = CHNLIB_String_Initialize(NULL);
\r
142 retstrtag->str = retstr;
\r
147 int CHNLIB_String_GetLength(const CHNLIB_String *strtag)
\r
149 if(CHNLIB_StructureHeader_GetTypeID(strtag) != CHNLIB_STRUCT_ID_String){
\r
153 return CHNLIB_CString_GetLength(strtag->str);
\r
156 void CHNLIB_String_DeleteLastCRLF(CHNLIB_String *strtag)
\r
158 if(CHNLIB_StructureHeader_GetTypeID(strtag) != CHNLIB_STRUCT_ID_String){
\r
162 CHNLIB_CString_DeleteLastCRLF(strtag->str);
\r
167 int CHNLIB_String_CompareStringWithCString(const CHNLIB_String *s, const char search[])
\r
169 return CHNLIB_CString_CompareString(CHNLIB_String_GetReferencePointerOfCString(s), search);
\r
172 int CHNLIB_String_CompareString_Strict(const CHNLIB_String *s, const CHNLIB_String *search)
\r
174 return CHNLIB_CString_CompareString_Strict(CHNLIB_String_GetReferencePointerOfCString(s), CHNLIB_String_GetReferencePointerOfCString(search));
\r
177 uint CHNLIB_String_GetCountOfContain(const CHNLIB_String *s, const CHNLIB_String *search)
\r
179 return CHNLIB_CString_GetCountOfContain(CHNLIB_String_GetReferencePointerOfCString(s), CHNLIB_String_GetReferencePointerOfCString(search));
\r
183 //Functions(CString(char[]))
\r
186 int CHNLIB_CString_GetLength(const char s[])
\r
188 //終端文字を含めない時の、文字列のバイト数を返す。
\r
195 for(i = 0; s[i] != 0x00; i++){
\r
202 void CHNLIB_CString_DeleteLastCRLF(char s[])
\r
204 //末尾のLF, CR/LFを\0に置換する
\r
212 for(i = 0; s[i] != '\0'; i++){
\r
214 if(crlf == -1 || crlf + 1 != i){
\r
219 if(crlf == -1 || crlf + 1 != i){
\r
225 for(i = crlf; s[i] != '\0'; i++){
\r
232 char *CHNLIB_CString_ExtractByLength(const char s[], int start, int len)
\r
234 //s[start]からs[start + len - 1]の文字を含む文字列を、新たにメモリを確保して書き込み、その先頭アドレスを返す。
\r
235 //lenに満たずにsが終端文字を迎えた場合は、sの終端文字直前までの文字列がコピーされる。
\r
236 //(len < 0)のときは、NULLを返す。また、結果として(len < 0)となった時も同様にNULLを返す。
\r
242 CHNLIB_ReportError("Null s[]\n", CHNLIB_DEBUG_ARGUMENTS);
\r
246 i = CHNLIB_CString_GetLength(s) + 1;
\r
256 str = CHNLIB_System_AllocateMemory_Strict(i, CHNLIB_DEBUG_ARGUMENTS);
\r
258 for(i = 0; s[i + start] != '\0'; i++){
\r
263 utf8type = CHNLIB_UTF8_GetCharacterType(s[i + start]);
\r
264 if(len < utf8type){
\r
269 str[i] = s[i + start];
\r
276 int CHNLIB_CString_CompareString(const char s[], const char search[])
\r
278 //s[]の先頭からsearch[]と比較し、searchの終端まで一致したらTrue, 一致しなかったらFalseを返す。
\r
279 //終端文字'\0'はカウントしない。
\r
280 //search[]に含まれる文字(終端文字除く)がすべて入っていれば一致とみなす。
\r
283 if(s == NULL || search == NULL){
\r
284 CHNLIB_ReportError("Null str.\n", CHNLIB_DEBUG_ARGUMENTS);
\r
288 for(i = 0; search[i] != '\0'; i++){
\r
289 if(s[i] != search[i]){
\r
296 int CHNLIB_CString_CompareString_Strict(const char s[], const char search[])
\r
298 //二つの文字列が終端文字までを含めて完全に一致するかどうか調べる。一致していればTrueを返す。
\r
299 //StrictよりExactの方が適する?<関数名
\r
302 if(s == NULL || search == NULL){
\r
303 CHNLIB_ReportError("Null str.\n", CHNLIB_DEBUG_ARGUMENTS);
\r
307 for(i = 0; search[i] != '\0'; i++){
\r
308 if(s[i] != search[i]){
\r
318 int CHNLIB_CString_CompareString_LeftHand(const char s[], const char search[])
\r
320 //二つの文字列がどの程度一致するか調べる。前方一致。
\r
321 //戻り値は、終端文字を除く、同一だったバイト数。
\r
324 if(s == NULL || search == NULL){
\r
325 CHNLIB_ReportError("Null str.\n", CHNLIB_DEBUG_ARGUMENTS);
\r
329 for(i = 0; search[i] != '\0'; i++){
\r
330 if(s[i] != search[i]){
\r
338 uint CHNLIB_CString_GetCountOfContain(const char s[], const char search[])
\r
340 //[Not implemented]
\r
344 if(s == NULL || search == NULL){
\r
345 CHNLIB_ReportError("Null str.\n", CHNLIB_DEBUG_ARGUMENTS);
\r
350 for(i = 0; s[i] != '\0'; i++){
\r
351 if(CHNLIB_CString_CompareString(&s[i], search)){
\r
359 //Internal functions
\r
362 CHNLIB_String *CHNLIB_String_Internal_Allocate(void)
\r
364 CHNLIB_String *tag;
\r
366 tag = (CHNLIB_String *)CHNLIB_System_AllocateMemory_Strict(sizeof(CHNLIB_String), CHNLIB_DEBUG_ARGUMENTS);
\r
368 CHNLIB_StructureHeader_Initialize(&tag->header, CHNLIB_STRUCT_ID_String);
\r