static int opensearch_CS_stat()

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;
}