diff options
Diffstat (limited to 'gl/localcharset.c')
| -rw-r--r-- | gl/localcharset.c | 50 |
1 files changed, 30 insertions, 20 deletions
diff --git a/gl/localcharset.c b/gl/localcharset.c index fa2207fe..a225a2ea 100644 --- a/gl/localcharset.c +++ b/gl/localcharset.c | |||
| @@ -1,6 +1,6 @@ | |||
| 1 | /* Determine a canonical name for the current locale's character encoding. | 1 | /* Determine a canonical name for the current locale's character encoding. |
| 2 | 2 | ||
| 3 | Copyright (C) 2000-2006, 2008-2010 Free Software Foundation, Inc. | 3 | Copyright (C) 2000-2006, 2008-2013 Free Software Foundation, Inc. |
| 4 | 4 | ||
| 5 | This program is free software; you can redistribute it and/or modify | 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 | 6 | it under the terms of the GNU General Public License as published by |
| @@ -13,8 +13,7 @@ | |||
| 13 | GNU General Public License for more details. | 13 | GNU General Public License for more details. |
| 14 | 14 | ||
| 15 | You should have received a copy of the GNU General Public License along | 15 | You should have received a copy of the GNU General Public License along |
| 16 | with this program; if not, write to the Free Software Foundation, | 16 | with this program; if not, see <http://www.gnu.org/licenses/>. */ |
| 17 | Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ | ||
| 18 | 17 | ||
| 19 | /* Written by Bruno Haible <bruno@clisp.org>. */ | 18 | /* Written by Bruno Haible <bruno@clisp.org>. */ |
| 20 | 19 | ||
| @@ -30,11 +29,11 @@ | |||
| 30 | #include <stdlib.h> | 29 | #include <stdlib.h> |
| 31 | 30 | ||
| 32 | #if defined __APPLE__ && defined __MACH__ && HAVE_LANGINFO_CODESET | 31 | #if defined __APPLE__ && defined __MACH__ && HAVE_LANGINFO_CODESET |
| 33 | # define DARWIN7 /* Darwin 7 or newer, i.e. MacOS X 10.3 or newer */ | 32 | # define DARWIN7 /* Darwin 7 or newer, i.e. Mac OS X 10.3 or newer */ |
| 34 | #endif | 33 | #endif |
| 35 | 34 | ||
| 36 | #if defined _WIN32 || defined __WIN32__ | 35 | #if defined _WIN32 || defined __WIN32__ |
| 37 | # define WIN32_NATIVE | 36 | # define WINDOWS_NATIVE |
| 38 | #endif | 37 | #endif |
| 39 | 38 | ||
| 40 | #if defined __EMX__ | 39 | #if defined __EMX__ |
| @@ -44,7 +43,7 @@ | |||
| 44 | # endif | 43 | # endif |
| 45 | #endif | 44 | #endif |
| 46 | 45 | ||
| 47 | #if !defined WIN32_NATIVE | 46 | #if !defined WINDOWS_NATIVE |
| 48 | # include <unistd.h> | 47 | # include <unistd.h> |
| 49 | # if HAVE_LANGINFO_CODESET | 48 | # if HAVE_LANGINFO_CODESET |
| 50 | # include <langinfo.h> | 49 | # include <langinfo.h> |
| @@ -57,7 +56,7 @@ | |||
| 57 | # define WIN32_LEAN_AND_MEAN | 56 | # define WIN32_LEAN_AND_MEAN |
| 58 | # include <windows.h> | 57 | # include <windows.h> |
| 59 | # endif | 58 | # endif |
| 60 | #elif defined WIN32_NATIVE | 59 | #elif defined WINDOWS_NATIVE |
| 61 | # define WIN32_LEAN_AND_MEAN | 60 | # define WIN32_LEAN_AND_MEAN |
| 62 | # include <windows.h> | 61 | # include <windows.h> |
| 63 | #endif | 62 | #endif |
| @@ -66,6 +65,11 @@ | |||
| 66 | # include <os2.h> | 65 | # include <os2.h> |
| 67 | #endif | 66 | #endif |
| 68 | 67 | ||
| 68 | /* For MB_CUR_MAX_L */ | ||
| 69 | #if defined DARWIN7 | ||
| 70 | # include <xlocale.h> | ||
| 71 | #endif | ||
| 72 | |||
| 69 | #if ENABLE_RELOCATABLE | 73 | #if ENABLE_RELOCATABLE |
| 70 | # include "relocatable.h" | 74 | # include "relocatable.h" |
| 71 | #else | 75 | #else |
| @@ -83,7 +87,7 @@ | |||
| 83 | #endif | 87 | #endif |
| 84 | 88 | ||
| 85 | #if defined _WIN32 || defined __WIN32__ || defined __CYGWIN__ || defined __EMX__ || defined __DJGPP__ | 89 | #if defined _WIN32 || defined __WIN32__ || defined __CYGWIN__ || defined __EMX__ || defined __DJGPP__ |
| 86 | /* Win32, Cygwin, OS/2, DOS */ | 90 | /* Native Windows, Cygwin, OS/2, DOS */ |
| 87 | # define ISSLASH(C) ((C) == '/' || (C) == '\\') | 91 | # define ISSLASH(C) ((C) == '/' || (C) == '\\') |
| 88 | #endif | 92 | #endif |
| 89 | 93 | ||
| @@ -123,7 +127,7 @@ get_charset_aliases (void) | |||
| 123 | cp = charset_aliases; | 127 | cp = charset_aliases; |
| 124 | if (cp == NULL) | 128 | if (cp == NULL) |
| 125 | { | 129 | { |
| 126 | #if !(defined DARWIN7 || defined VMS || defined WIN32_NATIVE || defined __CYGWIN__) | 130 | #if !(defined DARWIN7 || defined VMS || defined WINDOWS_NATIVE || defined __CYGWIN__) |
| 127 | const char *dir; | 131 | const char *dir; |
| 128 | const char *base = "charset.alias"; | 132 | const char *base = "charset.alias"; |
| 129 | char *file_name; | 133 | char *file_name; |
| @@ -228,8 +232,7 @@ get_charset_aliases (void) | |||
| 228 | { | 232 | { |
| 229 | /* Out of memory. */ | 233 | /* Out of memory. */ |
| 230 | res_size = 0; | 234 | res_size = 0; |
| 231 | if (old_res_ptr != NULL) | 235 | free (old_res_ptr); |
| 232 | free (old_res_ptr); | ||
| 233 | break; | 236 | break; |
| 234 | } | 237 | } |
| 235 | strcpy (res_ptr + res_size - (l2 + 1) - (l1 + 1), buf1); | 238 | strcpy (res_ptr + res_size - (l2 + 1) - (l1 + 1), buf1); |
| @@ -309,7 +312,7 @@ get_charset_aliases (void) | |||
| 309 | "DECKOREAN" "\0" "EUC-KR" "\0"; | 312 | "DECKOREAN" "\0" "EUC-KR" "\0"; |
| 310 | # endif | 313 | # endif |
| 311 | 314 | ||
| 312 | # if defined WIN32_NATIVE || defined __CYGWIN__ | 315 | # if defined WINDOWS_NATIVE || defined __CYGWIN__ |
| 313 | /* To avoid the troubles of installing a separate file in the same | 316 | /* To avoid the troubles of installing a separate file in the same |
| 314 | directory as the DLL and of retrieving the DLL's directory at | 317 | directory as the DLL and of retrieving the DLL's directory at |
| 315 | runtime, simply inline the aliases here. */ | 318 | runtime, simply inline the aliases here. */ |
| @@ -361,7 +364,7 @@ locale_charset (void) | |||
| 361 | const char *codeset; | 364 | const char *codeset; |
| 362 | const char *aliases; | 365 | const char *aliases; |
| 363 | 366 | ||
| 364 | #if !(defined WIN32_NATIVE || defined OS2) | 367 | #if !(defined WINDOWS_NATIVE || defined OS2) |
| 365 | 368 | ||
| 366 | # if HAVE_LANGINFO_CODESET | 369 | # if HAVE_LANGINFO_CODESET |
| 367 | 370 | ||
| @@ -408,10 +411,10 @@ locale_charset (void) | |||
| 408 | } | 411 | } |
| 409 | } | 412 | } |
| 410 | 413 | ||
| 411 | /* Woe32 has a function returning the locale's codepage as a number: | 414 | /* The Windows API has a function returning the locale's codepage as a |
| 412 | GetACP(). This encoding is used by Cygwin, unless the user has set | 415 | number: GetACP(). This encoding is used by Cygwin, unless the user |
| 413 | the environment variable CYGWIN=codepage:oem (which very few people | 416 | has set the environment variable CYGWIN=codepage:oem (which very few |
| 414 | do). | 417 | people do). |
| 415 | Output directed to console windows needs to be converted (to | 418 | Output directed to console windows needs to be converted (to |
| 416 | GetOEMCP() if the console is using a raster font, or to | 419 | GetOEMCP() if the console is using a raster font, or to |
| 417 | GetConsoleOutputCP() if it is using a TrueType font). Cygwin does | 420 | GetConsoleOutputCP() if it is using a TrueType font). Cygwin does |
| @@ -454,12 +457,12 @@ locale_charset (void) | |||
| 454 | 457 | ||
| 455 | # endif | 458 | # endif |
| 456 | 459 | ||
| 457 | #elif defined WIN32_NATIVE | 460 | #elif defined WINDOWS_NATIVE |
| 458 | 461 | ||
| 459 | static char buf[2 + 10 + 1]; | 462 | static char buf[2 + 10 + 1]; |
| 460 | 463 | ||
| 461 | /* Woe32 has a function returning the locale's codepage as a number: | 464 | /* The Windows API has a function returning the locale's codepage as a |
| 462 | GetACP(). | 465 | number: GetACP(). |
| 463 | When the output goes to a console window, it needs to be provided in | 466 | When the output goes to a console window, it needs to be provided in |
| 464 | GetOEMCP() encoding if the console is using a raster font, or in | 467 | GetOEMCP() encoding if the console is using a raster font, or in |
| 465 | GetConsoleOutputCP() encoding if it is using a TrueType font. | 468 | GetConsoleOutputCP() encoding if it is using a TrueType font. |
| @@ -544,5 +547,12 @@ locale_charset (void) | |||
| 544 | if (codeset[0] == '\0') | 547 | if (codeset[0] == '\0') |
| 545 | codeset = "ASCII"; | 548 | codeset = "ASCII"; |
| 546 | 549 | ||
| 550 | #ifdef DARWIN7 | ||
| 551 | /* Mac OS X sets MB_CUR_MAX to 1 when LC_ALL=C, and "UTF-8" | ||
| 552 | (the default codeset) does not work when MB_CUR_MAX is 1. */ | ||
| 553 | if (strcmp (codeset, "UTF-8") == 0 && MB_CUR_MAX_L (uselocale (NULL)) <= 1) | ||
| 554 | codeset = "ASCII"; | ||
| 555 | #endif | ||
| 556 | |||
| 547 | return codeset; | 557 | return codeset; |
| 548 | } | 558 | } |
