~ubuntu-branches/ubuntu/precise/wget/precise-proposed

« back to all changes in this revision

Viewing changes to lib/localcharset.c

  • Committer: Bazaar Package Importer
  • Author(s): Steve Langasek
  • Date: 2011-10-19 00:00:09 UTC
  • mfrom: (2.1.13 sid)
  • Revision ID: james.westby@ubuntu.com-20111019000009-8p33w3wz4b1rdri0
Tags: 1.13-1ubuntu1
* Merge from Debian unstable, remaining changes:
  - Add wget-udeb to ship wget.gnu as alternative to busybox wget
    implementation.
  - Depend on libssl-dev 0.9.8k-7ubuntu4 (LP: #503339)
* Dropped changes, superseded in Debian:
  - Keep build dependencies in main:
    + debian/control: remove info2man build-dep
    + debian/patches/series: disable wget-infopod_generated_manpage
  - Mark wget Multi-Arch: foreign, so packages that aren't of the same arch
    can depend on it.
* Pass --with-ssl=openssl; we don't want to use gnutls, there's no udeb for
  it.
* Add a second build pass for the udeb, so we can build without libidn.

Show diffs side-by-side

added added

removed removed

Lines of Context:
 
1
/* -*- buffer-read-only: t -*- vi: set ro: */
 
2
/* DO NOT EDIT! GENERATED AUTOMATICALLY! */
1
3
/* Determine a canonical name for the current locale's character encoding.
2
4
 
3
 
   Copyright (C) 2000-2006, 2008-2009 Free Software Foundation, Inc.
 
5
   Copyright (C) 2000-2006, 2008-2011 Free Software Foundation, Inc.
4
6
 
5
7
   This program is free software; you can redistribute it and/or modify
6
8
   it under the terms of the GNU General Public License as published by
23
25
/* Specification.  */
24
26
#include "localcharset.h"
25
27
 
 
28
#include <fcntl.h>
26
29
#include <stddef.h>
27
30
#include <stdio.h>
28
31
#include <string.h>
44
47
#endif
45
48
 
46
49
#if !defined WIN32_NATIVE
 
50
# include <unistd.h>
47
51
# if HAVE_LANGINFO_CODESET
48
52
#  include <langinfo.h>
49
53
# else
75
79
# include "configmake.h"
76
80
#endif
77
81
 
 
82
/* Define O_NOFOLLOW to 0 on platforms where it does not exist.  */
 
83
#ifndef O_NOFOLLOW
 
84
# define O_NOFOLLOW 0
 
85
#endif
 
86
 
78
87
#if defined _WIN32 || defined __WIN32__ || defined __CYGWIN__ || defined __EMX__ || defined __DJGPP__
79
88
  /* Win32, Cygwin, OS/2, DOS */
80
89
# define ISSLASH(C) ((C) == '/' || (C) == '\\')
117
126
  if (cp == NULL)
118
127
    {
119
128
#if !(defined DARWIN7 || defined VMS || defined WIN32_NATIVE || defined __CYGWIN__)
120
 
      FILE *fp;
121
129
      const char *dir;
122
130
      const char *base = "charset.alias";
123
131
      char *file_name;
124
132
 
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);
130
138
 
131
139
      /* Concatenate dir and base into freshly allocated file_name.  */
132
140
      {
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)
138
 
          {
139
 
            memcpy (file_name, dir, dir_len);
140
 
            if (add_slash)
141
 
              file_name[dir_len] = DIRECTORY_SEPARATOR;
142
 
            memcpy (file_name + dir_len + add_slash, base, base_len + 1);
143
 
          }
 
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)
 
146
          {
 
147
            memcpy (file_name, dir, dir_len);
 
148
            if (add_slash)
 
149
              file_name[dir_len] = DIRECTORY_SEPARATOR;
 
150
            memcpy (file_name + dir_len + add_slash, base, base_len + 1);
 
151
          }
144
152
      }
145
153
 
146
 
      if (file_name == NULL || (fp = fopen (file_name, "r")) == NULL)
147
 
        /* Out of memory or file not found, treat it as empty.  */
148
 
        cp = "";
 
154
      if (file_name == NULL)
 
155
        /* Out of memory.  Treat the file as empty.  */
 
156
        cp = "";
149
157
      else
