Akihiro Sagawa : kernel32: Implement LCMAP_HIRAGANA.

Alexandre Julliard julliard at winehq.org
Fri Sep 23 10:25:16 CDT 2016


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

Author: Akihiro Sagawa <sagawa.aki at gmail.com>
Date:   Fri Sep 23 00:06:18 2016 +0900

kernel32: Implement LCMAP_HIRAGANA.

Signed-off-by: Akihiro Sagawa <sagawa.aki at gmail.com>
Signed-off-by: Alexandre Julliard <julliard at winehq.org>

---

 dlls/kernel32/locale.c       | 18 ++++++++++++++++--
 dlls/kernel32/tests/locale.c |  8 ++++++--
 2 files changed, 22 insertions(+), 4 deletions(-)

diff --git a/dlls/kernel32/locale.c b/dlls/kernel32/locale.c
index 97a22ba..de1a28c 100644
--- a/dlls/kernel32/locale.c
+++ b/dlls/kernel32/locale.c
@@ -3192,8 +3192,10 @@ INT WINAPI LCMapStringEx(LPCWSTR name, DWORD flags, LPCWSTR src, INT srclen, LPW
         SetLastError(ERROR_INVALID_FLAGS);
         return 0;
     }
-    if ((flags & (NORM_IGNORENONSPACE | NORM_IGNORESYMBOLS)) &&
-        (flags & ~(NORM_IGNORENONSPACE | NORM_IGNORESYMBOLS)))
+    if (((flags & (NORM_IGNORENONSPACE | NORM_IGNORESYMBOLS)) &&
+         (flags & ~(NORM_IGNORENONSPACE | NORM_IGNORESYMBOLS))) ||
+        ((flags & LCMAP_HIRAGANA) &&
+         (flags & (LCMAP_SIMPLIFIED_CHINESE | LCMAP_TRADITIONAL_CHINESE))))
     {
         SetLastError(ERROR_INVALID_FLAGS);
         return 0;
@@ -3268,6 +3270,18 @@ INT WINAPI LCMapStringEx(LPCWSTR name, DWORD flags, LPCWSTR src, INT srclen, LPW
         srclen -= len;
     }
 
+    if (flags & LCMAP_HIRAGANA)
+    {
+        /* map katakana to hiragana, e.g. U+30A1 -> U+3041.
+           we can't use C3_KATAKANA as some characters can't map to hiragana */
+        for (len = dst_ptr - dst, dst_ptr = dst; len; len--, dst_ptr++)
+        {
+            if ((*dst_ptr >= 0x30A1 && *dst_ptr <= 0x30F6) ||
+                *dst_ptr == 0x30FD || *dst_ptr == 0x30FE)
+                *dst_ptr -= 0x60;
+        }
+    }
+
 done:
     if (srclen)
     {
diff --git a/dlls/kernel32/tests/locale.c b/dlls/kernel32/tests/locale.c
index 5e149d8..94d3d8a 100644
--- a/dlls/kernel32/tests/locale.c
+++ b/dlls/kernel32/tests/locale.c
@@ -2206,6 +2206,10 @@ static const DWORD lcmap_invalid_flags[] = {
     LCMAP_LOWERCASE | NORM_IGNORESYMBOLS,
     LCMAP_UPPERCASE | NORM_IGNORENONSPACE,
     LCMAP_LOWERCASE | NORM_IGNORENONSPACE,
+    LCMAP_HIRAGANA | NORM_IGNORENONSPACE,
+    LCMAP_HIRAGANA | NORM_IGNORESYMBOLS,
+    LCMAP_HIRAGANA | LCMAP_SIMPLIFIED_CHINESE,
+    LCMAP_HIRAGANA | LCMAP_TRADITIONAL_CHINESE,
 };
 
 static void test_LCMapStringA(void)
@@ -2433,14 +2437,14 @@ static void test_lcmapstring_unicode(lcmapstring_wrapper func_ptr, const char *f
                    japanese_text, -1, buf, sizeof(buf)/sizeof(WCHAR));
     ok(ret == lstrlenW(hiragana_text) + 1, "%s ret %d, error %d, expected value %d\n", func_name,
        ret, GetLastError(), lstrlenW(hiragana_text) + 1);
-    todo_wine ok(!lstrcmpW(buf, hiragana_text), "%s string compare mismatch\n", func_name);
+    ok(!lstrcmpW(buf, hiragana_text), "%s string compare mismatch\n", func_name);
 
     buf[0] = 0x30f5; /* KATAKANA LETTER SMALL KA */
     ret = func_ptr(LCMAP_HIRAGANA, buf, 1, buf2, 1);
     ok(ret == 1, "%s ret %d, error %d, expected value 1\n", func_name,
        ret, GetLastError());
     /* U+3095: HIRAGANA LETTER SMALL KA was added in Unicode 3.2 */
-    todo_wine ok(buf2[0] == 0x3095 || broken(buf2[0] == 0x30f5 /* Vista and earlier versions */),
+    ok(buf2[0] == 0x3095 || broken(buf2[0] == 0x30f5 /* Vista and earlier versions */),
        "%s expected %04x, got %04x\n", func_name, 0x3095, buf2[0]);
 
     /* test LCMAP_KATAKANA | LCMAP_LOWERCASE */




More information about the wine-cvs mailing list