Akihiro Sagawa : msvcrt: Improve _mbbtombc to handle Japanese characters.

Alexandre Julliard julliard at winehq.org
Mon Mar 26 12:29:32 CDT 2012


Module: wine
Branch: master
Commit: 578d85f320e04608200abd80440c2ff605461a7f
URL:    http://source.winehq.org/git/wine.git/?a=commit;h=578d85f320e04608200abd80440c2ff605461a7f

Author: Akihiro Sagawa <sagawa.aki at gmail.com>
Date:   Wed Mar 21 23:02:10 2012 +0900

msvcrt: Improve _mbbtombc to handle Japanese characters.

---

 dlls/msvcrt/mbcs.c         |   33 +++++++++++++++++++++++++++------
 dlls/msvcrt/tests/string.c |    8 ++------
 2 files changed, 29 insertions(+), 12 deletions(-)

diff --git a/dlls/msvcrt/mbcs.c b/dlls/msvcrt/mbcs.c
index 6d3e3fb..c61311b 100644
--- a/dlls/msvcrt/mbcs.c
+++ b/dlls/msvcrt/mbcs.c
@@ -52,6 +52,19 @@ static struct cp_extra_info_t g_cpextrainfo[] =
     {0, {1, 255, 0, 0}}       /* match all with FIXME */
 };
 
+/* Maps cp932 single byte character to multi byte character */
+static const unsigned char mbbtombc_932[] = {
+  0x40,0x49,0x68,0x94,0x90,0x93,0x95,0x66,0x69,0x6a,0x96,0x7b,0x43,0x7c,0x44,0x5e,
+  0x4f,0x50,0x51,0x52,0x53,0x54,0x55,0x56,0x57,0x58,0x46,0x47,0x83,0x81,0x84,0x48,
+  0x97,0x60,0x61,0x62,0x63,0x64,0x65,0x66,0x67,0x68,0x69,0x6a,0x6b,0x6c,0x6d,0x6e,
+  0x6f,0x70,0x71,0x72,0x73,0x74,0x75,0x76,0x77,0x78,0x79,0x6d,0x8f,0x6e,0x4f,0x76,
+  0x77,0x78,0x79,0x6d,0x8f,0x6e,0x4f,0x51,0x65,0x81,0x82,0x83,0x84,0x85,0x86,0x87,
+  0x88,0x89,0x8a,0x8b,0x8c,0x8d,0x8e,0x8f,0x90,0x91,0x92,0x93,0x94,0x95,0x50,
+       0x42,0x75,0x76,0x41,0x45,0x92,0x40,0x42,0x44,0x46,0x48,0x83,0x85,0x87,0x62,
+  0x5b,0x41,0x43,0x45,0x47,0x49,0x4a,0x4c,0x4e,0x50,0x52,0x54,0x56,0x58,0x5a,0x5c,
+  0x5e,0x60,0x63,0x65,0x67,0x69,0x6a,0x6b,0x6c,0x6d,0x6e,0x71,0x74,0x77,0x7a,0x7d,
+  0x7e,0x80,0x81,0x82,0x84,0x86,0x88,0x89,0x8a,0x8b,0x8c,0x8d,0x8f,0x93,0x4a,0x4b };
+
 /* Maps multibyte cp932 punctuation marks to single byte equivalents */
 static const unsigned char mbctombb_932_punct[] = {
   0x20,0xa4,0xa1,0x2c,0x2e,0xa5,0x3a,0x3b,0x3f,0x21,0xde,0xdf,0x00,0x00,0x00,0x5e,
@@ -1080,14 +1093,22 @@ unsigned char* CDECL _mbstok(unsigned char *str, const unsigned char *delim)
  */
 unsigned int CDECL _mbbtombc(unsigned int c)
 {
-  if(get_mbcinfo()->ismbcodepage &&
-     ((c >= 0x20 && c <=0x7e) ||(c >= 0xa1 && c <= 0xdf)))
+  if(get_mbcinfo()->mbcodepage == 932)
   {
-    /* FIXME: I can't get this function to return anything
-     * different from what I pass it...
-     */
+    if(c >= 0x20 && c <= 0x7e) {
+      if((c >= 0x41 && c <= 0x5a) || (c >= 0x61 && c <= 0x7a) || (c >= 0x30 && c <= 0x39))
+        return mbbtombc_932[c - 0x20] | 0x8200;
+      else
+        return mbbtombc_932[c - 0x20] | 0x8100;
+    }
+    else if(c >= 0xa1 && c <= 0xdf) {
+      if(c >= 0xa6 && c <= 0xdd && c != 0xb0)
+        return mbbtombc_932[c - 0xa1 + 0x5f] | 0x8300;
+      else
+        return mbbtombc_932[c - 0xa1 + 0x5f] | 0x8100;
+    }
   }
-  return c;  /* ASCII CP or no MB char */
+  return c;  /* not Japanese or no MB char */
 }
 
 /*********************************************************************
diff --git a/dlls/msvcrt/tests/string.c b/dlls/msvcrt/tests/string.c
index e65b274..f3fb243 100644
--- a/dlls/msvcrt/tests/string.c
+++ b/dlls/msvcrt/tests/string.c
@@ -927,12 +927,8 @@ static void test_mbbtombc(void)
             unsigned int exp, ret;
             ret = _mbbtombc(mbbmbc[j][0]);
             exp = (cp[i] == 932) ? mbbmbc[j][1] : mbbmbc[j][0];
-            if (cp[i] == 932 && exp > 255)
-              todo_wine ok(ret == exp, "Expected 0x%x, got 0x%x (0x%x, codepage %d)\n",
-                 exp, ret, mbbmbc[j][0], cp[i]);
-            else
-              ok(ret == exp, "Expected 0x%x, got 0x%x (0x%x, codepage %d)\n",
-                 exp, ret, mbbmbc[j][0], cp[i]);
+            ok(ret == exp, "Expected 0x%x, got 0x%x (0x%x, codepage %d)\n",
+               exp, ret, mbbmbc[j][0], cp[i]);
         }
     }
     _setmbcp(prev_cp);




More information about the wine-cvs mailing list