"Fossies" - the Fresh Open Source Software Archive

Member "libextractor-1.11/src/common/convert.c" (30 Jan 2021, 2526 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 "convert.c" see the Fossies "Dox" file reference documentation and the latest Fossies "Diffs" side-by-side code changes report: 1.10_vs_1.11.

    1 /*
    2      This file is part of libextractor.
    3      Copyright (C) 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 3, 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 #include "platform.h"
   22 #include "extractor.h"
   23 #include "convert.h"
   24 
   25 /**
   26  * Convert the len characters long character sequence
   27  * given in input that is in the given charset
   28  * to UTF-8.
   29  *
   30  * @param input string to convert
   31  * @param len number of bytes in input
   32  * @param charset input character set
   33  * @return the converted string (0-terminated), NULL on error
   34  * @return the converted string (0-terminated),
   35  *  if conversion fails, a copy of the original
   36  *  string is returned.
   37  */
   38 char *
   39 EXTRACTOR_common_convert_to_utf8 (const char *input,
   40                                   size_t len,
   41                                   const char *charset)
   42 {
   43 #if HAVE_ICONV
   44   size_t tmpSize;
   45   size_t finSize;
   46   char *tmp;
   47   char *ret;
   48   char *itmp;
   49   const char *i;
   50   iconv_t cd;
   51 
   52   i = input;
   53   cd = iconv_open ("UTF-8", charset);
   54   if (cd == (iconv_t) -1)
   55     return strndup (i, len);
   56   if (len > 1024 * 1024)
   57   {
   58     iconv_close (cd);
   59     return NULL;   /* too big for meta data */
   60   }
   61   tmpSize = 3 * len + 4;
   62   tmp = malloc (tmpSize);
   63   if (tmp == NULL)
   64   {
   65     iconv_close (cd);
   66     return NULL;
   67   }
   68   itmp = tmp;
   69   finSize = tmpSize;
   70   if (iconv (cd, (char **) &input, &len, &itmp, &finSize) == ((size_t) -1))
   71   {
   72     iconv_close (cd);
   73     free (tmp);
   74     return strndup (i, len);
   75   }
   76   ret = malloc (tmpSize - finSize + 1);
   77   if (ret == NULL)
   78   {
   79     iconv_close (cd);
   80     free (tmp);
   81     return NULL;
   82   }
   83   memcpy (ret, tmp, tmpSize - finSize);
   84   ret[tmpSize - finSize] = '\0';
   85   free (tmp);
   86   iconv_close (cd);
   87   return ret;
   88 #else
   89   char *ret;
   90 
   91   ret = malloc (len + 1);
   92   memcpy (ret, input, len);
   93   ret[len] = '\0';
   94   return ret;
   95 #endif
   96 }
   97 
   98 
   99 /* end of convert.c */