150
 
        {
151
 
          /* Parse the file's contents.  */
152
 
          char *res_ptr = NULL;
153
 
          size_t res_size = 0;
154
 
 
155
 
          for (;;)
156
 
            {
157
 
              int c;
158
 
              char buf1[50+1];
159
 
              char buf2[50+1];
160
 
              size_t l1, l2;
161
 
              char *old_res_ptr;
162
 
 
163
 
              c = getc (fp);
164
 
              if (c == EOF)
165
 
                break;
166
 
              if (c == '\n' || c == ' ' || c == '\t')
167
 
                continue;
168
 
              if (c == '#')
169
 
                {
170
 
                  /* Skip comment, to end of line.  */
171
 
                  do
172
 
                    c = getc (fp);
173
 
                  while (!(c == EOF || c == '\n'));
174
 
                  if (c == EOF)
175
 
                    break;
176
 
                  continue;
177
 
                }
178
 
              ungetc (c, fp);
179
 
              if (fscanf (fp, "%50s %50s", buf1, buf2) < 2)
180
 
                break;
181
 
              l1 = strlen (buf1);
182
 
              l2 = strlen (buf2);
183
 
              old_res_ptr = res_ptr;
184
 
              if (res_size == 0)
185
 
                {
186
 
                  res_size = l1 + 1 + l2 + 1;
187
 
                  res_ptr = (char *) malloc (res_size + 1);
188
 
                }
189
 
              else
190
 
                {
191
 
                  res_size += l1 + 1 + l2 + 1;
192
 
                  res_ptr = (char *) realloc (res_ptr, res_size + 1);
193
 
                }
194
 
              if (res_ptr == NULL)
195
 
                {
196
 
                  /* Out of memory. */
197
 
                  res_size = 0;
198
 
                  if (old_res_ptr != NULL)
199
 
                    free (old_res_ptr);
200
 
                  break;
201
 
                }
202
 
              strcpy (res_ptr + res_size - (l2 + 1) - (l1 + 1), buf1);
203
 
              strcpy (res_ptr + res_size - (l2 + 1), buf2);
204
 
            }
205
 
          fclose (fp);
206
 
          if (res_size == 0)
207
 
            cp = "";
208
 
          else
209
 
            {
210
 
              *(res_ptr + res_size) = '\0';
211
 
              cp = res_ptr;
212
 
            }
213
 
        }
214
 
 
215
 
      if (file_name != NULL)
216
 
        free (file_name);
 
158
        {
 
159
          int fd;
 
160
 
 
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));
 
170
          if (fd < 0)
 
171
            /* File not found.  Treat it as empty.  */
 
172
            cp = "";
 
173
          else
 
174
            {
 
175
              FILE *fp;
 
176
 
 
177
              fp = fdopen (fd, "r");
 
178
              if (fp == NULL)
 
179
                {
 
180
                  /* Out of memory.  Treat the file as empty.  */
 
181
                  close (fd);
 
182
                  cp = "";
 
183
                }
 
184
              else
 
185
                {
 
186
                  /* Parse the file's contents.  */
 
187
                  char *res_ptr = NULL;
 
188
                  size_t res_size = 0;
 
189
 
 
190
                  for (;;)
 
191
                    {
 
192
                      int c;
 
193
                      char buf1[50+1];
 
194
                      char buf2[50+1];
 
195
                      size_t l1, l2;
 
196
                      char *old_res_ptr;
 
197
 
 
198
                      c = getc (fp);
 
199
                      if (c == EOF)
 
200
                        break;
 
201
                      if (c == '\n' || c == ' ' || c == '\t')
 
202
                        continue;
 
203
                      if (c == '#')
 
204
                        {
 
205
                          /* Skip comment, to end of line.  */
 
206
                          do
 
207
                            c = getc (fp);
 
208
                          while (!(c == EOF || c == '\n'));
 
209
                          if (c == EOF)
 
210
                            break;
 
211
                          continue;
 
212
                        }
 
213
                      ungetc (c, fp);
 
214
                      if (fscanf (fp, "%50s %50s", buf1, buf2) < 2)
 
215
                        break;
 
216
                      l1 = strlen (buf1);
 
217
                      l2 = strlen (buf2);
 
218
                      old_res_ptr = res_ptr;
 
219
                      if (res_size == 0)
 
220
                        {
 
221
                          res_size = l1 + 1 + l2 + 1;
 
222
                          res_ptr = (char *) malloc (res_size + 1);
 
223
                        }
 
224
                      else
 
225
                        {
 
226
                          res_size += l1 + 1 + l2 + 1;
 
227
                          res_ptr = (char *) realloc (res_ptr, res_size + 1);
 
228
                        }
 
229
                      if (res_ptr == NULL)
 
230
                        {
 
231
                          /* Out of memory. */
 
232
                          res_size = 0;
 
233
                          free (old_res_ptr);
 
234
                          break;
 
235
                        }
 
236
                      strcpy (res_ptr + res_size - (l2 + 1) - (l1 + 1), buf1);
 
237
                      strcpy (res_ptr + res_size - (l2 + 1), buf2);
 
238
                    }
 
239
                  fclose (fp);
 
240
                  if (res_size == 0)
 
241
                    cp = "";
 
242
                  else
 
243
                    {
 
244
                      *(res_ptr + res_size) = '\0';
 
245
                      cp = res_ptr;
 
246
                    }
 
247
                }
 
248
            }
 
