Module: wine Branch: master Commit: 9a2d605dd9799149be5a8950a2f867adac6fa0c5 URL: http://source.winehq.org/git/wine.git/?a=commit;h=9a2d605dd9799149be5a8950a2...
Author: Mikolaj Zalewski mikolajz@google.com Date: Wed Aug 22 19:14:30 2007 -0700
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 9c6d34c..718e387 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 698a3af..004d059 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)