#define WINVER 0x0600 #include #include #include #define VERSION "1.0" extern char *__progname; void version () __attribute__ ((noreturn)); void usage (FILE *, int) __attribute__ ((noreturn)); void version () { printf ("%s (Cygwin) %s\n", __progname, VERSION); exit (0); } void usage (FILE * stream, int status) { fprintf (stream, "\n\ Usage: %s [-suU] [-l LCID]\n\ \n\ Return POSIX LANG identifier corresponding to a locale, default is the\n\ system default locale\n\ Possible options are:\n\ \n\ -s, --system return LANG for the system's default locale\n\ -u, --user return LANG for the current user's default locale\n\ -l, --lcid LCID return LANG for the LCID given as argument\n\ -U, --UTF-8 always attach .UTF-8 to LANG\n\ -h, --help this text\n\ -V, --version print the version of %s and exit\n", __progname, __progname); exit (status); } struct option longopts[] = { {"system", no_argument, NULL, 's'}, {"user", no_argument, NULL, 'u'}, {"lcid", required_argument, NULL, 'l'}, {"UTF-8", no_argument, NULL, 'U'}, {"help", no_argument, NULL, 'h'}, {"version", no_argument, NULL, 'V'}, {"testloop", no_argument, NULL, 'T'}, {0, no_argument, NULL, 0} }; char *opts = "dsul:UhV"; int getlocale (LCID lcid, bool utf, bool test) { UINT codepage; char iso639[10]; char iso3166[10]; if (!GetLocaleInfo (lcid, LOCALE_IDEFAULTANSICODEPAGE | LOCALE_RETURN_NUMBER, (char *) &codepage, sizeof codepage) || !GetLocaleInfo (lcid, LOCALE_SISO639LANGNAME, iso639, 10) || !GetLocaleInfo (lcid, LOCALE_SISO3166CTRYNAME, iso3166, 10)) { if (!test) fprintf (stderr, "%s: Non existant locale\n", __progname); return 2; } if (utf) codepage = 0; if (test) { char cty[256]; char lang[256]; GetLocaleInfo (lcid, LOCALE_SENGCOUNTRY, cty, 256); GetLocaleInfo (lcid, LOCALE_SENGLANGUAGE, lang, 256); printf ("0x%04x=\"%s_%s\", %s (%s)\n", (unsigned) lcid, iso639, iso3166, lang, cty); } else printf ("LANG=\"%s_%s%s\"\n", iso639, iso3166, codepage ? "" : ".UTF-8"); return 0; } #define d(X) {X, #X} struct dl { LCTYPE t; const char *s; } dlist[] = { d(LOCALE_SLONGDATE), d(LOCALE_SSHORTDATE), d(LOCALE_STIMEFORMAT), d(LOCALE_SYEARMONTH), d(LOCALE_S1159), d(LOCALE_S2359), d(LOCALE_SDAYNAME1), d(LOCALE_SDAYNAME2), d(LOCALE_SDAYNAME3), d(LOCALE_SDAYNAME4), d(LOCALE_SDAYNAME5), d(LOCALE_SDAYNAME6), d(LOCALE_SDAYNAME7), d(LOCALE_SABBREVDAYNAME1), d(LOCALE_SABBREVDAYNAME2), d(LOCALE_SABBREVDAYNAME3), d(LOCALE_SABBREVDAYNAME4), d(LOCALE_SABBREVDAYNAME5), d(LOCALE_SABBREVDAYNAME6), d(LOCALE_SABBREVDAYNAME7), d(LOCALE_SMONTHNAME1), d(LOCALE_SMONTHNAME2), d(LOCALE_SMONTHNAME3), d(LOCALE_SMONTHNAME4), d(LOCALE_SMONTHNAME5), d(LOCALE_SMONTHNAME6), d(LOCALE_SMONTHNAME7), d(LOCALE_SMONTHNAME8), d(LOCALE_SMONTHNAME9), d(LOCALE_SMONTHNAME10), d(LOCALE_SMONTHNAME11), d(LOCALE_SMONTHNAME12), d(LOCALE_SMONTHNAME13), d(LOCALE_SABBREVMONTHNAME1), d(LOCALE_SABBREVMONTHNAME2), d(LOCALE_SABBREVMONTHNAME3), d(LOCALE_SABBREVMONTHNAME4), d(LOCALE_SABBREVMONTHNAME5), d(LOCALE_SABBREVMONTHNAME6), d(LOCALE_SABBREVMONTHNAME7), d(LOCALE_SABBREVMONTHNAME8), d(LOCALE_SABBREVMONTHNAME9), d(LOCALE_SABBREVMONTHNAME10), d(LOCALE_SABBREVMONTHNAME11), d(LOCALE_SABBREVMONTHNAME12), d(LOCALE_SABBREVMONTHNAME13), { 0, NULL } }; int main (int argc, char **argv) { int opt; LCID lcid = LOCALE_SYSTEM_DEFAULT; bool utf = false; bool test = false; bool dates = false; while ((opt = getopt_long (argc, argv, opts, longopts, NULL)) != EOF) switch (opt) { case 's': lcid = LOCALE_SYSTEM_DEFAULT; break; case 'u': lcid = LOCALE_USER_DEFAULT; break; case 'l': lcid = strtoul (optarg, NULL, 0); break; case 'U': utf = true; break; case 'h': usage (stdout, 0); break; case 'V': version (); break; case 'T': test = true; break; case 'd': dates = true; break; default: usage (stderr, 1); break; } if (test) { for (unsigned lang = 1; lang <= 0x3ff; ++lang) for (unsigned sublang = 1; sublang <= 0x3f; ++sublang) getlocale ((sublang << 10) | lang, false, true); return 0; } if (dates) { char buf[256]; for (dl *dp = dlist; dp->t; ++dp) if (GetLocaleInfo (lcid, dp->t, buf, 256)) printf ("%s: <%s>\n", dp->s, buf); return 0; } return getlocale (lcid, utf, false); }