public inbox for cygwin-xfree@sourceware.org
help / color / mirror / Atom feed
From: Corinna Vinschen <corinna-cygwin@cygwin.com>
To: cygwin-xfree@cygwin.com
Subject: Re: X11R7.5 and C.UTF-8
Date: Thu, 03 Dec 2009 13:48:00 -0000	[thread overview]
Message-ID: <20091203134837.GX8059@calimero.vinschen.de> (raw)
In-Reply-To: <416096c60912030516r42f67c05yfaa3b64fcca68b43@mail.gmail.com>

[-- Attachment #1: Type: text/plain, Size: 1341 bytes --]

On Dec  3 13:16, Andy Koppe wrote:
> 2009/12/3 Thomas Dickey:
> >> From
> >> http://www.opengroup.org/onlinepubs/009695399/basedefs/xbd_chap07.html,
> >> §7.2:
> >>
> >> "The tables in Locale Definition describe the characteristics and
> >> behavior of the POSIX locale for data consisting entirely of
> >> characters from the portable character set and the control character
> >> set. For other characters, the behavior is unspecified."
> >>
> >> This means that characters 0..127 have to be treated as ASCII, but
> >> beyond that an implementation can do what it wants. And on Cygwin 1.7,
> >> plain "C" actually does imply UTF-8, which happily is
> >> backward-compatible with ASCII.
> >
> > That's an interpretation that so far hasn't been blessed by the standards
> > people.  Any discussion of this topic should mention that, as a caveat.
> 
> Fair point. It also means that apps are entitled to assume that "C"
> supports no more than ASCII, which is why Cygwin 1.7's default locale
> is C.UTF-8. A default locale setting based on the user's language
> selection would be better, but we don't have that (yet?).

Try the attached.  Note:  It has a hidden "--testloop" option...


Corinna

-- 
Corinna Vinschen                  Please, send mails regarding Cygwin to
Cygwin Project Co-Leader          cygwin AT cygwin DOT com
Red Hat

[-- Attachment #2: getlocale.cc --]
[-- Type: text/x-c++src, Size: 4612 bytes --]

#define WINVER 0x0600
#include <stdio.h>
#include <windows.h>
#include <getopt.h>

#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);
}


[-- Attachment #3: Type: text/plain, Size: 223 bytes --]

--
Unsubscribe info:      http://cygwin.com/ml/#unsubscribe-simple
Problem reports:       http://cygwin.com/problems.html
Documentation:         http://x.cygwin.com/docs/
FAQ:                   http://x.cygwin.com/docs/faq/

  reply	other threads:[~2009-12-03 13:48 UTC|newest]

Thread overview: 30+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2009-10-28 14:22 Ken Brown
2009-10-28 21:23 ` Thomas Dickey
2009-10-28 21:48   ` Ken Brown
2009-10-28 22:07     ` Andy Koppe
2009-11-28 12:22       ` Ken Brown
2009-11-28 13:35         ` Andy Koppe
2009-11-28 15:29           ` Ken Brown
2009-12-03  5:27         ` Linda Walsh
2009-12-03  7:37           ` Charles Wilson
2009-12-03  7:48           ` Andy Koppe
2009-12-03  9:09             ` Corinna Vinschen
2009-12-03  9:55             ` Thomas Dickey
2009-12-03 13:16               ` Andy Koppe
2009-12-03 13:48                 ` Corinna Vinschen [this message]
2009-12-04  4:30               ` Eric Blake
2009-12-04  9:45                 ` Thomas Dickey
2009-10-28 21:49   ` Andy Koppe
2009-10-28 23:51     ` Andy Koppe
2009-10-28 22:19   ` Charles Wilson
2009-10-28 23:52 ` Jon TURNEY
2009-10-29  0:07   ` Andy Koppe
2009-10-29 13:42     ` Jon TURNEY
2009-10-29 13:56       ` Corinna Vinschen
2009-10-29 14:54         ` Jon TURNEY
2009-10-29 14:37       ` Ken Brown
2009-10-29 15:01         ` Jon TURNEY
2009-10-29 19:11           ` Jon TURNEY
2009-10-29 20:20             ` Andy Koppe
2009-11-03 21:00               ` Jon TURNEY
2009-11-04  6:34                 ` Andy Koppe

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20091203134837.GX8059@calimero.vinschen.de \
    --to=corinna-cygwin@cygwin.com \
    --cc=cygwin-xfree@cygwin.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).