David Hedberg : msvcrt: Implement _mbcjistojms.

Alexandre Julliard julliard at winehq.org
Fri Feb 6 09:55:39 CST 2009


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

Author: David Hedberg <david.hedberg at gmail.com>
Date:   Sat Jan 24 00:37:57 2009 +0100

msvcrt: Implement _mbcjistojms.

---

 dlls/msvcrt/mbcs.c         |   36 ++++++++++++++++++++++++++++++++++++
 dlls/msvcrt/msvcrt.spec    |    2 +-
 dlls/msvcrt/tests/string.c |   23 +++++++++++++++++++++++
 3 files changed, 60 insertions(+), 1 deletions(-)

diff --git a/dlls/msvcrt/mbcs.c b/dlls/msvcrt/mbcs.c
index d1a84e7..a6e0cca 100644
--- a/dlls/msvcrt/mbcs.c
+++ b/dlls/msvcrt/mbcs.c
@@ -318,6 +318,42 @@ unsigned int CDECL _mbctoupper(unsigned int c)
 }
 
 /*********************************************************************
+ *		_mbcjistojms(MSVCRT.@)
+ *
+ *		Converts a jis character to sjis.
+ *		Based on description from
+ *		http://www.slayers.ne.jp/~oouchi/code/jistosjis.html
+ */
+unsigned int CDECL _mbcjistojms(unsigned int c)
+{
+  /* Conversion takes place only when codepage is 932.
+     In all other cases, c is returned unchanged */
+  if(MSVCRT___lc_codepage == 932)
+  {
+    if(HIBYTE(c) >= 0x21 && HIBYTE(c) <= 0x7e &&
+       LOBYTE(c) >= 0x21 && LOBYTE(c) <= 0x7e)
+    {
+      if(HIBYTE(c) % 2)
+        c += 0x1f;
+      else
+        c += 0x7d;
+
+      if(LOBYTE(c) > 0x7F)
+        c += 0x1;
+
+      c = (((HIBYTE(c) - 0x21)/2 + 0x81) << 8) | LOBYTE(c);
+
+      if(HIBYTE(c) > 0x9f)
+        c += 0x4000;
+    }
+    else
+      return 0; /* Codepage is 932, but c can't be converted */
+  }
+
+  return c;
+}
+
+/*********************************************************************
  *		_mbsdec(MSVCRT.@)
  */
 unsigned char* CDECL _mbsdec(const unsigned char* start, const unsigned char* cur)
diff --git a/dlls/msvcrt/msvcrt.spec b/dlls/msvcrt/msvcrt.spec
index 32ef01c..1a9bc12 100644
--- a/dlls/msvcrt/msvcrt.spec
+++ b/dlls/msvcrt/msvcrt.spec
@@ -358,7 +358,7 @@
 @ cdecl _mbbtype(long long)
 # extern _mbcasemap
 @ cdecl _mbccpy (str str)
-@ stub _mbcjistojms #(long)
+@ cdecl _mbcjistojms (long)
 @ stub _mbcjmstojis #(long)
 @ cdecl _mbclen(ptr)
 @ stub _mbctohira #(long)
diff --git a/dlls/msvcrt/tests/string.c b/dlls/msvcrt/tests/string.c
index 9134100..45c40d5 100644
--- a/dlls/msvcrt/tests/string.c
+++ b/dlls/msvcrt/tests/string.c
@@ -597,6 +597,28 @@ static void test_wcscpy_s(void)
     ok(szDestShort[0] == 0, "szDestShort[0] not 0\n");
 }
 
+static void test_mbcjisjms(void)
+{
+    /* List of value-pairs to test. The test assumes the last pair to be {0, ..} */
+    unsigned int jisjms[][2] = { {0x2020, 0}, {0x2021, 0}, {0x2120, 0}, {0x2121, 0x8140},
+                                 {0x7f7f, 0}, {0x7f7e, 0}, {0x7e7f, 0}, {0x7e7e, 0xeffc},
+                                 {0x2121FFFF, 0}, {0x2223, 0x81a1}, {0x237e, 0x829e}, {0, 0}};
+    unsigned int ret, exp, i;
+
+    i = 0;
+    do
+    {
+        ret = _mbcjistojms(jisjms[i][0]);
+
+        if(_getmbcp() == 932)   /* Japanese codepage? */
+            exp = jisjms[i][1];
+        else
+            exp = jisjms[i][0]; /* If not, no conversion */
+
+        ok(ret == exp, "Expected 0x%x, got 0x%x\n", exp, ret);
+    } while(jisjms[i++][0] != 0);
+}
+
 START_TEST(string)
 {
     char mem[100];
@@ -637,6 +659,7 @@ START_TEST(string)
     test_strcpy_s();
     test_strcat_s();
     test__mbsnbcpy_s();
+    test_mbcjisjms();
 
     test_wcscpy_s();
 }




More information about the wine-cvs mailing list