-- v2: msvcrt: Add _mbsnset_l implementation. msvcrt: Add _mbsnccnt_l implementation. msvcrt: Add _mbsncat_l implementation. msvcrt: Add _mbsnbset_l implementation. msvcrt: Add _mbsnbicmp_l implementation. msvcrt: Add _mbsnbcpy_l implementation. msvcrt: Add _mbsnbcat_s_l implementation.
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 | 27 +++++++++++++++++++++------ dlls/msvcrt/msvcrt.spec | 2 +- dlls/ucrtbase/ucrtbase.spec | 4 ++-- 8 files changed, 29 insertions(+), 14 deletions(-)
diff --git a/dlls/msvcr100/msvcr100.spec b/dlls/msvcr100/msvcr100.spec index 36452977926..0f57555e454 100644 --- a/dlls/msvcr100/msvcr100.spec +++ b/dlls/msvcr100/msvcr100.spec @@ -1126,7 +1126,7 @@ @ cdecl _mbsnbcat(str str long) @ cdecl _mbsnbcat_l(str str long ptr) @ cdecl _mbsnbcat_s(str long ptr long) -@ stub _mbsnbcat_s_l +@ cdecl _mbsnbcat_s_l(str long ptr long ptr) @ cdecl _mbsnbcmp(str str long) @ cdecl _mbsnbcmp_l(str str long ptr) @ cdecl _mbsnbcnt(ptr long) diff --git a/dlls/msvcr110/msvcr110.spec b/dlls/msvcr110/msvcr110.spec index b057d5b85ad..072cef0f0c9 100644 --- a/dlls/msvcr110/msvcr110.spec +++ b/dlls/msvcr110/msvcr110.spec @@ -1483,7 +1483,7 @@ @ cdecl _mbsnbcat(str str long) @ cdecl _mbsnbcat_l(str str long ptr) @ cdecl _mbsnbcat_s(str long ptr long) -@ stub _mbsnbcat_s_l +@ cdecl _mbsnbcat_s_l(str long ptr long ptr) @ cdecl _mbsnbcmp(str str long) @ cdecl _mbsnbcmp_l(str str long ptr) @ cdecl _mbsnbcnt(ptr long) diff --git a/dlls/msvcr120/msvcr120.spec b/dlls/msvcr120/msvcr120.spec index 5f24c3f7971..55a0a4b1d2d 100644 --- a/dlls/msvcr120/msvcr120.spec +++ b/dlls/msvcr120/msvcr120.spec @@ -1494,7 +1494,7 @@ @ cdecl _mbsnbcat(str str long) @ cdecl _mbsnbcat_l(str str long ptr) @ cdecl _mbsnbcat_s(str long ptr long) -@ stub _mbsnbcat_s_l +@ cdecl _mbsnbcat_s_l(str long ptr long ptr) @ cdecl _mbsnbcmp(str str long) @ cdecl _mbsnbcmp_l(str str long ptr) @ cdecl _mbsnbcnt(ptr long) diff --git a/dlls/msvcr80/msvcr80.spec b/dlls/msvcr80/msvcr80.spec index 42e215d7f79..38d157f8a9a 100644 --- a/dlls/msvcr80/msvcr80.spec +++ b/dlls/msvcr80/msvcr80.spec @@ -798,7 +798,7 @@ @ cdecl _mbsnbcat(str str long) @ cdecl _mbsnbcat_l(str str long ptr) @ cdecl _mbsnbcat_s(str long ptr long) -@ stub _mbsnbcat_s_l +@ cdecl _mbsnbcat_s_l(str long ptr long ptr) @ cdecl _mbsnbcmp(str str long) @ cdecl _mbsnbcmp_l(str str long ptr) @ cdecl _mbsnbcnt(ptr long) diff --git a/dlls/msvcr90/msvcr90.spec b/dlls/msvcr90/msvcr90.spec index be847415309..58cb3ef2e92 100644 --- a/dlls/msvcr90/msvcr90.spec +++ b/dlls/msvcr90/msvcr90.spec @@ -776,7 +776,7 @@ @ cdecl _mbsnbcat(str str long) @ cdecl _mbsnbcat_l(str str long ptr) @ cdecl _mbsnbcat_s(str long ptr long) -@ stub _mbsnbcat_s_l +@ cdecl _mbsnbcat_s_l(str long ptr long ptr) @ cdecl _mbsnbcmp(str str long) @ cdecl _mbsnbcmp_l(str str long ptr) @ cdecl _mbsnbcnt(ptr long) diff --git a/dlls/msvcrt/mbcs.c b/dlls/msvcrt/mbcs.c index 01d290b2647..245dc843ba2 100644 --- a/dlls/msvcrt/mbcs.c +++ b/dlls/msvcrt/mbcs.c @@ -2336,20 +2336,22 @@ unsigned char* CDECL _mbsnbcat(unsigned char *dst, const unsigned char *src, siz return _mbsnbcat_l(dst, src, len, NULL); }
-int CDECL _mbsnbcat_s(unsigned char *dst, size_t size, const unsigned char *src, size_t len) +/********************************************************************* + * _mbsnbcat_s_l(MSVCRT.@) + */ +int CDECL _mbsnbcat_s_l(unsigned char *dst, size_t size, const unsigned char *src, size_t len, _locale_t locale) { unsigned char *ptr = dst; size_t i; + pthreadmbcinfo mbcinfo;
- if (!dst && !size && !src && !len) + if (!dst && !size && !len) return 0;
- if (!dst || !size || !src) + if (!MSVCRT_CHECK_PMT(dst && size && src)) { if (dst && size) *dst = '\0'; - - *_errno() = EINVAL; return EINVAL; }
@@ -2364,9 +2366,14 @@ int CDECL _mbsnbcat_s(unsigned char *dst, size_t size, const unsigned char *src, return EINVAL; }
+ if (locale) + mbcinfo = locale->mbcinfo; + else + mbcinfo = get_mbcinfo(); + /* If necessary, check that the character preceding the null terminator is * a lead byte and move the pointer back by one for later overwrite. */ - if (ptr != dst && get_mbcinfo()->ismbcodepage && _ismbblead(*(ptr - 1))) + if (ptr != dst && mbcinfo->ismbcodepage && _ismbblead_l(*(ptr - 1), locale)) size++, ptr--;
for (i = 0; *src && i < len; i++) @@ -2386,6 +2393,14 @@ int CDECL _mbsnbcat_s(unsigned char *dst, size_t size, const unsigned char *src, return 0; }
+/********************************************************************* + * _mbsnbcat_s(MSVCRT.@) + */ +int CDECL _mbsnbcat_s(unsigned char *dst, size_t size, const unsigned char *src, size_t len) +{ + return _mbsnbcat_s_l(dst, size, src, len, NULL); +} + /********************************************************************* * _mbsncat(MSVCRT.@) */ diff --git a/dlls/msvcrt/msvcrt.spec b/dlls/msvcrt/msvcrt.spec index a997a4e61d5..738279a2cd3 100644 --- a/dlls/msvcrt/msvcrt.spec +++ b/dlls/msvcrt/msvcrt.spec @@ -747,7 +747,7 @@ @ cdecl _mbsnbcat(str str long) @ cdecl _mbsnbcat_l(str str long ptr) @ cdecl _mbsnbcat_s(str long ptr long) -# stub _mbsnbcat_s_l(str long ptr long ptr) +@ cdecl _mbsnbcat_s_l(str long ptr long ptr) @ cdecl _mbsnbcmp(str str long) @ cdecl _mbsnbcmp_l(str str long ptr) @ cdecl _mbsnbcnt(ptr long) diff --git a/dlls/ucrtbase/ucrtbase.spec b/dlls/ucrtbase/ucrtbase.spec index f0b078e09e7..46cea0359b4 100644 --- a/dlls/ucrtbase/ucrtbase.spec +++ b/dlls/ucrtbase/ucrtbase.spec @@ -642,7 +642,7 @@ @ cdecl _mbsnbcat(str str long) @ cdecl _mbsnbcat_l(str str long ptr) @ cdecl _mbsnbcat_s(str long ptr long) -@ stub _mbsnbcat_s_l +@ cdecl _mbsnbcat_s_l(str long ptr long ptr) @ cdecl _mbsnbcmp(str str long) @ cdecl _mbsnbcmp_l(str str long ptr) @ cdecl _mbsnbcnt(ptr long) @@ -1211,7 +1211,7 @@ @ cdecl _o__mbsnbcat(str str long) _mbsnbcat @ cdecl _o__mbsnbcat_l(str str long ptr) _mbsnbcat_l @ cdecl _o__mbsnbcat_s(str long ptr long) _mbsnbcat_s -@ stub _o__mbsnbcat_s_l +@ cdecl _o__mbsnbcat_s_l(str long ptr long ptr) _mbsnbcat_s_l @ cdecl _o__mbsnbcmp(str str long) _mbsnbcmp @ cdecl _o_mbsnbcmp_l(str str long ptr) _mbsnbcmp_l @ cdecl _o__mbsnbcnt(ptr long) _mbsnbcnt
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 | 67 ++++++++++++++++++++++++------------- dlls/msvcrt/msvcrt.spec | 2 +- dlls/ucrtbase/ucrtbase.spec | 4 +-- 8 files changed, 51 insertions(+), 32 deletions(-)
diff --git a/dlls/msvcr100/msvcr100.spec b/dlls/msvcr100/msvcr100.spec index 0f57555e454..884289175c0 100644 --- a/dlls/msvcr100/msvcr100.spec +++ b/dlls/msvcr100/msvcr100.spec @@ -1134,7 +1134,7 @@ @ cdecl _mbsnbcoll(str str long) @ cdecl _mbsnbcoll_l(str str long ptr) @ cdecl _mbsnbcpy(ptr str long) -@ stub _mbsnbcpy_l +@ cdecl _mbsnbcpy_l(ptr str long ptr) @ cdecl _mbsnbcpy_s(ptr long str long) @ cdecl _mbsnbcpy_s_l(ptr long str long ptr) @ cdecl _mbsnbicmp(str str long) diff --git a/dlls/msvcr110/msvcr110.spec b/dlls/msvcr110/msvcr110.spec index 072cef0f0c9..89bb35c7dba 100644 --- a/dlls/msvcr110/msvcr110.spec +++ b/dlls/msvcr110/msvcr110.spec @@ -1491,7 +1491,7 @@ @ cdecl _mbsnbcoll(str str long) @ cdecl _mbsnbcoll_l(str str long ptr) @ cdecl _mbsnbcpy(ptr str long) -@ stub _mbsnbcpy_l +@ cdecl _mbsnbcpy_l(ptr str long ptr) @ cdecl _mbsnbcpy_s(ptr long str long) @ cdecl _mbsnbcpy_s_l(ptr long str long ptr) @ cdecl _mbsnbicmp(str str long) diff --git a/dlls/msvcr120/msvcr120.spec b/dlls/msvcr120/msvcr120.spec index 55a0a4b1d2d..1be83715d23 100644 --- a/dlls/msvcr120/msvcr120.spec +++ b/dlls/msvcr120/msvcr120.spec @@ -1502,7 +1502,7 @@ @ cdecl _mbsnbcoll(str str long) @ cdecl _mbsnbcoll_l(str str long ptr) @ cdecl _mbsnbcpy(ptr str long) -@ stub _mbsnbcpy_l +@ cdecl _mbsnbcpy_l(ptr str long ptr) @ cdecl _mbsnbcpy_s(ptr long str long) @ cdecl _mbsnbcpy_s_l(ptr long str long ptr) @ cdecl _mbsnbicmp(str str long) diff --git a/dlls/msvcr80/msvcr80.spec b/dlls/msvcr80/msvcr80.spec index 38d157f8a9a..78172dbc104 100644 --- a/dlls/msvcr80/msvcr80.spec +++ b/dlls/msvcr80/msvcr80.spec @@ -806,7 +806,7 @@ @ cdecl _mbsnbcoll(str str long) @ cdecl _mbsnbcoll_l(str str long ptr) @ cdecl _mbsnbcpy(ptr str long) -@ stub _mbsnbcpy_l +@ cdecl _mbsnbcpy_l(ptr str long ptr) @ cdecl _mbsnbcpy_s(ptr long str long) @ cdecl _mbsnbcpy_s_l(ptr long str long ptr) @ cdecl _mbsnbicmp(str str long) diff --git a/dlls/msvcr90/msvcr90.spec b/dlls/msvcr90/msvcr90.spec index 58cb3ef2e92..c1736877ff5 100644 --- a/dlls/msvcr90/msvcr90.spec +++ b/dlls/msvcr90/msvcr90.spec @@ -784,7 +784,7 @@ @ cdecl _mbsnbcoll(str str long) @ cdecl _mbsnbcoll_l(str str long ptr) @ cdecl _mbsnbcpy(ptr str long) -@ stub _mbsnbcpy_l +@ cdecl _mbsnbcpy_l(ptr str long ptr) @ cdecl _mbsnbcpy_s(ptr long str long) @ cdecl _mbsnbcpy_s_l(ptr long str long ptr) @ cdecl _mbsnbicmp(str str long) diff --git a/dlls/msvcrt/mbcs.c b/dlls/msvcrt/mbcs.c index 245dc843ba2..38ace70cd7e 100644 --- a/dlls/msvcrt/mbcs.c +++ b/dlls/msvcrt/mbcs.c @@ -993,39 +993,58 @@ int CDECL _mbscpy_s(unsigned char *dst, size_t size, const unsigned char *src) }
/********************************************************************* - * _mbsnbcpy(MSVCRT.@) + * _mbsnbcpy_l(MSVCRT.@) * REMARKS * Like strncpy this function doesn't enforce the string to be * NUL-terminated */ -unsigned char* CDECL _mbsnbcpy(unsigned char* dst, const unsigned char* src, size_t n) +unsigned char* CDECL _mbsnbcpy_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) - { - BOOL is_lead = FALSE; - while (*src && n) + unsigned char* ret = dst; + pthreadmbcinfo mbcinfo; + + if (!n) + return dst; + if (!MSVCRT_CHECK_PMT(dst && src)) + return NULL; + if (locale) + mbcinfo = locale->mbcinfo; + else + mbcinfo = get_mbcinfo(); + if (mbcinfo->ismbcodepage) { - is_lead = (!is_lead && _ismbblead(*src)); - n--; - *dst++ = *src++; - } + BOOL is_lead = FALSE; + while (*src && n) + { + is_lead = (!is_lead && _ismbblead_l(*src, locale)); + n--; + *dst++ = *src++; + }
- if (is_lead) /* if string ends with a lead, remove it */ - *(dst - 1) = 0; - } - else - { - while (n) + if (is_lead) /* if string ends with a lead, remove it */ + *(dst - 1) = 0; + } + 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; +} + +/********************************************************************* + * _mbsnbcpy(MSVCRT.@) + * REMARKS + * Like strncpy this function doesn't enforce the string to be + * NUL-terminated + */ +unsigned char* CDECL _mbsnbcpy(unsigned char* dst, const unsigned char* src, size_t n) +{ + return _mbsnbcpy_l(dst, src, n, NULL); }
/********************************************************************* diff --git a/dlls/msvcrt/msvcrt.spec b/dlls/msvcrt/msvcrt.spec index 738279a2cd3..998bd7268ca 100644 --- a/dlls/msvcrt/msvcrt.spec +++ b/dlls/msvcrt/msvcrt.spec @@ -755,7 +755,7 @@ @ cdecl _mbsnbcoll(str str long) @ cdecl _mbsnbcoll_l(str str long ptr) @ cdecl _mbsnbcpy(ptr str long) -# stub _mbsnbcpy_l(ptr str long ptr) +@ cdecl _mbsnbcpy_l(ptr str long ptr) @ cdecl _mbsnbcpy_s(ptr long str long) @ cdecl _mbsnbcpy_s_l(ptr long str long ptr) @ cdecl _mbsnbicmp(str str long) diff --git a/dlls/ucrtbase/ucrtbase.spec b/dlls/ucrtbase/ucrtbase.spec index 46cea0359b4..25c3e5ac766 100644 --- a/dlls/ucrtbase/ucrtbase.spec +++ b/dlls/ucrtbase/ucrtbase.spec @@ -650,7 +650,7 @@ @ cdecl _mbsnbcoll(str str long) @ cdecl _mbsnbcoll_l(str str long ptr) @ cdecl _mbsnbcpy(ptr str long) -@ stub _mbsnbcpy_l +@ cdecl _mbsnbcpy_l(ptr str long ptr) @ cdecl _mbsnbcpy_s(ptr long str long) @ cdecl _mbsnbcpy_s_l(ptr long str long ptr) @ cdecl _mbsnbicmp(str str long) @@ -1219,7 +1219,7 @@ @ cdecl _o__mbsnbcoll(str str long) _mbsnbcoll @ cdecl _o__mbsnbcoll_l(str str long ptr) _mbsnbcoll_l @ cdecl _o__mbsnbcpy(ptr str long) _mbsnbcpy -@ stub _o__mbsnbcpy_l +@ cdecl _o__mbsnbcpy_l(ptr str long ptr) _mbsnbcpy_l @ cdecl _o__mbsnbcpy_s(ptr long str long) _mbsnbcpy_s @ cdecl _o__mbsnbcpy_s_l(ptr long str long ptr) _mbsnbcpy_s_l @ cdecl _o__mbsnbicmp(str str long) _mbsnbicmp
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 | 45 +++++++++++++++++++++++++------------ dlls/msvcrt/msvcrt.spec | 2 +- dlls/ucrtbase/ucrtbase.spec | 4 ++-- 8 files changed, 39 insertions(+), 22 deletions(-)
diff --git a/dlls/msvcr100/msvcr100.spec b/dlls/msvcr100/msvcr100.spec index 2e607207780..121ff766807 100644 --- a/dlls/msvcr100/msvcr100.spec +++ b/dlls/msvcr100/msvcr100.spec @@ -1142,7 +1142,7 @@ @ cdecl _mbsnbicoll(str str long) @ cdecl _mbsnbicoll_l(str str long ptr) @ cdecl _mbsnbset(ptr long long) -@ stub _mbsnbset_l +@ cdecl _mbsnbset_l(str long long ptr) @ stub _mbsnbset_s @ stub _mbsnbset_s_l @ cdecl _mbsncat(str str long) diff --git a/dlls/msvcr110/msvcr110.spec b/dlls/msvcr110/msvcr110.spec index 4c552a2a80f..b14ed43cb3b 100644 --- a/dlls/msvcr110/msvcr110.spec +++ b/dlls/msvcr110/msvcr110.spec @@ -1499,7 +1499,7 @@ @ cdecl _mbsnbicoll(str str long) @ cdecl _mbsnbicoll_l(str str long ptr) @ cdecl _mbsnbset(ptr long long) -@ stub _mbsnbset_l +@ cdecl _mbsnbset_l(str long long ptr) @ stub _mbsnbset_s @ stub _mbsnbset_s_l @ cdecl _mbsncat(str str long) diff --git a/dlls/msvcr120/msvcr120.spec b/dlls/msvcr120/msvcr120.spec index d60c97a53fc..0aa7cafb660 100644 --- a/dlls/msvcr120/msvcr120.spec +++ b/dlls/msvcr120/msvcr120.spec @@ -1510,7 +1510,7 @@ @ cdecl _mbsnbicoll(str str long) @ cdecl _mbsnbicoll_l(str str long ptr) @ cdecl _mbsnbset(ptr long long) -@ stub _mbsnbset_l +@ cdecl _mbsnbset_l(str long long ptr) @ stub _mbsnbset_s @ stub _mbsnbset_s_l @ cdecl _mbsncat(str str long) diff --git a/dlls/msvcr80/msvcr80.spec b/dlls/msvcr80/msvcr80.spec index d718ec58cb4..52a9fbce0dc 100644 --- a/dlls/msvcr80/msvcr80.spec +++ b/dlls/msvcr80/msvcr80.spec @@ -814,7 +814,7 @@ @ cdecl _mbsnbicoll(str str long) @ cdecl _mbsnbicoll_l(str str long ptr) @ cdecl _mbsnbset(ptr long long) -@ stub _mbsnbset_l +@ cdecl _mbsnbset_l(str long long ptr) @ stub _mbsnbset_s @ stub _mbsnbset_s_l @ cdecl _mbsncat(str str long) diff --git a/dlls/msvcr90/msvcr90.spec b/dlls/msvcr90/msvcr90.spec index d3b51e6cdac..78521a857ae 100644 --- a/dlls/msvcr90/msvcr90.spec +++ b/dlls/msvcr90/msvcr90.spec @@ -792,7 +792,7 @@ @ cdecl _mbsnbicoll(str str long) @ cdecl _mbsnbicoll_l(str str long ptr) @ cdecl _mbsnbset(ptr long long) -@ stub _mbsnbset_l +@ cdecl _mbsnbset_l(str long long ptr) @ stub _mbsnbset_s @ stub _mbsnbset_s_l @ cdecl _mbsncat(str str long) diff --git a/dlls/msvcrt/mbcs.c b/dlls/msvcrt/mbcs.c index e75a02e0193..2d492197452 100644 --- a/dlls/msvcrt/mbcs.c +++ b/dlls/msvcrt/mbcs.c @@ -2200,35 +2200,52 @@ unsigned char* CDECL _mbsset(unsigned char* str, unsigned int c) }
/********************************************************************* - * _mbsnbset(MSVCRT.@) + * _mbsnbset_l(MSVCRT.@) */ -unsigned char* CDECL _mbsnbset(unsigned char *str, unsigned int c, size_t len) +unsigned char* CDECL _mbsnbset_l(unsigned char *str, unsigned int c, size_t len, _locale_t locale) { unsigned char *ret = str; + pthreadmbcinfo mbcinfo;
- if(!len) - return ret; + if (!len) + return ret; + if (!MSVCRT_CHECK_PMT(str)) + return NULL; + + if (locale) + mbcinfo = locale->mbcinfo; + else + mbcinfo = get_mbcinfo();
- if(!get_mbcinfo()->ismbcodepage || c < 256) - return u__strnset(str, c, len); /* ASCII CP or SB char */ + if (!mbcinfo->ismbcodepage || c < 256) + return u__strnset(str, c, len); /* ASCII CP or SB char */
c &= 0xffff; /* Strip high bits */
- while(str[0] && str[1] && (len > 1)) + while (str[0] && str[1] && (len > 1)) { - *str++ = c >> 8; - len--; - *str++ = c & 0xff; - len--; + *str++ = c >> 8; + len--; + *str++ = c & 0xff; + len--; } - if(len && str[0]) { - /* as per msdn pad with a blank character */ - str[0] = ' '; + if (len && str[0]) + { + /* as per msdn pad with a blank character */ + str[0] = ' '; }
return ret; }
+/********************************************************************* + * _mbsnbset(MSVCRT.@) + */ +unsigned char* CDECL _mbsnbset(unsigned char *str, unsigned int c, size_t len) +{ + return _mbsnbset_l(str, c, len, NULL); +} + /********************************************************************* * _mbsnset(MSVCRT.@) */ diff --git a/dlls/msvcrt/msvcrt.spec b/dlls/msvcrt/msvcrt.spec index e62e221b2b3..de58dd39a93 100644 --- a/dlls/msvcrt/msvcrt.spec +++ b/dlls/msvcrt/msvcrt.spec @@ -763,7 +763,7 @@ @ cdecl _mbsnbicoll(str str long) @ cdecl _mbsnbicoll_l(str str long ptr) @ cdecl _mbsnbset(ptr long long) -# stub _mbsnbset_l(str long long ptr) +@ cdecl _mbsnbset_l(str long long ptr) # stub _mbsnbset_s(ptr long long long) # stub _mbsnbset_s_l(ptr long long long ptr) @ cdecl _mbsncat(str str long) diff --git a/dlls/ucrtbase/ucrtbase.spec b/dlls/ucrtbase/ucrtbase.spec index 1ed734b76d8..a18f5d6e397 100644 --- a/dlls/ucrtbase/ucrtbase.spec +++ b/dlls/ucrtbase/ucrtbase.spec @@ -658,7 +658,7 @@ @ cdecl _mbsnbicoll(str str long) @ cdecl _mbsnbicoll_l(str str long ptr) @ cdecl _mbsnbset(ptr long long) -@ stub _mbsnbset_l +@ cdecl _mbsnbset_l(str long long ptr) @ stub _mbsnbset_s @ stub _mbsnbset_s_l @ cdecl _mbsncat(str str long) @@ -1227,7 +1227,7 @@ @ cdecl _o__mbsnbicoll(str str long) _mbsnbicoll @ cdecl _o__mbsnbicoll_l(str str long ptr) _mbsnbicoll_l @ cdecl _o__mbsnbset(ptr long long) _mbsnbset -@ stub _o__mbsnbset_l +@ cdecl _o__mbsnbset_l(str long long ptr) _mbsnbset_l @ stub _o__mbsnbset_s @ stub _o__mbsnbset_s_l @ cdecl _o__mbsncat(str str long) _mbsncat
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 | 93 ++++++++++++++++++++++--------------- dlls/msvcrt/msvcrt.spec | 2 +- dlls/ucrtbase/ucrtbase.spec | 4 +- 8 files changed, 64 insertions(+), 45 deletions(-)
diff --git a/dlls/msvcr100/msvcr100.spec b/dlls/msvcr100/msvcr100.spec index 884289175c0..2e607207780 100644 --- a/dlls/msvcr100/msvcr100.spec +++ b/dlls/msvcr100/msvcr100.spec @@ -1138,7 +1138,7 @@ @ cdecl _mbsnbcpy_s(ptr long str long) @ cdecl _mbsnbcpy_s_l(ptr long str long ptr) @ cdecl _mbsnbicmp(str str long) -@ stub _mbsnbicmp_l +@ cdecl _mbsnbicmp_l(str str long ptr) @ cdecl _mbsnbicoll(str str long) @ cdecl _mbsnbicoll_l(str str long ptr) @ cdecl _mbsnbset(ptr long long) diff --git a/dlls/msvcr110/msvcr110.spec b/dlls/msvcr110/msvcr110.spec index 89bb35c7dba..4c552a2a80f 100644 --- a/dlls/msvcr110/msvcr110.spec +++ b/dlls/msvcr110/msvcr110.spec @@ -1495,7 +1495,7 @@ @ cdecl _mbsnbcpy_s(ptr long str long) @ cdecl _mbsnbcpy_s_l(ptr long str long ptr) @ cdecl _mbsnbicmp(str str long) -@ stub _mbsnbicmp_l +@ cdecl _mbsnbicmp_l(str str long ptr) @ cdecl _mbsnbicoll(str str long) @ cdecl _mbsnbicoll_l(str str long ptr) @ cdecl _mbsnbset(ptr long long) diff --git a/dlls/msvcr120/msvcr120.spec b/dlls/msvcr120/msvcr120.spec index 1be83715d23..d60c97a53fc 100644 --- a/dlls/msvcr120/msvcr120.spec +++ b/dlls/msvcr120/msvcr120.spec @@ -1506,7 +1506,7 @@ @ cdecl _mbsnbcpy_s(ptr long str long) @ cdecl _mbsnbcpy_s_l(ptr long str long ptr) @ cdecl _mbsnbicmp(str str long) -@ stub _mbsnbicmp_l +@ cdecl _mbsnbicmp_l(str str long ptr) @ cdecl _mbsnbicoll(str str long) @ cdecl _mbsnbicoll_l(str str long ptr) @ cdecl _mbsnbset(ptr long long) diff --git a/dlls/msvcr80/msvcr80.spec b/dlls/msvcr80/msvcr80.spec index 78172dbc104..d718ec58cb4 100644 --- a/dlls/msvcr80/msvcr80.spec +++ b/dlls/msvcr80/msvcr80.spec @@ -810,7 +810,7 @@ @ cdecl _mbsnbcpy_s(ptr long str long) @ cdecl _mbsnbcpy_s_l(ptr long str long ptr) @ cdecl _mbsnbicmp(str str long) -@ stub _mbsnbicmp_l +@ cdecl _mbsnbicmp_l(str str long ptr) @ cdecl _mbsnbicoll(str str long) @ cdecl _mbsnbicoll_l(str str long ptr) @ cdecl _mbsnbset(ptr long long) diff --git a/dlls/msvcr90/msvcr90.spec b/dlls/msvcr90/msvcr90.spec index c1736877ff5..d3b51e6cdac 100644 --- a/dlls/msvcr90/msvcr90.spec +++ b/dlls/msvcr90/msvcr90.spec @@ -788,7 +788,7 @@ @ cdecl _mbsnbcpy_s(ptr long str long) @ cdecl _mbsnbcpy_s_l(ptr long str long ptr) @ cdecl _mbsnbicmp(str str long) -@ stub _mbsnbicmp_l +@ cdecl _mbsnbicmp_l(str str long ptr) @ cdecl _mbsnbicoll(str str long) @ cdecl _mbsnbicoll_l(str str long ptr) @ cdecl _mbsnbset(ptr long long) diff --git a/dlls/msvcrt/mbcs.c b/dlls/msvcrt/mbcs.c index 38ace70cd7e..e75a02e0193 100644 --- a/dlls/msvcrt/mbcs.c +++ b/dlls/msvcrt/mbcs.c @@ -1362,47 +1362,66 @@ int CDECL _mbsnicmp(const unsigned char* str, const unsigned char* cmp, size_t l }
/********************************************************************* - * _mbsnbicmp(MSVCRT.@) + * _mbsnbicmp_l(MSVCRT.@) */ -int CDECL _mbsnbicmp(const unsigned char* str, const unsigned char* cmp, size_t len) +int CDECL _mbsnbicmp_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 (!len) + return 0; + 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; - strc = _mbctolower(strc); - cmpc = _mbctolower(cmpc); - 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; + strc = _mbctolower_l(strc, locale); + cmpc = _mbctolower_l(cmpc, locale); + if (strc != cmpc) + return strc < cmpc ? -1 : 1; + len -= clen; + str += clen; + cmp += clen; + } + return 0; /* Matched len bytes */ } - return 0; /* Matched len bytes */ - } - return u_strncasecmp(str,cmp,len); + return u_strncasecmp(str, cmp, len); +} + +/********************************************************************* + * _mbsnbicmp(MSVCRT.@) + */ +int CDECL _mbsnbicmp(const unsigned char* str, const unsigned char* cmp, size_t len) +{ + return _mbsnbicmp_l(str, cmp, len, NULL); }
/********************************************************************* diff --git a/dlls/msvcrt/msvcrt.spec b/dlls/msvcrt/msvcrt.spec index 998bd7268ca..e62e221b2b3 100644 --- a/dlls/msvcrt/msvcrt.spec +++ b/dlls/msvcrt/msvcrt.spec @@ -759,7 +759,7 @@ @ cdecl _mbsnbcpy_s(ptr long str long) @ cdecl _mbsnbcpy_s_l(ptr long str long ptr) @ cdecl _mbsnbicmp(str str long) -# stub _mbsnbicmp_l(str str long ptr) +@ cdecl _mbsnbicmp_l(str str long ptr) @ cdecl _mbsnbicoll(str str long) @ cdecl _mbsnbicoll_l(str str long ptr) @ cdecl _mbsnbset(ptr long long) diff --git a/dlls/ucrtbase/ucrtbase.spec b/dlls/ucrtbase/ucrtbase.spec index 25c3e5ac766..1ed734b76d8 100644 --- a/dlls/ucrtbase/ucrtbase.spec +++ b/dlls/ucrtbase/ucrtbase.spec @@ -654,7 +654,7 @@ @ cdecl _mbsnbcpy_s(ptr long str long) @ cdecl _mbsnbcpy_s_l(ptr long str long ptr) @ cdecl _mbsnbicmp(str str long) -@ stub _mbsnbicmp_l +@ cdecl _mbsnbicmp_l(str str long ptr) @ cdecl _mbsnbicoll(str str long) @ cdecl _mbsnbicoll_l(str str long ptr) @ cdecl _mbsnbset(ptr long long) @@ -1223,7 +1223,7 @@ @ cdecl _o__mbsnbcpy_s(ptr long str long) _mbsnbcpy_s @ cdecl _o__mbsnbcpy_s_l(ptr long str long ptr) _mbsnbcpy_s_l @ cdecl _o__mbsnbicmp(str str long) _mbsnbicmp -@ stub _o__mbsnbicmp_l +@ cdecl _o__mbsnbicmp_l(str str long ptr) _mbsnbicmp_l @ cdecl _o__mbsnbicoll(str str long) _mbsnbicoll @ cdecl _o__mbsnbicoll_l(str str long ptr) _mbsnbicoll_l @ cdecl _o__mbsnbset(ptr long long) _mbsnbset
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 | 56 +++++++++++++++++++++++++------------ dlls/msvcrt/msvcrt.spec | 2 +- dlls/ucrtbase/ucrtbase.spec | 4 +-- 8 files changed, 46 insertions(+), 26 deletions(-)
diff --git a/dlls/msvcr100/msvcr100.spec b/dlls/msvcr100/msvcr100.spec index 121ff766807..565689ac6ab 100644 --- a/dlls/msvcr100/msvcr100.spec +++ b/dlls/msvcr100/msvcr100.spec @@ -1146,7 +1146,7 @@ @ stub _mbsnbset_s @ stub _mbsnbset_s_l @ cdecl _mbsncat(str str long) -@ stub _mbsncat_l +@ cdecl _mbsncat_l(str str long ptr) @ stub _mbsncat_s @ stub _mbsncat_s_l @ cdecl _mbsnccnt(str long) diff --git a/dlls/msvcr110/msvcr110.spec b/dlls/msvcr110/msvcr110.spec index b14ed43cb3b..bc143f34505 100644 --- a/dlls/msvcr110/msvcr110.spec +++ b/dlls/msvcr110/msvcr110.spec @@ -1503,7 +1503,7 @@ @ stub _mbsnbset_s @ stub _mbsnbset_s_l @ cdecl _mbsncat(str str long) -@ stub _mbsncat_l +@ cdecl _mbsncat_l(str str long ptr) @ stub _mbsncat_s @ stub _mbsncat_s_l @ cdecl _mbsnccnt(str long) diff --git a/dlls/msvcr120/msvcr120.spec b/dlls/msvcr120/msvcr120.spec index 0aa7cafb660..cd76f568557 100644 --- a/dlls/msvcr120/msvcr120.spec +++ b/dlls/msvcr120/msvcr120.spec @@ -1514,7 +1514,7 @@ @ stub _mbsnbset_s @ stub _mbsnbset_s_l @ cdecl _mbsncat(str str long) -@ stub _mbsncat_l +@ cdecl _mbsncat_l(str str long ptr) @ stub _mbsncat_s @ stub _mbsncat_s_l @ cdecl _mbsnccnt(str long) diff --git a/dlls/msvcr80/msvcr80.spec b/dlls/msvcr80/msvcr80.spec index 52a9fbce0dc..5bc963edf57 100644 --- a/dlls/msvcr80/msvcr80.spec +++ b/dlls/msvcr80/msvcr80.spec @@ -818,7 +818,7 @@ @ stub _mbsnbset_s @ stub _mbsnbset_s_l @ cdecl _mbsncat(str str long) -@ stub _mbsncat_l +@ cdecl _mbsncat_l(str str long ptr) @ stub _mbsncat_s @ stub _mbsncat_s_l @ cdecl _mbsnccnt(str long) diff --git a/dlls/msvcr90/msvcr90.spec b/dlls/msvcr90/msvcr90.spec index 78521a857ae..a7f47e568c7 100644 --- a/dlls/msvcr90/msvcr90.spec +++ b/dlls/msvcr90/msvcr90.spec @@ -796,7 +796,7 @@ @ stub _mbsnbset_s @ stub _mbsnbset_s_l @ cdecl _mbsncat(str str long) -@ stub _mbsncat_l +@ cdecl _mbsncat_l(str str long ptr) @ stub _mbsncat_s @ stub _mbsncat_s_l @ cdecl _mbsnccnt(str long) diff --git a/dlls/msvcrt/mbcs.c b/dlls/msvcrt/mbcs.c index 2d492197452..77ced6e8a3e 100644 --- a/dlls/msvcrt/mbcs.c +++ b/dlls/msvcrt/mbcs.c @@ -2457,30 +2457,50 @@ int CDECL _mbsnbcat_s(unsigned char *dst, size_t size, const unsigned char *src, }
/********************************************************************* - * _mbsncat(MSVCRT.@) + * _mbsncat_l(MSVCRT.@) */ -unsigned char* CDECL _mbsncat(unsigned char* dst, const unsigned char* src, size_t len) +unsigned char* CDECL _mbsncat_l(unsigned char* dst, const unsigned char* src, size_t len, _locale_t locale) { - if(get_mbcinfo()->ismbcodepage) - { - unsigned char *res = dst; - while (*dst) - { - if (_ismbblead(*dst++)) - dst++; - } - while (*src && len--) + pthreadmbcinfo mbcinfo; + + if (!len) + return dst; + + if (!MSVCRT_CHECK_PMT(dst && src)) + return NULL; + + if (locale) + mbcinfo = locale->mbcinfo; + else + mbcinfo = get_mbcinfo(); + + if (mbcinfo->ismbcodepage) { - *dst++ = *src; - if(_ismbblead(*src++)) - *dst++ = *src++; + unsigned char *res = dst; + while (*dst) + { + if (_ismbblead_l(*dst++, locale)) + dst++; + } + while (*src && len--) + { + *dst++ = *src; + if (_ismbblead_l(*src++, locale)) + *dst++ = *src++; + } + *dst = '\0'; + return res; } - *dst = '\0'; - return res; - } - return u_strncat(dst, src, len); /* ASCII CP */ + return u_strncat(dst, src, len); /* ASCII CP */ }
+/********************************************************************* + * _mbsncat(MSVCRT.@) + */ +unsigned char* CDECL _mbsncat(unsigned char* dst, const unsigned char* src, size_t len) +{ + return _mbsncat_l(dst, src, len, NULL); +}
/********************************************************************* * _mbslwr_l(MSVCRT.@) diff --git a/dlls/msvcrt/msvcrt.spec b/dlls/msvcrt/msvcrt.spec index de58dd39a93..ff6f14b884f 100644 --- a/dlls/msvcrt/msvcrt.spec +++ b/dlls/msvcrt/msvcrt.spec @@ -767,7 +767,7 @@ # stub _mbsnbset_s(ptr long long long) # stub _mbsnbset_s_l(ptr long long long ptr) @ cdecl _mbsncat(str str long) -# stub _mbsncat_l(str str long ptr) +@ cdecl _mbsncat_l(str str long ptr) # stub _mbsncat_s(str long str long) # stub _mbsncat_s_l(str long str long ptr) @ cdecl _mbsnccnt(str long) diff --git a/dlls/ucrtbase/ucrtbase.spec b/dlls/ucrtbase/ucrtbase.spec index a18f5d6e397..91c54e1a31c 100644 --- a/dlls/ucrtbase/ucrtbase.spec +++ b/dlls/ucrtbase/ucrtbase.spec @@ -662,7 +662,7 @@ @ stub _mbsnbset_s @ stub _mbsnbset_s_l @ cdecl _mbsncat(str str long) -@ stub _mbsncat_l +@ cdecl _mbsncat_l(str str long ptr) @ stub _mbsncat_s @ stub _mbsncat_s_l @ cdecl _mbsnccnt(str long) @@ -1231,7 +1231,7 @@ @ stub _o__mbsnbset_s @ stub _o__mbsnbset_s_l @ cdecl _o__mbsncat(str str long) _mbsncat -@ stub _o__mbsncat_l +@ cdecl _o__mbsncat_l(str str long ptr) _mbsncat_l @ stub _o__mbsncat_s @ stub _o__mbsncat_s_l @ cdecl _o__mbsnccnt(str long) _mbsnccnt
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, 49 insertions(+), 28 deletions(-)
diff --git a/dlls/msvcr100/msvcr100.spec b/dlls/msvcr100/msvcr100.spec index 565689ac6ab..4f84a92d712 100644 --- a/dlls/msvcr100/msvcr100.spec +++ b/dlls/msvcr100/msvcr100.spec @@ -1150,7 +1150,7 @@ @ stub _mbsncat_s @ stub _mbsncat_s_l @ cdecl _mbsnccnt(str long) -@ stub _mbsnccnt_l +@ cdecl _mbsnccnt_l(str long ptr) @ cdecl _mbsncmp(str str long) @ stub _mbsncmp_l @ stub _mbsncoll(str str long) diff --git a/dlls/msvcr110/msvcr110.spec b/dlls/msvcr110/msvcr110.spec index bc143f34505..c65a154c77d 100644 --- a/dlls/msvcr110/msvcr110.spec +++ b/dlls/msvcr110/msvcr110.spec @@ -1507,7 +1507,7 @@ @ stub _mbsncat_s @ stub _mbsncat_s_l @ cdecl _mbsnccnt(str long) -@ stub _mbsnccnt_l +@ cdecl _mbsnccnt_l(str long ptr) @ cdecl _mbsncmp(str str long) @ stub _mbsncmp_l @ stub _mbsncoll(str str long) diff --git a/dlls/msvcr120/msvcr120.spec b/dlls/msvcr120/msvcr120.spec index cd76f568557..19814e9dc6b 100644 --- a/dlls/msvcr120/msvcr120.spec +++ b/dlls/msvcr120/msvcr120.spec @@ -1518,7 +1518,7 @@ @ stub _mbsncat_s @ stub _mbsncat_s_l @ cdecl _mbsnccnt(str long) -@ stub _mbsnccnt_l +@ cdecl _mbsnccnt_l(str long ptr) @ cdecl _mbsncmp(str str long) @ stub _mbsncmp_l @ stub _mbsncoll(str str long) diff --git a/dlls/msvcr80/msvcr80.spec b/dlls/msvcr80/msvcr80.spec index 5bc963edf57..be691c2a4e9 100644 --- a/dlls/msvcr80/msvcr80.spec +++ b/dlls/msvcr80/msvcr80.spec @@ -822,7 +822,7 @@ @ stub _mbsncat_s @ stub _mbsncat_s_l @ cdecl _mbsnccnt(str long) -@ stub _mbsnccnt_l +@ cdecl _mbsnccnt_l(str long ptr) @ cdecl _mbsncmp(str str long) @ stub _mbsncmp_l @ stub _mbsncoll(str str long) diff --git a/dlls/msvcr90/msvcr90.spec b/dlls/msvcr90/msvcr90.spec index a7f47e568c7..ba0ff67b362 100644 --- a/dlls/msvcr90/msvcr90.spec +++ b/dlls/msvcr90/msvcr90.spec @@ -800,7 +800,7 @@ @ stub _mbsncat_s @ stub _mbsncat_s_l @ cdecl _mbsnccnt(str long) -@ stub _mbsnccnt_l +@ cdecl _mbsnccnt_l(str long ptr) @ cdecl _mbsncmp(str str long) @ stub _mbsncmp_l @ stub _mbsncoll(str str long) diff --git a/dlls/msvcrt/mbcs.c b/dlls/msvcrt/mbcs.c index 77ced6e8a3e..f8b0d238f4f 100644 --- a/dlls/msvcrt/mbcs.c +++ b/dlls/msvcrt/mbcs.c @@ -2273,31 +2273,52 @@ unsigned char* CDECL _mbsnset(unsigned char* str, unsigned int c, size_t len) }
/********************************************************************* - * _mbsnccnt(MSVCRT.@) + * _mbsnccnt_l(MSVCRT.@) * 'c' is for 'character'. */ -size_t CDECL _mbsnccnt(const unsigned char* str, size_t len) +size_t CDECL _mbsnccnt_l(const unsigned char* str, size_t len, _locale_t locale) { - size_t ret; - if(get_mbcinfo()->ismbcodepage) - { - ret=0; - while(*str && len-- > 0) + size_t ret; + pthreadmbcinfo mbcinfo; + + if (!len) + return 0; + if (!MSVCRT_CHECK_PMT(str)) + return 0; + + if (locale) + mbcinfo = locale->mbcinfo; + else + mbcinfo = get_mbcinfo(); + + if (mbcinfo->ismbcodepage) { - if(_ismbblead(*str)) - { - if (!len) - break; - len--; - str++; - } - str++; - ret++; + ret = 0; + while (*str && len-- > 0) + { + if (_ismbblead_l(*str, locale)) + { + if (!len) + break; + len--; + str++; + } + str++; + ret++; + } + return ret; } - return ret; - } - ret=u_strlen(str); - return min(ret, len); /* ASCII CP */ + ret = u_strlen(str); + return min(ret, len); /* ASCII CP */ +} + +/********************************************************************* + * _mbsnccnt(MSVCRT.@) + * 'c' is for 'character'. + */ +size_t CDECL _mbsnccnt(const unsigned char* str, size_t len) +{ + return _mbsnccnt_l(str, len, NULL); }
/********************************************************************* diff --git a/dlls/msvcrt/msvcrt.spec b/dlls/msvcrt/msvcrt.spec index ff6f14b884f..f316e4f3885 100644 --- a/dlls/msvcrt/msvcrt.spec +++ b/dlls/msvcrt/msvcrt.spec @@ -771,7 +771,7 @@ # stub _mbsncat_s(str long str long) # stub _mbsncat_s_l(str long str long ptr) @ cdecl _mbsnccnt(str long) -# stub _mbsnccnt_l(str long ptr) +@ cdecl _mbsnccnt_l(str long ptr) @ cdecl _mbsncmp(str str long) # stub _mbsncmp_l(str str long ptr) @ stub _mbsncoll(str str long) diff --git a/dlls/ucrtbase/ucrtbase.spec b/dlls/ucrtbase/ucrtbase.spec index 91c54e1a31c..45a92bdf94f 100644 --- a/dlls/ucrtbase/ucrtbase.spec +++ b/dlls/ucrtbase/ucrtbase.spec @@ -666,7 +666,7 @@ @ stub _mbsncat_s @ stub _mbsncat_s_l @ cdecl _mbsnccnt(str long) -@ stub _mbsnccnt_l +@ cdecl _mbsnccnt_l(str long ptr) @ cdecl _mbsncmp(str str long) @ stub _mbsncmp_l @ stub _mbsncoll(str str long) @@ -1235,7 +1235,7 @@ @ stub _o__mbsncat_s @ stub _o__mbsncat_s_l @ cdecl _o__mbsnccnt(str long) _mbsnccnt -@ stub _o__mbsnccnt_l +@ cdecl _o__mbsnccnt_l(str long ptr) _mbsnccnt_l @ cdecl _o__mbsncmp(str str long) _mbsncmp @ stub _o__mbsncmp_l @ stub _o__mbsncoll
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 | 46 +++++++++++++++++++++++++------------ dlls/msvcrt/msvcrt.spec | 2 +- dlls/ucrtbase/ucrtbase.spec | 4 ++-- 8 files changed, 39 insertions(+), 23 deletions(-)
diff --git a/dlls/msvcr100/msvcr100.spec b/dlls/msvcr100/msvcr100.spec index 4f84a92d712..88558752607 100644 --- a/dlls/msvcr100/msvcr100.spec +++ b/dlls/msvcr100/msvcr100.spec @@ -1170,7 +1170,7 @@ @ cdecl _mbsnlen(str long) @ cdecl _mbsnlen_l(str long ptr) @ cdecl _mbsnset(ptr long long) -@ stub _mbsnset_l +@ cdecl _mbsnset_l(ptr long long ptr) @ stub _mbsnset_s @ stub _mbsnset_s_l @ cdecl _mbspbrk(str str) diff --git a/dlls/msvcr110/msvcr110.spec b/dlls/msvcr110/msvcr110.spec index c65a154c77d..1937ffc9efb 100644 --- a/dlls/msvcr110/msvcr110.spec +++ b/dlls/msvcr110/msvcr110.spec @@ -1527,7 +1527,7 @@ @ cdecl _mbsnlen(str long) @ cdecl _mbsnlen_l(str long ptr) @ cdecl _mbsnset(ptr long long) -@ stub _mbsnset_l +@ cdecl _mbsnset_l(ptr long long ptr) @ stub _mbsnset_s @ stub _mbsnset_s_l @ cdecl _mbspbrk(str str) diff --git a/dlls/msvcr120/msvcr120.spec b/dlls/msvcr120/msvcr120.spec index 19814e9dc6b..462a42b719b 100644 --- a/dlls/msvcr120/msvcr120.spec +++ b/dlls/msvcr120/msvcr120.spec @@ -1538,7 +1538,7 @@ @ cdecl _mbsnlen(str long) @ cdecl _mbsnlen_l(str long ptr) @ cdecl _mbsnset(ptr long long) -@ stub _mbsnset_l +@ cdecl _mbsnset_l(ptr long long ptr) @ stub _mbsnset_s @ stub _mbsnset_s_l @ cdecl _mbspbrk(str str) diff --git a/dlls/msvcr80/msvcr80.spec b/dlls/msvcr80/msvcr80.spec index be691c2a4e9..822a43d5765 100644 --- a/dlls/msvcr80/msvcr80.spec +++ b/dlls/msvcr80/msvcr80.spec @@ -842,7 +842,7 @@ @ cdecl _mbsnlen(str long) @ cdecl _mbsnlen_l(str long ptr) @ cdecl _mbsnset(ptr long long) -@ stub _mbsnset_l +@ cdecl _mbsnset_l(ptr long long ptr) @ stub _mbsnset_s @ stub _mbsnset_s_l @ cdecl _mbspbrk(str str) diff --git a/dlls/msvcr90/msvcr90.spec b/dlls/msvcr90/msvcr90.spec index ba0ff67b362..32075829392 100644 --- a/dlls/msvcr90/msvcr90.spec +++ b/dlls/msvcr90/msvcr90.spec @@ -820,7 +820,7 @@ @ cdecl _mbsnlen(str long) @ cdecl _mbsnlen_l(str long ptr) @ cdecl _mbsnset(ptr long long) -@ stub _mbsnset_l +@ cdecl _mbsnset_l(ptr long long ptr) @ stub _mbsnset_s @ stub _mbsnset_s_l @ cdecl _mbspbrk(str str) diff --git a/dlls/msvcrt/mbcs.c b/dlls/msvcrt/mbcs.c index f8b0d238f4f..52b882a2fba 100644 --- a/dlls/msvcrt/mbcs.c +++ b/dlls/msvcrt/mbcs.c @@ -2249,27 +2249,43 @@ unsigned char* CDECL _mbsnbset(unsigned char *str, unsigned int c, size_t len) /********************************************************************* * _mbsnset(MSVCRT.@) */ -unsigned char* CDECL _mbsnset(unsigned char* str, unsigned int c, size_t len) +unsigned char* CDECL _mbsnset_l(unsigned char* str, unsigned int c, size_t len, _locale_t locale) { - unsigned char *ret = str; + unsigned char *ret = str; + pthreadmbcinfo mbcinfo;
- if(!len) - return ret; + if (!len) + return ret; + if (!MSVCRT_CHECK_PMT(str)) + return NULL;
- if(!get_mbcinfo()->ismbcodepage || c < 256) - return u__strnset(str, c, len); /* ASCII CP or SB char */ + if (locale) + mbcinfo = locale->mbcinfo; + else + mbcinfo = get_mbcinfo();
- c &= 0xffff; /* Strip high bits */ + if (!mbcinfo->ismbcodepage || c < 256) + return u__strnset(str, c, len); /* ASCII CP or SB char */
- while(str[0] && str[1] && len--) - { - *str++ = c >> 8; - *str++ = c & 0xff; - } - if(len && str[0]) - str[0] = '\0'; /* FIXME: OK to shorten? */ + c &= 0xffff; /* Strip high bits */
- return ret; + while (str[0] && str[1] && len--) + { + *str++ = c >> 8; + *str++ = c & 0xff; + } + if (len && str[0]) + str[0] = '\0'; /* FIXME: OK to shorten? */ + + return ret; +} + +/********************************************************************* + * _mbsnset(MSVCRT.@) + */ +unsigned char* CDECL _mbsnset(unsigned char* str, unsigned int c, size_t len) +{ + return _mbsnset_l(str, c, len, NULL); }
/********************************************************************* diff --git a/dlls/msvcrt/msvcrt.spec b/dlls/msvcrt/msvcrt.spec index f316e4f3885..430e0f9d5af 100644 --- a/dlls/msvcrt/msvcrt.spec +++ b/dlls/msvcrt/msvcrt.spec @@ -791,7 +791,7 @@ @ cdecl _mbsnlen(str long) @ cdecl _mbsnlen_l(str long ptr) @ cdecl _mbsnset(ptr long long) -# stub _mbsnset_l(ptr long long ptr) +@ cdecl _mbsnset_l(ptr long long ptr) # stub _mbsnset_s(ptr long long long) # stub _mbsnset_s_l(ptr long long long ptr) @ cdecl _mbspbrk(str str) diff --git a/dlls/ucrtbase/ucrtbase.spec b/dlls/ucrtbase/ucrtbase.spec index 45a92bdf94f..75f21a447c7 100644 --- a/dlls/ucrtbase/ucrtbase.spec +++ b/dlls/ucrtbase/ucrtbase.spec @@ -686,7 +686,7 @@ @ cdecl _mbsnlen(str long) @ cdecl _mbsnlen_l(str long ptr) @ cdecl _mbsnset(ptr long long) -@ stub _mbsnset_l +@ cdecl _mbsnset_l(ptr long long ptr) @ stub _mbsnset_s @ stub _mbsnset_s_l @ cdecl _mbspbrk(str str) @@ -1255,7 +1255,7 @@ @ cdecl _o__mbsnlen(str long) _mbsnlen @ cdecl _o__mbsnlen_l(str long ptr) _mbsnlen_l @ cdecl _o__mbsnset(ptr long long) _mbsnset -@ stub _o__mbsnset_l +@ cdecl _o__mbsnset_l(ptr long long ptr) _mbsnset_l @ stub _o__mbsnset_s @ stub _o__mbsnset_s_l @ cdecl _o__mbspbrk(str str) _mbspbrk
This merge request was approved by Piotr Caban.