msvcrt[4/5]: test and fix _mbclen/_mbslen (patch)
Mikolaj Zalewski
mikolajz at google.com
Mon Aug 20 12:23:55 CDT 2007
I forgot the patch
-------------- next part --------------
From 19b9f420c7f00f16bd3e6414396fa9a391750090 Mon Sep 17 00:00:00 2001
From: =?utf-8?q?Miko=C5=82aj_Zalewski?= <mikolaj at zalewski.pl>
Date: Sun, 19 Aug 2007 22:46:56 -0700
Subject: [PATCH] msvcrt: test and fix _mbclen/_mbslen
---
dlls/msvcrt/mbcs.c | 18 ++++++++++--------
dlls/msvcrt/tests/string.c | 11 ++++++++++-
2 files changed, 20 insertions(+), 9 deletions(-)
diff --git a/dlls/msvcrt/mbcs.c b/dlls/msvcrt/mbcs.c
index c69cc25..f49323d 100644
--- a/dlls/msvcrt/mbcs.c
+++ b/dlls/msvcrt/mbcs.c
@@ -356,7 +356,7 @@ unsigned char* CDECL _mbsninc(const unsigned char* str, MSVCRT_size_t num)
*/
unsigned int CDECL _mbclen(const unsigned char* str)
{
- return MSVCRT_isleadbyte(*str) ? 2 : 1;
+ return _ismbblead(*str) ? 2 : 1;
}
/*********************************************************************
@@ -379,17 +379,19 @@ int CDECL MSVCRT_mblen(const char* str, MSVCRT_size_t size)
*/
MSVCRT_size_t CDECL _mbslen(const unsigned char* str)
{
- if(MSVCRT___mb_cur_max > 1)
+ MSVCRT_size_t len = 0;
+ while(*str)
{
- MSVCRT_size_t len = 0;
- while(*str)
+ if (_ismbblead(*str))
{
- str += MSVCRT_isleadbyte(*str) ? 2 : 1;
- len++;
+ str++;
+ if (!*str) /* count only full chars */
+ break;
}
- return len;
+ str++;
+ len++;
}
- return u_strlen(str); /* ASCII CP */
+ return len;
}
/*********************************************************************
diff --git a/dlls/msvcrt/tests/string.c b/dlls/msvcrt/tests/string.c
index 8b55cf3..209f1fa 100644
--- a/dlls/msvcrt/tests/string.c
+++ b/dlls/msvcrt/tests/string.c
@@ -166,6 +166,8 @@ static void test_mbcp(void)
int mb_orig_max = __mb_cur_max;
int curr_mbcp = _getmbcp();
unsigned char *mbstring = (unsigned char *)"\xb0\xb1\xb2 \xb3\xb4 \xb5"; /* incorrect string */
+ unsigned char *mbstring2 = (unsigned char *)"\xb0\xb1\xb2\xb3Q\xb4\xb5"; /* correct string */
+ unsigned char *mbsonlylead = (unsigned char *)"\xb0";
/* some two single-byte code pages*/
test_codepage(1252);
@@ -186,12 +188,19 @@ static void test_mbcp(void)
ok(_ismbbtrail('\xb0'), "\xa0 should be a trail byte\n");
ok(_ismbbtrail(' ') == FALSE, "' ' should not be a trail byte\n");
-
/* _mbsnextc */
expect_eq(_mbsnextc(mbstring), 0xb0b1, int, "%x");
expect_eq(_mbsnextc(&mbstring[2]), 0xb220, int, "%x"); /* lead + invalid tail */
expect_eq(_mbsnextc(&mbstring[3]), 0x20, int, "%x"); /* single char */
+ /* _mbclen/_mbslen */
+ expect_eq(_mbclen(mbstring), 2, int, "%d");
+ expect_eq(_mbclen(&mbstring[2]), 2, int, "%d");
+ expect_eq(_mbclen(&mbstring[3]), 1, int, "%d");
+ expect_eq(_mbslen(mbstring2), 4, int, "%d");
+ expect_eq(_mbslen(mbsonlylead), 0, int, "%d"); /* lead + NUL not counted as character */
+ expect_eq(_mbslen(mbstring), 4, int, "%d"); /* lead + invalid trail counted */
+
_setmbcp(curr_mbcp);
}
--
1.4.4.2
More information about the wine-patches
mailing list