249
 
 
250
          free (file_name);
 
251
        }
217
252
 
218
253
#else
219
254
 
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";
251
286
# endif
252
287
 
253
288
# if defined VMS
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"
265
 
           /* Japanese */
266
 
           "eucJP" "\0" "EUC-JP" "\0"
267
 
           "SJIS" "\0" "SHIFT_JIS" "\0"
268
 
           "DECKANJI" "\0" "DEC-KANJI" "\0"
269
 
           "SDECKANJI" "\0" "EUC-JP" "\0"
270
 
           /* Chinese */
271
 
           "eucTW" "\0" "EUC-TW" "\0"
272
 
           "DECHANYU" "\0" "DEC-HANYU" "\0"
273
 
           "DECHANZI" "\0" "GB2312" "\0"
274
 
           /* Korean */
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"
 
300
           /* Japanese */
 
301
           "eucJP" "\0" "EUC-JP" "\0"
 
302
           "SJIS" "\0" "SHIFT_JIS" "\0"
 
303
           "DECKANJI" "\0" "DEC-KANJI" "\0"
 
304
           "SDECKANJI" "\0" "EUC-JP" "\0"
 
305
           /* Chinese */
 
306
           "eucTW" "\0" "EUC-TW" "\0"
 
307
           "DECHANYU" "\0" "DEC-HANYU" "\0"
 
308
           "DECHANZI" "\0" "GB2312" "\0"
 
309
           /* Korean */
 
310
           "DECKOREAN" "\0" "EUC-KR" "\0";
276
311
# endif
277
312
 
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.  */
282
317
 
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";
306
341
# endif
307
342
#endif
308
343
 
335
370
  codeset = nl_langinfo (CODESET);
336
371
 
337
372
#  ifdef __CYGWIN__
338
 
  /* Cygwin 2006 does not have locales.  nl_langinfo (CODESET) always
339
 
     returns "US-ASCII".  As long as this is not fixed, return the suffix
340
 
     of the locale name from the environment variables (if present) or
341
 
     the codepage as a number.  */
 
373
  /* Cygwin < 1.7 does not have locales.  nl_langinfo (CODESET) always
 
374
     returns "US-ASCII".  Return the suffix of the locale name from the
 
375
     environment variables (if present) or the codepage as a number.  */
342
376
  if (codeset != NULL && strcmp (codeset, "US-ASCII") == 0)
343
377
    {
344
378
      const char *locale;
346
380
 
347
381
      locale = getenv ("LC_ALL");
348
382
      if (locale == NULL || locale[0] == '\0')
349
 
        {
350
 
          locale = getenv ("LC_CTYPE");
351
 
          if (locale == NULL || locale[0] == '\0')
352
 
            locale = getenv ("LANG");
353
 
        }
 
383
        {
 
384
          locale = getenv ("LC_CTYPE");
 
385
          if (locale == NULL || locale[0] == '\0')
 
386
            locale = getenv ("LANG");
 
387
        }
354
388
      if (locale != NULL && locale[0] != '\0')
355
 
        {
356
 
          /* If the locale name contains an encoding after the dot, return
357
 
             it.  */
358
 
          const char *dot = strchr (locale, '.');
359
 
 
360
 
          if (dot != NULL)
361
 
            {
362
 
              const char *modifier;
363
 
 
364
 
              dot++;
365
 
              /* Look for the possible @... trailer and remove it, if any.  */
366
 
              modifier = strchr (dot, '@');
367
 
              if (modifier == NULL)
368
 
                return dot;
369
 
              if (modifier - dot < sizeof (buf))
370
 
                {
371
 
                  memcpy (buf, dot, modifier - dot);
372
 
                  buf [modifier - dot] = '\0';
373
 
                  return buf;
374
 
                }
375
 
            }
376
 
        }
377
 
 
378
 
      /* Woe32 has a function returning the locale's codepage as a number.  */
 
389
        {
 
390
          /* If the locale name contains an encoding after the dot, return
 
391
             it.  */
 
392
          const char *dot = strchr (locale, '.');
 
393
 
 
394
          if (dot != NULL)
 
395
            {
 
396
              const char *modifier;
 
397
 
 
398
              dot++;
 
399
              /* Look for the possible @... trailer and remove it, if any.  */
 
400
              modifier = strchr (dot, '@');
 
401
              if (modifier == NULL)
 
402
                return dot;
 
403
              if (modifier - dot < sizeof (buf))
 
404
                {
 
405
                  memcpy (buf, dot, modifier - dot);
 
406
                  buf [modifier - dot] = '\0';
 
407
                  return buf;
 
408
                }
 
409
            }
 
410
        }
 
411
 
 
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
 
415
         do).
 
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
 
