/* Copyright (C)1999 ASH multimedia lab. (http://ash.jp/) */ #include #include #include #include "libstr.h" /******************************/ /* 文字列の指定位置の状態判定 */ /******************************/ int judge_char(code, mode, str, len, sta, byte, keta, kind) int code; /* 文字コード (i) */ /* CD_JIS,CD_SJIS,CD_EUC,CD_UTF8,CD_UTF16 */ int *mode; /* JIS文字モード (i/o) */ /* JIS_ROMA,JIS_KANA,JIS_KNJI,JIS_HOJO */ char *str; /* 入力文字列 (i) */ int len; /* 入力文字列バイト数 (i) */ int sta; /* 判定バイト位置 (i) */ int *byte; /* バイト数 (o) */ int *keta; /* 表示桁数 (o) */ int *kind; /* 文字の種類 (o) */ /* CH_BIN,CH_CTRL,CH_ROMA,CH_KANA,CH_KNJI,CH_HOJO */ /* 返却値 0: 正常 */ /* -1: 入力文字列が不正(staの値) */ { unsigned char *c = (unsigned char *)&str[sta]; if (code == CD_JIS) { if (c[0] == 0x1b) { if (c[1] == 0x28) { if (c[2] == 0x42) { *kind = CH_CTRL; /* エスケープシーケンス */ *mode = JIS_ROMA; /* JISローマ字モード */ *byte = 3; *keta = 1; goto end; } else if (c[2] == 0x4a) { *kind = CH_CTRL; /* エスケープシーケンス */ *mode = JIS_ROMA; /* JISローマ字モード */ *byte = 3; *keta = 1; goto end; } else if (c[2] == 0x49) { *kind = CH_CTRL; /* エスケープシーケンス */ *mode = JIS_KANA; /* JISカナモード */ *byte = 3; *keta = 1; goto end; } } else if (c[1] == 0x24) { if (c[2] == 0x40) { *kind = CH_CTRL; /* エスケープシーケンス */ *mode = JIS_KNJI; /* JIS漢字モード */ *byte = 3; *keta = 1; goto end; } else if (c[2] == 0x42) { *kind = CH_CTRL; /* エスケープシーケンス */ *mode = JIS_KNJI; /* JIS漢字モード */ *byte = 3; *keta = 1; goto end; } else if (c[2] == 0x44) { *kind = CH_CTRL; /* エスケープシーケンス */ *mode = JIS_HOJO; /* JIS補助漢字モード */ *byte = 3; *keta = 1; goto end; } } } else { if (*mode == JIS_ROMA) { if ((c[0] >= 0x20) && (c[0] <= 0x7e)) { *kind = CH_ROMA; /* JISローマ字 */ *mode = JIS_ROMA; /* JISローマ字モード */ *byte = 1; *keta = 1; goto end; } if ((c[0] >= 0x07) && (c[0] <= 0x0f)) { *kind = CH_CTRL; /* 制御記号 */ *mode = JIS_ROMA; /* 制御記号モード */ *byte = 1; *keta = 1; goto end; } } else if (*mode == JIS_KANA) { if ((c[0] >= 0x21) && (c[0] <= 0x5f)) { *kind = CH_KANA; /* JISカナ */ *mode = JIS_KANA; /* JISカナモード */ *byte = 1; *keta = 1; goto end; } } else if (*mode == JIS_KNJI) { if ((c[0] >= 0x21) && (c[0] <= 0x7e)) { if ((c[1] >= 0x21) && (c[1] <= 0x7e)) { *kind = CH_KNJI; /* JIS漢字 */ *mode = JIS_KNJI; /* JIS漢字モード */ *byte = 2; *keta = 2; goto end; } } } } } else if (code == CD_SJIS) { if ((c[0] >= 0x20) && (c[0] <= 0x7e)) { *kind = CH_ROMA; /* JISローマ字 */ *byte = 1; *keta = 1; goto end; } else if (c[0] <= 0x7f) { *kind = CH_CTRL; /* 制御記号 */ *byte = 1; *keta = 1; goto end; } else if ((c[0] >= 0xa1) && (c[0] <= 0xdf)) { *kind = CH_KANA; /* JISカナ */ *byte = 1; *keta = 1; goto end; } else if (((c[0] >= 0x81) && (c[0] <= 0x9f)) || ((c[0] >= 0xe0) && (c[0] <= 0xef))) { if (((c[1] >= 0x40) && (c[1] <= 0x7e)) || ((c[1] >= 0x80) && (c[1] <= 0xfc))) { *kind = CH_KNJI; /* JIS漢字 */ *byte = 2; *keta = 2; goto end; } } } else if (code == CD_EUC) { if ((c[0] >= 0x20) && (c[0] <= 0x7e)) { /* JISローマ字 */ *kind = CH_ROMA; /* JISローマ字 */ *byte = 1; *keta = 1; goto end; } else if (c[0] <= 0x7f) { /* 制御記号 */ if ((c[0] >= 0x07) && (c[0] <= 0x0f)) { *kind = CH_CTRL; /* 制御記号 */ *byte = 1; *keta = 1; goto end; } } else if ((c[0] >= 0xa1) && (c[0] <= 0xfe)) { if ((c[1] >= 0xa1) && (c[1] <= 0xfe)) { *kind = CH_KNJI; /* JIS漢字 */ *byte = 2; *keta = 2; goto end; } } else if (c[0] == 0x8e) { if ((c[1] >= 0xa1) && (c[1] <= 0xdf)) { *kind = CH_KANA; /* JISカナ */ *byte = 2; *keta = 1; goto end; } } else if (c[0] == 0x8f) { if ((c[1] >= 0xa1) && (c[1] <= 0xfe)) { if ((c[2] >= 0xa1) && (c[2] <= 0xfe)) { *kind = CH_HOJO; /* JIS補助漢字 */ *byte = 3; *keta = 2; goto end; } } } } /* その他の文字 */ *kind = CH_BIN; /* バイナリ */ if (code == CD_JIS) {*mode = JIS_ROMA;} *byte = 1; *keta = 1; end:; #ifdef DEBUG printf("\njudge_char(code=%d,mode=%d", code, *mode); printf(",str=%02x", (unsigned char)str[sta]); printf("%02x", (unsigned char)str[sta+1]); printf(",len=%d,sta=%d", len, sta); printf(",byte=%d,keta=%d,kind=%d)\n", *byte, *keta, *kind); #endif } /**********************/ /* 文字コード変換処理 */ /**********************/ /* JIS -> EUC */ void jis2euc(cj, ce) unsigned char *cj; /* JISコード文字列 */ unsigned char *ce; /* EUCコード文字列 */ { ce[0] = cj[0] | 0x80; ce[1] = cj[1] | 0x80; ce[2] = 0x00; } /* SJIS -> EUC */ void sjis2euc(cs, ce) unsigned char *cs; /* SJISコード文字列 */ unsigned char *ce; /* EUCコード文字列 */ { unsigned char cj[9]; /* SJIS -> JIS */ sjis2jis(cs, cj); /* JIS -> EUC */ jis2euc(cj, ce); } /* SJIS -> JIS */ void sjis2jis(cs, cj) unsigned char *cs; /* SJISコード文字列 */ unsigned char *cj; /* JISコード文字列 */ { /* 1バイト目の変換 */ if (cs[0] < 0xe0) { /* 81-9F -> 21-5E */ cj[0] = (cs[0] - 0x70) << 1; } else { /* 80-90 -> 60-70 */ cj[0] = (cs[0] - 0xb0) << 1; } /* 2バイト目の変換 */ if (cs[1] < 0x9e) { /* 奇数区 */ cj[0]--; if (cs[1] < 0x80) { /* 3F-6F -> 20-50 */ cj[1] = cs[1] - 0x1f; } else { /* 80-90 -> 60-70 */ cj[1] = cs[1] - 0x20; } } else { /* 9E-EE -> 20-70 */ cj[1] = cs[1] - 0x7e; } cj[2] = 0x00; }