119
128
#if !(defined DARWIN7 || defined VMS || defined WIN32_NATIVE || defined __CYGWIN__)
122
130
const char *base = "charset.alias";
125
133
/* Make it possible to override the charset.alias location. This is
126
necessary for running the testsuite before "make install". */
134
necessary for running the testsuite before "make install". */
127
135
dir = getenv ("CHARSETALIASDIR");
128
136
if (dir == NULL || dir[0] == '\0')
129
dir = relocate (LIBDIR);
137
dir = relocate (LIBDIR);
131
139
/* Concatenate dir and base into freshly allocated file_name. */
133
size_t dir_len = strlen (dir);
134
size_t base_len = strlen (base);
135
int add_slash = (dir_len > 0 && !ISSLASH (dir[dir_len - 1]));
136
file_name = (char *) malloc (dir_len + add_slash + base_len + 1);
137
if (file_name != NULL)
139
memcpy (file_name, dir, dir_len);
141
file_name[dir_len] = DIRECTORY_SEPARATOR;
142
memcpy (file_name + dir_len + add_slash, base, base_len + 1);
141
size_t dir_len = strlen (dir);
142
size_t base_len = strlen (base);
143
int add_slash = (dir_len > 0 && !ISSLASH (dir[dir_len - 1]));
144
file_name = (char *) malloc (dir_len + add_slash + base_len + 1);
145
if (file_name != NULL)
147
memcpy (file_name, dir, dir_len);
149
file_name[dir_len] = DIRECTORY_SEPARATOR;
150
memcpy (file_name + dir_len + add_slash, base, base_len + 1);
146
if (file_name == NULL || (fp = fopen (file_name, "r")) == NULL)
147
/* Out of memory or file not found, treat it as empty. */
154
if (file_name == NULL)
155
/* Out of memory. Treat the file as empty. */
151
/* Parse the file's contents. */
152
char *res_ptr = NULL;
166
if (c == '\n' || c == ' ' || c == '\t')
170
/* Skip comment, to end of line. */
173
while (!(c == EOF || c == '\n'));
179
if (fscanf (fp, "%50s %50s", buf1, buf2) < 2)
183
old_res_ptr = res_ptr;
186
res_size = l1 + 1 + l2 + 1;
187
res_ptr = (char *) malloc (res_size + 1);
191
res_size += l1 + 1 + l2 + 1;
192
res_ptr = (char *) realloc (res_ptr, res_size + 1);
198
if (old_res_ptr != NULL)
202
strcpy (res_ptr + res_size - (l2 + 1) - (l1 + 1), buf1);
203
strcpy (res_ptr + res_size - (l2 + 1), buf2);
210
*(res_ptr + res_size) = '\0';
215
if (file_name != NULL)
161
/* Open the file. Reject symbolic links on platforms that support
162
O_NOFOLLOW. This is a security feature. Without it, an attacker
163
could retrieve parts of the contents (namely, the tail of the
164
first line that starts with "* ") of an arbitrary file by placing
165
a symbolic link to that file under the name "charset.alias" in
166
some writable directory and defining the environment variable
167
CHARSETALIASDIR to point to that directory. */
168
fd = open (file_name,
169
O_RDONLY | (HAVE_WORKING_O_NOFOLLOW ? O_NOFOLLOW : 0));
171
/* File not found. Treat it as empty. */
177
fp = fdopen (fd, "r");
180
/* Out of memory. Treat the file as empty. */
186
/* Parse the file's contents. */
187
char *res_ptr = NULL;
201
if (c == '\n' || c == ' ' || c == '\t')
205
/* Skip comment, to end of line. */
208
while (!(c == EOF || c == '\n'));
214
if (fscanf (fp, "%50s %50s", buf1, buf2) < 2)
218
old_res_ptr = res_ptr;
221
res_size = l1 + 1 + l2 + 1;
222
res_ptr = (char *) malloc (res_size + 1);
226
res_size += l1 + 1 + l2 + 1;
227
res_ptr = (char *) realloc (res_ptr, res_size + 1);
236
strcpy (res_ptr + res_size - (l2 + 1) - (l1 + 1), buf1);
237
strcpy (res_ptr + res_size - (l2 + 1), buf2);
244
*(res_ptr + res_size) = '\0';
220
255
# if defined DARWIN7
221
256
/* To avoid the trouble of installing a file that is shared by many
222
GNU packages -- many packaging systems have problems with this --,
223
simply inline the aliases here. */
257
GNU packages -- many packaging systems have problems with this --,
258
simply inline the aliases here. */
224
259
cp = "ISO8859-1" "\0" "ISO-8859-1" "\0"
225
"ISO8859-2" "\0" "ISO-8859-2" "\0"
226
"ISO8859-4" "\0" "ISO-8859-4" "\0"
227
"ISO8859-5" "\0" "ISO-8859-5" "\0"
228
"ISO8859-7" "\0" "ISO-8859-7" "\0"
229
"ISO8859-9" "\0" "ISO-8859-9" "\0"
230
"ISO8859-13" "\0" "ISO-8859-13" "\0"
231
"ISO8859-15" "\0" "ISO-8859-15" "\0"
232
"KOI8-R" "\0" "KOI8-R" "\0"
233
"KOI8-U" "\0" "KOI8-U" "\0"
234
"CP866" "\0" "CP866" "\0"
235
"CP949" "\0" "CP949" "\0"
236
"CP1131" "\0" "CP1131" "\0"
237
"CP1251" "\0" "CP1251" "\0"
238
"eucCN" "\0" "GB2312" "\0"
239
"GB2312" "\0" "GB2312" "\0"
240
"eucJP" "\0" "EUC-JP" "\0"
241
"eucKR" "\0" "EUC-KR" "\0"
242
"Big5" "\0" "BIG5" "\0"
243
"Big5HKSCS" "\0" "BIG5-HKSCS" "\0"
244
"GBK" "\0" "GBK" "\0"
245
"GB18030" "\0" "GB18030" "\0"
246
"SJIS" "\0" "SHIFT_JIS" "\0"
247
"ARMSCII-8" "\0" "ARMSCII-8" "\0"
248
"PT154" "\0" "PT154" "\0"
249
/*"ISCII-DEV" "\0" "?" "\0"*/
250
"*" "\0" "UTF-8" "\0";
260
"ISO8859-2" "\0" "ISO-8859-2" "\0"
261
"ISO8859-4" "\0" "ISO-8859-4" "\0"
262
"ISO8859-5" "\0" "ISO-8859-5" "\0"
263
"ISO8859-7" "\0" "ISO-8859-7" "\0"
264
"ISO8859-9" "\0" "ISO-8859-9" "\0"
265
"ISO8859-13" "\0" "ISO-8859-13" "\0"
266
"ISO8859-15" "\0" "ISO-8859-15" "\0"
267
"KOI8-R" "\0" "KOI8-R" "\0"
268
"KOI8-U" "\0" "KOI8-U" "\0"
269
"CP866" "\0" "CP866" "\0"
270
"CP949" "\0" "CP949" "\0"
271
"CP1131" "\0" "CP1131" "\0"
272
"CP1251" "\0" "CP1251" "\0"
273
"eucCN" "\0" "GB2312" "\0"
274
"GB2312" "\0" "GB2312" "\0"
275
"eucJP" "\0" "EUC-JP" "\0"
276
"eucKR" "\0" "EUC-KR" "\0"
277
"Big5" "\0" "BIG5" "\0"
278
"Big5HKSCS" "\0" "BIG5-HKSCS" "\0"
279
"GBK" "\0" "GBK" "\0"
280
"GB18030" "\0" "GB18030" "\0"
281
"SJIS" "\0" "SHIFT_JIS" "\0"
282
"ARMSCII-8" "\0" "ARMSCII-8" "\0"
283
"PT154" "\0" "PT154" "\0"
284
/*"ISCII-DEV" "\0" "?" "\0"*/
285
"*" "\0" "UTF-8" "\0";
254
289
/* To avoid the troubles of an extra file charset.alias_vms in the
255
sources of many GNU packages, simply inline the aliases here. */
290
sources of many GNU packages, simply inline the aliases here. */
256
291
/* The list of encodings is taken from the OpenVMS 7.3-1 documentation
257
"Compaq C Run-Time Library Reference Manual for OpenVMS systems"
258
section 10.7 "Handling Different Character Sets". */
292
"Compaq C Run-Time Library Reference Manual for OpenVMS systems"
293
section 10.7 "Handling Different Character Sets". */
259
294
cp = "ISO8859-1" "\0" "ISO-8859-1" "\0"
260
"ISO8859-2" "\0" "ISO-8859-2" "\0"
261
"ISO8859-5" "\0" "ISO-8859-5" "\0"
262
"ISO8859-7" "\0" "ISO-8859-7" "\0"
263
"ISO8859-8" "\0" "ISO-8859-8" "\0"
264
"ISO8859-9" "\0" "ISO-8859-9" "\0"
266
"eucJP" "\0" "EUC-JP" "\0"
267
"SJIS" "\0" "SHIFT_JIS" "\0"
268
"DECKANJI" "\0" "DEC-KANJI" "\0"
269
"SDECKANJI" "\0" "EUC-JP" "\0"
271
"eucTW" "\0" "EUC-TW" "\0"
272
"DECHANYU" "\0" "DEC-HANYU" "\0"
273
"DECHANZI" "\0" "GB2312" "\0"
275
"DECKOREAN" "\0" "EUC-KR" "\0";
295
"ISO8859-2" "\0" "ISO-8859-2" "\0"
296
"ISO8859-5" "\0" "ISO-8859-5" "\0"
297
"ISO8859-7" "\0" "ISO-8859-7" "\0"
298
"ISO8859-8" "\0" "ISO-8859-8" "\0"
299
"ISO8859-9" "\0" "ISO-8859-9" "\0"
301
"eucJP" "\0" "EUC-JP" "\0"
302
"SJIS" "\0" "SHIFT_JIS" "\0"
303
"DECKANJI" "\0" "DEC-KANJI" "\0"
304
"SDECKANJI" "\0" "EUC-JP" "\0"
306
"eucTW" "\0" "EUC-TW" "\0"
307
"DECHANYU" "\0" "DEC-HANYU" "\0"
308
"DECHANZI" "\0" "GB2312" "\0"
310
"DECKOREAN" "\0" "EUC-KR" "\0";
278
313
# if defined WIN32_NATIVE || defined __CYGWIN__
279
314
/* To avoid the troubles of installing a separate file in the same
280
directory as the DLL and of retrieving the DLL's directory at
281
runtime, simply inline the aliases here. */
315
directory as the DLL and of retrieving the DLL's directory at
316
runtime, simply inline the aliases here. */
283
318
cp = "CP936" "\0" "GBK" "\0"
284
"CP1361" "\0" "JOHAB" "\0"
285
"CP20127" "\0" "ASCII" "\0"
286
"CP20866" "\0" "KOI8-R" "\0"
287
"CP20936" "\0" "GB2312" "\0"
288
"CP21866" "\0" "KOI8-RU" "\0"
289
"CP28591" "\0" "ISO-8859-1" "\0"
290
"CP28592" "\0" "ISO-8859-2" "\0"
291
"CP28593" "\0" "ISO-8859-3" "\0"
292
"CP28594" "\0" "ISO-8859-4" "\0"
293
"CP28595" "\0" "ISO-8859-5" "\0"
294
"CP28596" "\0" "ISO-8859-6" "\0"
295
"CP28597" "\0" "ISO-8859-7" "\0"
296
"CP28598" "\0" "ISO-8859-8" "\0"
297
"CP28599" "\0" "ISO-8859-9" "\0"
298
"CP28605" "\0" "ISO-8859-15" "\0"
299
"CP38598" "\0" "ISO-8859-8" "\0"
300
"CP51932" "\0" "EUC-JP" "\0"
301
"CP51936" "\0" "GB2312" "\0"
302
"CP51949" "\0" "EUC-KR" "\0"
303
"CP51950" "\0" "EUC-TW" "\0"
304
"CP54936" "\0" "GB18030" "\0"
305
"CP65001" "\0" "UTF-8" "\0";
319
"CP1361" "\0" "JOHAB" "\0"
320
"CP20127" "\0" "ASCII" "\0"
321
"CP20866" "\0" "KOI8-R" "\0"
322
"CP20936" "\0" "GB2312" "\0"
323
"CP21866" "\0" "KOI8-RU" "\0"
324
"CP28591" "\0" "ISO-8859-1" "\0"
325
"CP28592" "\0" "ISO-8859-2" "\0"
326
"CP28593" "\0" "ISO-8859-3" "\0"
327
"CP28594" "\0" "ISO-8859-4" "\0"
328
"CP28595" "\0" "ISO-8859-5" "\0"
329
"CP28596" "\0" "ISO-8859-6" "\0"
330
"CP28597" "\0" "ISO-8859-7" "\0"
331
"CP28598" "\0" "ISO-8859-8" "\0"
332
"CP28599" "\0" "ISO-8859-9" "\0"
333
"CP28605" "\0" "ISO-8859-15" "\0"
334
"CP38598" "\0" "ISO-8859-8" "\0"
335
"CP51932" "\0" "EUC-JP" "\0"
336
"CP51936" "\0" "GB2312" "\0"
337
"CP51949" "\0" "EUC-KR" "\0"
338
"CP51950" "\0" "EUC-TW" "\0"
339
"CP54936" "\0" "GB18030" "\0"
340
"CP65001" "\0" "UTF-8" "\0";
347
381
locale = getenv ("LC_ALL");
348
382
if (locale == NULL || locale[0] == '\0')
350
locale = getenv ("LC_CTYPE");
351
if (locale == NULL || locale[0] == '\0')
352
locale = getenv ("LANG");
384
locale = getenv ("LC_CTYPE");
385
if (locale == NULL || locale[0] == '\0')
386
locale = getenv ("LANG");
354
388
if (locale != NULL && locale[0] != '\0')
356
/* If the locale name contains an encoding after the dot, return
358
const char *dot = strchr (locale, '.');
362
const char *modifier;
365
/* Look for the possible @... trailer and remove it, if any. */
366
modifier = strchr (dot, '@');
367
if (modifier == NULL)
369
if (modifier - dot < sizeof (buf))
371
memcpy (buf, dot, modifier - dot);
372
buf [modifier - dot] = '\0';
378
/* Woe32 has a function returning the locale's codepage as a number. */
390
/* If the locale name contains an encoding after the dot, return
392
const char *dot = strchr (locale, '.');
396
const char *modifier;
399
/* Look for the possible @... trailer and remove it, if any. */
400
modifier = strchr (dot, '@');
401
if (modifier == NULL)
403
if (modifier - dot < sizeof (buf))
405
memcpy (buf, dot, modifier - dot);
406
buf [modifier - dot] = '\0';
412
/* Woe32 has a function returning the locale's codepage as a number:
413
GetACP(). This encoding is used by Cygwin, unless the user has set
414
the environment variable CYGWIN=codepage:oem (which very few people
416
Output directed to console windows needs to be converted (to
417
GetOEMCP() if the console is using a raster font, or to
418
GetConsoleOutputCP() if it is using a TrueType font). Cygwin does
419
this conversion transparently (see winsup/cygwin/fhandler_console.cc),
420
converting to GetConsoleOutputCP(). This leads to correct results,
421
except when SetConsoleOutputCP has been called and a raster font is
379
423
sprintf (buf, "CP%u", GetACP ());