[YukiWiki] [[findSplitter()]]

[ トップ | 一覧 | 編集 | 差分 | 単語検索 | 最終更新 | ]


 シンプルすぎていじる余地がほとんどないYO!
 仕方ないから常套的に比較回数減らしてみた。

 /* 半角カナ・SJIS 2バイト文字のいずれでもない文字のなかから
  * spに一致する文字を探す 
  */
 char	*findSplitter(char *stt,int sp)
 {
	unsigned char	*p = (unsigned char*)stt;
	int c;

	sp &= 0xff;

	while(c = *p++)
	{
		if ( c >= 0x81 /* && c <= 0xfc */ ) {
			if ( c < 0xa0 || c > 0xdf )
				p++;
			continue;
		}
		if ( c == ss )
			return p - 1;
	}
	return	NULL		;
 }

テーブル化してみました。2バイト系の処理関数としてまとめてみてもいいかも。

read11.rev1.c からの変更としました。 最近の処理系は、int = 32bit だよね?

 const char s_PrintTbl[] = {
	0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,	/* 0x00 - 0x0f */
	0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,	/* 0x10 - 0x1f */
	0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,	/* 0x20 - 0x2f */
	0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,	/* 0x30 - 0x3f */
	0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,	/* 0x40 - 0x4f */
	0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,	/* 0x50 - 0x5f */
	0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,	/* 0x60 - 0x6f */
	0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,	/* 0x70 - 0x7f */
	0,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,	/* 0x80 - 0x8f */
	2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,	/* 0x90 - 0x9f */
	1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,	/* 0xa0 - 0xaf */
	1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,	/* 0xb0 - 0xbf */
	1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,	/* 0xc0 - 0xcf */
	1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,	/* 0xd0 - 0xdf */
	2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,	/* 0xe0 - 0xef */
	2,2,2,2,2,2,2,2,2,2,2,2,2,0,0,0,	/* 0xf0 - 0xff */
 };

 char	*findSplitter( char *stt, int sp )
 {
	unsigned char	*p = (unsigned char *)stt;
	char		ss = (unsigned char)( sp & 0x000000ff );

	while( *p ){
		if( s_PrintTbl[*p] ){
			p += s_PrintTbl[*p]; continue;
		}
		if( *p == ss )	return p;

		p++;
	}
	return NULL;
 }


YukiWiki 1.6.2 Copyright (C) 2000,2001 by Hiroshi Yuki.
Modified by aki.