シフトJIS文字列の判定処理例

#define jms1(c) \
(((0x81 <= ((unsigned char)(c))) && (((unsigned char)(c)) <= 0x9F)) || ((0xE0 <= ((unsigned char)(c))) && (((unsigned char)(c)) <= 0xFC) ))
#define jms2(c) \
((0x7F != (unsigned char)(c)) && (0x40 <= ((unsigned char)(c))) && (((unsigned char)(c)) <= 0xFC))

//*********************************************************
// 文字列 str の str[nPos] について、
//   0 …… 1バイト文字
//   1 …… 2バイト文字の一部(第1バイト)
//   2 …… 2バイト文字の一部(第2バイト)
// のいずれかを返す。
//*********************************************************
int isJMS( const char *str, int nPos )
{
	int i;
	int state; // { 0, 1, 2 }

	// 0 = 1バイト文字
	// 1 = 2バイト文字の第1バイト
	// 2 = 2バイト文字の第2バイト
	state = 0;
	for( i = 0; str[i] != '\0'; i++ )
	{
		if      ( ( state == 0 ) && ( jms1( str[i] ) ) ) state = 1; // 0 -> 1
		else if ( ( state == 1 ) && ( jms2( str[i] ) ) ) state = 2; // 1 -> 2
		else if ( ( state == 2 ) && ( jms1( str[i] ) ) ) state = 1; // 2 -> 1
		else                                             state = 0; // 2 -> 0, その他

		// str[nPos] での状態を返す。
		if ( i == nPos ) return state;
	}
	return 0;
}//isJMS

ネタ元