#include "dkcString.h"
#include "dkcStdio.h"
#include "dkcOSIndependent.h"
#include <limits.h>
dkcString.cのインクルード依存関係図
関数 | |
BOOL | dkcIsSJIS1 (BYTE c) |
cがSJISの1バイト目の時TRUE(1) | |
BOOL | dkcIsSJIS2 (BYTE c) |
cがSJISの2バイト目の時TRUE(1) | |
BOOL | dkcIsSpace (BYTE c) |
半角全角を区別なしにSpace系の文字だったらTRUE | |
const char * | dkcGetSpaceSeparator () |
可視できる文字定数だったらTRUE | |
int WINAPI | dkcSJIS_StrChrSearch (const char *s, char c) |
SJIS文字を除外して文字を検索 最初に見つかった位置を返す -1なら見つからない. | |
int WINAPI | dkcSJIS_StrChrSearchLast (const char *s, char c) |
SJIS文字を除外して文字を検索 最後に見つかった位置を返す -1なら見つからない. | |
int WINAPI | dkcSJIS_StrChrSearchTail (const char *s, size_t len, char c) |
int WINAPI | dkcSJIS_StrChrSearchInStr (const char *s, const char *c) |
int WINAPI | dkcSJIS_StrChrSearchInStrLast (const char *s, const char *c) |
It has not tested. | |
int WINAPI | dkcSJIS_SearchPathSep (const char *s) |
パスセパレータが最初に見つかった位置を返す。 -1は見つからない | |
int WINAPI | dkcSJIS_SearchPathSepLast (const char *s) |
パスセパレータが最期に見つかった位置を返す。 -1は見つからない | |
int WINAPI | dkcStrStr (const char *dest, const char *src) |
int | dkcBMStrStrLogic (const char *text, const char *pattern) |
int WINAPI | dkcBMStrStr (const char *dest, const char *src) |
DKC_STRING *WINAPI | dkcAllocString (size_t size) |
int WINAPI | dkcFreeString (DKC_STRING **ptr) |
int WINAPI | dkcStringCopy (DKC_STRING *ptr, const char *str, size_t size) |
int WINAPI | dkcStringConcatenate (DKC_STRING *ptr, const char *str, size_t size) |
http://www.google.com/search?num=50&hl=ja&lr=lang_ja&q=strcat+cat%82%c6%82%cd | |
int WINAPI | dkcStringInsert (DKC_STRING *ptr, size_t point, const char *str, size_t size) |
int WINAPI | dkcStringErase (DKC_STRING *ptr, size_t point, size_t len) |
int WINAPI | dkcStringReplace (DKC_STRING *ptr, size_t begin_, size_t end_, const char *str, size_t size) |
size_t | dkcStringSize (const DKC_STRING *ptr) |
size_t | dkcStringNum (const DKC_STRING *ptr) |
文字列の文字数を返す。内部streamをstrlenにかけたものを保存しておいたものを取得。 | |
const char *WINAPI | dkcStringPointer (const DKC_STRING *ptr) |
int WINAPI | dkcStringGetBuffer (const DKC_STRING *ptr, char *buffer, size_t buffsize) |
DKC_STRINGの内部文字列をバッファにぶち込む. | |
int WINAPI | dkcStringSerialize (const DKC_STRING *ptr, DKC_SERIALIZE *se) |
It has not tested. | |
DKC_STRING *WINAPI | dkcAllocStringDeserialize (DKC_DESERIALIZE *se) |
it has not tested. | |
変数 | |
const BYTE | SJIS1_S1 = 0x81 |
const BYTE | SJIS1_E1 = 0x9f |
const BYTE | SJIS1_S2 = 0xe0 |
const BYTE | SJIS1_E2 = 0xf5 |
const BYTE | SJIS2_S1 = 0x40 |
const BYTE | SJIS2_E1 = 0x7e |
const BYTE | SJIS2_S2 = 0x80 |
const BYTE | SJIS2_E2 = 0xfc |
|
dkcString.c の 222 行で定義されています。 参照先 DKC_STRING, dkcAllocate(), dkcAllocMemoryStream(), dkcFree(), dkc_String::mByteSize, dkc_String::mStream, と NULL. 参照元 dkcAllocDeserialize(), dkcAllocPathString(), dkcAllocSerialize(), と dkcAllocStringDeserialize().
00222 { 00223 DKC_STRING *p; 00224 //へんな引数は除外 00225 //if(dkcErrorFlagCheck(flag)) return edk_ArgumentException; 00226 00227 p = (DKC_STRING *)dkcAllocate(sizeof(DKC_STRING)); 00228 if(NULL==p) return NULL; 00229 00230 p->mStream = dkcAllocMemoryStream(size + 1); 00231 if(NULL==p->mStream) goto Error; 00232 00233 p->mByteSize = 0; 00234 00235 return p; 00236 Error: 00237 dkcFree((void **)&p); 00238 return NULL; 00239 } |
|
it has not tested.
dkcString.c の 405 行で定義されています。 参照先 DKC_DESERIALIZE, DKC_MEMORYSTREAM, DKC_STRING, dkcAllocMemoryStreamDeserialize(), dkcAllocString(), dkcDeserializeRead(), dkcFreeMemoryStream(), edkcSerializeIDString, dkc_String::mByteSize, dkc_String::mStream, と NULL.
00406 { 00407 DKC_STRING *p; 00408 DKC_STRING t; 00409 DKC_MEMORYSTREAM *mem; 00410 size_t read; 00411 int id; 00412 00413 dkcDeserializeRead(se,&id,sizeof(id),&read); 00414 if(id != edkcSerializeIDString) 00415 { 00416 return NULL; 00417 } 00418 00419 mem = dkcAllocMemoryStreamDeserialize(se); 00420 if(NULL==mem){ 00421 return NULL; 00422 } 00423 00424 dkcDeserializeRead(se,&t,sizeof(t),&read); 00425 00426 p = dkcAllocString(0); 00427 if(NULL==p){ 00428 return NULL; 00429 } 00430 00431 dkcFreeMemoryStream(&p->mStream); 00432 p->mByteSize = t.mByteSize; 00433 p->mStream = mem; 00434 00435 //dkcmNOT_ASSERT(read != p->mSize); 00436 00437 return p; 00438 00439 } |
|
strstrをBM法でやってみたもの
dkcString.c の 213 行で定義されています。 参照先 dkcBMStrStrLogic().
00214 { 00215 return dkcBMStrStrLogic(dest,src); 00216 } |
|
dkcString.c の 179 行で定義されています。 参照元 dkcBMStrStr().
00180 { 00181 int i, j, k, len; 00182 int skip[UCHAR_MAX + 1]; 00183 unsigned char c, tail; 00184 00185 len = strlen((char *)pattern); /* 文字列の長さ */ 00186 if (len == 0) return -1; /* エラー: 長さ0 */ 00187 tail = pattern[len - 1]; /* 最後の文字 */ 00188 if (len == 1) { /* 長さ1なら簡単! */ 00189 for (i = 0; text[i] != '\0'; i++) 00190 if (text[i] == tail) return i; 00191 } else { // 長さ2以上なら表を作って… 00192 for (i = 0; i <= UCHAR_MAX; i++) skip[i] = len; 00193 for (i = 0; i < len - 1; i++) 00194 skip[pattern[i]] = len - 1 - i; 00195 /* i = len - 1; */ // いよいよ照合 00196 while ((c = text[i]) != '\0') { 00197 /* // デモンストレーション用 00198 printf("テ: %s\n", text); 00199 printf("照: %*s\n", i + 1, pattern); 00200 */ 00201 if (c == tail) { 00202 j = len - 1; k = i; 00203 while (pattern[--j] == text[--k]) 00204 if (j == 0) return k; //見つかった 00205 } 00206 i += skip[c]; 00207 } 00208 } 00209 return -1; // 見つからなかった 00210 } |
|
dkcString.c の 241 行で定義されています。 参照先 DKC_STRING, dkcFree(), dkcFreeMemoryStream(), edk_ArgumentException, と NULL. 参照元 dkcAllocDeserialize(), dkcAllocPathString(), dkcAllocSerialize(), dkcFreeDeserialize(), dkcFreePathString(), と dkcFreeSerialize().
00241 { 00242 //変な引数入れるな! 00243 if(NULL==ptr || NULL==*ptr || NULL==(*ptr)->mStream){return edk_ArgumentException;} 00244 dkcFreeMemoryStream(&(*ptr)->mStream); 00245 return dkcFree(ptr); 00246 } |
|
可視できる文字定数だったらTRUE
dkcString.c の 65 行で定義されています。
00065 { 00066 static const char temp[]={ 00067 '\0',0x0a,0x0d,' ','\t' 00068 }; 00069 return temp; 00070 } |
|
cがSJISの1バイト目の時TRUE(1)
dkcString.c の 40 行で定義されています。 参照先 BOOL, BYTE, SJIS1_E2, と SJIS1_S1.
00041 { 00042 // 普通に書けばこのような感じだが、高速化する 00043 // if((c >= SJIS1_S1 && c <= SJIS1_E1) || (c >= SJIS1_S2 && c <= SJIS1_E2)) return TRUE; 00044 /* 00045 c ^= 0x20; 00046 if(c >= (SJIS1_S1 ^ 0x20) && c <= (SJIS1_E2 ^ 0x20)) return TRUE; 00047 return FALSE; 00048 */ 00049 return ((c ^= 0x20) && (c >= (SJIS1_S1 ^ 0x20) && c <= (SJIS1_E2 ^ 0x20))); 00050 } |
|
cがSJISの2バイト目の時TRUE(1)
dkcString.c の 52 行で定義されています。 参照先 BOOL, BYTE, SJIS2_E2, SJIS2_S1, と SJIS2_S2.
|
|
半角全角を区別なしにSpace系の文字だったらTRUE
dkcString.c の 60 行で定義されています。
00061 { 00062 return (c=='\0' || c==0x0a || c==0x0d || c==' ' || c=='\t'); 00063 } |
|
パスセパレータが最初に見つかった位置を返す。 -1は見つからない
dkcString.c の 155 行で定義されています。 参照先 dkcGetPathSep(), と dkcSJIS_StrChrSearchInStr(). 参照元 dkcPathStringElementErase_Logic(), dkcPathStringElementReplace_Logic(), と dkcPathStringGetFileExtension().
00156 { 00157 const char *target = dkcGetPathSep(); 00158 return dkcSJIS_StrChrSearchInStr(s,target); 00159 } |
|
パスセパレータが最期に見つかった位置を返す。 -1は見つからない
dkcString.c の 161 行で定義されています。 参照先 dkcGetPathSep(), と dkcSJIS_StrChrSearchInStrLast(). 参照元 dkcIsTailPathSep().
00162 { 00163 const char *target = dkcGetPathSep(); 00164 return dkcSJIS_StrChrSearchInStrLast(s,target); 00165 } |
|
SJIS文字を除外して文字を検索 最初に見つかった位置を返す -1なら見つからない.
dkcString.c の 73 行で定義されています。 参照先 dkcmIsSJIS1, と dkcmIsSJIS2. 参照元 dkcIsRelativityPath(), dkcPathStringDevideBegin_Logic(), dkcPathStringDevideNext_Logic(), と dkcPathStringGetDrive().
00074 { 00075 // c == 0 も考慮している 00076 int i; 00077 for(i = 0; ; i++){ 00078 if(s[i] == c) return i; 00079 if(s[i] == '\0') break; 00080 if(dkcmIsSJIS1(s[i]) && dkcmIsSJIS2(s[i + 1])) i++; 00081 } 00082 return -1; 00083 } |
|
複数の文字定数を検索指定できるdkcSJIS_StrChrSearch() /
dkcString.c の 118 行で定義されています。 参照先 dkcmIsSJIS1, と dkcmIsSJIS2.
00119 { 00120 // c == 0 も考慮している 00121 size_t i,j; 00122 size_t len = strlen(c); 00123 for(i = 0; ; i++){ 00124 if(s[i] == '\0') break; 00125 if(dkcmIsSJIS1(s[i]) && dkcmIsSJIS2(s[i + 1])){ 00126 i++; 00127 continue; 00128 } 00129 for(j=0;j<len;j++){ 00130 if(s[i] == c[j]) return i; 00131 } 00132 } 00133 return -1; 00134 } |
|
It has not tested.
dkcString.c の 136 行で定義されています。 参照先 dkcmIsSJIS1, と dkcmIsSJIS2. 参照元 dkcSJIS_SearchPathSepLast().
00137 { 00138 int nLast = -1; 00139 size_t i,j; 00140 size_t len = strlen(c); 00141 // c == 0 も考慮している 00142 for(i = 0; ; i++){ 00143 if(s[i] == '\0') break; 00144 if(dkcmIsSJIS1(s[i]) && dkcmIsSJIS2(s[i + 1])){ 00145 i++; 00146 continue; 00147 } 00148 for(j=0;j<len;j++){ 00149 if(s[i] == c[j]) nLast = i; 00150 } 00151 } 00152 return nLast; 00153 } |
|
SJIS文字を除外して文字を検索 最後に見つかった位置を返す -1なら見つからない.
dkcString.c の 86 行で定義されています。 参照先 dkcmIsSJIS1, と dkcmIsSJIS2. 参照元 dkcPathStringGetFileExtension(), と dkcPathStringGetFileName().
00087 { 00088 int nLast = -1,i; 00089 // c == 0 も考慮している 00090 for(i = 0; ; i++){ 00091 if(s[i] == c) nLast = i; 00092 if(s[i] == '\0') break; 00093 if(dkcmIsSJIS1(s[i]) && dkcmIsSJIS2(s[i + 1])) i++; 00094 } 00095 return nLast; 00096 } |
|
SJIS文字を除外して文字を後ろから検索
dkcString.c の 98 行で定義されています。 参照先 dkcmIsSJIS1, と dkcmIsSJIS2. 参照元 dkcPathStringGetDirectory().
00098 { 00099 int i; 00100 for(i=len;i > 0;i--){//sjisを調べるためi > 0 iが0になったら終了。 00101 if(dkcmIsSJIS1(s[i - 1]) && dkcmIsSJIS2(s[i]) ) 00102 { 00103 i--; 00104 continue; 00105 } 00106 if(s[i] == c) return i; 00107 } 00108 //iが0の時。 00109 if(! (dkcmIsSJIS1(s[i]) && dkcmIsSJIS2(s[i + 1]) )) 00110 { 00111 if(c==s[i]){ 00112 return 0; 00113 } 00114 } 00115 return -1; 00116 } |
|
http://www.google.com/search?num=50&hl=ja&lr=lang_ja&q=strcat+cat%82%c6%82%cd
dkcString.c の 270 行で定義されています。 参照先 DKC_STRING, dkcMemoryStreamDynamicWrite(), dkcmNOT_ASSERT, DKUTIL_FAILED, edk_FAILED, edk_SUCCEEDED, dkc_String::mByteSize, dkc_MemoryStream::mNowOffset, dkc_String::mStream, と NULL. 参照元 dkcPathStringNormalizeConcatenateLogic(), と dkcStringInsert().
00270 { 00271 dkcmNOT_ASSERT(NULL==ptr || NULL==ptr->mStream || 0==size); 00272 00273 if(0 != ptr->mByteSize){ 00274 ptr->mStream->mNowOffset --;//一つ減らしてNULL文字分を潰す。 00275 } 00276 if(DKUTIL_FAILED(dkcMemoryStreamDynamicWrite(ptr->mStream,str,size + 1)))//+1してNULL文字もコピー 00277 { 00278 return edk_FAILED; 00279 } 00280 00281 ptr->mByteSize += size; 00282 00283 return edk_SUCCEEDED; 00284 } |
|
dkcString.c の 249 行で定義されています。 参照先 DKC_STRING, dkcMemoryStreamClear(), dkcMemoryStreamDynamicWrite(), dkcMemoryStreamSeek(), dkcmNOT_ASSERT, DKUTIL_FAILED, edk_FAILED, edk_SUCCEEDED, edkcMemoryStreamSeekSet, dkc_String::mByteSize, dkc_String::mStream, と NULL. 参照元 dkcAllocDeserialize(), dkcAllocSerialize(), と dkcPathStringCopy().
00250 { 00251 dkcmNOT_ASSERT(NULL==ptr || NULL==ptr->mStream || 0==size); 00252 00253 if(DKUTIL_FAILED(dkcMemoryStreamSeek(ptr->mStream,0,edkcMemoryStreamSeekSet))){ 00254 return edk_FAILED; 00255 } 00256 00257 dkcMemoryStreamClear(ptr->mStream); 00258 00259 if(DKUTIL_FAILED(dkcMemoryStreamDynamicWrite(ptr->mStream,str, 00260 size + 1/* + 1してNULL文字分もコピー*/))) 00261 { 00262 return edk_FAILED; 00263 } 00264 00265 ptr->mByteSize = size; 00266 00267 return edk_SUCCEEDED; 00268 } |
|
dkcString.c の 331 行で定義されています。 参照先 dkc_stream_swap(), DKC_STRING, dkcMemoryStreamSeek(), edk_Not_Satisfactory, edkcMemoryStreamSeekSet, dkc_MemoryStream::mBuffer, dkc_String::mByteSize, dkc_MemoryStream::mNowOffset, と dkc_String::mStream. 参照元 dkcPathStringElementErase_Logic(), と dkcStringReplace().
00332 { 00333 char *tp; 00334 size_t size; 00335 int r; 00336 00337 tp = (char *)ptr->mStream->mBuffer; 00338 size = ptr->mStream->mNowOffset; 00339 if(point + len >= size){ 00340 len = size - len; 00341 dkcMemoryStreamSeek(ptr->mStream,len,edkcMemoryStreamSeekSet); 00342 00343 return edk_Not_Satisfactory; 00344 } 00345 else 00346 { 00347 dkc_stream_swap(&tp[point],size - point - 1,len);//要らない領域を後ろに持ってくる。 00348 00349 ptr->mByteSize -= len;//少なくする。 00350 //多分バッファオーバーフローしないと思うけど・・・。 00351 ptr->mStream->mBuffer[ptr->mByteSize] = '\0'; 00352 00353 00354 r = dkcMemoryStreamSeek(ptr->mStream,size - len,edkcMemoryStreamSeekSet); 00355 } 00356 return r; 00357 } |
|
DKC_STRINGの内部文字列をバッファにぶち込む.
dkcString.c の 382 行で定義されています。 参照先 dkc_memcpy(), DKC_STRING, dkcStringNum(), DKUTIL_FAILED, edk_FAILED, dkc_MemoryStream::mBuffer, dkc_MemoryStream::mNowOffset, dkc_String::mStream, と NULL.
00383 { 00384 int r; 00385 size_t num; 00386 if(NULL==ptr) return edk_FAILED; 00387 num = dkcStringNum(ptr); 00388 r = dkc_memcpy(buffer,buffsize,ptr->mStream->mBuffer,ptr->mStream->mNowOffset); 00389 if(DKUTIL_FAILED(r)) return r; 00390 00391 return r; 00392 //return dkcStreamToBuffer(ptr->mStream,edkcStreamSeekSet,0,num,buffer,buffsize); 00393 } |
|
dkcString.c の 286 行で定義されています。 参照先 dkc_stream_swap(), DKC_STRING, dkcMemoryStreamGetSeekPoint(), dkcmNOT_ASSERT, dkcStringConcatenate(), edk_ArgumentException, edk_Not_Satisfactory, edk_SUCCEEDED, dkc_MemoryStream::mBuffer, dkc_String::mStream, と NULL. 参照元 dkcPathStringElementInsert_Logic(), と dkcStringReplace().
00287 { 00288 size_t tpo;//一時オフセット保存 00289 char *tp;//bufferのtemp 00290 //char *mlctp;//mallocで確保したバッファのtemp 00291 //size_t len;//tpo - point 00292 //size_t maxbuffsize;//ptr->mStream->mSize - len 00293 00294 dkcmNOT_ASSERT(NULL==ptr || NULL==ptr->mStream); 00295 if(0==size){ 00296 return edk_Not_Satisfactory; 00297 } 00298 //lock thread 00299 00300 //ここらへんがステートマシンだから嫌^^; 00301 00302 00303 00304 //エラーチェック 00305 { 00306 tpo = dkcMemoryStreamGetSeekPoint(ptr->mStream); 00307 if(point > tpo) 00308 {//pointがはみ出ている。 00309 return edk_ArgumentException; 00310 } 00311 //とりあえず、push!! 00312 dkcStringConcatenate(ptr,str,size);//これでmByteSizeは+=されている。 00313 00314 tp = (char *)ptr->mStream->mBuffer; 00315 00316 //一度、Concatenateしたので再取得 00317 tpo = dkcMemoryStreamGetSeekPoint(ptr->mStream); 00318 00319 //入れ替えしてやる。 00320 dkc_stream_swap(&tp[point],tpo - point - 1,tpo - point - size - 1); 00321 00322 } 00323 return edk_SUCCEEDED; 00324 00325 //unlock thread 00326 00327 00328 00329 } |
|
文字列の文字数を返す。内部streamをstrlenにかけたものを保存しておいたものを取得。
dkcString.c の 373 行で定義されています。 参照先 DKC_STRING, と dkc_String::mByteSize. 参照元 dkcStringGetBuffer().
00373 { 00374 return ptr->mByteSize; 00375 } |
|
|
dkcString.c の 359 行で定義されています。 参照先 DKC_STRING, dkcStringErase(), と dkcStringInsert(). 参照元 dkcPathStringElementReplace_Logic().
00361 { 00362 //非効率だけどこれで^^;;;; 00363 dkcStringErase(ptr,begin_,end_ - begin_); 00364 return dkcStringInsert(ptr,begin_,str,size); 00365 } |
|
It has not tested.
dkcString.c の 396 行で定義されています。 参照先 DKC_SERIALIZE, DKC_STRING, dkcMemoryStreamSerialize(), dkcmNOT_ASSERT, dkcSerializeWrite(), edkcSerializeIDString, と NULL.
00397 { 00398 int id = edkcSerializeIDString; 00399 dkcmNOT_ASSERT(NULL==ptr); 00400 dkcSerializeWrite(se,&id,sizeof(id)); 00401 dkcMemoryStreamSerialize(ptr->mStream,se); 00402 return dkcSerializeWrite(se,ptr,sizeof(DKC_STRING)); 00403 } |
|
dkcString.c の 369 行で定義されています。 参照先 DKC_STRING, と dkc_String::mByteSize. 参照元 dkcPathStringDevideNext_Logic(), dkcPathStringGetDirectory(), dkcPathStringGetFileExtension(), dkcPathStringGetFileName(), と dkcPathStringSize().
00369 { 00370 return ptr->mByteSize; 00371 } |
|
strstrのWrapper
dkcString.c の 168 行で定義されています。 参照先 NULL.
00169 { 00170 char *p = strstr(dest,src); 00171 if(NULL==p) return -1; 00172 return (int)(p - dest); 00173 /*int offset = p - dest;//overflowすると危ない 00174 if(offset < 0) return -1; 00175 return offset; 00176 */ 00177 } |
|
dkcString.c の 27 行で定義されています。 |
|
dkcString.c の 29 行で定義されています。 参照元 dkcIsSJIS1(). |
|
d金魚
dkcString.c の 26 行で定義されています。 参照元 dkcIsSJIS1(). |
|
dkcString.c の 28 行で定義されています。 |
|
dkcString.c の 33 行で定義されています。 |
|
dkcString.c の 35 行で定義されています。 参照元 dkcIsSJIS2(). |
|
dkcString.c の 32 行で定義されています。 参照元 dkcIsSJIS2(). |
|
dkcString.c の 34 行で定義されています。 参照元 dkcIsSJIS2(). |