422
         in use.  */
379
423
      sprintf (buf, "CP%u", GetACP ());
380
424
      codeset = buf;
381
425
    }
397
441
    {
398
442
      locale = getenv ("LC_ALL");
399
443
      if (locale == NULL || locale[0] == '\0')
400
 
        {
401
 
          locale = getenv ("LC_CTYPE");
402
 
          if (locale == NULL || locale[0] == '\0')
403
 
            locale = getenv ("LANG");
404
 
        }
 
444
        {
 
445
          locale = getenv ("LC_CTYPE");
 
446
          if (locale == NULL || locale[0] == '\0')
 
447
            locale = getenv ("LANG");
 
448
        }
405
449
    }
406
450
 
407
451
  /* On some old systems, one used to set locale = "iso8859_1". On others,
415
459
 
416
460
  static char buf[2 + 10 + 1];
417
461
 
418
 
  /* Woe32 has a function returning the locale's codepage as a number.  */
 
462
  /* Woe32 has a function returning the locale's codepage as a number:
 
463
     GetACP().
 
464
     When the output goes to a console window, it needs to be provided in
 
465
     GetOEMCP() encoding if the console is using a raster font, or in
 
466
     GetConsoleOutputCP() encoding if it is using a TrueType font.
 
467
     But in GUI programs and for output sent to files and pipes, GetACP()
 
468
     encoding is the best bet.  */
419
469
  sprintf (buf, "CP%u", GetACP ());
420
470
  codeset = buf;
421
471
 
433
483
    {
434
484
      locale = getenv ("LC_CTYPE");
435
485
      if (locale == NULL || locale[0] == '\0')
436
 
        locale = getenv ("LANG");
 
486
        locale = getenv ("LANG");
437
487
    }
438
488
  if (locale != NULL && locale[0] != '\0')
439
489
    {
441
491
      const char *dot = strchr (locale, '.');
442
492
 
443
493
      if (dot != NULL)
444
 
        {
445
 
          const char *modifier;
 
494
        {
 
495
          const char *modifier;
446
496
 
447
 
          dot++;
448
 
          /* Look for the possible @... trailer and remove it, if any.  */
449
 
          modifier = strchr (dot, '@');
450
 
          if (modifier == NULL)
451
 
            return dot;
452
 
          if (modifier - dot < sizeof (buf))
453
 
            {
454
 
              memcpy (buf, dot, modifier - dot);
455
 
              buf [modifier - dot] = '\0';
456
 
              return buf;
457
 
            }
458
 
        }
 
497
          dot++;
 
498
          /* Look for the possible @... trailer and remove it, if any.  */
 
499
          modifier = strchr (dot, '@');
 
500
          if (modifier == NULL)
 
501
            return dot;
 
502
          if (modifier - dot < sizeof (buf))
 
503
            {
 
504
              memcpy (buf, dot, modifier - dot);
 
505
              buf [modifier - dot] = '\0';
 
506
              return buf;
 
507
            }
 
508
        }
459
509
 
460
510
      /* Resolve through the charset.alias file.  */
461
511
      codeset = locale;
464
514
    {
465
515
      /* OS/2 has a function returning the locale's codepage as a number.  */
466
516
      if (DosQueryCp (sizeof (cp), cp, &cplen))
467
 
        codeset = "";
 
517
        codeset = "";
468
518
      else
469
 
        {
470
 
          sprintf (buf, "CP%u", cp[0]);
471
 
          codeset = buf;
472
 
        }
 
519
        {
 
520
          sprintf (buf, "CP%u", cp[0]);
 
521
          codeset = buf;
 
522
        }
473
523
    }
474
524
 
475
525
#endif
483
533
       *aliases != '\0';
484
534
       aliases += strlen (aliases) + 1, aliases += strlen (aliases) + 1)
485
535
    if (strcmp (codeset, aliases) == 0
486
 
        || (aliases[0] == '*' && aliases[1] == '\0'))
 
536
        || (aliases[0] == '*' && aliases[1] == '\0'))
487
537
      {
488
 
        codeset = aliases + strlen (aliases) + 1;
489
 
        break;
 
538
        codeset = aliases + strlen (aliases) + 1;
 
539
        break;
490
540
      }
491
541
 
492
542
  /* Don't return an empty string.  GNU libc and GNU libiconv interpret