"Fossies" - the Fresh Open Source Software Archive

Member "libextractor-1.11/src/main/iconv.c" (30 Jan 2021, 2190 Bytes) of package /linux/privat/libextractor-1.11.tar.gz:


As a special service "Fossies" has tried to format the requested source page into HTML format using (guessed) C and C++ source code syntax highlighting (style: standard) with prefixed line numbers and code folding option. Alternatively you can here view or download the uninterpreted source code file. For more information about "iconv.c" see the Fossies "Dox" file reference documentation.

    1 /*
    2      This file is part of libextractor.
    3      Copyright (C) 2002, 2003, 2004 Vidyut Samanta and Christian Grothoff
    4 
    5      libextractor is free software; you can redistribute it and/or modify
    6      it under the terms of the GNU General Public License as published
    7      by the Free Software Foundation; either version 2, or (at your
    8      option) any later version.
    9 
   10      libextractor is distributed in the hope that it will be useful, but
   11      WITHOUT ANY WARRANTY; without even the implied warranty of
   12      MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
   13      General Public License for more details.
   14 
   15      You should have received a copy of the GNU General Public License
   16      along with libextractor; see the file COPYING.  If not, write to the
   17      Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
   18      Boston, MA 02110-1301, USA.
   19 */
   20 
   21 /**
   22  * @file main/iconv.c
   23  * @brief convenience functions for character conversion
   24  * @author Christian Grothoff
   25  */
   26 
   27 /**
   28  * Convert the given input using the given converter
   29  * and return as a 0-terminated string.
   30  *
   31  * @param cd converter to use
   32  * @param in input string
   33  * @param inSize number of bytes in 'in'
   34  * @return NULL on error, otherwise the converted string (to be free'd by caller)
   35  */
   36 static char *
   37 iconv_helper (iconv_t cd,
   38               const char *in,
   39               size_t inSize)
   40 {
   41 #if HAVE_ICONV
   42   char *buf;
   43   char *ibuf;
   44   const char *i;
   45   size_t outSize;
   46   size_t outLeft;
   47 
   48   if (inSize > 1024 * 1024)
   49     return NULL; /* too big to be meta data */
   50   i = in;
   51   /* reset iconv */
   52   iconv (cd, NULL, NULL, NULL, NULL);
   53   outSize = 4 * inSize + 2;
   54   outLeft = outSize - 2; /* make sure we have 2 0-terminations! */
   55   if (NULL == (buf = malloc (outSize)))
   56     return NULL;
   57   ibuf = buf;
   58   memset (buf, 0, outSize);
   59   if (iconv (cd,
   60              (char**) &in,
   61              &inSize,
   62              &ibuf,
   63              &outLeft) == SIZE_MAX)
   64   {
   65     /* conversion failed */
   66     free (buf);
   67     return strdup (i);
   68   }
   69   return buf;
   70 #else
   71   /* good luck, just copying string... */
   72   char *buf;
   73 
   74   buf = malloc (inSize + 1);
   75   memcpy (buf, in, inSize);
   76   buf[inSize] = '\0';
   77 #endif
   78 }
   79 
   80 
   81 /* end of iconv.c */