[[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 & 0x0000ff );
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.