あるバイト列中で指定のバイト集合に属するバイトが最初に現れる位置を調べる関数を作る。 //********************************************************* // mempbrk // バイト集合 ctrl[count] に属するバイトが // バイト列 string[length] で最初に現れる位置へのポインタを返す // バイト列の長さが 0 であれば常に NULL を返す //********************************************************* void * mempbrk ( const void *string, int length, const char *ctrl, int count ) { // バイト列 ctrl に属さない部分バイト列の長さを調べる const int span = memcspn( string, length, ctrl, count ); if ( length <= span ) { // バイト列 string の全バイトがバイト列 ctrl に属さないので NULL を返す return NULL; } // バイト集合 ctrl に属するバイトがバイト列 string で最初に現れる位置へのポインタを返す const char *p = static_cast<const char *>( string ); return const_cast<char *>( p + span ); }//mempbrk //********************************************************* // memcspn // バイト集合 ctrl[count] に属するバイトが // バイト列 string[length] で最初に現れる位置をバイト列先頭からのバイト数で返す // (バイト集合に属さないバイトが連続する部分バイト列の長さを返す) //********************************************************* int memcspn ( const void *string, int length, const char *ctrl, int count ) { const char *q = ctrl; char map[256 / CHAR_BIT]; memset( map, 0, sizeof(map) ); {for( int i = 0; i < count; i++ ) { const unsigned char c = *q++; const int index = c / CHAR_BIT; const int bit = c % CHAR_BIT; map[ index ] |= (1 << bit); }} const char *p = static_cast<const char *>( string ); {for( int span = 0; span < length; span++ ) { const unsigned char c = *p++; const int index = c / CHAR_BIT; const int bit = c % CHAR_BIT; if ( 0 != (map[index] & (1 << bit)) ) { return span; } }} // バイト集合に属さないバイトが連続する部分バイト列の長さはバイト列全体の長さに等しい return length; }//memcspn |
|
水無瀬 優 postmaster@katsura-kotonoha.sakura.ne.jp
同人ダウンロード販売|DL.Getchu.com