in sql-odbc/src/sqlodbc/multibyte.c [120:262]
static int opensearch_CS_stat(int stat, unsigned int character, int characterset_code) {
if (character == 0)
stat = 0;
switch (characterset_code) {
case UTF8: {
if (stat < 2 && character >= 0x80) {
if (character >= 0xfc)
stat = 6;
else if (character >= 0xf8)
stat = 5;
else if (character >= 0xf0)
stat = 4;
else if (character >= 0xe0)
stat = 3;
else if (character >= 0xc0)
stat = 2;
} else if (stat >= 2 && character > 0x7f)
stat--;
else
stat = 0;
} break;
/* SHIFT_JIS_2004 Support. */
case SHIFT_JIS_2004: {
if (stat < 2 && character >= 0x81 && character <= 0x9f)
stat = 2;
else if (stat < 2 && character >= 0xe0 && character <= 0xef)
stat = 2;
else if (stat < 2 && character >= 0xf0 && character <= 0xfc)
stat = 2;
else if (stat == 2)
stat = 1;
else
stat = 0;
} break;
/* Shift-JIS Support. */
case SJIS: {
if (stat < 2 && character > 0x80
&& !(character > 0x9f && character < 0xe0))
stat = 2;
else if (stat == 2)
stat = 1;
else
stat = 0;
} break;
/* Chinese Big5 Support. */
case BIG5: {
if (stat < 2 && character > 0xA0)
stat = 2;
else if (stat == 2)
stat = 1;
else
stat = 0;
} break;
/* Chinese GBK Support. */
case GBK: {
if (stat < 2 && character > 0x7F)
stat = 2;
else if (stat == 2)
stat = 1;
else
stat = 0;
} break;
/* Korian UHC Support. */
case UHC: {
if (stat < 2 && character > 0x7F)
stat = 2;
else if (stat == 2)
stat = 1;
else
stat = 0;
} break;
case EUC_JIS_2004:
/* 0x8f is JIS X 0212 + JIS X 0213(2) 3 byte */
/* 0x8e is JIS X 0201 2 byte */
/* 0xa0-0xff is JIS X 0213(1) 2 byte */
case EUC_JP:
/* 0x8f is JIS X 0212 3 byte */
/* 0x8e is JIS X 0201 2 byte */
/* 0xa0-0xff is JIS X 0208 2 byte */
{
if (stat < 3 && character == 0x8f) /* JIS X 0212 */
stat = 3;
else if (stat != 2
&& (character == 0x8e
|| character > 0xa0)) /* Half Katakana HighByte &
Kanji HighByte */
stat = 2;
else if (stat == 2)
stat = 1;
else
stat = 0;
}
break;
/* EUC_CN, EUC_KR, JOHAB Support */
case EUC_CN:
case EUC_KR:
case JOHAB: {
if (stat < 2 && character > 0xa0)
stat = 2;
else if (stat == 2)
stat = 1;
else
stat = 0;
} break;
case EUC_TW: {
if (stat < 4 && character == 0x8e)
stat = 4;
else if (stat == 4 && character > 0xa0)
stat = 3;
else if ((stat == 3 || stat < 2) && character > 0xa0)
stat = 2;
else if (stat == 2)
stat = 1;
else
stat = 0;
} break;
/*Chinese GB18030 support.Added by Bill Huang <bhuang@redhat.com>
* <bill_huanghb@ybb.ne.jp>*/
case GB18030: {
if (stat < 2 && character > 0x80)
stat = 2;
else if (stat == 2) {
if (character >= 0x30 && character <= 0x39)
stat = 3;
else
stat = 1;
} else if (stat == 3) {
if (character >= 0x30 && character <= 0x39)
stat = 1;
else
stat = 3;
} else
stat = 0;
} break;
default: {
stat = 0;
} break;
}
return stat;
}