annotate lib/striconveha.c @ 7944:a1d177cd9523

* doc/gnulib-tool.texi (Initial import): Update to match current behavior with strdup module. * lib/.cppi-disable: Remove strcase.h, strdup.h, strndup.h, strnlen.h. * lib/memmem.h: Remove; all uses removed. This is now done by <string.h>. * lib/mempcpy.h: Likewise. * lib/memrchr.h: Likewise. * lib/stpcpy.h: Likewise. * lib/stpncpy.h: Likewise. * lib/strcase.h: Likewise. * lib/strchrnul.h: Likewise. * lib/strdup.h: Likewise. * lib/strndup.h: Likewise. * lib/strnlen.h: Likewise. * lib/strpbrk.h: Likewise. * lib/strsep.h: Likewise. * lib/strstr.h: Likewise. * lib/strtok_r.h: Likewise. * lib/string_.h: New file. * lib/argp-namefrob.h: Don't include no-longer-existent include files. Rely on <string.h> instead. * lib/canon-host.c: Likewise. * lib/chdir-long.c: Likewise. * lib/concatpath.c: Likewise. * lib/exclude.c: Likewise. * lib/fchdir.c: Likewise. * lib/getaddrinfo.c: Likewise. * lib/getcwd.c: Likewise. * lib/getsubopt.c: Likewise. * lib/glob.c: Likewise. * lib/hard-locale.c: Likewise. * lib/iconvme.c: Likewise. * lib/javacomp.c: Likewise. * lib/mempcpy.c: Likewise. * lib/memrchr.c: Likewise. * lib/regex_internal.h: Likewise. * lib/stpncpy.c: Likewise. * lib/strcasecmp.c: Likewise. * lib/strchrnul.c: Likewise. * lib/strdup.c: Likewise. * lib/striconv.c: Likewise. * lib/striconveh.c: Likewise. * lib/striconveha.c: Likewise. * lib/strncasecmp.c: Likewise. * lib/strndup.c: Likewise. * lib/strnlen.c: Likewise. * lib/strsep.c: Likewise. * lib/strstr.c: Likewise. * lib/strtok_r.c: Likewise. * lib/userspec.c: Likewise. * lib/w32spawn.h: Likewise. * lib/xstrndup.c: Likewise. * lib/mountlist.c (strstr): Remove decl. * m4/string_h.m4: New file. * m4/memmem.m4 (gl_FUNC_MEMMEM): Set HAVE_DECL_MEMMEM if necessary. * m4/mempcpy.m4 (gl_FUNC_MEMPCPY): Set HAVE_MEMPCPY if necessary. * m4/memrchr.m4 (gl_FUNC_MEMRCHR): Set HAVE_MEMRCHR * m4/stpcpy.m4 (gl_FUNC_STPCPY): Set HAVE_STPCPY if necessary. * m4/stpncpy.m4 (gl_PREREQ_STPNCPY): Set HAVE_STPNCPY if necessary. * m4/strcase.m4 (gl_FUNC_STRCASECMP): Set REPLACE_STRCASECMP if necessary. (gl_FUNC_STRNCASECMP): Set HAVE_DECL_STRNCASECMP if necessary. * m4/strchrnul.m4 (gl_FUNC_STRCHRNUL): Set HAVE_STRCHRNUL if necessary. * m4/strdup.m4 (gl_FUNC_STRDUP): Set HAVE_DECL_STRDUP if necessary. * m4/strndup.m4 (gl_FUNC_STRNDUP): Set HAVE_DECL_STRNLEN and HAVE_DECL_STRDUP if necessary. (gl_PREREQ_STRNLEN): Don't bother to check for strnlen decl, since gl_FUNC_STRNDUP does that now. * m4/strnlen.m4 (gl_FUNC_STRNLEN): Set HAVE_DECL_STRNLEN if necessary. Check for decl here... (gl_PREREQ_STRNLEN): ... not here. * m4/strpbrk.m4 (gl_FUNC_STRPBRK): Set HAVE_STRPBRK if necessary. * m4/strsep.m4 (gl_FUNC_STRSEP): Set HAVE_STRSEP if necessary. * m4/strstr.m4 (gl_FUNC_STRSTR): Set REPLACE_STRSTR if necessary. * m4/strtok_r.m4 (gl_FUNC_STRTOK_R): Set HAVE_DECL_STRTOK_R if necessary. * modules/string: New file. * modules/memmem (Files): Remove special-purpose include file. (Depends-on): Add string. (Include): Include <string.h>, not the removed file. * modules/mempcpy: Likewise. * modules/memrchr: Likewise. * modules/stpcpy: Likewise. * modules/stpncpy: Likewise. * modules/strcase: Likewise. * modules/strchrnul: Likewise. * modules/strdup: Likewise. * modules/strndup: Likewise. * modules/strnlen: Likewise. * modules/strpbrk: Likewise. * modules/strsep: Likewise. * modules/strstr: Likewise. * modules/strtok_r: Likewise. * tests/test-dirname.c: Don't include "stdup.h", since <string.h> now suffices. * tests/test-memmem.c: Don't include "memmem.h", since <string.h> now suffices.
author Paul Eggert <eggert@cs.ucla.edu>
date Fri, 26 Jan 2007 22:16:55 +0000
parents 0a4679777f66
children a162347a0232
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
7919
b7b7885895a6 New module 'striconveha'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
1 /* Character set conversion with error handling and autodetection.
b7b7885895a6 New module 'striconveha'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
2 Copyright (C) 2002, 2005, 2007 Free Software Foundation, Inc.
b7b7885895a6 New module 'striconveha'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
3 Written by Bruno Haible.
b7b7885895a6 New module 'striconveha'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
4
b7b7885895a6 New module 'striconveha'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
5 This program is free software; you can redistribute it and/or modify
b7b7885895a6 New module 'striconveha'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
6 it under the terms of the GNU General Public License as published by
b7b7885895a6 New module 'striconveha'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
7 the Free Software Foundation; either version 2, or (at your option)
b7b7885895a6 New module 'striconveha'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
8 any later version.
b7b7885895a6 New module 'striconveha'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
9
b7b7885895a6 New module 'striconveha'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
10 This program is distributed in the hope that it will be useful,
b7b7885895a6 New module 'striconveha'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
11 but WITHOUT ANY WARRANTY; without even the implied warranty of
b7b7885895a6 New module 'striconveha'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
12 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
b7b7885895a6 New module 'striconveha'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
13 GNU General Public License for more details.
b7b7885895a6 New module 'striconveha'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
14
b7b7885895a6 New module 'striconveha'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
15 You should have received a copy of the GNU General Public License
b7b7885895a6 New module 'striconveha'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
16 along with this program; if not, write to the Free Software Foundation,
b7b7885895a6 New module 'striconveha'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
17 Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */
b7b7885895a6 New module 'striconveha'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
18
b7b7885895a6 New module 'striconveha'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
19 #include <config.h>
b7b7885895a6 New module 'striconveha'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
20
b7b7885895a6 New module 'striconveha'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
21 /* Specification. */
b7b7885895a6 New module 'striconveha'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
22 #include "striconveha.h"
b7b7885895a6 New module 'striconveha'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
23
b7b7885895a6 New module 'striconveha'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
24 #include <errno.h>
b7b7885895a6 New module 'striconveha'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
25 #include <stdlib.h>
b7b7885895a6 New module 'striconveha'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
26 #include <string.h>
b7b7885895a6 New module 'striconveha'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
27
7931
0a4679777f66 Add an optional argument specifying transliteration.
Bruno Haible <bruno@clisp.org>
parents: 7930
diff changeset
28 #include "allocsa.h"
0a4679777f66 Add an optional argument specifying transliteration.
Bruno Haible <bruno@clisp.org>
parents: 7930
diff changeset
29 #include "c-strcase.h"
0a4679777f66 Add an optional argument specifying transliteration.
Bruno Haible <bruno@clisp.org>
parents: 7930
diff changeset
30
7919
b7b7885895a6 New module 'striconveha'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
31 #define SIZEOF(a) (sizeof(a)/sizeof(a[0]))
b7b7885895a6 New module 'striconveha'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
32
b7b7885895a6 New module 'striconveha'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
33
b7b7885895a6 New module 'striconveha'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
34 /* Autodetection list. */
b7b7885895a6 New module 'striconveha'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
35
b7b7885895a6 New module 'striconveha'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
36 struct autodetect_alias
b7b7885895a6 New module 'striconveha'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
37 {
b7b7885895a6 New module 'striconveha'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
38 struct autodetect_alias *next;
b7b7885895a6 New module 'striconveha'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
39 const char *name;
b7b7885895a6 New module 'striconveha'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
40 const char * const *encodings_to_try;
b7b7885895a6 New module 'striconveha'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
41 };
b7b7885895a6 New module 'striconveha'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
42
b7b7885895a6 New module 'striconveha'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
43 static const char * const autodetect_utf8_try[] =
b7b7885895a6 New module 'striconveha'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
44 {
b7b7885895a6 New module 'striconveha'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
45 /* Try UTF-8 first. There are very few ISO-8859-1 inputs that would
b7b7885895a6 New module 'striconveha'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
46 be valid UTF-8, but many UTF-8 inputs are valid ISO-8859-1. */
b7b7885895a6 New module 'striconveha'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
47 "UTF-8", "ISO-8859-1",
b7b7885895a6 New module 'striconveha'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
48 NULL
b7b7885895a6 New module 'striconveha'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
49 };
b7b7885895a6 New module 'striconveha'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
50 static const char * const autodetect_jp_try[] =
b7b7885895a6 New module 'striconveha'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
51 {
b7b7885895a6 New module 'striconveha'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
52 /* Try 7-bit encoding first. If the input contains bytes >= 0x80,
b7b7885895a6 New module 'striconveha'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
53 it will fail.
b7b7885895a6 New module 'striconveha'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
54 Try EUC-JP next. Short SHIFT_JIS inputs may come out wrong. This
b7b7885895a6 New module 'striconveha'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
55 is unavoidable. People will condemn SHIFT_JIS.
b7b7885895a6 New module 'striconveha'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
56 If we tried SHIFT_JIS first, then some short EUC-JP inputs would
b7b7885895a6 New module 'striconveha'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
57 come out wrong, and people would condemn EUC-JP and Unix, which
b7b7885895a6 New module 'striconveha'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
58 would not be good.
b7b7885895a6 New module 'striconveha'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
59 Finally try SHIFT_JIS. */
b7b7885895a6 New module 'striconveha'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
60 "ISO-2022-JP-2", "EUC-JP", "SHIFT_JIS",
b7b7885895a6 New module 'striconveha'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
61 NULL
b7b7885895a6 New module 'striconveha'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
62 };
b7b7885895a6 New module 'striconveha'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
63 static const char * const autodetect_kr_try[] =
b7b7885895a6 New module 'striconveha'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
64 {
b7b7885895a6 New module 'striconveha'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
65 /* Try 7-bit encoding first. If the input contains bytes >= 0x80,
b7b7885895a6 New module 'striconveha'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
66 it will fail.
b7b7885895a6 New module 'striconveha'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
67 Finally try EUC-KR. */
b7b7885895a6 New module 'striconveha'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
68 "ISO-2022-KR", "EUC-KR",
b7b7885895a6 New module 'striconveha'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
69 NULL
b7b7885895a6 New module 'striconveha'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
70 };
b7b7885895a6 New module 'striconveha'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
71
b7b7885895a6 New module 'striconveha'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
72 static struct autodetect_alias autodetect_predefined[] =
b7b7885895a6 New module 'striconveha'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
73 {
b7b7885895a6 New module 'striconveha'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
74 { &autodetect_predefined[1], "autodetect_utf8", autodetect_utf8_try },
b7b7885895a6 New module 'striconveha'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
75 { &autodetect_predefined[2], "autodetect_jp", autodetect_jp_try },
b7b7885895a6 New module 'striconveha'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
76 { NULL, "autodetect_kr", autodetect_kr_try }
b7b7885895a6 New module 'striconveha'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
77 };
b7b7885895a6 New module 'striconveha'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
78
b7b7885895a6 New module 'striconveha'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
79 static struct autodetect_alias *autodetect_list = &autodetect_predefined[0];
b7b7885895a6 New module 'striconveha'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
80 static struct autodetect_alias **autodetect_list_end =
b7b7885895a6 New module 'striconveha'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
81 &autodetect_predefined[SIZEOF(autodetect_predefined)-1].next;
b7b7885895a6 New module 'striconveha'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
82
b7b7885895a6 New module 'striconveha'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
83 int
b7b7885895a6 New module 'striconveha'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
84 uniconv_register_autodetect (const char *name,
b7b7885895a6 New module 'striconveha'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
85 const char * const *try_in_order)
b7b7885895a6 New module 'striconveha'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
86 {
b7b7885895a6 New module 'striconveha'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
87 size_t namelen;
b7b7885895a6 New module 'striconveha'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
88 size_t listlen;
b7b7885895a6 New module 'striconveha'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
89 size_t memneed;
b7b7885895a6 New module 'striconveha'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
90 size_t i;
b7b7885895a6 New module 'striconveha'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
91 char *memory;
b7b7885895a6 New module 'striconveha'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
92 struct autodetect_alias *new_alias;
b7b7885895a6 New module 'striconveha'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
93 char *new_name;
b7b7885895a6 New module 'striconveha'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
94 const char **new_try_in_order;
b7b7885895a6 New module 'striconveha'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
95
b7b7885895a6 New module 'striconveha'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
96 /* The TRY_IN_ORDER list must not be empty. */
b7b7885895a6 New module 'striconveha'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
97 if (try_in_order[0] == NULL)
b7b7885895a6 New module 'striconveha'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
98 {
b7b7885895a6 New module 'striconveha'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
99 errno = EINVAL;
b7b7885895a6 New module 'striconveha'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
100 return -1;
b7b7885895a6 New module 'striconveha'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
101 }
b7b7885895a6 New module 'striconveha'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
102
b7b7885895a6 New module 'striconveha'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
103 /* We must deep-copy NAME and TRY_IN_ORDER, because they may be allocated
b7b7885895a6 New module 'striconveha'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
104 with dynamic extent. */
b7b7885895a6 New module 'striconveha'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
105 namelen = strlen (name) + 1;
b7b7885895a6 New module 'striconveha'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
106 memneed = sizeof (struct autodetect_alias) + namelen + sizeof (char *);
b7b7885895a6 New module 'striconveha'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
107 for (i = 0; try_in_order[i] != NULL; i++)
b7b7885895a6 New module 'striconveha'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
108 memneed += sizeof (char *) + strlen (try_in_order[i]) + 1;
b7b7885895a6 New module 'striconveha'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
109 listlen = i;
b7b7885895a6 New module 'striconveha'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
110
b7b7885895a6 New module 'striconveha'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
111 memory = (char *) malloc (memneed);
b7b7885895a6 New module 'striconveha'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
112 if (memory != NULL)
b7b7885895a6 New module 'striconveha'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
113 {
b7b7885895a6 New module 'striconveha'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
114 new_alias = (struct autodetect_alias *) memory;
b7b7885895a6 New module 'striconveha'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
115 memory += sizeof (struct autodetect_alias);
b7b7885895a6 New module 'striconveha'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
116
b7b7885895a6 New module 'striconveha'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
117 new_try_in_order = (const char **) memory;
b7b7885895a6 New module 'striconveha'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
118 memory += (listlen + 1) * sizeof (char *);
b7b7885895a6 New module 'striconveha'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
119
b7b7885895a6 New module 'striconveha'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
120 new_name = (char *) memory;
b7b7885895a6 New module 'striconveha'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
121 memcpy (new_name, name, namelen);
b7b7885895a6 New module 'striconveha'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
122 memory += namelen;
b7b7885895a6 New module 'striconveha'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
123
b7b7885895a6 New module 'striconveha'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
124 for (i = 0; i < listlen; i++)
b7b7885895a6 New module 'striconveha'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
125 {
b7b7885895a6 New module 'striconveha'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
126 size_t len = strlen (try_in_order[i]) + 1;
b7b7885895a6 New module 'striconveha'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
127 memcpy (memory, try_in_order[i], len);
b7b7885895a6 New module 'striconveha'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
128 new_try_in_order[i] = (const char *) memory;
b7b7885895a6 New module 'striconveha'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
129 memory += len;
b7b7885895a6 New module 'striconveha'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
130 }
b7b7885895a6 New module 'striconveha'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
131 new_try_in_order[i] = NULL;
b7b7885895a6 New module 'striconveha'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
132
b7b7885895a6 New module 'striconveha'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
133 /* Now insert the new alias. */
b7b7885895a6 New module 'striconveha'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
134 new_alias->name = new_name;
b7b7885895a6 New module 'striconveha'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
135 new_alias->encodings_to_try = new_try_in_order;
b7b7885895a6 New module 'striconveha'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
136 new_alias->next = NULL;
b7b7885895a6 New module 'striconveha'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
137 /* FIXME: Not multithread-safe. */
b7b7885895a6 New module 'striconveha'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
138 *autodetect_list_end = new_alias;
b7b7885895a6 New module 'striconveha'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
139 autodetect_list_end = &new_alias->next;
b7b7885895a6 New module 'striconveha'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
140 return 0;
b7b7885895a6 New module 'striconveha'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
141 }
b7b7885895a6 New module 'striconveha'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
142 else
b7b7885895a6 New module 'striconveha'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
143 {
b7b7885895a6 New module 'striconveha'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
144 errno = ENOMEM;
b7b7885895a6 New module 'striconveha'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
145 return -1;
b7b7885895a6 New module 'striconveha'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
146 }
b7b7885895a6 New module 'striconveha'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
147 }
b7b7885895a6 New module 'striconveha'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
148
7931
0a4679777f66 Add an optional argument specifying transliteration.
Bruno Haible <bruno@clisp.org>
parents: 7930
diff changeset
149 /* Like mem_iconveha, except no handling of transliteration. */
0a4679777f66 Add an optional argument specifying transliteration.
Bruno Haible <bruno@clisp.org>
parents: 7930
diff changeset
150 static int
0a4679777f66 Add an optional argument specifying transliteration.
Bruno Haible <bruno@clisp.org>
parents: 7930
diff changeset
151 mem_iconveha_notranslit (const char *src, size_t srclen,
0a4679777f66 Add an optional argument specifying transliteration.
Bruno Haible <bruno@clisp.org>
parents: 7930
diff changeset
152 const char *from_codeset, const char *to_codeset,
0a4679777f66 Add an optional argument specifying transliteration.
Bruno Haible <bruno@clisp.org>
parents: 7930
diff changeset
153 enum iconv_ilseq_handler handler,
0a4679777f66 Add an optional argument specifying transliteration.
Bruno Haible <bruno@clisp.org>
parents: 7930
diff changeset
154 size_t *offsets,
0a4679777f66 Add an optional argument specifying transliteration.
Bruno Haible <bruno@clisp.org>
parents: 7930
diff changeset
155 char **resultp, size_t *lengthp)
7919
b7b7885895a6 New module 'striconveha'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
156 {
b7b7885895a6 New module 'striconveha'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
157 int retval = mem_iconveh (src, srclen, from_codeset, to_codeset, handler,
7927
7ebab05df4f6 Add optional offsets argument to conversion routines.
Bruno Haible <bruno@clisp.org>
parents: 7919
diff changeset
158 offsets, resultp, lengthp);
7919
b7b7885895a6 New module 'striconveha'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
159 if (retval >= 0 || errno != EINVAL)
b7b7885895a6 New module 'striconveha'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
160 return retval;
b7b7885895a6 New module 'striconveha'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
161 else
b7b7885895a6 New module 'striconveha'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
162 {
b7b7885895a6 New module 'striconveha'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
163 struct autodetect_alias *alias;
b7b7885895a6 New module 'striconveha'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
164
b7b7885895a6 New module 'striconveha'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
165 /* Unsupported from_codeset or to_codeset. Check whether the caller
b7b7885895a6 New module 'striconveha'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
166 requested autodetection. */
b7b7885895a6 New module 'striconveha'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
167 for (alias = autodetect_list; alias != NULL; alias = alias->next)
b7b7885895a6 New module 'striconveha'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
168 if (strcmp (from_codeset, alias->name) == 0)
b7b7885895a6 New module 'striconveha'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
169 {
7930
8929067c3772 Make the striconveha module actually work.
Bruno Haible <bruno@clisp.org>
parents: 7927
diff changeset
170 const char * const *encodings;
7919
b7b7885895a6 New module 'striconveha'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
171
7930
8929067c3772 Make the striconveha module actually work.
Bruno Haible <bruno@clisp.org>
parents: 7927
diff changeset
172 if (handler != iconveh_error)
8929067c3772 Make the striconveha module actually work.
Bruno Haible <bruno@clisp.org>
parents: 7927
diff changeset
173 {
8929067c3772 Make the striconveha module actually work.
Bruno Haible <bruno@clisp.org>
parents: 7927
diff changeset
174 /* First try all encodings without any forgiving. */
8929067c3772 Make the striconveha module actually work.
Bruno Haible <bruno@clisp.org>
parents: 7927
diff changeset
175 encodings = alias->encodings_to_try;
8929067c3772 Make the striconveha module actually work.
Bruno Haible <bruno@clisp.org>
parents: 7927
diff changeset
176 do
8929067c3772 Make the striconveha module actually work.
Bruno Haible <bruno@clisp.org>
parents: 7927
diff changeset
177 {
7931
0a4679777f66 Add an optional argument specifying transliteration.
Bruno Haible <bruno@clisp.org>
parents: 7930
diff changeset
178 retval = mem_iconveha_notranslit (src, srclen,
0a4679777f66 Add an optional argument specifying transliteration.
Bruno Haible <bruno@clisp.org>
parents: 7930
diff changeset
179 *encodings, to_codeset,
0a4679777f66 Add an optional argument specifying transliteration.
Bruno Haible <bruno@clisp.org>
parents: 7930
diff changeset
180 iconveh_error, offsets,
0a4679777f66 Add an optional argument specifying transliteration.
Bruno Haible <bruno@clisp.org>
parents: 7930
diff changeset
181 resultp, lengthp);
7930
8929067c3772 Make the striconveha module actually work.
Bruno Haible <bruno@clisp.org>
parents: 7927
diff changeset
182 if (!(retval < 0 && errno == EILSEQ))
8929067c3772 Make the striconveha module actually work.
Bruno Haible <bruno@clisp.org>
parents: 7927
diff changeset
183 return retval;
8929067c3772 Make the striconveha module actually work.
Bruno Haible <bruno@clisp.org>
parents: 7927
diff changeset
184 encodings++;
8929067c3772 Make the striconveha module actually work.
Bruno Haible <bruno@clisp.org>
parents: 7927
diff changeset
185 }
8929067c3772 Make the striconveha module actually work.
Bruno Haible <bruno@clisp.org>
parents: 7927
diff changeset
186 while (*encodings != NULL);
8929067c3772 Make the striconveha module actually work.
Bruno Haible <bruno@clisp.org>
parents: 7927
diff changeset
187 }
8929067c3772 Make the striconveha module actually work.
Bruno Haible <bruno@clisp.org>
parents: 7927
diff changeset
188
8929067c3772 Make the striconveha module actually work.
Bruno Haible <bruno@clisp.org>
parents: 7927
diff changeset
189 encodings = alias->encodings_to_try;
7919
b7b7885895a6 New module 'striconveha'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
190 do
b7b7885895a6 New module 'striconveha'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
191 {
7931
0a4679777f66 Add an optional argument specifying transliteration.
Bruno Haible <bruno@clisp.org>
parents: 7930
diff changeset
192 retval = mem_iconveha_notranslit (src, srclen,
0a4679777f66 Add an optional argument specifying transliteration.
Bruno Haible <bruno@clisp.org>
parents: 7930
diff changeset
193 *encodings, to_codeset,
0a4679777f66 Add an optional argument specifying transliteration.
Bruno Haible <bruno@clisp.org>
parents: 7930
diff changeset
194 handler, offsets,
0a4679777f66 Add an optional argument specifying transliteration.
Bruno Haible <bruno@clisp.org>
parents: 7930
diff changeset
195 resultp, lengthp);
7919
b7b7885895a6 New module 'striconveha'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
196 if (!(retval < 0 && errno == EILSEQ))
b7b7885895a6 New module 'striconveha'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
197 return retval;
b7b7885895a6 New module 'striconveha'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
198 encodings++;
b7b7885895a6 New module 'striconveha'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
199 }
b7b7885895a6 New module 'striconveha'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
200 while (*encodings != NULL);
b7b7885895a6 New module 'striconveha'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
201
b7b7885895a6 New module 'striconveha'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
202 /* Return the last call's result. */
b7b7885895a6 New module 'striconveha'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
203 return -1;
b7b7885895a6 New module 'striconveha'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
204 }
b7b7885895a6 New module 'striconveha'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
205
b7b7885895a6 New module 'striconveha'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
206 /* It wasn't an autodetection name. */
b7b7885895a6 New module 'striconveha'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
207 errno = EINVAL;
b7b7885895a6 New module 'striconveha'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
208 return -1;
b7b7885895a6 New module 'striconveha'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
209 }
b7b7885895a6 New module 'striconveha'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
210 }
b7b7885895a6 New module 'striconveha'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
211
7931
0a4679777f66 Add an optional argument specifying transliteration.
Bruno Haible <bruno@clisp.org>
parents: 7930
diff changeset
212 int
0a4679777f66 Add an optional argument specifying transliteration.
Bruno Haible <bruno@clisp.org>
parents: 7930
diff changeset
213 mem_iconveha (const char *src, size_t srclen,
7919
b7b7885895a6 New module 'striconveha'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
214 const char *from_codeset, const char *to_codeset,
7931
0a4679777f66 Add an optional argument specifying transliteration.
Bruno Haible <bruno@clisp.org>
parents: 7930
diff changeset
215 bool transliterate,
0a4679777f66 Add an optional argument specifying transliteration.
Bruno Haible <bruno@clisp.org>
parents: 7930
diff changeset
216 enum iconv_ilseq_handler handler,
0a4679777f66 Add an optional argument specifying transliteration.
Bruno Haible <bruno@clisp.org>
parents: 7930
diff changeset
217 size_t *offsets,
0a4679777f66 Add an optional argument specifying transliteration.
Bruno Haible <bruno@clisp.org>
parents: 7930
diff changeset
218 char **resultp, size_t *lengthp)
0a4679777f66 Add an optional argument specifying transliteration.
Bruno Haible <bruno@clisp.org>
parents: 7930
diff changeset
219 {
0a4679777f66 Add an optional argument specifying transliteration.
Bruno Haible <bruno@clisp.org>
parents: 7930
diff changeset
220 if (srclen == 0)
0a4679777f66 Add an optional argument specifying transliteration.
Bruno Haible <bruno@clisp.org>
parents: 7930
diff changeset
221 {
0a4679777f66 Add an optional argument specifying transliteration.
Bruno Haible <bruno@clisp.org>
parents: 7930
diff changeset
222 /* Nothing to convert. */
0a4679777f66 Add an optional argument specifying transliteration.
Bruno Haible <bruno@clisp.org>
parents: 7930
diff changeset
223 *lengthp = 0;
0a4679777f66 Add an optional argument specifying transliteration.
Bruno Haible <bruno@clisp.org>
parents: 7930
diff changeset
224 return 0;
0a4679777f66 Add an optional argument specifying transliteration.
Bruno Haible <bruno@clisp.org>
parents: 7930
diff changeset
225 }
0a4679777f66 Add an optional argument specifying transliteration.
Bruno Haible <bruno@clisp.org>
parents: 7930
diff changeset
226
0a4679777f66 Add an optional argument specifying transliteration.
Bruno Haible <bruno@clisp.org>
parents: 7930
diff changeset
227 /* When using GNU libc >= 2.2 or GNU libiconv >= 1.5,
0a4679777f66 Add an optional argument specifying transliteration.
Bruno Haible <bruno@clisp.org>
parents: 7930
diff changeset
228 we want to use transliteration. */
0a4679777f66 Add an optional argument specifying transliteration.
Bruno Haible <bruno@clisp.org>
parents: 7930
diff changeset
229 #if (__GLIBC__ == 2 && __GLIBC_MINOR__ >= 2) || __GLIBC__ > 2 || _LIBICONV_VERSION >= 0x0105
0a4679777f66 Add an optional argument specifying transliteration.
Bruno Haible <bruno@clisp.org>
parents: 7930
diff changeset
230 if (transliterate)
0a4679777f66 Add an optional argument specifying transliteration.
Bruno Haible <bruno@clisp.org>
parents: 7930
diff changeset
231 {
0a4679777f66 Add an optional argument specifying transliteration.
Bruno Haible <bruno@clisp.org>
parents: 7930
diff changeset
232 int retval;
0a4679777f66 Add an optional argument specifying transliteration.
Bruno Haible <bruno@clisp.org>
parents: 7930
diff changeset
233 size_t len = strlen (to_codeset);
0a4679777f66 Add an optional argument specifying transliteration.
Bruno Haible <bruno@clisp.org>
parents: 7930
diff changeset
234 char *to_codeset_suffixed = (char *) allocsa (len + 10 + 1);
0a4679777f66 Add an optional argument specifying transliteration.
Bruno Haible <bruno@clisp.org>
parents: 7930
diff changeset
235 memcpy (to_codeset_suffixed, to_codeset, len);
0a4679777f66 Add an optional argument specifying transliteration.
Bruno Haible <bruno@clisp.org>
parents: 7930
diff changeset
236 memcpy (to_codeset_suffixed + len, "//TRANSLIT", 10 + 1);
0a4679777f66 Add an optional argument specifying transliteration.
Bruno Haible <bruno@clisp.org>
parents: 7930
diff changeset
237
0a4679777f66 Add an optional argument specifying transliteration.
Bruno Haible <bruno@clisp.org>
parents: 7930
diff changeset
238 retval = mem_iconveha_notranslit (src, srclen,
0a4679777f66 Add an optional argument specifying transliteration.
Bruno Haible <bruno@clisp.org>
parents: 7930
diff changeset
239 from_codeset, to_codeset_suffixed,
0a4679777f66 Add an optional argument specifying transliteration.
Bruno Haible <bruno@clisp.org>
parents: 7930
diff changeset
240 handler, offsets, resultp, lengthp);
0a4679777f66 Add an optional argument specifying transliteration.
Bruno Haible <bruno@clisp.org>
parents: 7930
diff changeset
241
0a4679777f66 Add an optional argument specifying transliteration.
Bruno Haible <bruno@clisp.org>
parents: 7930
diff changeset
242 freesa (to_codeset_suffixed);
0a4679777f66 Add an optional argument specifying transliteration.
Bruno Haible <bruno@clisp.org>
parents: 7930
diff changeset
243
0a4679777f66 Add an optional argument specifying transliteration.
Bruno Haible <bruno@clisp.org>
parents: 7930
diff changeset
244 return retval;
0a4679777f66 Add an optional argument specifying transliteration.
Bruno Haible <bruno@clisp.org>
parents: 7930
diff changeset
245 }
0a4679777f66 Add an optional argument specifying transliteration.
Bruno Haible <bruno@clisp.org>
parents: 7930
diff changeset
246 else
0a4679777f66 Add an optional argument specifying transliteration.
Bruno Haible <bruno@clisp.org>
parents: 7930
diff changeset
247 #endif
0a4679777f66 Add an optional argument specifying transliteration.
Bruno Haible <bruno@clisp.org>
parents: 7930
diff changeset
248 return mem_iconveha_notranslit (src, srclen,
0a4679777f66 Add an optional argument specifying transliteration.
Bruno Haible <bruno@clisp.org>
parents: 7930
diff changeset
249 from_codeset, to_codeset,
0a4679777f66 Add an optional argument specifying transliteration.
Bruno Haible <bruno@clisp.org>
parents: 7930
diff changeset
250 handler, offsets, resultp, lengthp);
0a4679777f66 Add an optional argument specifying transliteration.
Bruno Haible <bruno@clisp.org>
parents: 7930
diff changeset
251 }
0a4679777f66 Add an optional argument specifying transliteration.
Bruno Haible <bruno@clisp.org>
parents: 7930
diff changeset
252
0a4679777f66 Add an optional argument specifying transliteration.
Bruno Haible <bruno@clisp.org>
parents: 7930
diff changeset
253 /* Like str_iconveha, except no handling of transliteration. */
0a4679777f66 Add an optional argument specifying transliteration.
Bruno Haible <bruno@clisp.org>
parents: 7930
diff changeset
254 static char *
0a4679777f66 Add an optional argument specifying transliteration.
Bruno Haible <bruno@clisp.org>
parents: 7930
diff changeset
255 str_iconveha_notranslit (const char *src,
0a4679777f66 Add an optional argument specifying transliteration.
Bruno Haible <bruno@clisp.org>
parents: 7930
diff changeset
256 const char *from_codeset, const char *to_codeset,
0a4679777f66 Add an optional argument specifying transliteration.
Bruno Haible <bruno@clisp.org>
parents: 7930
diff changeset
257 enum iconv_ilseq_handler handler)
7919
b7b7885895a6 New module 'striconveha'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
258 {
b7b7885895a6 New module 'striconveha'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
259 char *result = str_iconveh (src, from_codeset, to_codeset, handler);
b7b7885895a6 New module 'striconveha'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
260
b7b7885895a6 New module 'striconveha'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
261 if (result != NULL || errno != EINVAL)
b7b7885895a6 New module 'striconveha'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
262 return result;
b7b7885895a6 New module 'striconveha'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
263 else
b7b7885895a6 New module 'striconveha'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
264 {
b7b7885895a6 New module 'striconveha'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
265 struct autodetect_alias *alias;
b7b7885895a6 New module 'striconveha'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
266
b7b7885895a6 New module 'striconveha'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
267 /* Unsupported from_codeset or to_codeset. Check whether the caller
b7b7885895a6 New module 'striconveha'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
268 requested autodetection. */
b7b7885895a6 New module 'striconveha'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
269 for (alias = autodetect_list; alias != NULL; alias = alias->next)
b7b7885895a6 New module 'striconveha'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
270 if (strcmp (from_codeset, alias->name) == 0)
b7b7885895a6 New module 'striconveha'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
271 {
7930
8929067c3772 Make the striconveha module actually work.
Bruno Haible <bruno@clisp.org>
parents: 7927
diff changeset
272 const char * const *encodings;
7919
b7b7885895a6 New module 'striconveha'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
273
7930
8929067c3772 Make the striconveha module actually work.
Bruno Haible <bruno@clisp.org>
parents: 7927
diff changeset
274 if (handler != iconveh_error)
8929067c3772 Make the striconveha module actually work.
Bruno Haible <bruno@clisp.org>
parents: 7927
diff changeset
275 {
8929067c3772 Make the striconveha module actually work.
Bruno Haible <bruno@clisp.org>
parents: 7927
diff changeset
276 /* First try all encodings without any forgiving. */
8929067c3772 Make the striconveha module actually work.
Bruno Haible <bruno@clisp.org>
parents: 7927
diff changeset
277 encodings = alias->encodings_to_try;
8929067c3772 Make the striconveha module actually work.
Bruno Haible <bruno@clisp.org>
parents: 7927
diff changeset
278 do
8929067c3772 Make the striconveha module actually work.
Bruno Haible <bruno@clisp.org>
parents: 7927
diff changeset
279 {
7931
0a4679777f66 Add an optional argument specifying transliteration.
Bruno Haible <bruno@clisp.org>
parents: 7930
diff changeset
280 result = str_iconveha_notranslit (src,
0a4679777f66 Add an optional argument specifying transliteration.
Bruno Haible <bruno@clisp.org>
parents: 7930
diff changeset
281 *encodings, to_codeset,
0a4679777f66 Add an optional argument specifying transliteration.
Bruno Haible <bruno@clisp.org>
parents: 7930
diff changeset
282 iconveh_error);
7930
8929067c3772 Make the striconveha module actually work.
Bruno Haible <bruno@clisp.org>
parents: 7927
diff changeset
283 if (!(result == NULL && errno == EILSEQ))
8929067c3772 Make the striconveha module actually work.
Bruno Haible <bruno@clisp.org>
parents: 7927
diff changeset
284 return result;
8929067c3772 Make the striconveha module actually work.
Bruno Haible <bruno@clisp.org>
parents: 7927
diff changeset
285 encodings++;
8929067c3772 Make the striconveha module actually work.
Bruno Haible <bruno@clisp.org>
parents: 7927
diff changeset
286 }
8929067c3772 Make the striconveha module actually work.
Bruno Haible <bruno@clisp.org>
parents: 7927
diff changeset
287 while (*encodings != NULL);
8929067c3772 Make the striconveha module actually work.
Bruno Haible <bruno@clisp.org>
parents: 7927
diff changeset
288 }
8929067c3772 Make the striconveha module actually work.
Bruno Haible <bruno@clisp.org>
parents: 7927
diff changeset
289
8929067c3772 Make the striconveha module actually work.
Bruno Haible <bruno@clisp.org>
parents: 7927
diff changeset
290 encodings = alias->encodings_to_try;
7919
b7b7885895a6 New module 'striconveha'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
291 do
b7b7885895a6 New module 'striconveha'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
292 {
7931
0a4679777f66 Add an optional argument specifying transliteration.
Bruno Haible <bruno@clisp.org>
parents: 7930
diff changeset
293 result = str_iconveha_notranslit (src,
0a4679777f66 Add an optional argument specifying transliteration.
Bruno Haible <bruno@clisp.org>
parents: 7930
diff changeset
294 *encodings, to_codeset,
0a4679777f66 Add an optional argument specifying transliteration.
Bruno Haible <bruno@clisp.org>
parents: 7930
diff changeset
295 handler);
7919
b7b7885895a6 New module 'striconveha'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
296 if (!(result == NULL && errno == EILSEQ))
b7b7885895a6 New module 'striconveha'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
297 return result;
b7b7885895a6 New module 'striconveha'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
298 encodings++;
b7b7885895a6 New module 'striconveha'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
299 }
b7b7885895a6 New module 'striconveha'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
300 while (*encodings != NULL);
b7b7885895a6 New module 'striconveha'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
301
b7b7885895a6 New module 'striconveha'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
302 /* Return the last call's result. */
b7b7885895a6 New module 'striconveha'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
303 return NULL;
b7b7885895a6 New module 'striconveha'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
304 }
b7b7885895a6 New module 'striconveha'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
305
b7b7885895a6 New module 'striconveha'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
306 /* It wasn't an autodetection name. */
b7b7885895a6 New module 'striconveha'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
307 errno = EINVAL;
b7b7885895a6 New module 'striconveha'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
308 return NULL;
b7b7885895a6 New module 'striconveha'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
309 }
b7b7885895a6 New module 'striconveha'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
310 }
7931
0a4679777f66 Add an optional argument specifying transliteration.
Bruno Haible <bruno@clisp.org>
parents: 7930
diff changeset
311
0a4679777f66 Add an optional argument specifying transliteration.
Bruno Haible <bruno@clisp.org>
parents: 7930
diff changeset
312 char *
0a4679777f66 Add an optional argument specifying transliteration.
Bruno Haible <bruno@clisp.org>
parents: 7930
diff changeset
313 str_iconveha (const char *src,
0a4679777f66 Add an optional argument specifying transliteration.
Bruno Haible <bruno@clisp.org>
parents: 7930
diff changeset
314 const char *from_codeset, const char *to_codeset,
0a4679777f66 Add an optional argument specifying transliteration.
Bruno Haible <bruno@clisp.org>
parents: 7930
diff changeset
315 bool transliterate,
0a4679777f66 Add an optional argument specifying transliteration.
Bruno Haible <bruno@clisp.org>
parents: 7930
diff changeset
316 enum iconv_ilseq_handler handler)
0a4679777f66 Add an optional argument specifying transliteration.
Bruno Haible <bruno@clisp.org>
parents: 7930
diff changeset
317 {
0a4679777f66 Add an optional argument specifying transliteration.
Bruno Haible <bruno@clisp.org>
parents: 7930
diff changeset
318 if (*src == '\0' || c_strcasecmp (from_codeset, to_codeset) == 0)
0a4679777f66 Add an optional argument specifying transliteration.
Bruno Haible <bruno@clisp.org>
parents: 7930
diff changeset
319 {
0a4679777f66 Add an optional argument specifying transliteration.
Bruno Haible <bruno@clisp.org>
parents: 7930
diff changeset
320 char *result = strdup (src);
0a4679777f66 Add an optional argument specifying transliteration.
Bruno Haible <bruno@clisp.org>
parents: 7930
diff changeset
321
0a4679777f66 Add an optional argument specifying transliteration.
Bruno Haible <bruno@clisp.org>
parents: 7930
diff changeset
322 if (result == NULL)
0a4679777f66 Add an optional argument specifying transliteration.
Bruno Haible <bruno@clisp.org>
parents: 7930
diff changeset
323 errno = ENOMEM;
0a4679777f66 Add an optional argument specifying transliteration.
Bruno Haible <bruno@clisp.org>
parents: 7930
diff changeset
324 return result;
0a4679777f66 Add an optional argument specifying transliteration.
Bruno Haible <bruno@clisp.org>
parents: 7930
diff changeset
325 }
0a4679777f66 Add an optional argument specifying transliteration.
Bruno Haible <bruno@clisp.org>
parents: 7930
diff changeset
326
0a4679777f66 Add an optional argument specifying transliteration.
Bruno Haible <bruno@clisp.org>
parents: 7930
diff changeset
327 /* When using GNU libc >= 2.2 or GNU libiconv >= 1.5,
0a4679777f66 Add an optional argument specifying transliteration.
Bruno Haible <bruno@clisp.org>
parents: 7930
diff changeset
328 we want to use transliteration. */
0a4679777f66 Add an optional argument specifying transliteration.
Bruno Haible <bruno@clisp.org>
parents: 7930
diff changeset
329 #if (__GLIBC__ == 2 && __GLIBC_MINOR__ >= 2) || __GLIBC__ > 2 || _LIBICONV_VERSION >= 0x0105
0a4679777f66 Add an optional argument specifying transliteration.
Bruno Haible <bruno@clisp.org>
parents: 7930
diff changeset
330 if (transliterate)
0a4679777f66 Add an optional argument specifying transliteration.
Bruno Haible <bruno@clisp.org>
parents: 7930
diff changeset
331 {
0a4679777f66 Add an optional argument specifying transliteration.
Bruno Haible <bruno@clisp.org>
parents: 7930
diff changeset
332 char *result;
0a4679777f66 Add an optional argument specifying transliteration.
Bruno Haible <bruno@clisp.org>
parents: 7930
diff changeset
333 size_t len = strlen (to_codeset);
0a4679777f66 Add an optional argument specifying transliteration.
Bruno Haible <bruno@clisp.org>
parents: 7930
diff changeset
334 char *to_codeset_suffixed = (char *) allocsa (len + 10 + 1);
0a4679777f66 Add an optional argument specifying transliteration.
Bruno Haible <bruno@clisp.org>
parents: 7930
diff changeset
335 memcpy (to_codeset_suffixed, to_codeset, len);
0a4679777f66 Add an optional argument specifying transliteration.
Bruno Haible <bruno@clisp.org>
parents: 7930
diff changeset
336 memcpy (to_codeset_suffixed + len, "//TRANSLIT", 10 + 1);
0a4679777f66 Add an optional argument specifying transliteration.
Bruno Haible <bruno@clisp.org>
parents: 7930
diff changeset
337
0a4679777f66 Add an optional argument specifying transliteration.
Bruno Haible <bruno@clisp.org>
parents: 7930
diff changeset
338 result = str_iconveha_notranslit (src, from_codeset, to_codeset_suffixed,
0a4679777f66 Add an optional argument specifying transliteration.
Bruno Haible <bruno@clisp.org>
parents: 7930
diff changeset
339 handler);
0a4679777f66 Add an optional argument specifying transliteration.
Bruno Haible <bruno@clisp.org>
parents: 7930
diff changeset
340
0a4679777f66 Add an optional argument specifying transliteration.
Bruno Haible <bruno@clisp.org>
parents: 7930
diff changeset
341 freesa (to_codeset_suffixed);
0a4679777f66 Add an optional argument specifying transliteration.
Bruno Haible <bruno@clisp.org>
parents: 7930
diff changeset
342
0a4679777f66 Add an optional argument specifying transliteration.
Bruno Haible <bruno@clisp.org>
parents: 7930
diff changeset
343 return result;
0a4679777f66 Add an optional argument specifying transliteration.
Bruno Haible <bruno@clisp.org>
parents: 7930
diff changeset
344 }
0a4679777f66 Add an optional argument specifying transliteration.
Bruno Haible <bruno@clisp.org>
parents: 7930
diff changeset
345 else
0a4679777f66 Add an optional argument specifying transliteration.
Bruno Haible <bruno@clisp.org>
parents: 7930
diff changeset
346 #endif
0a4679777f66 Add an optional argument specifying transliteration.
Bruno Haible <bruno@clisp.org>
parents: 7930
diff changeset
347 return str_iconveha_notranslit (src, from_codeset, to_codeset, handler);
0a4679777f66 Add an optional argument specifying transliteration.
Bruno Haible <bruno@clisp.org>
parents: 7930
diff changeset
348 }