Mercurial > hg > octave-lojdl > gnulib-hg
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 |
rev | line source |
---|---|
7919 | 1 /* Character set conversion with error handling and autodetection. |
2 Copyright (C) 2002, 2005, 2007 Free Software Foundation, Inc. | |
3 Written by Bruno Haible. | |
4 | |
5 This program is free software; you can redistribute it and/or modify | |
6 it under the terms of the GNU General Public License as published by | |
7 the Free Software Foundation; either version 2, or (at your option) | |
8 any later version. | |
9 | |
10 This program is distributed in the hope that it will be useful, | |
11 but WITHOUT ANY WARRANTY; without even the implied warranty of | |
12 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | |
13 GNU General Public License for more details. | |
14 | |
15 You should have received a copy of the GNU General Public License | |
16 along with this program; if not, write to the Free Software Foundation, | |
17 Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ | |
18 | |
19 #include <config.h> | |
20 | |
21 /* Specification. */ | |
22 #include "striconveha.h" | |
23 | |
24 #include <errno.h> | |
25 #include <stdlib.h> | |
26 #include <string.h> | |
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 | 31 #define SIZEOF(a) (sizeof(a)/sizeof(a[0])) |
32 | |
33 | |
34 /* Autodetection list. */ | |
35 | |
36 struct autodetect_alias | |
37 { | |
38 struct autodetect_alias *next; | |
39 const char *name; | |
40 const char * const *encodings_to_try; | |
41 }; | |
42 | |
43 static const char * const autodetect_utf8_try[] = | |
44 { | |
45 /* Try UTF-8 first. There are very few ISO-8859-1 inputs that would | |
46 be valid UTF-8, but many UTF-8 inputs are valid ISO-8859-1. */ | |
47 "UTF-8", "ISO-8859-1", | |
48 NULL | |
49 }; | |
50 static const char * const autodetect_jp_try[] = | |
51 { | |
52 /* Try 7-bit encoding first. If the input contains bytes >= 0x80, | |
53 it will fail. | |
54 Try EUC-JP next. Short SHIFT_JIS inputs may come out wrong. This | |
55 is unavoidable. People will condemn SHIFT_JIS. | |
56 If we tried SHIFT_JIS first, then some short EUC-JP inputs would | |
57 come out wrong, and people would condemn EUC-JP and Unix, which | |
58 would not be good. | |
59 Finally try SHIFT_JIS. */ | |
60 "ISO-2022-JP-2", "EUC-JP", "SHIFT_JIS", | |
61 NULL | |
62 }; | |
63 static const char * const autodetect_kr_try[] = | |
64 { | |
65 /* Try 7-bit encoding first. If the input contains bytes >= 0x80, | |
66 it will fail. | |
67 Finally try EUC-KR. */ | |
68 "ISO-2022-KR", "EUC-KR", | |
69 NULL | |
70 }; | |
71 | |
72 static struct autodetect_alias autodetect_predefined[] = | |
73 { | |
74 { &autodetect_predefined[1], "autodetect_utf8", autodetect_utf8_try }, | |
75 { &autodetect_predefined[2], "autodetect_jp", autodetect_jp_try }, | |
76 { NULL, "autodetect_kr", autodetect_kr_try } | |
77 }; | |
78 | |
79 static struct autodetect_alias *autodetect_list = &autodetect_predefined[0]; | |
80 static struct autodetect_alias **autodetect_list_end = | |
81 &autodetect_predefined[SIZEOF(autodetect_predefined)-1].next; | |
82 | |
83 int | |
84 uniconv_register_autodetect (const char *name, | |
85 const char * const *try_in_order) | |
86 { | |
87 size_t namelen; | |
88 size_t listlen; | |
89 size_t memneed; | |
90 size_t i; | |
91 char *memory; | |
92 struct autodetect_alias *new_alias; | |
93 char *new_name; | |
94 const char **new_try_in_order; | |
95 | |
96 /* The TRY_IN_ORDER list must not be empty. */ | |
97 if (try_in_order[0] == NULL) | |
98 { | |
99 errno = EINVAL; | |
100 return -1; | |
101 } | |
102 | |
103 /* We must deep-copy NAME and TRY_IN_ORDER, because they may be allocated | |
104 with dynamic extent. */ | |
105 namelen = strlen (name) + 1; | |
106 memneed = sizeof (struct autodetect_alias) + namelen + sizeof (char *); | |
107 for (i = 0; try_in_order[i] != NULL; i++) | |
108 memneed += sizeof (char *) + strlen (try_in_order[i]) + 1; | |
109 listlen = i; | |
110 | |
111 memory = (char *) malloc (memneed); | |
112 if (memory != NULL) | |
113 { | |
114 new_alias = (struct autodetect_alias *) memory; | |
115 memory += sizeof (struct autodetect_alias); | |
116 | |
117 new_try_in_order = (const char **) memory; | |
118 memory += (listlen + 1) * sizeof (char *); | |
119 | |
120 new_name = (char *) memory; | |
121 memcpy (new_name, name, namelen); | |
122 memory += namelen; | |
123 | |
124 for (i = 0; i < listlen; i++) | |
125 { | |
126 size_t len = strlen (try_in_order[i]) + 1; | |
127 memcpy (memory, try_in_order[i], len); | |
128 new_try_in_order[i] = (const char *) memory; | |
129 memory += len; | |
130 } | |
131 new_try_in_order[i] = NULL; | |
132 | |
133 /* Now insert the new alias. */ | |
134 new_alias->name = new_name; | |
135 new_alias->encodings_to_try = new_try_in_order; | |
136 new_alias->next = NULL; | |
137 /* FIXME: Not multithread-safe. */ | |
138 *autodetect_list_end = new_alias; | |
139 autodetect_list_end = &new_alias->next; | |
140 return 0; | |
141 } | |
142 else | |
143 { | |
144 errno = ENOMEM; | |
145 return -1; | |
146 } | |
147 } | |
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 | 156 { |
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 | 159 if (retval >= 0 || errno != EINVAL) |
160 return retval; | |
161 else | |
162 { | |
163 struct autodetect_alias *alias; | |
164 | |
165 /* Unsupported from_codeset or to_codeset. Check whether the caller | |
166 requested autodetection. */ | |
167 for (alias = autodetect_list; alias != NULL; alias = alias->next) | |
168 if (strcmp (from_codeset, alias->name) == 0) | |
169 { | |
7930
8929067c3772
Make the striconveha module actually work.
Bruno Haible <bruno@clisp.org>
parents:
7927
diff
changeset
|
170 const char * const *encodings; |
7919 | 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 | 190 do |
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 | 196 if (!(retval < 0 && errno == EILSEQ)) |
197 return retval; | |
198 encodings++; | |
199 } | |
200 while (*encodings != NULL); | |
201 | |
202 /* Return the last call's result. */ | |
203 return -1; | |
204 } | |
205 | |
206 /* It wasn't an autodetection name. */ | |
207 errno = EINVAL; | |
208 return -1; | |
209 } | |
210 } | |
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 | 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 | 258 { |
259 char *result = str_iconveh (src, from_codeset, to_codeset, handler); | |
260 | |
261 if (result != NULL || errno != EINVAL) | |
262 return result; | |
263 else | |
264 { | |
265 struct autodetect_alias *alias; | |
266 | |
267 /* Unsupported from_codeset or to_codeset. Check whether the caller | |
268 requested autodetection. */ | |
269 for (alias = autodetect_list; alias != NULL; alias = alias->next) | |
270 if (strcmp (from_codeset, alias->name) == 0) | |
271 { | |
7930
8929067c3772
Make the striconveha module actually work.
Bruno Haible <bruno@clisp.org>
parents:
7927
diff
changeset
|
272 const char * const *encodings; |
7919 | 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 | 291 do |
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 | 296 if (!(result == NULL && errno == EILSEQ)) |
297 return result; | |
298 encodings++; | |
299 } | |
300 while (*encodings != NULL); | |
301 | |
302 /* Return the last call's result. */ | |
303 return NULL; | |
304 } | |
305 | |
306 /* It wasn't an autodetection name. */ | |
307 errno = EINVAL; | |
308 return NULL; | |
309 } | |
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 } |