[PR]

『新妻LOVELY×CATION』を応援しています!

ある集合に属するバイトが最初に現れる
バイト列中の位置を調べる

戻る

 あるバイト列中で指定のバイト集合に属するバイトが最初に現れる位置を調べる関数を作る。

//*********************************************************
// 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


Google
ご意見・ご感想をお聞かせ下さい。匿名で送信できます。

 * 返信が必要な場合には postmaster@katsura-kotonoha.sakura.ne.jp へ直接メールしてください。

水無瀬 優 postmaster@katsura-kotonoha.sakura.ne.jp
『新妻LOVELY×CATION』を応援しています!