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