⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 charset.c

📁 在ADS环境下MiniGUI的源码
💻 C
📖 第 1 页 / 共 5 页
字号:
{
    unsigned char ch1;
    unsigned char ch2;

    if (len < 2) return 0;

    ch1 = mstr [0];
    if (ch1 == '\0')
        return 0;

    ch2 = mstr [1];
    if (ch1 >= 0xA1 && ch1 <= 0xFE && ch2 >= 0xA1 && ch2 <= 0xFE)
        return 2;

    return 0;
}

static unsigned int jisx0208_0_char_offset (const unsigned char* mchar)
{
#if 1
    return ((mchar [0] - 0xA1) * 94 + mchar [1] - 0xA1);
#else
    if(mchar [0] > 0xAA)
        return ((mchar [0] - 0xA6 - 0x02) * 94 + mchar [1] - 0xC1 - 0xC4);
    else
        return ((mchar [0] - 0xA1 - 0x02) * 83 + mchar [1] - 0xA1 + 0x7E);
#endif
}

static int jisx0208_0_is_this_charset (const unsigned char* charset)
{
    int i;
    char name [LEN_FONT_NAME + 1];

    for (i = 0; i < LEN_FONT_NAME + 1; i++) {
        if (charset [i] == '\0')
            break;
        name [i] = toupper (charset [i]);
    }
    name [i] = '\0';

    if ((strstr (name, "JISX0208") && strstr (name, "-0")) ||
            (strstr (name, "EUC") && strstr (name, "JP")))
        return 0;

    return 1;
}

static int jisx0208_0_len_first_substr (const unsigned char* mstr, int mstrlen)
{
    unsigned char ch1;
    unsigned char ch2;
    int i, left;
    int sub_len = 0;

    left = mstrlen;
    for (i = 0; i < mstrlen; i += 2) {
        if (left < 2) return sub_len;

        ch1 = mstr [i];
        if (ch1 == '\0') return sub_len;

        ch2 = mstr [i + 1];
        if (ch1 >= 0xA1 && ch1 <= 0xFE && ch2 >= 0xA1 && ch2 <= 0xFE)
            sub_len += 2;
        else
            return sub_len;

        left -= 2;
    }

    return sub_len;
}

static int jisx0208_0_pos_first_char (const unsigned char* mstr, int mstrlen)
{
    unsigned char ch1;
    unsigned char ch2;
    int i, left;

    i = 0;
    left = mstrlen;
    while (left) {
        if (left < 2) return -1;

        ch1 = mstr [i];
        if (ch1 == '\0') return -1;

        ch2 = mstr [i + 1];
        if (ch1 >= 0xA1 && ch1 <= 0xFE && ch2 >= 0xA1 && ch2 <= 0xFE)
            return i;

        i += 1;
        left -= 1;
    }

    return -1;
}

#ifdef _UNICODE_SUPPORT
static unsigned short jisx0208_0_conv_to_uc16 (const unsigned char* mchar, int len)
{
    unsigned short ucs_code = jisx0208_0_unicode_map [jisx0208_0_char_offset (mchar)];

    if (ucs_code == 0)
        return '?';

    return ucs_code;
}
#endif

static CHARSETOPS CharsetOps_jisx0208_0 = {
    8836,
    2,
    2,
    FONT_CHARSET_JISX0208_0,
    {'\xA1', '\xA1'},
    jisx0208_0_len_first_char,
    jisx0208_0_char_offset,
    db_nr_chars_in_str,
    jisx0208_0_is_this_charset,
    jisx0208_0_len_first_substr,
    db_get_next_word,
    jisx0208_0_pos_first_char,
#ifdef _UNICODE_SUPPORT
    jisx0208_0_conv_to_uc16
#endif
};
/************************* End of EUCJP *************************************/

#endif /* _EUCJP_SUPPORT */

#ifdef _SHIFTJIS_SUPPORT

