X-Git-Url: http://erislabs.net/gitweb/?a=blobdiff_plain;f=lib%2Flocalcharset.c;h=61f8f3e8529ed4b5de04fad2f0f84642c14cf0af;hb=d36212cb0a461bc3f063ecbcb1c4d88316eaa397;hp=932473c5b342ed4ddfc1a80eacd68ecc7ace0e3f;hpb=c0a1220dfadca5d04d1a4fabe7c0697d763fea58;p=gnulib.git diff --git a/lib/localcharset.c b/lib/localcharset.c index 932473c5b..61f8f3e85 100644 --- a/lib/localcharset.c +++ b/lib/localcharset.c @@ -1,6 +1,6 @@ /* Determine a canonical name for the current locale's character encoding. - Copyright (C) 2000 Free Software Foundation, Inc. + Copyright (C) 2000-2001 Free Software Foundation, Inc. This program is free software; you can redistribute it and/or modify it under the terms of the GNU Library General Public License as published @@ -37,12 +37,22 @@ # include #endif -#if HAVE_LANGINFO_CODESET -# include -#else -# if HAVE_SETLOCALE -# include +#if defined _WIN32 || defined __WIN32__ +# undef WIN32 /* avoid warning on mingw32 */ +# define WIN32 +#endif + +#ifndef WIN32 +# if HAVE_LANGINFO_CODESET +# include +# else +# if HAVE_SETLOCALE +# include +# endif # endif +#else /* WIN32 */ +# define WIN32_LEAN_AND_MEAN +# include #endif #ifndef DIRECTORY_SEPARATOR @@ -59,20 +69,24 @@ 'charset_aliases' simultaneously, both will produce the same value, and everything will be ok if the two assignments to 'charset_aliases' are atomic. But I don't know what will happen if the two assignments mix. */ +#if __STDC__ != 1 +# define volatile /* empty */ +#endif /* Pointer to the contents of the charset.alias file, if it has already been read, else NULL. Its format is: ALIAS_1 '\0' CANONICAL_1 '\0' ... ALIAS_n '\0' CANONICAL_n '\0' '\0' */ -static char * volatile charset_aliases; +static const char * volatile charset_aliases; /* Return a pointer to the contents of the charset.alias file. */ static const char * get_charset_aliases () { - char *cp; + const char *cp; cp = charset_aliases; if (cp == NULL) { +#ifndef WIN32 FILE *fp; const char *dir = LIBDIR; const char *base = "charset.alias"; @@ -157,9 +171,20 @@ get_charset_aliases () } } - charset_aliases = cp; if (file_name != NULL) free (file_name); + +#else /* WIN32 */ + + /* To avoid the troubles of installing a separate file in the same + directory as the DLL and of retrieving the DLL's directory at + runtime, simply inline the aliases here. */ + + cp = "CP936" "\0" "GBK" "\0" + "CP1361" "\0" "JOHAB" "\0"; +#endif + + charset_aliases = cp; } return cp; @@ -169,7 +194,7 @@ get_charset_aliases () into one of the canonical names listed in config.charset. The result must not be freed; it is statically allocated. If the canonical name cannot be determined, the result is a non-canonical - name or NULL. */ + name. */ #ifdef STATIC STATIC @@ -180,19 +205,25 @@ locale_charset () const char *codeset; const char *aliases; -#if HAVE_LANGINFO_CODESET +#ifndef WIN32 + +# if HAVE_LANGINFO_CODESET /* Most systems support nl_langinfo (CODESET) nowadays. */ codeset = nl_langinfo (CODESET); -#else +# else - /* On old systems which lack it, use setlocale and getenv. */ + /* On old systems which lack it, use setlocale or getenv. */ const char *locale = NULL; -# if HAVE_SETLOCALE + /* But most old systems don't have a complete set of locales. Some + (like SunOS 4 or DJGPP) have only the C locale. Therefore we don't + use setlocale here; it would return "C" when it doesn't support the + locale name the user has set. */ +# if HAVE_SETLOCALE && 0 locale = setlocale (LC_CTYPE, NULL); -# endif +# endif if (locale == NULL || locale[0] == '\0') { locale = getenv ("LC_ALL"); @@ -209,20 +240,32 @@ locale_charset () through the charset.alias file. */ codeset = locale; +# endif + +#else /* WIN32 */ + + static char buf[2 + 10 + 1]; + + /* Win32 has a function returning the locale's codepage as a number. */ + sprintf (buf, "CP%u", GetACP ()); + codeset = buf; + #endif - if (codeset != NULL && codeset[0] != '\0') - { - /* Resolve alias. */ - for (aliases = get_charset_aliases (); - *aliases != '\0'; - aliases += strlen (aliases) + 1, aliases += strlen (aliases) + 1) - if (!strcmp (codeset, aliases)) - { - codeset = aliases + strlen (aliases) + 1; - break; - } - } + if (codeset == NULL) + /* The canonical name cannot be determined. */ + codeset = ""; + + /* Resolve alias. */ + for (aliases = get_charset_aliases (); + *aliases != '\0'; + aliases += strlen (aliases) + 1, aliases += strlen (aliases) + 1) + if (strcmp (codeset, aliases) == 0 + || (aliases[0] == '*' && aliases[1] == '\0')) + { + codeset = aliases + strlen (aliases) + 1; + break; + } return codeset; }