/* Contributed by Jiro SEKIBA . */ #include #include #include #include #include #include #define UCS_STR "\x4e\x8c" /* EUC-TW 0xa2a2, EUC-JP 0x */ static const char *to_code; static bool xiconv (iconv_t cd, int out_size) { unsigned char euc[4]; char *inp = (char *) UCS_STR; char *outp = (char *) euc; size_t inbytesleft = strlen (UCS_STR); size_t outbytesleft = out_size; size_t ret; bool fail = false; errno = 0; ret = iconv (cd, &inp, &inbytesleft, &outp, &outbytesleft); if (errno || ret == (size_t) -1) { fail = out_size == 4 || errno != E2BIG; printf ("expected %d (E2BIG), got %d (%m)\n", E2BIG, errno); } else { printf ("%s: 0x%02x%02x\n", to_code, euc[0], euc[1]); if (out_size == 1) fail = true; } return fail; } static iconv_t xiconv_open (const char *code) { iconv_t cd; to_code = code; errno = 0; if (errno || (cd = iconv_open (to_code, "UCS-2BE")) == (iconv_t) -1) { puts ("Can't open converter"); exit (1); } return cd; } int main (void) { iconv_t cd; int result = 0; cd = xiconv_open ("EUC-TW"); result |= xiconv (cd, 4) == true; puts ("---"); result |= xiconv (cd, 1) == true; puts ("---"); iconv_close (cd); cd = xiconv_open ("EUC-JP"); result |= xiconv (cd, 4) == true; puts ("---"); result |= xiconv (cd, 1) == true; puts ("---"); iconv_close (cd); return result; }