diff --git a/dlls/msvcrt/mbcs.c b/dlls/msvcrt/mbcs.c index 024c9b56a93..38c249b7490 100644 --- a/dlls/msvcrt/mbcs.c +++ b/dlls/msvcrt/mbcs.c @@ -359,21 +359,6 @@ unsigned int CDECL _mbclen(const unsigned char* str) return _ismbblead(*str) ? 2 : 1; } -/********************************************************************* - * mblen(MSVCRT.@) - */ -int CDECL MSVCRT_mblen(const char* str, MSVCRT_size_t size) -{ - if (str && *str && size) - { - if(MSVCRT___mb_cur_max == 1) - return 1; /* ASCII CP */ - - return !MSVCRT_isleadbyte(*str) ? 1 : (size>1 ? 2 : -1); - } - return 0; -} - /********************************************************************* * _mbslen(MSVCRT.@) */ @@ -394,27 +379,6 @@ MSVCRT_size_t CDECL _mbslen(const unsigned char* str) return len; } -/********************************************************************* - * _mbstrlen(MSVCRT.@) - */ -MSVCRT_size_t CDECL _mbstrlen(const char* str) -{ - if(MSVCRT___mb_cur_max > 1) - { - MSVCRT_size_t len = 0; - while(*str) - { - /* FIXME: According to the documentation we are supposed to test for - * multi-byte character validity. Whatever that means - */ - str += MSVCRT_isleadbyte(*str) ? 2 : 1; - len++; - } - return len; - } - return strlen(str); /* ASCII CP */ -} - /********************************************************************* * _mbccpy(MSVCRT.@) */ @@ -1477,3 +1441,50 @@ unsigned char* CDECL _mbspbrk(const unsigned char* str, const unsigned char* acc } return NULL; } + + +/* + * Functions depending on locale codepage + */ + +/********************************************************************* + * mblen(MSVCRT.@) + * REMARKS + * Unlike most of the multibyte string functions this function uses + * the locale codepage, not the codepage set by _setmbcp + */ +int CDECL MSVCRT_mblen(const char* str, MSVCRT_size_t size) +{ + if (str && *str && size) + { + if(MSVCRT___mb_cur_max == 1) + return 1; /* ASCII CP */ + + return !MSVCRT_isleadbyte(*str) ? 1 : (size>1 ? 2 : -1); + } + return 0; +} + +/********************************************************************* + * _mbstrlen(MSVCRT.@) + * REMARKS + * Unlike most of the multibyte string functions this function uses + * the locale codepage, not the codepage set by _setmbcp + */ +MSVCRT_size_t CDECL _mbstrlen(const char* str) +{ + if(MSVCRT___mb_cur_max > 1) + { + MSVCRT_size_t len = 0; + while(*str) + { + /* FIXME: According to the documentation we are supposed to test for + * multi-byte character validity. Whatever that means + */ + str += MSVCRT_isleadbyte(*str) ? 2 : 1; + len++; + } + return len; + } + return strlen(str); /* ASCII CP */ +} diff --git a/dlls/msvcrt/tests/string.c b/dlls/msvcrt/tests/string.c index 209f1fabbe5..4f8265292cf 100644 --- a/dlls/msvcrt/tests/string.c +++ b/dlls/msvcrt/tests/string.c @@ -201,6 +201,19 @@ static void test_mbcp(void) expect_eq(_mbslen(mbsonlylead), 0, int, "%d"); /* lead + NUL not counted as character */ expect_eq(_mbslen(mbstring), 4, int, "%d"); /* lead + invalid trail counted */ + + /* 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) + */ + if (__mb_cur_max == 1) + { + expect_eq(mblen((char *)mbstring, 3), 1, int, "%x"); + expect_eq(_mbstrlen((char *)mbstring2), 7, int, "%d"); + } + else + skip("Current locale has double-byte charset - could leave to false positives\n"); + _setmbcp(curr_mbcp); }