NewtIconv.c

説明を見る。
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 /* HAVE_LIBICONV */
00072 

NEWT/0に対してThu Nov 23 16:50:43 2006に生成されました。  doxygen 1.5.0