diff options
author | Jim Meyering <jim@meyering.net> | 2000-12-19 08:16:09 +0000 |
---|---|---|
committer | Jim Meyering <jim@meyering.net> | 2000-12-19 08:16:09 +0000 |
commit | bc40f9fcef7371f4286b523dafe7c8d8a6b16c68 (patch) | |
tree | 19ecf6a1caf37a68be29ea17487a85ff2c5af8b0 | |
parent | d81418fd5ec90c7f20411d3c9f75e2e34c61bd15 (diff) | |
download | coreutils-bc40f9fcef7371f4286b523dafe7c8d8a6b16c68.tar.xz |
(locale_charset): Add support for Win32.
-rw-r--r-- | lib/localcharset.c | 54 |
1 files changed, 44 insertions, 10 deletions
diff --git a/lib/localcharset.c b/lib/localcharset.c index 932473c5b..936d93d84 100644 --- a/lib/localcharset.c +++ b/lib/localcharset.c @@ -37,12 +37,22 @@ # include <stdlib.h> #endif -#if HAVE_LANGINFO_CODESET -# include <langinfo.h> -#else -# if HAVE_SETLOCALE -# include <locale.h> +#if defined _WIN32 || defined __WIN32__ +# undef WIN32 /* avoid warning on mingw32 */ +# define WIN32 +#endif + +#ifndef WIN32 +# if HAVE_LANGINFO_CODESET +# include <langinfo.h> +# else +# if HAVE_SETLOCALE +# include <locale.h> +# endif # endif +#else /* WIN32 */ +# define WIN32_LEAN_AND_MEAN +# include <windows.h> #endif #ifndef DIRECTORY_SEPARATOR @@ -73,6 +83,7 @@ get_charset_aliases () cp = charset_aliases; if (cp == NULL) { +#ifndef WIN32 FILE *fp; const char *dir = LIBDIR; const char *base = "charset.alias"; @@ -157,9 +168,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; @@ -180,19 +202,21 @@ 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. */ const char *locale = NULL; -# if HAVE_SETLOCALE +# if HAVE_SETLOCALE locale = setlocale (LC_CTYPE, NULL); -# endif +# endif if (locale == NULL || locale[0] == '\0') { locale = getenv ("LC_ALL"); @@ -209,6 +233,16 @@ 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') |