/************************* SHIFTJIS Specific Operations ************************/
static int jisx0201_1_is_this_charset (const unsigned char* charset)
{
    int i;
    char name [LEN_FONT_NAME + 1];

    for (i = 0; i < LEN_FONT_NAME + 1; i++) {
        if (charset [i] == '\0')
            break;
        name [i] = toupper (charset [i]);
    }
    name [i] = '\0';

    if (strstr (name, "JISX0201") && strstr (name, "-1"))
        return 0;

    return 1;
}


#ifdef _UNICODE_SUPPORT
static unsigned short jisx0201_1_conv_to_uc16 (const unsigned char* mchar, int len)
{
    unsigned char ch1 = mchar [0];

    if (ch1 >= 0xA1 && ch1 <= 0xDF)
        return 0xFF61 + ch1 - 0xA1;
    else if (ch1 == 0x5C)
        return 0x00A5;
    else if (ch1 == 0x80)
        return 0x005C;

    return ch1;
}
#endif

static CHARSETOPS CharsetOps_jisx0201_1 = {
    190,
    1,
    1,
    FONT_CHARSET_JISX0201_1,
    {' '},
    sb_len_first_char,
    sb_char_offset,
    sb_nr_chars_in_str,
    jisx0201_1_is_this_charset,
    sb_len_first_substr,
    sb_get_next_word,
    sb_pos_first_char,
#ifdef _UNICODE_SUPPORT
    jisx0201_1_conv_to_uc16
#endif
};

static int jisx0208_1_len_first_char (const unsigned char* mstr, int len)
{
    unsigned char ch1;
    unsigned char ch2;

    if (len < 2) return 0;

    ch1 = mstr [0];
    if (ch1 == '\0')
        return 0;

    ch2 = mstr [1];
    if (((ch1 >= 0x81 && ch1 <= 0x9F) || (ch1 >= 0xE0 && ch1 <= 0xEF)) && 
            ((ch2 >= 0x40 && ch2 <= 0x7E) || (ch2 >= 0x80 && ch2 <= 0xFC)))
        return 2;

    return 0;
}

static unsigned int jisx0208_1_char_offset (const unsigned char* mchar)
{
    unsigned char ch1 = mchar [0];
    unsigned char ch2 = mchar [1];

#if 0
    if (ch1 >= 0x81 && ch1 <= 0x9F) {
        if (ch2 >= 0x40 && ch2 <= 0x7E) {
            return ((ch1 - 0x81) * 0x3F + ch2 - 0x40);
        }
        else {
            return (ch1 - 0x81) * 0x7D + ch2 - 0x80 + (0x1F * 0x3F);
        }
    }
    else {
        if (ch2 >= 0x40 && ch2 <= 0x7E) {
            return ((ch1 - 0xE0) * 0x3F + ch2 - 0x40) + 0x1F * (0x3F + 0x7D);
        }
        else {
            return ((ch1 - 0xE0) * 0x7D + ch2 - 0x80) + 0x1F * (0x3F + 0x7D) + 0x10 * 0x3F;
        }
    }
#else
    int adjust = ch2 < 159;
    int rowOffset = ch1 < 160 ? 112 : 176;
    int cellOffset = adjust ? (ch2 > 127 ? 32 : 31) : 126;

    ch1 = ((ch1 - rowOffset) << 1) - adjust;
    ch2 -= cellOffset;

    ch1 += 128;
    ch2 += 128;

    return ((ch1 - 0xA1) * 94 + ch2 - 0xA1);
#endif
}

static int jisx0208_1_is_this_charset (const unsigned char* charset)
{
    int i;
    char name [LEN_FONT_NAME + 1];

    for (i = 0; i < LEN_FONT_NAME + 1; i++) {
        if (charset [i] == '\0')
            break;
        name [i] = toupper (charset [i]);
    }
    name [i] = '\0';

    if ((strstr (name, "JISX0208") && strstr (name, "-1")) ||
            (strstr (name, "SHIFT") && strstr (name, "JIS")))
        return 0;

    return 1;
}

