/* unicode-jp.c -- JIS X 0208 <=> UCS-2 converter written by N. Tsuchimura */ #include #include #include #if defined(KANJI_ICONV) && defined(HAVE_ICONV_H) #include #include /* for atexit() */ #define ICONV_INVALID ((iconv_t)(-1)) #define ICONV_JIS "ISO-2022-JP" #define ICONV_UNI "UCS-2BE" static int inited = FALSE; static iconv_t i_jis2ucs2 = ICONV_INVALID; static iconv_t i_ucs22jis = ICONV_INVALID; #ifdef HAVE_ATEXIT static void close_iconv(void) #else /* HAVE_ATEXIT */ static void close_iconv(int dummy1, void *dummy2) #endif /* HAVE_ATEXIT */ { if (i_jis2ucs2 != ICONV_INVALID) iconv_close(i_jis2ucs2); if (i_ucs22jis != ICONV_INVALID) iconv_close(i_ucs22jis); } static void open_iconv(void) { inited = true; i_jis2ucs2 = iconv_open(ICONV_UNI, ICONV_JIS); i_ucs22jis = iconv_open(ICONV_JIS, ICONV_UNI); #ifdef HAVE_ATEXIT atexit(close_iconv); #endif /* HAVE_ATEXIT */ #ifdef HAVE_ON_EXIT on_exit(close_iconv, NULL); #endif /* HAVE_ON_EXIT */ } /* convert a JIS X 0208 char to UCS-2 */ static int JIStoUCS2native(int jis) { unsigned char jis_seq[8] = { 0x1b, 0x24, 0x42, /* JIS X 0208-1983 */ (unsigned char)HI(jis), (unsigned char)LO(jis), 0x1b, 0x28, 0x42, /* ASCII */ }; unsigned char unicode[2]; size_t from = sizeof jis_seq; size_t to = sizeof unicode; char *from_ptr = (char *)jis_seq; char *to_ptr = (char *)unicode; if (!inited) open_iconv(); if (i_jis2ucs2 == ICONV_INVALID) return 0; if (iconv(i_jis2ucs2, &from_ptr, &from, &to_ptr, &to) == (size_t)(-1)) { return 0; } return HILO(unicode[0], unicode[1]); } /* convert a UCS-2 char to JIS X 0208 */ static int UCS2toJISnative(int ucs2) { unsigned char unicode[2] = { (unsigned char)HI(ucs2), (unsigned char)LO(ucs2), }; unsigned char jis_seq[10] = { 0,0,0,0,0,0,0,0,0,0 }; size_t from = sizeof unicode; size_t to = sizeof jis_seq; char *from_ptr = (char *)unicode; char *to_ptr = (char *)jis_seq; unsigned char *ret = jis_seq; if (!inited) open_iconv(); if (i_ucs22jis == ICONV_INVALID) return 0; if (iconv(i_ucs22jis, &from_ptr, &from, &to_ptr, &to) == (size_t)(-1)) { return 0; } if (ret[0] == 0x1b) ret += 3; return HILO(ret[0], ret[1]); } #else /* KANJI_ICONV && HAVE_ICONV_H */ #include "jisx0208.h" #define MAXJIS 84 /* convert a JIS X 0208 char to UCS-2 */ static int JIStoUCS2native(int jis) { int hi, low; if (jis == 0x2121) return 0x3000; /* UnicodeTbl[0][0] bug fix */ hi = HI(jis) - 0x21; low = LO(jis) - 0x21; if (0 <= hi && hi < MAXJIS && 0 <= low && low < 94) return (int)UnicodeTbl[hi][low]; return 0; } /* convert a UCS-2 char to JIS X 0208 */ static int UCS2toJISnative(int ucs2) { int i, j; if (ucs2 == 0x3000) return 0x2121; /* UnicodeTbl[0][0] bug fix */ for (i=0; i int main(int argc, char **argv) { int hi, low; for (hi=0; hi