SJIS判定

改行を80文字間隔くらいで適度にいれたいとき

/*
非漢字              0x8140-0x84BE
第一水準            0x889F-0x9872
第二水準            0x989F-0x9FFC, 0xE040-0xEAA4
NEC 特殊文字 	    0x8740-0x879C
NEC選定IBM拡張文字 	0xED40-0xEEFC
IBM選定IBM拡張文字 	0xFA40-0xFC4B
*/
#define SJIS(c) \
   (((((unsigned char)c)>=0x81)&&(((unsigned char)c)<=0x9f))\
  ||((((unsigned char)c)>=0xe0)&&(((unsigned char)c)<=0xfc)))

	int nSpl = 79;
	int nLen = size > nSpl ? nSpl : size;
	if(nLen>xxxx) {
		while(((unsigned)p[nLen-1])&0x80) nLen--;
		nLen += ((nSpl - nLen) / 2 * 2); //二の倍数になるよ
	}
	memcpy(rString.GetBufferSetLength(nLen), p, nLen*sizeof(TCHAR));

末尾から判定するときは、上位ビットが立っていないところまでモドって2の倍数分だけすすむ

{0x80, 0x33, 0x88, 0x80, 0x66, 0x88, 0x86, 0x89, 0x84}
                               <1    <1    <1    <1
                               >2           >2          

ちなみに半角文字判定はしてない
半角文字まで確実に戻りたいなら、頭から判定するか、二文字比較しないとだめ
あれ 結局 SJIS判定使ってないんじゃ...www