static int jisx0208_1_len_first_substr (const unsigned char* mstr, int mstrlen)
{
    unsigned char ch1;
    unsigned char ch2;
    int i, left;
    int sub_len = 0;

    left = mstrlen;
    for (i = 0; i < mstrlen; i += 2) {
        if (left < 2) return sub_len;

        ch1 = mstr [i];
        if (ch1 == '\0') return sub_len;

        ch2 = mstr [i + 1];
        if (((ch1 >= 0x81 && ch1 <= 0x9F) || (ch1 >= 0xE0 && ch1 <= 0xEF)) && 
                ((ch2 >= 0x40 && ch2 <= 0x7E) || (ch2 >= 0x80 && ch2 <= 0xFC)))
            sub_len += 2;
        else
            return sub_len;

        left -= 2;
    }

    return sub_len;
}

static int jisx0208_1_pos_first_char (const unsigned char* mstr, int mstrlen)
{
    unsigned char ch1;
    unsigned char ch2;
    int i, left;

    i = 0;
    left = mstrlen;
    while (left) {
        if (left < 2) return -1;

        ch1 = mstr [i];
        if (ch1 == '\0') return -1;

        ch2 = mstr [i + 1];
        if (((ch1 >= 0x81 && ch1 <= 0x9F) || (ch1 >= 0xE0 && ch1 <= 0xEF)) && 
                ((ch2 >= 0x40 && ch2 <= 0x7E) || (ch2 >= 0x80 && ch2 <= 0xFC)))
            return i;

        i += 1;
        left -= 1;
    }

    return -1;
}

#ifdef _UNICODE_SUPPORT
static unsigned short jisx0208_1_conv_to_uc16 (const unsigned char* mchar, int len)
{
    unsigned short ucs_code = jisx0208_1_unicode_map [jisx0208_1_char_offset (mchar)];

    if (ucs_code == 0)
        return '?';

    return ucs_code;
}
#endif

static CHARSETOPS CharsetOps_jisx0208_1 = {
    8836,
    2,
    2,
    FONT_CHARSET_JISX0208_1,
    {'\xA1', '\xA1'},
    jisx0208_1_len_first_char,
    jisx0208_1_char_offset,
    db_nr_chars_in_str,
    jisx0208_1_is_this_charset,
    jisx0208_1_len_first_substr,
    db_get_next_word,
    jisx0208_1_pos_first_char,
#ifdef _UNICODE_SUPPORT
    jisx0208_1_conv_to_uc16
#endif
};
/************************* End of SHIFTJIS *************************************/

#endif /* _SHIFTJIS_SUPPORT */

#ifdef _UNICODE_SUPPORT

/************************* UNICODE Specific Operations ************************/
static int utf8_len_first_char (const unsigned char* mstr, int len)
{
    int c = *((unsigned char *)mstr);
    int n = 1;

    if (c & 0x80) {
        while (c & (0x80 >> n))
            n++;
    }

    return n;
}

static unsigned short utf8_conv_to_uc16 (const unsigned char* mchar, int len)
{
    int c = *((unsigned char *)(mchar++));
    int n, t;

    if (c & 0x80) {
        n = 1;
        while (c & (0x80 >> n))
            n++;

        c &= (1 << (8-n)) - 1;
        while (--n > 0) {
            t = *((unsigned char *)(mchar++));

            if ((!(t & 0x80)) || (t & 0x40))
                return '^';

            c = (c << 6) | (t & 0x3F);
        }
    }

    return (unsigned short) c;
}

static unsigned int utf8_char_offset (const unsigned char* mchar)
{
    return utf8_conv_to_uc16 (mchar, 0);
}

static int utf8_nr_chars_in_str (const unsigned char* mstr, int mstrlen)
{
    int charlen;
    int n = 0;
    int left = mstrlen;

    while (left >= 0) {
        charlen = utf8_len_first_char (mstr, left);
        if (charlen > 0)
            n ++;

        left -= charlen;
        mstr += charlen;
    }

    return n;
}

