summaryrefslogtreecommitdiff
path: root/lib/localcharset.c
diff options
context:
space:
mode:
authorJim Meyering <jim@meyering.net>2000-12-19 08:16:09 +0000
committerJim Meyering <jim@meyering.net>2000-12-19 08:16:09 +0000
commitbc40f9fcef7371f4286b523dafe7c8d8a6b16c68 (patch)
tree19ecf6a1caf37a68be29ea17487a85ff2c5af8b0 /lib/localcharset.c
parentd81418fd5ec90c7f20411d3c9f75e2e34c61bd15 (diff)
downloadcoreutils-bc40f9fcef7371f4286b523dafe7c8d8a6b16c68.tar.xz
(locale_charset): Add support for Win32.
Diffstat (limited to 'lib/localcharset.c')
-rw-r--r--lib/localcharset.c54
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')