From: Piotr Caban piotr@codeweavers.com
--- dlls/msvcrt/mbcs.c | 50 ++++++++++++++-------------------------------- 1 file changed, 15 insertions(+), 35 deletions(-)
diff --git a/dlls/msvcrt/mbcs.c b/dlls/msvcrt/mbcs.c index e6c0e944255..2e228d77811 100644 --- a/dlls/msvcrt/mbcs.c +++ b/dlls/msvcrt/mbcs.c @@ -2889,9 +2889,8 @@ size_t CDECL _mbscspn(const unsigned char* str, const unsigned char* cmp) */ unsigned char* CDECL _mbsrev_l(unsigned char* str, _locale_t locale) { - int i, len; - unsigned char *p, *temp; pthreadmbcinfo mbcinfo; + unsigned char *p, tmp;
if (!MSVCRT_CHECK_PMT(str)) return NULL; @@ -2904,44 +2903,25 @@ unsigned char* CDECL _mbsrev_l(unsigned char* str, _locale_t locale) if (!mbcinfo->ismbcodepage) return u__strrev(str);
- len = _mbslen_l(str, locale); - temp = malloc(len * 2); - if (!temp) - return str; - - /* unpack multibyte string to temp buffer */ - p = str; - for (i = 0; i < len; i++) + for (p = str; *p; p++) { if (_ismbblead_l(*p, locale)) { - temp[i * 2] = *p++; - temp[i * 2 + 1] = *p++; - } - else - { - temp[i * 2] = *p++; - temp[i * 2 + 1] = 0; - } - } - - /* repack it in the reverse order */ - p = str; - for (i = len - 1; i >= 0; i--) - { - if (_ismbblead_l(temp[i * 2], locale)) - { - *p++ = temp[i * 2]; - *p++ = temp[i * 2 + 1]; - } - else - { - *p++ = temp[i * 2]; + if (p[1]) + { + tmp = p[0]; + p[0] = p[1]; + p[1] = tmp; + p++; + } + else + { + /* drop trailing lead char */ + p[0] = 0; + } } } - - free(temp); - return str; + return u__strrev(str); }
/*********************************************************************
From: Piotr Caban piotr@codeweavers.com
--- dlls/msvcrt/tests/string.c | 22 ++++++++++++++++++++++ 1 file changed, 22 insertions(+)
diff --git a/dlls/msvcrt/tests/string.c b/dlls/msvcrt/tests/string.c index b63df4b846d..34338fd4a39 100644 --- a/dlls/msvcrt/tests/string.c +++ b/dlls/msvcrt/tests/string.c @@ -4671,6 +4671,27 @@ static void test_wcsncpy(void) wine_dbgstr_wn(dst, ARRAY_SIZE(dst))); }
+static void test_mbsrev(void) +{ + unsigned char buf[64], *ret; + int cp = _getmbcp(); + + _setmbcp(932); + + strcpy((char *)buf, "\x36\x8c\x8e"); + ret = _mbsrev(buf); + ok(ret == buf, "ret = %p, expected %p\n", ret, buf); + ok(!memcmp(buf, "\x8c\x8e\x36", 4), "buf = %s\n", wine_dbgstr_a((char *)buf)); + + /* test string that ends with leading byte */ + strcpy((char *)buf, "\x36\x8c"); + ret = _mbsrev(buf); + ok(ret == buf, "ret = %p, expected %p\n", ret, buf); + ok(!memcmp(buf, "\x36", 2), "buf = %s\n", wine_dbgstr_a((char *)buf)); + + _setmbcp(cp); +} + START_TEST(string) { char mem[100]; @@ -4831,4 +4852,5 @@ START_TEST(string) test_SpecialCasing(); test__mbbtype(); test_wcsncpy(); + test_mbsrev(); }