OSDN Git Service

* strfuncs.cc (__sjis_wctomb): Special handling for characters which
authorcorinna <corinna>
Sat, 23 Jan 2010 16:43:16 +0000 (16:43 +0000)
committercorinna <corinna>
Sat, 23 Jan 2010 16:43:16 +0000 (16:43 +0000)
differ between SJIS and Windows codepage 932, if charset is "SJIS".
(__sjis_mbtowc): Ditto.
(_jis_wctomb): Remove.
(__jis_mbtowc): Remove.

winsup/cygwin/ChangeLog
winsup/cygwin/strfuncs.cc

index 45af01a..68bf818 100644 (file)
@@ -1,5 +1,13 @@
 2010-01-23  Corinna Vinschen  <corinna@vinschen.de>
 
+       * strfuncs.cc (__sjis_wctomb): Special handling for characters which
+       differ between SJIS and Windows codepage 932, if charset is "SJIS".
+       (__sjis_mbtowc): Ditto.
+       (_jis_wctomb): Remove.
+       (__jis_mbtowc): Remove.
+
+2010-01-23  Corinna Vinschen  <corinna@vinschen.de>
+
        * nlsfuncs.cc (wcsxfrm): Call LCMapStringW with LCMAP_BYTEREV flag to
        allow correct comparison using wcscmp.
 
index 849bd5d..181cdb2 100644 (file)
@@ -108,18 +108,27 @@ extern "C" int
 __sjis_wctomb (struct _reent *r, char *s, wchar_t wchar, const char *charset,
               mbstate_t *state)
 {
+  if (*charset == 'S')
+    {
+      /* SJIS is not exactly CP932.  Two ASCII code points are converted
+        differently. */
+      if (wchar == L'\x00a5')   /* SJIS has Yen sign in place of Backslash */
+       {
+         if (s)
+           *s = '\x5c';
+         return 1;
+       }
+      else if (wchar == L'\x203e') /* SJIS has Overline in place of Tilde */
+       {
+         if (s)
+           *s = '\x7e';
+         return 1;
+       }
+    }
   return __db_wctomb (r,s, wchar, 932);
 }
 
 extern "C" int
-__jis_wctomb (struct _reent *r, char *s, wchar_t wchar, const char *charset,
-              mbstate_t *state)
-{
-  /* FIXME: See comment at start of file. */
-  return __ascii_wctomb (r, s, wchar, charset, state);
-}
-
-extern "C" int
 __eucjp_wctomb (struct _reent *r, char *s, wchar_t wchar, const char *charset,
               mbstate_t *state)
 {
@@ -243,15 +252,17 @@ extern "C" int
 __sjis_mbtowc (struct _reent *r, wchar_t *pwc, const char *s, size_t n,
               const char *charset, mbstate_t *state)
 {
-  return __db_mbtowc (r, pwc, s, n, 932, state);
-}
-
-extern "C" int
-__jis_mbtowc (struct _reent *r, wchar_t *pwc, const char *s, size_t n,
-              const char *charset, mbstate_t *state)
-{
-  /* FIXME: See comment at start of file. */
-  return __ascii_mbtowc (r, pwc, s, n, charset, state);
+  int ret = __db_mbtowc (r, pwc, s, n, 932, state);
+  if (*charset == 'S' && pwc && ret == 1)
+    {
+      /* CP932 is not exactly SJIS.  Two ASCII code points are converted
+        differently. */
+      if (*s == '\x5c')                /* SJIS has Yen sign in place of Backslash */
+       *pwc = L'\x00a5';
+      else if (*s == '\x7e')   /* SJIS has Overline in place of Tilde */
+       *pwc = L'\x203e';
+    }
+  return ret;
 }
 
 extern "C" int