OSDN Git Service

* libc/locale/nl_langinfo.c (nl_langinfo): Return "CP932" when using
authorcorinna <corinna>
Sun, 24 Jan 2010 12:18:19 +0000 (12:18 +0000)
committercorinna <corinna>
Sun, 24 Jan 2010 12:18:19 +0000 (12:18 +0000)
SJIS on Cygwin.  Explain why.

newlib/ChangeLog
newlib/libc/locale/nl_langinfo.c

index 187978c..5b21f2b 100644 (file)
@@ -1,3 +1,8 @@
+2010-01-24  Corinna Vinschen  <corinna@vinschen.de>
+
+       * libc/locale/nl_langinfo.c (nl_langinfo): Return "CP932" when using
+       SJIS on Cygwin.  Explain why.
+
 2010-01-23  Corinna Vinschen  <corinna@vinschen.de>
 
        * libc/locale/locale.c (loadlocale): Allow CP932 as alias for SJIS.
index ae7228c..cd86c15 100644 (file)
@@ -79,6 +79,20 @@ _DEFUN(nl_langinfo, (item),
                    else if (strcmp (ret + 2, "21866") == 0)
                      ret = "KOI8-U";
                  }
+               else if (ret[0] == 'S'/*JIS*/)
+                 {
+                   /* Cygwin uses MSFT's implementation of SJIS, which differs
+                      in some codepoints from the real thing, especially
+                      0x5c: yen sign instead of backslash,
+                      0x7e: overline instead of tilde.
+                      We can't use the real SJIS since otherwise Win32
+                      pathnames would become invalid.  OTOH, if we return
+                      "SJIS" here, then libiconv will do mb<->wc conversion
+                      differently to our internal functions.  Therefore we
+                      return what we really implement, CP932.  This is handled
+                      fine by libiconv. */
+                   ret = "CP932";
+                 }
 #else
                ret = "";
                if ((s = setlocale(LC_CTYPE, NULL)) != NULL) {