static int utf8_is_this_charset (const unsigned char* charset)
{
    int i;
    char name [LEN_FONT_NAME + 1];

    for (i = 0; i < LEN_FONT_NAME + 1; i++) {
        if (charset [i] == '\0')
            break;
        name [i] = toupper (charset [i]);
    }
    name [i] = '\0';

    if (strstr (name, "UTF") && strstr (name, "8"))
        return 0;

    return 1;
}

static int utf8_len_first_substr (const unsigned char* mstr, int mstrlen)
{
    return mstrlen;
}

static int utf8_pos_first_char (const unsigned char* mstr, int mstrlen)
{
    return 0;
}

static CHARSETOPS CharsetOps_utf8 = {
    65535,
    2,
    4,
    FONT_CHARSET_UTF8,
    {'\xA1', '\xA1'},
    utf8_len_first_char,
    utf8_char_offset,
    utf8_nr_chars_in_str,
    utf8_is_this_charset,
    utf8_len_first_substr,
    sb_get_next_word,
    utf8_pos_first_char,
#ifdef _UNICODE_SUPPORT
    utf8_conv_to_uc16
#endif
};

/************************* End of UNICODE *************************************/
#endif /* _UNICODE_SUPPORT */

static CHARSETOPS* Charsets [] =
{
    &CharsetOps_ascii,
#ifdef _LATIN10_SUPPORT
    &CharsetOps_iso8859_16,
#endif
#ifdef _LATIN9_SUPPORT
    &CharsetOps_iso8859_15,
#endif
#ifdef _LATIN8_SUPPORT
    &CharsetOps_iso8859_14,
#endif
#ifdef _LATIN7_SUPPORT
    &CharsetOps_iso8859_13,
#endif
#ifdef _THAI_SUPPORT
    &CharsetOps_iso8859_11,
#endif
#ifdef _LATIN6_SUPPORT
    &CharsetOps_iso8859_10,
#endif
#ifdef _LATIN5_SUPPORT
    &CharsetOps_iso8859_9,
#endif
#ifdef _HEBREW_SUPPORT
    &CharsetOps_iso8859_8,
#endif
#ifdef _GREEK_SUPPORT
    &CharsetOps_iso8859_7,
#endif
#ifdef _ARABIC_SUPPORT
    &CharsetOps_iso8859_6,
#endif
#ifdef _CYRILLIC_SUPPORT
    &CharsetOps_iso8859_5,
#endif
#ifdef _LATIN4_SUPPORT
    &CharsetOps_iso8859_4,
#endif
#ifdef _LATIN3_SUPPORT
    &CharsetOps_iso8859_3,
#endif
#ifdef _LATIN2_SUPPORT
    &CharsetOps_iso8859_2,
#endif
    &CharsetOps_iso8859_1,
#ifdef _GB_SUPPORT
    &CharsetOps_gb2312_0,
#endif
#ifdef _GBK_SUPPORT
    &CharsetOps_gbk,
#endif
#ifdef _GB18030_SUPPORT
    &CharsetOps_gb18030_0,
#endif
#ifdef _BIG5_SUPPORT
    &CharsetOps_big5,
#endif
#ifdef _EUCKR_SUPPORT
    &CharsetOps_ksc5601_0,
#endif
#ifdef _EUCJP_SUPPORT
    &CharsetOps_jisx0201_0,
    &CharsetOps_jisx0208_0,
#endif
#ifdef _SHIFTJIS_SUPPORT
    &CharsetOps_jisx0201_1,
    &CharsetOps_jisx0208_1,
#endif
#ifdef _UNICODE_SUPPORT
    &CharsetOps_utf8,
#endif
};

#define NR_CHARSETS     (sizeof(Charsets)/sizeof(CHARSETOPS*))

CHARSETOPS* GetCharsetOps (const char* charset_name)
{
    int i;

    for (i = 0; i < NR_CHARSETS; i++) {
        if ((*Charsets [i]->is_this_charset) (charset_name) == 0)
            return Charsets [i];
    }

    return NULL;
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -