Module: wine Branch: master Commit: 4148ac0ab59b9bd01c565bc31d4e5bf241a66436 URL: http://source.winehq.org/git/wine.git/?a=commit;h=4148ac0ab59b9bd01c565bc31d...
Author: David Hedberg david.hedberg@gmail.com Date: Wed Feb 24 04:52:52 2010 +0100
msvcrt: Implement _mbctombb.
---
dlls/msvcrt/mbcs.c | 46 ++++++++++++++++++++++++++++++++++++++++++++ dlls/msvcrt/msvcrt.spec | 2 +- dlls/msvcrt/tests/string.c | 23 ++++++++++++++++++++++ 3 files changed, 70 insertions(+), 1 deletions(-)
diff --git a/dlls/msvcrt/mbcs.c b/dlls/msvcrt/mbcs.c index 38891e6..e0ce3e2 100644 --- a/dlls/msvcrt/mbcs.c +++ b/dlls/msvcrt/mbcs.c @@ -53,6 +53,24 @@ static struct cp_extra_info_t g_cpextrainfo[] = {0, {1, 255, 0, 0}} /* match all with FIXME */ };
+/* 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, + 0x7e,0x5f,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xb0,0x00,0x00,0x2f,0x00, + 0x00,0x00,0x7c,0x00,0x00,0x60,0x27,0x00,0x22,0x28,0x29,0x00,0x00,0x5b,0x5d,0x7b, + 0x7d,0x00,0x00,0x00,0x00,0xa2,0xa3,0x00,0x00,0x00,0x00,0x2b,0x2d,0x00,0x00,0x00, + 0x00,0x3d,0x00,0x3c,0x3e,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x5c, + 0x24,0x00,0x00,0x25,0x23,0x26,0x2a,0x40}; + +/* Maps multibyte cp932 hiragana/katakana to single-byte equivalents */ +static const unsigned char mbctombb_932_kana[] = { + 0xa7,0xb1,0xa8,0xb2,0xa9,0xb3,0xaa,0xb4,0xab,0xb5,0xb6,0xb6,0xb7,0xb7,0xb8,0xb8, + 0xb9,0xb9,0xba,0xba,0xbb,0xbb,0xbc,0xbc,0xbd,0xbd,0xbe,0xbe,0xbf,0xbf,0xc0,0xc0, + 0xc1,0xc1,0xaf,0xc2,0xc2,0xc3,0xc3,0xc4,0xc4,0xc5,0xc6,0xc7,0xc8,0xc9,0xca,0xca, + 0xca,0xcb,0xcb,0xcb,0xcc,0xcc,0xcc,0xcd,0xcd,0xcd,0xce,0xce,0xce,0xcf,0xd0,0xd1, + 0xd2,0xd3,0xac,0xd4,0xad,0xd5,0xae,0xd6,0xd7,0xd8,0xd9,0xda,0xdb,0xdc,0xdc,0xb2, + 0xb4,0xa6,0xdd,0xb3,0xb6,0xb9}; + static MSVCRT_wchar_t msvcrt_mbc_to_wc(unsigned int ch) { MSVCRT_wchar_t chW; @@ -319,6 +337,34 @@ unsigned int CDECL _mbctoupper(unsigned int c) }
/********************************************************************* + * _mbctombb (MSVCRT.@) + */ +unsigned int CDECL _mbctombb(unsigned int c) +{ + unsigned int value; + + if(MSVCRT___lc_codepage == 932) + { + if(c >= 0x829f && c <= 0x82f1) /* Hiragana */ + return mbctombb_932_kana[c - 0x829f]; + if(c >= 0x8340 && c <= 0x8396 && c != 0x837f) /* Katakana */ + return mbctombb_932_kana[c - 0x8340 - (c >= 0x837f ? 1 : 0)]; + if(c >= 0x8140 && c <= 0x8197) /* Punctuation */ + { + value = mbctombb_932_punct[c - 0x8140]; + return value ? value : c; + } + if((c >= 0x824f && c <= 0x8258) || /* Fullwidth digits */ + (c >= 0x8260 && c <= 0x8279)) /* Fullwidth capitals letters */ + return c - 0x821f; + if(c >= 0x8281 && c <= 0x829a) /* Fullwidth small letters */ + return c - 0x8220; + /* all other cases return c */ + } + return c; +} + +/********************************************************************* * _mbcjistojms(MSVCRT.@) * * Converts a jis character to sjis. diff --git a/dlls/msvcrt/msvcrt.spec b/dlls/msvcrt/msvcrt.spec index a3bbb88..0e91d83 100644 --- a/dlls/msvcrt/msvcrt.spec +++ b/dlls/msvcrt/msvcrt.spec @@ -380,7 +380,7 @@ @ stub _mbctohira #(long) @ stub _mbctokata #(long) @ cdecl _mbctolower(long) -@ stub _mbctombb #(long) +@ cdecl _mbctombb(long) @ cdecl _mbctoupper(long) @ extern _mbctype MSVCRT_mbctype @ cdecl _mbsbtype(str long) diff --git a/dlls/msvcrt/tests/string.c b/dlls/msvcrt/tests/string.c index 199c0fa..a7b3404 100644 --- a/dlls/msvcrt/tests/string.c +++ b/dlls/msvcrt/tests/string.c @@ -730,6 +730,28 @@ static void test_mbcjisjms(void) } while(jisjms[i++][0] != 0); }
+static void test_mbctombb(void) +{ + static const unsigned int mbcmbb_932[][2] = { + {0x829e, 0x829e}, {0x829f, 0xa7}, {0x82f1, 0xdd}, {0x82f2, 0x82f2}, + {0x833f, 0x833f}, {0x8340, 0xa7}, {0x837e, 0xd0}, {0x837f, 0x837f}, + {0x8380, 0xd1}, {0x8396, 0xb9}, {0x8397, 0x8397}, {0x813f, 0x813f}, + {0x8140, 0x20}, {0x814c, 0x814c}, {0x814f, 0x5e}, {0x8197, 0x40}, + {0x8198, 0x8198}, {0x8258, 0x39}, {0x8259, 0x8259}, {0x825f, 0x825f}, + {0x8260, 0x41}, {0x82f1, 0xdd}, {0x82f2, 0x82f2}, {0,0}}; + unsigned int exp, ret, i; + unsigned int prev_cp = _getmbcp(); + + _setmbcp(932); + for (i = 0; mbcmbb_932[i][0] != 0; i++) + { + ret = _mbctombb(mbcmbb_932[i][0]); + exp = mbcmbb_932[i][1]; + ok(ret == exp, "Expected 0x%x, got 0x%x\n", exp, ret); + } + _setmbcp(prev_cp); +} + static void test_ismbclegal(void) { unsigned int prev_cp = _getmbcp(); int ret, exp, err; @@ -931,6 +953,7 @@ START_TEST(string) test_strcat_s(); test__mbsnbcpy_s(); test_mbcjisjms(); + test_mbctombb(); test_ismbclegal(); test_strtok(); test_wcscpy_s();