msvcrt: Implement _mbctombb.
This commit is contained in:
parent
9b02b5cddb
commit
4148ac0ab5
|
@ -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;
|
||||
|
@ -318,6 +336,34 @@ unsigned int CDECL _mbctoupper(unsigned int c)
|
|||
return toupper(c); /* ASCII CP or SB char */
|
||||
}
|
||||
|
||||
/*********************************************************************
|
||||
* _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.@)
|
||||
*
|
||||
|
|
|
@ -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)
|
||||
|
|
|
@ -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();
|
||||
|
|
Loading…
Reference in New Issue