00001
00012
00013 #include "NewtIconv.h"
00014
00015
00016 #ifdef HAVE_LIBICONV
00017
00030 char * NewtIconv(iconv_t cd, char * src, size_t srclen, size_t* dstlenp)
00031 {
00032 char * dst = NULL;
00033 size_t dstlen = 0;
00034
00035 if (cd != (iconv_t)-1)
00036 {
00037 size_t bufflen;
00038
00039 bufflen = srclen * 3;
00040 dst = malloc(bufflen);
00041
00042 if (dst)
00043 {
00044 const char * inbuf_p = src;
00045 char * outbuf_p = dst;
00046 size_t inbytesleft = srclen;
00047 size_t outbytesleft = bufflen;
00048 size_t status;
00049
00050 iconv(cd, NULL, NULL, NULL, NULL);
00051 status = iconv(cd, &inbuf_p, &inbytesleft, &outbuf_p, &outbytesleft);
00052
00053 if (status == (size_t)-1)
00054 {
00055 free(dst);
00056 dst = NULL;
00057 }
00058 else
00059 {
00060 dstlen = bufflen - outbytesleft;
00061 dst = realloc(dst, dstlen);
00062 }
00063 }
00064 }
00065
00066 if (dstlenp) *dstlenp = dstlen;
00067
00068 return dst;
00069 }
00070
00071 #endif
00072