From 12c547919f2760595a7bbf8566da6e45a89344e2 Mon Sep 17 00:00:00 2001 From: Akihiro Sagawa Date: Fri, 23 Sep 2016 00:06:19 +0900 Subject: [PATCH] kernel32: Implement LCMAP_KATAKANA. Signed-off-by: Akihiro Sagawa Signed-off-by: Alexandre Julliard --- dlls/kernel32/locale.c | 13 ++++++++++++- dlls/kernel32/tests/locale.c | 6 +++++- 2 files changed, 17 insertions(+), 2 deletions(-) diff --git a/dlls/kernel32/locale.c b/dlls/kernel32/locale.c index de1a28cdbfd..842922a50b4 100644 --- a/dlls/kernel32/locale.c +++ b/dlls/kernel32/locale.c @@ -3194,7 +3194,7 @@ INT WINAPI LCMapStringEx(LPCWSTR name, DWORD flags, LPCWSTR src, INT srclen, LPW } if (((flags & (NORM_IGNORENONSPACE | NORM_IGNORESYMBOLS)) && (flags & ~(NORM_IGNORENONSPACE | NORM_IGNORESYMBOLS))) || - ((flags & LCMAP_HIRAGANA) && + ((flags & (LCMAP_HIRAGANA | LCMAP_KATAKANA)) && (flags & (LCMAP_SIMPLIFIED_CHINESE | LCMAP_TRADITIONAL_CHINESE)))) { SetLastError(ERROR_INVALID_FLAGS); @@ -3281,6 +3281,17 @@ INT WINAPI LCMapStringEx(LPCWSTR name, DWORD flags, LPCWSTR src, INT srclen, LPW *dst_ptr -= 0x60; } } + else if (flags & LCMAP_KATAKANA) + { + /* map hiragana to katakana, e.g. U+3041 -> U+30A1. + we can't use C3_HIRAGANA as some characters can't map to katakana */ + for (len = dst_ptr - dst, dst_ptr = dst; len; len--, dst_ptr++) + { + if ((*dst_ptr >= 0x3041 && *dst_ptr <= 0x3096) || + *dst_ptr == 0x309D || *dst_ptr == 0x309E) + *dst_ptr += 0x60; + } + } done: if (srclen) diff --git a/dlls/kernel32/tests/locale.c b/dlls/kernel32/tests/locale.c index 94d3d8afd05..57219796e1b 100644 --- a/dlls/kernel32/tests/locale.c +++ b/dlls/kernel32/tests/locale.c @@ -2210,6 +2210,10 @@ static const DWORD lcmap_invalid_flags[] = { LCMAP_HIRAGANA | NORM_IGNORESYMBOLS, LCMAP_HIRAGANA | LCMAP_SIMPLIFIED_CHINESE, LCMAP_HIRAGANA | LCMAP_TRADITIONAL_CHINESE, + LCMAP_KATAKANA | NORM_IGNORENONSPACE, + LCMAP_KATAKANA | NORM_IGNORESYMBOLS, + LCMAP_KATAKANA | LCMAP_SIMPLIFIED_CHINESE, + LCMAP_KATAKANA | LCMAP_TRADITIONAL_CHINESE, }; static void test_LCMapStringA(void) @@ -2452,7 +2456,7 @@ static void test_lcmapstring_unicode(lcmapstring_wrapper func_ptr, const char *f japanese_text, -1, buf, sizeof(buf)/sizeof(WCHAR)); ok(ret == lstrlenW(katakana_text) + 1, "%s ret %d, error %d, expected value %d\n", func_name, ret, GetLastError(), lstrlenW(katakana_text) + 1); - todo_wine ok(!lstrcmpW(buf, katakana_text), "%s string compare mismatch\n", func_name); + ok(!lstrcmpW(buf, katakana_text), "%s string compare mismatch\n", func_name); /* test LCMAP_FULLWIDTH */ ret = func_ptr(LCMAP_FULLWIDTH, -- 2.11.4.GIT