summaryrefslogtreecommitdiffstats
path: root/winsup/utils
diff options
context:
space:
mode:
authorCorinna Vinschen <corinna@vinschen.de>2010-01-22 22:31:50 +0000
committerCorinna Vinschen <corinna@vinschen.de>2010-01-22 22:31:50 +0000
commitbe822de2a1f66e29f17b1c1d64a34c6c07264f66 (patch)
tree5f64d665d233e6ace6d3c1565c2e56fab6d34064 /winsup/utils
parent326fb376dda24e2c3f445863791eb6073d91d69b (diff)
downloadcygnal-be822de2a1f66e29f17b1c1d64a34c6c07264f66.tar.gz
cygnal-be822de2a1f66e29f17b1c1d64a34c6c07264f66.tar.bz2
cygnal-be822de2a1f66e29f17b1c1d64a34c6c07264f66.zip
* Makefile.in (CYGWIN_BINS): Add getlocale.
* getlocale.c: New file. * utils.sgml (getlocale): New section describing new getlocale tool.
Diffstat (limited to 'winsup/utils')
-rw-r--r--winsup/utils/ChangeLog6
-rw-r--r--winsup/utils/Makefile.in4
-rw-r--r--winsup/utils/getlocale.c129
-rw-r--r--winsup/utils/utils.sgml48
4 files changed, 185 insertions, 2 deletions
diff --git a/winsup/utils/ChangeLog b/winsup/utils/ChangeLog
index e33d8f2b0..8d677e6fd 100644
--- a/winsup/utils/ChangeLog
+++ b/winsup/utils/ChangeLog
@@ -1,3 +1,9 @@
+2010-01-22 Corinna Vinschen <corinna@vinschen.de>
+
+ * Makefile.in (CYGWIN_BINS): Add getlocale.
+ * getlocale.c: New file.
+ * utils.sgml (getlocale): New section describing new getlocale tool.
+
2010-01-16 Corinna Vinschen <corinna@vinschen.de>
* cygpath.cc (get_mixed_name): Drop function. Replace with call to
diff --git a/winsup/utils/Makefile.in b/winsup/utils/Makefile.in
index 1e282d0c4..04ce39fad 100644
--- a/winsup/utils/Makefile.in
+++ b/winsup/utils/Makefile.in
@@ -1,6 +1,6 @@
# Makefile for Cygwin utilities
# Copyright 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004,
-# 2005, 2006, 2007, 2008, 2009 Red Hat, Inc.
+# 2005, 2006, 2007, 2008, 2009, 2010 Red Hat, Inc.
# This file is part of Cygwin.
@@ -52,7 +52,7 @@ MINGW_CXX := ${srcdir}/mingw ${CXX} -I${updir}
# List all binaries to be linked in Cygwin mode. Each binary on this list
# must have a corresponding .o of the same name.
-CYGWIN_BINS := ${addsuffix .exe,cygpath getfacl ldd kill mkgroup \
+CYGWIN_BINS := ${addsuffix .exe,cygpath getfacl getlocale ldd kill mkgroup \
mkpasswd mount passwd ps regtool setfacl setmetamode ssp umount}
# List all binaries to be linked in MinGW mode. Each binary on this list
diff --git a/winsup/utils/getlocale.c b/winsup/utils/getlocale.c
new file mode 100644
index 000000000..3a601269f
--- /dev/null
+++ b/winsup/utils/getlocale.c
@@ -0,0 +1,129 @@
+/*
+ * Copyright (c) 2010, Corinna Vinschen
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+#include <stdio.h>
+#include <getopt.h>
+#include <string.h>
+#define WINVER 0x0601
+#include <windows.h>
+
+extern char *__progname;
+
+void usage (FILE *, int) __attribute__ ((noreturn));
+
+void
+usage (FILE * stream, int status)
+{
+ fprintf (stream,
+ "Usage: %s [-asuh]\n"
+ "Print Windows locale(s)\n"
+ "\n"
+ "Options:\n"
+ "\n"
+ " -a, --all List all available locales\n"
+ " -s, --system Print system default locale\n"
+ " (default is current user default locale)\n"
+ " -u, --utf Attach \".UTF-8\" to the result\n"
+ " -h, --help this text\n",
+ __progname);
+ exit (status);
+}
+
+struct option longopts[] = {
+ {"all", no_argument, NULL, 'a'},
+ {"system", no_argument, NULL, 's'},
+ {"utf", no_argument, NULL, 'u'},
+ {"help", no_argument, NULL, 'h'},
+ {0, no_argument, NULL, 0}
+};
+const char *opts = "ahsu";
+
+int
+getlocale (LCID lcid, char *name)
+{
+ char iso639[10];
+ char iso3166[10];
+
+ iso3166[0] = '\0';
+ if (!GetLocaleInfo (lcid, LOCALE_SISO639LANGNAME, iso639, 10))
+ return 0;
+ GetLocaleInfo (lcid, LOCALE_SISO3166CTRYNAME, iso3166, 10);
+ sprintf (name, "%s%s%s", iso639, lcid > 0x3ff ? "_" : "",
+ lcid > 0x3ff ? iso3166 : "");
+ return 1;
+}
+
+int main (int argc, char **argv)
+{
+ int opt;
+ LCID lcid = LOCALE_USER_DEFAULT;
+ int all = 0;
+ const char *utf = "";
+ char name[32];
+
+ while ((opt = getopt_long (argc, argv, opts, longopts, NULL)) != EOF)
+ switch (opt)
+ {
+ case 'a':
+ all = 1;
+ break;
+ case 's':
+ lcid = LOCALE_SYSTEM_DEFAULT;
+ break;
+ case 'u':
+ utf = ".UTF-8";
+ break;
+ case 'h':
+ usage (stdout, 0);
+ break;
+ default:
+ usage (stderr, 1);
+ break;
+ }
+ if (all)
+ {
+ unsigned lang, sublang;
+
+ for (lang = 1; lang <= 0x3ff; ++lang)
+ for (sublang = 1; sublang <= 0x3f; ++sublang)
+ {
+ lcid = (sublang << 10) | lang;
+ if (getlocale (lcid, name))
+ {
+ char lang[256];
+ char country[256];
+ char loc[32];
+ GetLocaleInfo (lcid, LOCALE_SENGLANGUAGE, lang, 256);
+ GetLocaleInfo (lcid, LOCALE_SENGCOUNTRY, country, 256);
+ stpcpy (stpcpy (loc, name), utf);
+ printf ("%-16s %s (%s)\n", loc, lang, country);
+ }
+ }
+ return 0;
+ }
+ if (getlocale (lcid, name))
+ printf ("%s%s\n", name, utf);
+ return 0;
+}
diff --git a/winsup/utils/utils.sgml b/winsup/utils/utils.sgml
index bdb3ecb85..0c6499c41 100644
--- a/winsup/utils/utils.sgml
+++ b/winsup/utils/utils.sgml
@@ -501,6 +501,54 @@ The format for ACL output is as follows:
</para>
</sect2>
+<sect2 id="getlocale"><title>getlocale</title>
+
+<screen>
+Usage: getlocale [-asuh]
+Print Windows locale(s)
+
+Options:
+
+ -a, --all List all available locales
+ -s, --system Print system default locale
+ (default is current user default locale)
+ -u, --utf Attach ".UTF-8" to the result
+ -h, --help this text
+</screen>
+
+<para><command>getlocale</command> without parameters just prints the
+current user's Windows default locale to stdout. The <literal>-s</literal>
+option prints the systems default locale instead. With the
+<literal>-u</literal> option <command>getlocale</command> appends a ".UTF-8".
+This can be used in scripts to set the Cygwin locale, for instance:
+</para>
+
+<screen>
+bash$ export LANG=$(getlocale -u)
+bash$ echo $LANG
+en_US.UTF-8
+</screen>
+
+<para>The <literal>-a</literal> option is helpful to learn which locales
+are supported by your Windows machine. It prints the locales and their
+actual meaning, like this:</para>
+
+<screen>
+bash$ getlocale -a
+ar_SA Arabic (Saudi Arabia)
+ar_IQ Arabic (Iraq)
+zh_TW Chinese (Traditional) (Taiwan)
+zh_CN Chinese (Simplified) (People's Republic of China)
+zh_HK Chinese (Traditional) (Hong Kong S.A.R.)
+da_DK Danish (Denmark)
+en_US English (United States)
+en_GB English (United Kingdom)
+en_AU English (Australia)
+...
+</screen>
+
+</sect2>
+
<sect2 id="kill"><title>kill</title>
<screen>