msvcrt: Test that some functions depends on locale codepage, not the one set by _setmbcp.
This commit is contained in:
parent
cea1052f62
commit
12ff6788b3
|
@ -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 */
|
||||
}
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
|
||||
|
|
Loading…
Reference in New Issue