libextractor  1.11
About: GNU libextractor is a library used to extract meta-data from files of arbitrary type.
  Fossies Dox: libextractor-1.11.tar.gz  ("unofficial" and yet experimental doxygen-generated source code documentation)  

convert.c
Go to the documentation of this file.
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 *
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 */
char * EXTRACTOR_common_convert_to_utf8(const char *input, size_t len, const char *charset)
Definition: convert.c:39
#define NULL
Definition: getopt1.c:60
plaform specifics