61{
62 iconv_t cd;
63 char *outputptr;
64 size_t outbytesleft;
65 size_t inbytesleft;
66
67 inbytesleft = strlen(inputbuf);
68
69 cd = iconv_open("UTF-8", fromcode);
70 if ( cd == ((iconv_t)(-1)) )
72
73 outbytesleft = inbytesleft * 3 + 1;
74
75 *outputbuf = (
char *)
malloc(outbytesleft);
76 if (!*outputbuf)
78
79 memset(*outputbuf, 0, outbytesleft);
80 outputptr = *outputbuf;
81
82
83 if ( iconv(cd, &inputbuf, &inbytesleft, &outputptr, &outbytesleft) == (size_t)-1 )
84 {
85#ifdef HAVE_ICONVCTL
86 int on = 1;
87
88 iconvctl(cd, ICONV_SET_TRANSLITERATE, &on);
89 if ( iconv(cd, &inputbuf, &inbytesleft, &outputptr, &outbytesleft) == -1 )
90 {
91
92 iconvctl(cd, ICONV_SET_DISCARD_ILSEQ, &on);
93 if ( iconv(cd, &inputbuf, &inbytesleft, &outputptr, &outbytesleft) == -1 )
94 {
95
97 iconv_close(cd);
99 }
100 }
101 iconv_close(cd);
103#else
105 iconv_close(cd);
107#endif
108 }
109
110 iconv_close(cd);
112}