From 9a2d605dd9799149be5a8950a2f867adac6fa0c5 Mon Sep 17 00:00:00 2001 From: Mikolaj Zalewski Date: Wed, 22 Aug 2007 19:14:30 -0700 Subject: [PATCH] msvcrt: Test and fix _mbsinc/_mbsninc. --- dlls/msvcrt/mbcs.c | 29 +++++++++++++++++------------ dlls/msvcrt/tests/string.c | 26 ++++++++++++++++++++++++++ 2 files changed, 43 insertions(+), 12 deletions(-) diff --git a/dlls/msvcrt/mbcs.c b/dlls/msvcrt/mbcs.c index 9c6d34c8f55..718e3871332 100644 --- a/dlls/msvcrt/mbcs.c +++ b/dlls/msvcrt/mbcs.c @@ -27,6 +27,7 @@ #include "wine/unicode.h" #include "wine/debug.h" #include "msvcrt/mbctype.h" +#include "msvcrt/mbstring.h" WINE_DEFAULT_DEBUG_CHANNEL(msvcrt); @@ -335,10 +336,7 @@ unsigned char* CDECL _mbsdec(const unsigned char* start, const unsigned char* cu */ unsigned char* CDECL _mbsinc(const unsigned char* str) { - if(MSVCRT___mb_cur_max > 1 && MSVCRT_isleadbyte(*str)) - return (unsigned char*)str + 2; /* MB char */ - - return (unsigned char*)str + 1; /* ASCII CP or SB char */ + return (unsigned char *)(str + _mbclen(str)); } /********************************************************************* @@ -346,15 +344,22 @@ unsigned char* CDECL _mbsinc(const unsigned char* str) */ unsigned char* CDECL _mbsninc(const unsigned char* str, MSVCRT_size_t num) { - if(!str || num < 1) + if(!str) return NULL; - if(MSVCRT___mb_cur_max > 1) + + while (num > 0 && *str) { - while(num--) - str = _mbsinc(str); - return (unsigned char*)str; + if (_ismbblead(*str)) + { + if (!*(str+1)) + break; + str++; + } + str++; + num--; } - return (unsigned char*)str + num; /* ASCII CP */ + + return (unsigned char*)str; } /********************************************************************* @@ -1348,7 +1353,7 @@ MSVCRT_size_t CDECL _mbsspn(const unsigned char* string, const unsigned char* se /********************************************************************* * _mbsspnp (MSVCRT.@) */ -const unsigned char* CDECL _mbsspnp(const unsigned char* string, const unsigned char* set) +unsigned char* CDECL _mbsspnp(const unsigned char* string, const unsigned char* set) { const unsigned char *p, *q; @@ -1376,7 +1381,7 @@ const unsigned char* CDECL _mbsspnp(const unsigned char* string, const unsigned } if (*p == '\0') return NULL; - return p; + return (unsigned char *)p; } /********************************************************************* diff --git a/dlls/msvcrt/tests/string.c b/dlls/msvcrt/tests/string.c index 698a3aff662..004d059c6f8 100644 --- a/dlls/msvcrt/tests/string.c +++ b/dlls/msvcrt/tests/string.c @@ -185,6 +185,7 @@ static void test_mbcp(void) unsigned char *mbstring2 = (unsigned char *)"\xb0\xb1\xb2\xb3Q\xb4\xb5"; /* correct string */ unsigned char *mbsonlylead = (unsigned char *)"\xb0\0\xb1\xb2"; unsigned char buf[16]; + int step; /* some two single-byte code pages*/ test_codepage(1252); @@ -252,6 +253,31 @@ static void test_mbcp(void) _mbsnbcpy(buf, mbsonlylead, 5); expect_bin(buf, "\0\0\0\0\0\xff", 6); + /* _mbsinc/mbsdec */ + step = _mbsinc(mbstring) - mbstring; + ok(step == 2, "_mbsinc adds %d (exp. 2)\n", step); + step = _mbsinc(&mbstring[2]) - &mbstring[2]; /* lead + invalid tail */ + ok(step == 2, "_mbsinc adds %d (exp. 2)\n", step); + + step = _mbsninc(mbsonlylead, 1) - mbsonlylead; + ok(step == 0, "_mbsninc adds %d (exp. 0)\n", step); + step = _mbsninc(mbsonlylead, 2) - mbsonlylead; /* lead + NUL byte + lead + char */ + ok(step == 0, "_mbsninc adds %d (exp. 0)\n", step); + step = _mbsninc(mbstring2, 0) - mbstring2; + ok(step == 0, "_mbsninc adds %d (exp. 2)\n", step); + step = _mbsninc(mbstring2, 1) - mbstring2; + ok(step == 2, "_mbsninc adds %d (exp. 2)\n", step); + step = _mbsninc(mbstring2, 2) - mbstring2; + ok(step == 4, "_mbsninc adds %d (exp. 4)\n", step); + step = _mbsninc(mbstring2, 3) - mbstring2; + ok(step == 5, "_mbsninc adds %d (exp. 5)\n", step); + step = _mbsninc(mbstring2, 4) - mbstring2; + ok(step == 7, "_mbsninc adds %d (exp. 7)\n", step); + step = _mbsninc(mbstring2, 5) - mbstring2; + ok(step == 7, "_mbsninc adds %d (exp. 7)\n", step); + step = _mbsninc(mbstring2, 17) - mbstring2; + ok(step == 7, "_mbsninc adds %d (exp. 7)\n", step); + /* functions that depend on locale codepage, not mbcp. * we hope the current locale to be SBCS because setlocale(LC_ALL, ".1252") seems not to work yet * (as of Wine 0.9.43)