From: Bartosz Kosiorek gang65@poczta.onet.pl
--- dlls/msvcr100/msvcr100.spec | 2 +- dlls/msvcr110/msvcr110.spec | 2 +- dlls/msvcr120/msvcr120.spec | 2 +- dlls/msvcr80/msvcr80.spec | 2 +- dlls/msvcr90/msvcr90.spec | 2 +- dlls/msvcrt/mbcs.c | 61 ++++++++++++++++++++++++------------- dlls/msvcrt/msvcrt.spec | 2 +- dlls/ucrtbase/ucrtbase.spec | 4 +-- 8 files changed, 47 insertions(+), 30 deletions(-)
diff --git a/dlls/msvcr100/msvcr100.spec b/dlls/msvcr100/msvcr100.spec index 9659cd1f3a2..5996051d5ed 100644 --- a/dlls/msvcr100/msvcr100.spec +++ b/dlls/msvcr100/msvcr100.spec @@ -1096,7 +1096,7 @@ @ extern _mbctype MSVCRT_mbctype @ stub _mblen_l @ cdecl _mbsbtype(str long) -@ stub _mbsbtype_l +@ cdecl _mbsbtype_l(str long ptr) @ cdecl _mbscat_s(ptr long str) @ cdecl _mbscat_s_l(ptr long str ptr) @ cdecl _mbschr(str long) diff --git a/dlls/msvcr110/msvcr110.spec b/dlls/msvcr110/msvcr110.spec index 4bab0eddc99..1dacd170343 100644 --- a/dlls/msvcr110/msvcr110.spec +++ b/dlls/msvcr110/msvcr110.spec @@ -1453,7 +1453,7 @@ @ extern _mbctype MSVCRT_mbctype @ stub _mblen_l @ cdecl _mbsbtype(str long) -@ stub _mbsbtype_l +@ cdecl _mbsbtype_l(str long ptr) @ cdecl _mbscat_s(ptr long str) @ cdecl _mbscat_s_l(ptr long str ptr) @ cdecl _mbschr(str long) diff --git a/dlls/msvcr120/msvcr120.spec b/dlls/msvcr120/msvcr120.spec index e0d87f7f7f1..b0e7c83101c 100644 --- a/dlls/msvcr120/msvcr120.spec +++ b/dlls/msvcr120/msvcr120.spec @@ -1464,7 +1464,7 @@ @ extern _mbctype MSVCRT_mbctype @ stub _mblen_l @ cdecl _mbsbtype(str long) -@ stub _mbsbtype_l +@ cdecl _mbsbtype_l(str long ptr) @ cdecl _mbscat_s(ptr long str) @ cdecl _mbscat_s_l(ptr long str ptr) @ cdecl _mbschr(str long) diff --git a/dlls/msvcr80/msvcr80.spec b/dlls/msvcr80/msvcr80.spec index 5cc72177a33..68660cd6e87 100644 --- a/dlls/msvcr80/msvcr80.spec +++ b/dlls/msvcr80/msvcr80.spec @@ -768,7 +768,7 @@ @ extern _mbctype MSVCRT_mbctype @ stub _mblen_l @ cdecl _mbsbtype(str long) -@ stub _mbsbtype_l +@ cdecl _mbsbtype_l(str long ptr) @ cdecl _mbscat_s(ptr long str) @ cdecl _mbscat_s_l(ptr long str ptr) @ cdecl _mbschr(str long) diff --git a/dlls/msvcr90/msvcr90.spec b/dlls/msvcr90/msvcr90.spec index 556ba1fa1a7..5f38afdbdfc 100644 --- a/dlls/msvcr90/msvcr90.spec +++ b/dlls/msvcr90/msvcr90.spec @@ -746,7 +746,7 @@ @ extern _mbctype MSVCRT_mbctype @ stub _mblen_l @ cdecl _mbsbtype(str long) -@ stub _mbsbtype_l +@ cdecl _mbsbtype_l(str long ptr) @ cdecl _mbscat_s(ptr long str) @ cdecl _mbscat_s_l(ptr long str ptr) @ cdecl _mbschr(str long) diff --git a/dlls/msvcrt/mbcs.c b/dlls/msvcrt/mbcs.c index 23d0bbbaeb8..cfc3088e94c 100644 --- a/dlls/msvcrt/mbcs.c +++ b/dlls/msvcrt/mbcs.c @@ -2028,34 +2028,51 @@ int CDECL _mbbtype(unsigned char c, int type) }
/********************************************************************* - * _mbsbtype (MSVCRT.@) + * _mbsbtype_l (MSVCRT.@) */ -int CDECL _mbsbtype(const unsigned char *str, size_t count) +int CDECL _mbsbtype_l(const unsigned char *str, size_t count, _locale_t locale) { - int lead = 0; - const unsigned char *end = str + count; + int lead = 0; + pthreadmbcinfo mbcinfo; + const unsigned char *end = str + count;
- /* Lead bytes can also be trail bytes so we need to analyse the string. - * Also we must return _MBC_ILLEGAL for chars past the end of the string - */ - while (str < end) /* Note: we skip the last byte - will check after the loop */ - { - if (!*str) - return _MBC_ILLEGAL; - lead = get_mbcinfo()->ismbcodepage && !lead && _ismbblead(*str); - str++; - } + if (!MSVCRT_CHECK_PMT(str)) + return _MBC_ILLEGAL;
- if (lead) - if (_ismbbtrail(*str)) - return _MBC_TRAIL; + if (locale) + mbcinfo = locale->mbcinfo; else - return _MBC_ILLEGAL; - else - if (_ismbblead(*str)) - return _MBC_LEAD; + mbcinfo = get_mbcinfo(); + + /* Lead bytes can also be trail bytes so we need to analyse the string. + * Also we must return _MBC_ILLEGAL for chars past the end of the string + */ + while (str < end) /* Note: we skip the last byte - will check after the loop */ + { + if (!*str) + return _MBC_ILLEGAL; + lead = mbcinfo->ismbcodepage && !lead && _ismbblead_l(*str, locale); + str++; + } + + if (lead) + if (_ismbbtrail_l(*str, locale)) + return _MBC_TRAIL; + else + return _MBC_ILLEGAL; else - return _MBC_SINGLE; + if (_ismbblead_l(*str, locale)) + return _MBC_LEAD; + else + return _MBC_SINGLE; +} + +/********************************************************************* + * _mbsbtype (MSVCRT.@) + */ +int CDECL _mbsbtype(const unsigned char *str, size_t count) +{ + return _mbsbtype_l(str, count, NULL); }
/********************************************************************* diff --git a/dlls/msvcrt/msvcrt.spec b/dlls/msvcrt/msvcrt.spec index e5e938959b8..7d7c81f72dd 100644 --- a/dlls/msvcrt/msvcrt.spec +++ b/dlls/msvcrt/msvcrt.spec @@ -713,7 +713,7 @@ @ extern _mbctype MSVCRT_mbctype # stub _mblen_l(str long ptr) @ cdecl _mbsbtype(str long) -# stub _mbsbtype_l(str long ptr) +@ cdecl _mbsbtype_l(str long ptr) @ cdecl _mbscat(str str) @ cdecl _mbscat_s(ptr long str) @ cdecl _mbscat_s_l(ptr long str ptr) diff --git a/dlls/ucrtbase/ucrtbase.spec b/dlls/ucrtbase/ucrtbase.spec index 33c66e2f0b3..995237dcc5c 100644 --- a/dlls/ucrtbase/ucrtbase.spec +++ b/dlls/ucrtbase/ucrtbase.spec @@ -611,7 +611,7 @@ @ cdecl _mbctoupper_l(long ptr) @ stub _mblen_l @ cdecl _mbsbtype(str long) -@ stub _mbsbtype_l +@ cdecl _mbsbtype_l(str long ptr) @ cdecl _mbscat_s(ptr long str) @ cdecl _mbscat_s_l(ptr long str ptr) @ cdecl _mbschr(str long) @@ -1181,7 +1181,7 @@ @ cdecl _o__mbctoupper_l(long ptr) _mbctoupper_l @ stub _o__mblen_l @ cdecl _o__mbsbtype(str long) _mbsbtype -@ stub _o__mbsbtype_l +@ cdecl _o__mbsbtype_l(str long ptr) _mbsbtype_l @ cdecl _o__mbscat_s(ptr long str) _mbscat_s @ cdecl _o__mbscat_s_l(ptr long str ptr) _mbscat_s_l @ cdecl _o__mbschr(str long) _mbschr
From: Bartosz Kosiorek gang65@poczta.onet.pl
--- dlls/msvcrt/mbcs.c | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-)
diff --git a/dlls/msvcrt/mbcs.c b/dlls/msvcrt/mbcs.c index cfc3088e94c..3fe40cfc98e 100644 --- a/dlls/msvcrt/mbcs.c +++ b/dlls/msvcrt/mbcs.c @@ -2382,13 +2382,19 @@ unsigned char* CDECL _mbslwr(unsigned char *s) int CDECL _mbslwr_s_l(unsigned char* s, size_t len, _locale_t locale) { unsigned char *p = s; + pthreadmbcinfo mbcinfo;
if (!s && !len) return 0; if (!MSVCRT_CHECK_PMT(s && len)) return EINVAL;
- if (get_mbcinfo()->ismbcodepage) + if (locale) + mbcinfo = locale->mbcinfo; + else + mbcinfo = get_mbcinfo(); + + if (mbcinfo->ismbcodepage) { unsigned int c; for ( ; *s && len > 0; len--)
From: Bartosz Kosiorek gang65@poczta.onet.pl
--- dlls/msvcr100/msvcr100.spec | 2 +- dlls/msvcr110/msvcr110.spec | 2 +- dlls/msvcr120/msvcr120.spec | 2 +- dlls/msvcr80/msvcr80.spec | 2 +- dlls/msvcr90/msvcr90.spec | 2 +- dlls/msvcrt/mbcs.c | 57 ++++++++++++++++++++++++------------- dlls/msvcrt/msvcrt.spec | 2 +- dlls/ucrtbase/ucrtbase.spec | 4 +-- 8 files changed, 45 insertions(+), 28 deletions(-)
diff --git a/dlls/msvcr100/msvcr100.spec b/dlls/msvcr100/msvcr100.spec index 5996051d5ed..97f179bc977 100644 --- a/dlls/msvcr100/msvcr100.spec +++ b/dlls/msvcr100/msvcr100.spec @@ -1200,7 +1200,7 @@ @ stub _mbstrnlen @ stub _mbstrnlen_l @ cdecl _mbsupr(str) -@ stub _mbsupr_l +@ cdecl _mbsupr_l(str ptr) @ cdecl _mbsupr_s(str long) @ cdecl _mbsupr_s_l(str long ptr) @ cdecl _mbtowc_l(ptr str long ptr) diff --git a/dlls/msvcr110/msvcr110.spec b/dlls/msvcr110/msvcr110.spec index 1dacd170343..10b922c4a68 100644 --- a/dlls/msvcr110/msvcr110.spec +++ b/dlls/msvcr110/msvcr110.spec @@ -1557,7 +1557,7 @@ @ stub _mbstrnlen @ stub _mbstrnlen_l @ cdecl _mbsupr(str) -@ stub _mbsupr_l +@ cdecl _mbsupr_l(str ptr) @ cdecl _mbsupr_s(str long) @ cdecl _mbsupr_s_l(str long ptr) @ cdecl _mbtowc_l(ptr str long ptr) diff --git a/dlls/msvcr120/msvcr120.spec b/dlls/msvcr120/msvcr120.spec index b0e7c83101c..15b25cbd094 100644 --- a/dlls/msvcr120/msvcr120.spec +++ b/dlls/msvcr120/msvcr120.spec @@ -1568,7 +1568,7 @@ @ stub _mbstrnlen @ stub _mbstrnlen_l @ cdecl _mbsupr(str) -@ stub _mbsupr_l +@ cdecl _mbsupr_l(str ptr) @ cdecl _mbsupr_s(str long) @ cdecl _mbsupr_s_l(str long ptr) @ cdecl _mbtowc_l(ptr str long ptr) diff --git a/dlls/msvcr80/msvcr80.spec b/dlls/msvcr80/msvcr80.spec index 68660cd6e87..43c59ab7cfc 100644 --- a/dlls/msvcr80/msvcr80.spec +++ b/dlls/msvcr80/msvcr80.spec @@ -872,7 +872,7 @@ @ stub _mbstrnlen @ stub _mbstrnlen_l @ cdecl _mbsupr(str) -@ stub _mbsupr_l +@ cdecl _mbsupr_l(str ptr) @ cdecl _mbsupr_s(str long) @ cdecl _mbsupr_s_l(str long ptr) @ cdecl _mbtowc_l(ptr str long ptr) diff --git a/dlls/msvcr90/msvcr90.spec b/dlls/msvcr90/msvcr90.spec index 5f38afdbdfc..d590ffda47f 100644 --- a/dlls/msvcr90/msvcr90.spec +++ b/dlls/msvcr90/msvcr90.spec @@ -850,7 +850,7 @@ @ stub _mbstrnlen @ stub _mbstrnlen_l @ cdecl _mbsupr(str) -@ stub _mbsupr_l +@ cdecl _mbsupr_l(str ptr) @ cdecl _mbsupr_s(str long) @ cdecl _mbsupr_s_l(str long ptr) @ cdecl _mbtowc_l(ptr str long ptr) diff --git a/dlls/msvcrt/mbcs.c b/dlls/msvcrt/mbcs.c index 3fe40cfc98e..897ebc8a9a5 100644 --- a/dlls/msvcrt/mbcs.c +++ b/dlls/msvcrt/mbcs.c @@ -2433,30 +2433,47 @@ int CDECL _mbslwr_s(unsigned char* str, size_t len) }
/********************************************************************* - * _mbsupr(MSVCRT.@) + * _mbsupr_l(MSVCRT.@) */ -unsigned char* CDECL _mbsupr(unsigned char* s) +unsigned char* CDECL _mbsupr_l(unsigned char* s, _locale_t locale) { - unsigned char *ret = s; - if (!s) - return NULL; - if (get_mbcinfo()->ismbcodepage) - { - unsigned int c; - while (*s) + unsigned char *ret = s; + pthreadmbcinfo mbcinfo; + + if (!MSVCRT_CHECK_PMT(s)) + return NULL; + + if (locale) + mbcinfo = locale->mbcinfo; + else + mbcinfo = get_mbcinfo(); + + if (mbcinfo->ismbcodepage) { - c = _mbctoupper(_mbsnextc(s)); - /* Note that I assume that the size of the character is unchanged */ - if (c > 255) - { - *s++=(c>>8); - c=c & 0xff; - } - *s++=c; + unsigned int c; + while (*s) + { + c = _mbctoupper_l(_mbsnextc_l(s, locale), locale); + /* Note that I assume that the size of the character is unchanged */ + if (c > 255) + { + *s++ = (c >> 8); + c = c & 0xff; + } + *s++ = c; + } } - } - else for ( ; *s; s++) *s = _toupper_l(*s, NULL); - return ret; + else + for ( ; *s; s++) *s = _toupper_l(*s, locale); + return ret; +} + +/********************************************************************* + * _mbsupr(MSVCRT.@) + */ +unsigned char* CDECL _mbsupr(unsigned char* s) +{ + return _mbsupr_l(s, NULL); }
/********************************************************************* diff --git a/dlls/msvcrt/msvcrt.spec b/dlls/msvcrt/msvcrt.spec index 7d7c81f72dd..ac180d8d718 100644 --- a/dlls/msvcrt/msvcrt.spec +++ b/dlls/msvcrt/msvcrt.spec @@ -821,7 +821,7 @@ # stub _mbstrnlen(str long) # stub _mbstrnlen_l(str long ptr) @ cdecl _mbsupr(str) -# stub _mbsupr_l(str ptr) +@ cdecl _mbsupr_l(str ptr) @ cdecl _mbsupr_s(str long) @ cdecl _mbsupr_s_l(str long ptr) @ cdecl _mbtowc_l(ptr str long ptr) diff --git a/dlls/ucrtbase/ucrtbase.spec b/dlls/ucrtbase/ucrtbase.spec index 995237dcc5c..dba8a6ed056 100644 --- a/dlls/ucrtbase/ucrtbase.spec +++ b/dlls/ucrtbase/ucrtbase.spec @@ -716,7 +716,7 @@ @ stub _mbstrnlen @ stub _mbstrnlen_l @ cdecl _mbsupr(str) -@ stub _mbsupr_l +@ cdecl _mbsupr_l(str ptr) @ cdecl _mbsupr_s(str long) @ cdecl _mbsupr_s_l(str long ptr) @ cdecl _mbtowc_l(ptr str long ptr) @@ -1285,7 +1285,7 @@ @ stub _o__mbstrnlen @ stub _o__mbstrnlen_l @ cdecl _o__mbsupr(str) _mbsupr -@ stub _o__mbsupr_l +@ cdecl _o__mbsupr_l(str ptr) _mbsupr_l @ cdecl _o__mbsupr_s(str long) _mbsupr_s @ cdecl _o__mbsupr_s_l(str long ptr) _mbsupr_s_l @ cdecl _o__mbtowc_l(ptr str long ptr) _mbtowc_l
From: Bartosz Kosiorek gang65@poczta.onet.pl
--- dlls/msvcr100/msvcr100.spec | 2 +- dlls/msvcr110/msvcr110.spec | 2 +- dlls/msvcr120/msvcr120.spec | 2 +- dlls/msvcr80/msvcr80.spec | 2 +- dlls/msvcr90/msvcr90.spec | 2 +- dlls/msvcrt/mbcs.c | 86 ++++++++++++++++++++++--------------- dlls/msvcrt/msvcrt.spec | 2 +- dlls/ucrtbase/ucrtbase.spec | 4 +- 8 files changed, 59 insertions(+), 43 deletions(-)
diff --git a/dlls/msvcr100/msvcr100.spec b/dlls/msvcr100/msvcr100.spec index 97f179bc977..d7b343ca150 100644 --- a/dlls/msvcr100/msvcr100.spec +++ b/dlls/msvcr100/msvcr100.spec @@ -1128,7 +1128,7 @@ @ cdecl _mbsnbcat_s(str long ptr long) @ stub _mbsnbcat_s_l @ cdecl _mbsnbcmp(str str long) -@ stub _mbsnbcmp_l +@ cdecl _mbsnbcmp_l(str str long ptr) @ cdecl _mbsnbcnt(ptr long) @ stub _mbsnbcnt_l @ cdecl _mbsnbcoll(str str long) diff --git a/dlls/msvcr110/msvcr110.spec b/dlls/msvcr110/msvcr110.spec index 10b922c4a68..37acb768277 100644 --- a/dlls/msvcr110/msvcr110.spec +++ b/dlls/msvcr110/msvcr110.spec @@ -1485,7 +1485,7 @@ @ cdecl _mbsnbcat_s(str long ptr long) @ stub _mbsnbcat_s_l @ cdecl _mbsnbcmp(str str long) -@ stub _mbsnbcmp_l +@ cdecl _mbsnbcmp_l(str str long ptr) @ cdecl _mbsnbcnt(ptr long) @ stub _mbsnbcnt_l @ cdecl _mbsnbcoll(str str long) diff --git a/dlls/msvcr120/msvcr120.spec b/dlls/msvcr120/msvcr120.spec index 15b25cbd094..2799d6b2130 100644 --- a/dlls/msvcr120/msvcr120.spec +++ b/dlls/msvcr120/msvcr120.spec @@ -1496,7 +1496,7 @@ @ cdecl _mbsnbcat_s(str long ptr long) @ stub _mbsnbcat_s_l @ cdecl _mbsnbcmp(str str long) -@ stub _mbsnbcmp_l +@ cdecl _mbsnbcmp_l(str str long ptr) @ cdecl _mbsnbcnt(ptr long) @ stub _mbsnbcnt_l @ cdecl _mbsnbcoll(str str long) diff --git a/dlls/msvcr80/msvcr80.spec b/dlls/msvcr80/msvcr80.spec index 43c59ab7cfc..88057cbb4b9 100644 --- a/dlls/msvcr80/msvcr80.spec +++ b/dlls/msvcr80/msvcr80.spec @@ -800,7 +800,7 @@ @ cdecl _mbsnbcat_s(str long ptr long) @ stub _mbsnbcat_s_l @ cdecl _mbsnbcmp(str str long) -@ stub _mbsnbcmp_l +@ cdecl _mbsnbcmp_l(str str long ptr) @ cdecl _mbsnbcnt(ptr long) @ stub _mbsnbcnt_l @ cdecl _mbsnbcoll(str str long) diff --git a/dlls/msvcr90/msvcr90.spec b/dlls/msvcr90/msvcr90.spec index d590ffda47f..02b73e23e7a 100644 --- a/dlls/msvcr90/msvcr90.spec +++ b/dlls/msvcr90/msvcr90.spec @@ -778,7 +778,7 @@ @ cdecl _mbsnbcat_s(str long ptr long) @ stub _mbsnbcat_s_l @ cdecl _mbsnbcmp(str str long) -@ stub _mbsnbcmp_l +@ cdecl _mbsnbcmp_l(str str long ptr) @ cdecl _mbsnbcnt(ptr long) @ stub _mbsnbcnt_l @ cdecl _mbsnbcoll(str str long) diff --git a/dlls/msvcrt/mbcs.c b/dlls/msvcrt/mbcs.c index 897ebc8a9a5..722a11d487b 100644 --- a/dlls/msvcrt/mbcs.c +++ b/dlls/msvcrt/mbcs.c @@ -1213,45 +1213,61 @@ int CDECL _mbsncmp(const unsigned char* str, const unsigned char* cmp, size_t le }
/********************************************************************* - * _mbsnbcmp(MSVCRT.@) + * _mbsnbcmp_l(MSVCRT.@) */ -int CDECL _mbsnbcmp(const unsigned char* str, const unsigned char* cmp, size_t len) +int CDECL _mbsnbcmp_l(const unsigned char* str, const unsigned char* cmp, size_t len, _locale_t locale) { - if (!len) - return 0; - if(get_mbcinfo()->ismbcodepage) - { - unsigned int strc, cmpc; - while (len) + pthreadmbcinfo mbcinfo; + + if (!MSVCRT_CHECK_PMT(str && cmp)) + return _NLSCMPERROR; + + if (locale) + mbcinfo = locale->mbcinfo; + else + mbcinfo = get_mbcinfo(); + + if (mbcinfo->ismbcodepage) { - int clen; - if(!*str) - return *cmp ? -1 : 0; - if(!*cmp) - return 1; - if (_ismbblead(*str)) - { - strc=(len>=2)?_mbsnextc(str):0; - clen=2; - } - else - { - strc=*str; - clen=1; - } - if (_ismbblead(*cmp)) - cmpc=(len>=2)?_mbsnextc(cmp):0; - else - cmpc=*cmp; - if(strc != cmpc) - return strc < cmpc ? -1 : 1; - len -= clen; - str += clen; - cmp += clen; + unsigned int strc, cmpc; + while (len) + { + int clen; + if (!*str) + return *cmp ? -1 : 0; + if (!*cmp) + return 1; + if (_ismbblead_l(*str, locale)) + { + strc = (len >= 2) ? _mbsnextc_l(str, locale) : 0; + clen = 2; + } + else + { + strc = *str; + clen = 1; + } + if (_ismbblead_l(*cmp, locale)) + cmpc = (len >= 2) ? _mbsnextc_l(cmp, locale) : 0; + else + cmpc = *cmp; + if(strc != cmpc) + return strc < cmpc ? -1 : 1; + len -= clen; + str += clen; + cmp += clen; + } + return 0; /* Matched len chars */ } - return 0; /* Matched len chars */ - } - return u_strncmp(str,cmp,len); + return u_strncmp(str, cmp, len); +} + +/********************************************************************* + * _mbsnbcmp(MSVCRT.@) + */ +int CDECL _mbsnbcmp(const unsigned char* str, const unsigned char* cmp, size_t len) +{ + return _mbsnbcmp_l(str, cmp, len, NULL); }
/********************************************************************* diff --git a/dlls/msvcrt/msvcrt.spec b/dlls/msvcrt/msvcrt.spec index ac180d8d718..def70e6bd52 100644 --- a/dlls/msvcrt/msvcrt.spec +++ b/dlls/msvcrt/msvcrt.spec @@ -749,7 +749,7 @@ @ cdecl _mbsnbcat_s(str long ptr long) # stub _mbsnbcat_s_l(str long ptr long ptr) @ cdecl _mbsnbcmp(str str long) -# stub _mbsnbcmp_l(str str long ptr) +@ cdecl _mbsnbcmp_l(str str long ptr) @ cdecl _mbsnbcnt(ptr long) # stub _mbsnbcnt_l(ptr long ptr) @ cdecl _mbsnbcoll(str str long) diff --git a/dlls/ucrtbase/ucrtbase.spec b/dlls/ucrtbase/ucrtbase.spec index dba8a6ed056..60d00a6e438 100644 --- a/dlls/ucrtbase/ucrtbase.spec +++ b/dlls/ucrtbase/ucrtbase.spec @@ -644,7 +644,7 @@ @ cdecl _mbsnbcat_s(str long ptr long) @ stub _mbsnbcat_s_l @ cdecl _mbsnbcmp(str str long) -@ stub _mbsnbcmp_l +@ cdecl _mbsnbcmp_l(str str long ptr) @ cdecl _mbsnbcnt(ptr long) @ stub _mbsnbcnt_l @ cdecl _mbsnbcoll(str str long) @@ -1213,7 +1213,7 @@ @ cdecl _o__mbsnbcat_s(str long ptr long) _mbsnbcat_s @ stub _o__mbsnbcat_s_l @ cdecl _o__mbsnbcmp(str str long) _mbsnbcmp -@ stub _o__mbsnbcmp_l +@ cdecl _o_mbsnbcmp_l(str str long ptr) _mbsnbcmp_l @ cdecl _o__mbsnbcnt(ptr long) _mbsnbcnt @ stub _o__mbsnbcnt_l @ cdecl _o__mbsnbcoll(str str long) _mbsnbcoll
From: Bartosz Kosiorek gang65@poczta.onet.pl
--- dlls/msvcr100/msvcr100.spec | 2 +- dlls/msvcr110/msvcr110.spec | 2 +- dlls/msvcr120/msvcr120.spec | 2 +- dlls/msvcr80/msvcr80.spec | 2 +- dlls/msvcr90/msvcr90.spec | 2 +- dlls/msvcrt/mbcs.c | 44 ++++++++++++++++++++++++++----------- dlls/msvcrt/msvcrt.spec | 2 +- dlls/ucrtbase/ucrtbase.spec | 4 ++-- 8 files changed, 39 insertions(+), 21 deletions(-)
diff --git a/dlls/msvcr100/msvcr100.spec b/dlls/msvcr100/msvcr100.spec index d7b343ca150..75b782ea8e3 100644 --- a/dlls/msvcr100/msvcr100.spec +++ b/dlls/msvcr100/msvcr100.spec @@ -1130,7 +1130,7 @@ @ cdecl _mbsnbcmp(str str long) @ cdecl _mbsnbcmp_l(str str long ptr) @ cdecl _mbsnbcnt(ptr long) -@ stub _mbsnbcnt_l +@ cdecl _mbsnbcnt_l(ptr long ptr) @ cdecl _mbsnbcoll(str str long) @ cdecl _mbsnbcoll_l(str str long ptr) @ cdecl _mbsnbcpy(ptr str long) diff --git a/dlls/msvcr110/msvcr110.spec b/dlls/msvcr110/msvcr110.spec index 37acb768277..80132da3c6d 100644 --- a/dlls/msvcr110/msvcr110.spec +++ b/dlls/msvcr110/msvcr110.spec @@ -1487,7 +1487,7 @@ @ cdecl _mbsnbcmp(str str long) @ cdecl _mbsnbcmp_l(str str long ptr) @ cdecl _mbsnbcnt(ptr long) -@ stub _mbsnbcnt_l +@ cdecl _mbsnbcnt_l(ptr long ptr) @ cdecl _mbsnbcoll(str str long) @ cdecl _mbsnbcoll_l(str str long ptr) @ cdecl _mbsnbcpy(ptr str long) diff --git a/dlls/msvcr120/msvcr120.spec b/dlls/msvcr120/msvcr120.spec index 2799d6b2130..44baaaedb60 100644 --- a/dlls/msvcr120/msvcr120.spec +++ b/dlls/msvcr120/msvcr120.spec @@ -1498,7 +1498,7 @@ @ cdecl _mbsnbcmp(str str long) @ cdecl _mbsnbcmp_l(str str long ptr) @ cdecl _mbsnbcnt(ptr long) -@ stub _mbsnbcnt_l +@ cdecl _mbsnbcnt_l(ptr long ptr) @ cdecl _mbsnbcoll(str str long) @ cdecl _mbsnbcoll_l(str str long ptr) @ cdecl _mbsnbcpy(ptr str long) diff --git a/dlls/msvcr80/msvcr80.spec b/dlls/msvcr80/msvcr80.spec index 88057cbb4b9..f0e5e709bba 100644 --- a/dlls/msvcr80/msvcr80.spec +++ b/dlls/msvcr80/msvcr80.spec @@ -802,7 +802,7 @@ @ cdecl _mbsnbcmp(str str long) @ cdecl _mbsnbcmp_l(str str long ptr) @ cdecl _mbsnbcnt(ptr long) -@ stub _mbsnbcnt_l +@ cdecl _mbsnbcnt_l(ptr long ptr) @ cdecl _mbsnbcoll(str str long) @ cdecl _mbsnbcoll_l(str str long ptr) @ cdecl _mbsnbcpy(ptr str long) diff --git a/dlls/msvcr90/msvcr90.spec b/dlls/msvcr90/msvcr90.spec index 02b73e23e7a..cdb867d1234 100644 --- a/dlls/msvcr90/msvcr90.spec +++ b/dlls/msvcr90/msvcr90.spec @@ -780,7 +780,7 @@ @ cdecl _mbsnbcmp(str str long) @ cdecl _mbsnbcmp_l(str str long ptr) @ cdecl _mbsnbcnt(ptr long) -@ stub _mbsnbcnt_l +@ cdecl _mbsnbcnt_l(ptr long ptr) @ cdecl _mbsnbcoll(str str long) @ cdecl _mbsnbcoll_l(str str long ptr) @ cdecl _mbsnbcpy(ptr str long) diff --git a/dlls/msvcrt/mbcs.c b/dlls/msvcrt/mbcs.c index 722a11d487b..223a44b8a96 100644 --- a/dlls/msvcrt/mbcs.c +++ b/dlls/msvcrt/mbcs.c @@ -2199,24 +2199,42 @@ size_t CDECL _mbsnccnt(const unsigned char* str, size_t len) }
/********************************************************************* - * _mbsnbcnt(MSVCRT.@) + * _mbsnbcnt_l(MSVCRT.@) * 'b' is for byte count. */ -size_t CDECL _mbsnbcnt(const unsigned char* str, size_t len) +size_t CDECL _mbsnbcnt_l(const unsigned char* str, size_t len, _locale_t locale) { - size_t ret; - if(get_mbcinfo()->ismbcodepage) - { - const unsigned char* xstr = str; - while(*xstr && len-- > 0) + size_t ret; + pthreadmbcinfo mbcinfo; + + if (!MSVCRT_CHECK_PMT(str && len > 0)) + return 0; + + if (locale) + mbcinfo = locale->mbcinfo; + else + mbcinfo = get_mbcinfo(); + if (mbcinfo->ismbcodepage) { - if (_ismbblead(*xstr++)) - xstr++; + const unsigned char* xstr = str; + while (*xstr && len-- > 0) + { + if (_ismbblead_l(*xstr++, locale)) + xstr++; + } + return xstr - str; } - return xstr-str; - } - ret=u_strlen(str); - return min(ret, len); /* ASCII CP */ + ret = u_strlen(str); + return min(ret, len); /* ASCII CP */ +} + +/********************************************************************* + * _mbsnbcnt(MSVCRT.@) + * 'b' is for byte count. + */ +size_t CDECL _mbsnbcnt(const unsigned char* str, size_t len) +{ + return _mbsnbcnt_l(str, len, NULL); }
/********************************************************************* diff --git a/dlls/msvcrt/msvcrt.spec b/dlls/msvcrt/msvcrt.spec index def70e6bd52..9f98662b65a 100644 --- a/dlls/msvcrt/msvcrt.spec +++ b/dlls/msvcrt/msvcrt.spec @@ -751,7 +751,7 @@ @ cdecl _mbsnbcmp(str str long) @ cdecl _mbsnbcmp_l(str str long ptr) @ cdecl _mbsnbcnt(ptr long) -# stub _mbsnbcnt_l(ptr long ptr) +@ cdecl _mbsnbcnt_l(ptr long ptr) @ cdecl _mbsnbcoll(str str long) @ cdecl _mbsnbcoll_l(str str long ptr) @ cdecl _mbsnbcpy(ptr str long) diff --git a/dlls/ucrtbase/ucrtbase.spec b/dlls/ucrtbase/ucrtbase.spec index 60d00a6e438..569a5d42725 100644 --- a/dlls/ucrtbase/ucrtbase.spec +++ b/dlls/ucrtbase/ucrtbase.spec @@ -646,7 +646,7 @@ @ cdecl _mbsnbcmp(str str long) @ cdecl _mbsnbcmp_l(str str long ptr) @ cdecl _mbsnbcnt(ptr long) -@ stub _mbsnbcnt_l +@ cdecl _mbsnbcnt_l(ptr long ptr) @ cdecl _mbsnbcoll(str str long) @ cdecl _mbsnbcoll_l(str str long ptr) @ cdecl _mbsnbcpy(ptr str long) @@ -1215,7 +1215,7 @@ @ cdecl _o__mbsnbcmp(str str long) _mbsnbcmp @ cdecl _o_mbsnbcmp_l(str str long ptr) _mbsnbcmp_l @ cdecl _o__mbsnbcnt(ptr long) _mbsnbcnt -@ stub _o__mbsnbcnt_l +@ cdecl _o__mbsnbcnt_l(ptr long ptr) _mbsnbcnt_l @ cdecl _o__mbsnbcoll(str str long) _mbsnbcoll @ cdecl _o__mbsnbcoll_l(str str long ptr) _mbsnbcoll_l @ cdecl _o__mbsnbcpy(ptr str long) _mbsnbcpy
From: Bartosz Kosiorek gang65@poczta.onet.pl
--- dlls/msvcr100/msvcr100.spec | 2 +- dlls/msvcr110/msvcr110.spec | 2 +- dlls/msvcr120/msvcr120.spec | 2 +- dlls/msvcr80/msvcr80.spec | 2 +- dlls/msvcr90/msvcr90.spec | 2 +- dlls/msvcrt/mbcs.c | 80 +++++++++++++++++++++++-------------- dlls/msvcrt/msvcrt.spec | 2 +- dlls/ucrtbase/ucrtbase.spec | 4 +- 8 files changed, 58 insertions(+), 38 deletions(-)
diff --git a/dlls/msvcr100/msvcr100.spec b/dlls/msvcr100/msvcr100.spec index 75b782ea8e3..68b8b2f713d 100644 --- a/dlls/msvcr100/msvcr100.spec +++ b/dlls/msvcr100/msvcr100.spec @@ -1156,7 +1156,7 @@ @ stub _mbsncoll(str str long) @ stub _mbsncoll_l @ cdecl _mbsncpy(ptr str long) -@ stub _mbsncpy_l +@ cdecl _mbsncpy_l(ptr str long ptr) @ stub _mbsncpy_s @ stub _mbsncpy_s_l @ cdecl _mbsnextc(str) diff --git a/dlls/msvcr110/msvcr110.spec b/dlls/msvcr110/msvcr110.spec index 80132da3c6d..456821a0b2c 100644 --- a/dlls/msvcr110/msvcr110.spec +++ b/dlls/msvcr110/msvcr110.spec @@ -1513,7 +1513,7 @@ @ stub _mbsncoll(str str long) @ stub _mbsncoll_l @ cdecl _mbsncpy(ptr str long) -@ stub _mbsncpy_l +@ cdecl _mbsncpy_l(ptr str long ptr) @ stub _mbsncpy_s @ stub _mbsncpy_s_l @ cdecl _mbsnextc(str) diff --git a/dlls/msvcr120/msvcr120.spec b/dlls/msvcr120/msvcr120.spec index 44baaaedb60..d8963036835 100644 --- a/dlls/msvcr120/msvcr120.spec +++ b/dlls/msvcr120/msvcr120.spec @@ -1524,7 +1524,7 @@ @ stub _mbsncoll(str str long) @ stub _mbsncoll_l @ cdecl _mbsncpy(ptr str long) -@ stub _mbsncpy_l +@ cdecl _mbsncpy_l(ptr str long ptr) @ stub _mbsncpy_s @ stub _mbsncpy_s_l @ cdecl _mbsnextc(str) diff --git a/dlls/msvcr80/msvcr80.spec b/dlls/msvcr80/msvcr80.spec index f0e5e709bba..2482c2cb340 100644 --- a/dlls/msvcr80/msvcr80.spec +++ b/dlls/msvcr80/msvcr80.spec @@ -828,7 +828,7 @@ @ stub _mbsncoll(str str long) @ stub _mbsncoll_l @ cdecl _mbsncpy(ptr str long) -@ stub _mbsncpy_l +@ cdecl _mbsncpy_l(ptr str long ptr) @ stub _mbsncpy_s @ stub _mbsncpy_s_l @ cdecl _mbsnextc(str) diff --git a/dlls/msvcr90/msvcr90.spec b/dlls/msvcr90/msvcr90.spec index cdb867d1234..7fa54577b02 100644 --- a/dlls/msvcr90/msvcr90.spec +++ b/dlls/msvcr90/msvcr90.spec @@ -806,7 +806,7 @@ @ stub _mbsncoll(str str long) @ stub _mbsncoll_l @ cdecl _mbsncpy(ptr str long) -@ stub _mbsncpy_l +@ cdecl _mbsncpy_l(ptr str long ptr) @ stub _mbsncpy_s @ stub _mbsncpy_s_l @ cdecl _mbsnextc(str) diff --git a/dlls/msvcrt/mbcs.c b/dlls/msvcrt/mbcs.c index 223a44b8a96..b70512ef2ad 100644 --- a/dlls/msvcrt/mbcs.c +++ b/dlls/msvcrt/mbcs.c @@ -839,47 +839,67 @@ int CDECL _mbccpy_s(unsigned char* dest, size_t maxsize, return _mbccpy_s_l(dest, maxsize, copied, src, NULL); }
+ /********************************************************************* - * _mbsncpy(MSVCRT.@) + * _mbsncpy_l(MSVCRT.@) * REMARKS * The parameter n is the number or characters to copy, not the size of - * the buffer. Use _mbsnbcpy for a function analogical to strncpy + * the buffer. Use _mbsnbcpy_l for a function analogical to strncpy */ -unsigned char* CDECL _mbsncpy(unsigned char* dst, const unsigned char* src, size_t n) +unsigned char* CDECL _mbsncpy_l(unsigned char* dst, const unsigned char* src, size_t n, _locale_t locale) { - unsigned char* ret = dst; - if(!n) - return dst; - if (get_mbcinfo()->ismbcodepage) - { - while (*src && n) + unsigned char* ret = dst; + pthreadmbcinfo mbcinfo; + + if(!MSVCRT_CHECK_PMT(dst && src && n > 0)) { - n--; - if (_ismbblead(*src)) - { - if (!*(src+1)) + *ret = -1; + return ret; + } + if (locale) + mbcinfo = locale->mbcinfo; + else + mbcinfo = get_mbcinfo(); + + if (mbcinfo->ismbcodepage) + { + while (*src && n) { - *dst++ = 0; - *dst++ = 0; - break; + n--; + if (_ismbblead_l(*src, locale)) + { + if (!*(src + 1)) + { + *dst++ = 0; + *dst++ = 0; + break; + } + *dst++ = *src++; + } + *dst++ = *src++; } - - *dst++ = *src++; - } - - *dst++ = *src++; } - } - else - { - while (n) + else { - n--; - if (!(*dst++ = *src++)) break; + while (n) + { + n--; + if (!(*dst++ = *src++)) break; + } } - } - while (n--) *dst++ = 0; - return ret; + while (n--) *dst++ = 0; + return ret; +} + +/********************************************************************* + * _mbsncpy(MSVCRT.@) + * REMARKS + * The parameter n is the number or characters to copy, not the size of + * the buffer. Use _mbsnbcpy for a function analogical to strncpy + */ +unsigned char* CDECL _mbsncpy(unsigned char* dst, const unsigned char* src, size_t n) +{ + return _mbsncpy_l(dst, src, n, NULL); }
/********************************************************************* diff --git a/dlls/msvcrt/msvcrt.spec b/dlls/msvcrt/msvcrt.spec index 9f98662b65a..b603f71a6bd 100644 --- a/dlls/msvcrt/msvcrt.spec +++ b/dlls/msvcrt/msvcrt.spec @@ -777,7 +777,7 @@ @ stub _mbsncoll(str str long) # stub _mbsncoll_l(str str long ptr) @ cdecl _mbsncpy(ptr str long) -# stub _mbsncpy_l(ptr str long ptr) +@ cdecl _mbsncpy_l(ptr str long ptr) # stub _mbsncpy_s(ptr long str long) # stub _mbsncpy_s_l(ptr long str long ptr) @ cdecl _mbsnextc(str) diff --git a/dlls/ucrtbase/ucrtbase.spec b/dlls/ucrtbase/ucrtbase.spec index 569a5d42725..c5127f5059f 100644 --- a/dlls/ucrtbase/ucrtbase.spec +++ b/dlls/ucrtbase/ucrtbase.spec @@ -672,7 +672,7 @@ @ stub _mbsncoll(str str long) @ stub _mbsncoll_l @ cdecl _mbsncpy(ptr str long) -@ stub _mbsncpy_l +@ cdecl _mbsncpy_l(ptr str long ptr) @ stub _mbsncpy_s @ stub _mbsncpy_s_l @ cdecl _mbsnextc(str) @@ -1241,7 +1241,7 @@ @ stub _o__mbsncoll @ stub _o__mbsncoll_l @ cdecl _o__mbsncpy(ptr str long) _mbsncpy -@ stub _o__mbsncpy_l +@ cdecl _o__mbsncpy_l(ptr str long ptr) _mbsncpy_l @ stub _o__mbsncpy_s @ stub _o__mbsncpy_s_l @ cdecl _o__mbsnextc(str) _mbsnextc
From: Bartosz Kosiorek gang65@poczta.onet.pl
--- dlls/msvcr100/msvcr100.spec | 2 +- dlls/msvcr110/msvcr110.spec | 2 +- dlls/msvcr120/msvcr120.spec | 2 +- dlls/msvcr80/msvcr80.spec | 2 +- dlls/msvcr90/msvcr90.spec | 2 +- dlls/msvcrt/mbcs.c | 57 ++++++++++++++++++++++++------------- dlls/msvcrt/msvcrt.spec | 2 +- dlls/ucrtbase/ucrtbase.spec | 4 +-- 8 files changed, 46 insertions(+), 27 deletions(-)
diff --git a/dlls/msvcr100/msvcr100.spec b/dlls/msvcr100/msvcr100.spec index 68b8b2f713d..36452977926 100644 --- a/dlls/msvcr100/msvcr100.spec +++ b/dlls/msvcr100/msvcr100.spec @@ -1162,7 +1162,7 @@ @ cdecl _mbsnextc(str) @ cdecl _mbsnextc_l(str ptr) @ cdecl _mbsnicmp(str str long) -@ stub _mbsnicmp_l +@ cdecl _mbsnicmp_l(str str long ptr) @ stub _mbsnicoll(str str long) @ stub _mbsnicoll_l @ cdecl _mbsninc(str long) diff --git a/dlls/msvcr110/msvcr110.spec b/dlls/msvcr110/msvcr110.spec index 456821a0b2c..b057d5b85ad 100644 --- a/dlls/msvcr110/msvcr110.spec +++ b/dlls/msvcr110/msvcr110.spec @@ -1519,7 +1519,7 @@ @ cdecl _mbsnextc(str) @ cdecl _mbsnextc_l(str ptr) @ cdecl _mbsnicmp(str str long) -@ stub _mbsnicmp_l +@ cdecl _mbsnicmp_l(str str long ptr) @ stub _mbsnicoll(str str long) @ stub _mbsnicoll_l @ cdecl _mbsninc(str long) diff --git a/dlls/msvcr120/msvcr120.spec b/dlls/msvcr120/msvcr120.spec index d8963036835..5f24c3f7971 100644 --- a/dlls/msvcr120/msvcr120.spec +++ b/dlls/msvcr120/msvcr120.spec @@ -1530,7 +1530,7 @@ @ cdecl _mbsnextc(str) @ cdecl _mbsnextc_l(str ptr) @ cdecl _mbsnicmp(str str long) -@ stub _mbsnicmp_l +@ cdecl _mbsnicmp_l(str str long ptr) @ stub _mbsnicoll(str str long) @ stub _mbsnicoll_l @ cdecl _mbsninc(str long) diff --git a/dlls/msvcr80/msvcr80.spec b/dlls/msvcr80/msvcr80.spec index 2482c2cb340..42e215d7f79 100644 --- a/dlls/msvcr80/msvcr80.spec +++ b/dlls/msvcr80/msvcr80.spec @@ -834,7 +834,7 @@ @ cdecl _mbsnextc(str) @ cdecl _mbsnextc_l(str ptr) @ cdecl _mbsnicmp(str str long) -@ stub _mbsnicmp_l +@ cdecl _mbsnicmp_l(str str long ptr) @ stub _mbsnicoll(str str long) @ stub _mbsnicoll_l @ cdecl _mbsninc(str long) diff --git a/dlls/msvcr90/msvcr90.spec b/dlls/msvcr90/msvcr90.spec index 7fa54577b02..be847415309 100644 --- a/dlls/msvcr90/msvcr90.spec +++ b/dlls/msvcr90/msvcr90.spec @@ -812,7 +812,7 @@ @ cdecl _mbsnextc(str) @ cdecl _mbsnextc_l(str ptr) @ cdecl _mbsnicmp(str str long) -@ stub _mbsnicmp_l +@ cdecl _mbsnicmp_l(str str long ptr) @ stub _mbsnicoll(str str long) @ stub _mbsnicoll_l @ cdecl _mbsninc(str long) diff --git a/dlls/msvcrt/mbcs.c b/dlls/msvcrt/mbcs.c index b70512ef2ad..86812e51d0e 100644 --- a/dlls/msvcrt/mbcs.c +++ b/dlls/msvcrt/mbcs.c @@ -1295,28 +1295,47 @@ int CDECL _mbsnbcmp(const unsigned char* str, const unsigned char* cmp, size_t l * * Compare two multibyte strings case insensitively to 'len' characters. */ -int CDECL _mbsnicmp(const unsigned char* str, const unsigned char* cmp, size_t len) +int CDECL _mbsnicmp_l(const unsigned char* str, const unsigned char* cmp, size_t len, _locale_t locale) { - /* FIXME: No tolower() for mb strings yet */ - if(get_mbcinfo()->ismbcodepage) - { - unsigned int strc, cmpc; - while(len--) + pthreadmbcinfo mbcinfo; + + if (!MSVCRT_CHECK_PMT(str && cmp)) + return _NLSCMPERROR; + + if (locale) + mbcinfo = locale->mbcinfo; + else + mbcinfo = get_mbcinfo(); + /* FIXME: No tolower() for mb strings yet */ + if (mbcinfo->ismbcodepage) { - if(!*str) - return *cmp ? -1 : 0; - if(!*cmp) - return 1; - strc = _mbctolower(_mbsnextc(str)); - cmpc = _mbctolower(_mbsnextc(cmp)); - if(strc != cmpc) - return strc < cmpc ? -1 : 1; - str +=(strc > 255) ? 2 : 1; - cmp +=(strc > 255) ? 2 : 1; /* Equal, use same increment */ + unsigned int strc, cmpc; + while (len--) + { + if (!*str) + return *cmp ? -1 : 0; + if (!*cmp) + return 1; + strc = _mbctolower_l(_mbsnextc_l(str, locale), locale); + cmpc = _mbctolower_l(_mbsnextc_l(cmp, locale), locale); + if (strc != cmpc) + return strc < cmpc ? -1 : 1; + str += (strc > 255) ? 2 : 1; + cmp += (strc > 255) ? 2 : 1; /* Equal, use same increment */ + } + return 0; /* Matched len chars */ } - return 0; /* Matched len chars */ - } - return u_strncasecmp(str, cmp, len); /* ASCII CP */ + return u_strncasecmp(str, cmp, len); /* ASCII CP */ +} + +/********************************************************************* + * _mbsnicmp(MSVCRT.@) + * + * Compare two multibyte strings case insensitively to 'len' characters. + */ +int CDECL _mbsnicmp(const unsigned char* str, const unsigned char* cmp, size_t len) +{ + return _mbsnicmp_l(str, cmp, len, NULL); }
/********************************************************************* diff --git a/dlls/msvcrt/msvcrt.spec b/dlls/msvcrt/msvcrt.spec index b603f71a6bd..a997a4e61d5 100644 --- a/dlls/msvcrt/msvcrt.spec +++ b/dlls/msvcrt/msvcrt.spec @@ -783,7 +783,7 @@ @ cdecl _mbsnextc(str) @ cdecl _mbsnextc_l(str ptr) @ cdecl _mbsnicmp(str str long) -# stub _mbsnicmp_l(str str long ptr) +@ cdecl _mbsnicmp_l(str str long ptr) @ stub _mbsnicoll(str str long) # stub _mbsnicoll_l(str str long ptr) @ cdecl _mbsninc(str long) diff --git a/dlls/ucrtbase/ucrtbase.spec b/dlls/ucrtbase/ucrtbase.spec index c5127f5059f..f0b078e09e7 100644 --- a/dlls/ucrtbase/ucrtbase.spec +++ b/dlls/ucrtbase/ucrtbase.spec @@ -678,7 +678,7 @@ @ cdecl _mbsnextc(str) @ cdecl _mbsnextc_l(str ptr) @ cdecl _mbsnicmp(str str long) -@ stub _mbsnicmp_l +@ cdecl _mbsnicmp_l(str str long ptr) @ stub _mbsnicoll(str str long) @ stub _mbsnicoll_l @ cdecl _mbsninc(str long) @@ -1247,7 +1247,7 @@ @ cdecl _o__mbsnextc(str) _mbsnextc @ cdecl _o__mbsnextc_l(str ptr) _mbsnextc_l @ cdecl _o__mbsnicmp(str str long) _mbsnicmp -@ stub _o__mbsnicmp_l +@ cdecl _o__mbsnicmp_l(str str long ptr) _mbsnicmp_l @ stub _o__mbsnicoll @ stub _o__mbsnicoll_l @ cdecl _o__mbsninc(str long) _mbsninc
From: Bartosz Kosiorek gang65@poczta.onet.pl
--- dlls/msvcrt/string.c | 6 +++--- dlls/ucrtbase/tests/string.c | 16 +++++++++++++--- 2 files changed, 16 insertions(+), 6 deletions(-)
diff --git a/dlls/msvcrt/string.c b/dlls/msvcrt/string.c index d58a21406b1..c03a618f9bb 100644 --- a/dlls/msvcrt/string.c +++ b/dlls/msvcrt/string.c @@ -3313,7 +3313,7 @@ int __cdecl _strnicmp_l(const char *s1, const char *s2, pthreadlocinfo locinfo; int c1, c2;
- if(s1==NULL || s2==NULL) + if(!MSVCRT_CHECK_PMT(s1 && s2 && count <= 0x7fffffff)) return _NLSCMPERROR;
if(!count) @@ -3349,7 +3349,7 @@ int __cdecl _strnicmp_l(const char *s1, const char *s2, */ int __cdecl _stricmp_l(const char *s1, const char *s2, _locale_t locale) { - return _strnicmp_l(s1, s2, -1, locale); + return _strnicmp_l(s1, s2, 0x7fffffff, locale); }
/********************************************************************* @@ -3365,7 +3365,7 @@ int __cdecl _strnicmp(const char *s1, const char *s2, size_t count) */ int __cdecl _stricmp(const char *s1, const char *s2) { - return _strnicmp_l(s1, s2, -1, NULL); + return _strnicmp_l(s1, s2, 0x7fffffff, NULL); }
/********************************************************************* diff --git a/dlls/ucrtbase/tests/string.c b/dlls/ucrtbase/tests/string.c index 2c6a02da7ae..bdf9d03209e 100644 --- a/dlls/ucrtbase/tests/string.c +++ b/dlls/ucrtbase/tests/string.c @@ -480,12 +480,22 @@ static void test__strnicmp(void) static const char str2[] = "test"; int ret;
+ SET_EXPECT(invalid_parameter_handler); + errno = 0xdeadbeef; + ret = _strnicmp(str1, NULL, 2); + CHECK_CALLED(invalid_parameter_handler); + ok(ret == _NLSCMPERROR, "got %d.\n", ret); + ok(errno == EINVAL, "Unexpected errno %d.\n", errno); + SET_EXPECT(invalid_parameter_handler); errno = 0xdeadbeef; ret = _strnicmp(str1, str2, -1); - todo_wine CHECK_CALLED(invalid_parameter_handler); - todo_wine ok(ret == _NLSCMPERROR, "got %d.\n", ret); - todo_wine ok(errno == EINVAL, "Unexpected errno %d.\n", errno); + CHECK_CALLED(invalid_parameter_handler); + ok(ret == _NLSCMPERROR, "got %d.\n", ret); + ok(errno == EINVAL, "Unexpected errno %d.\n", errno); + + ret = _strnicmp(str1, str2, 0); + ok(!ret, "got %d.\n", ret);
ret = _strnicmp(str1, str2, 0x7fffffff); ok(!ret, "got %d.\n", ret);