-- v3: msvcrt: Add _mbsnbcat_l implementation. msvcrt: Add _cwprintf_l implementation. msvcrt: Add _cprintf_l implementation. msvcrt: Add _mbsrchr_l implementation. msvcrt: Add _mbslwr_l implementation. msvcrt: Add _mbsdec_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 | 46 ++++++++++++++++++++++++++----------- dlls/msvcrt/msvcrt.spec | 2 +- dlls/ucrtbase/ucrtbase.spec | 4 ++-- 8 files changed, 40 insertions(+), 22 deletions(-)
diff --git a/dlls/msvcr100/msvcr100.spec b/dlls/msvcr100/msvcr100.spec index 37aee60487d..4f6e01ca065 100644 --- a/dlls/msvcr100/msvcr100.spec +++ b/dlls/msvcr100/msvcr100.spec @@ -1110,7 +1110,7 @@ @ cdecl _mbscspn(str str) @ cdecl _mbscspn_l(str str ptr) @ cdecl _mbsdec(ptr ptr) -@ stub _mbsdec_l +@ cdecl _mbsdec_l(ptr ptr ptr) @ cdecl _mbsicmp(str str) @ cdecl _mbsicmp_l(str str ptr) @ cdecl _mbsicoll(str str) diff --git a/dlls/msvcr110/msvcr110.spec b/dlls/msvcr110/msvcr110.spec index d1fc7c2de55..51a68603d4f 100644 --- a/dlls/msvcr110/msvcr110.spec +++ b/dlls/msvcr110/msvcr110.spec @@ -1467,7 +1467,7 @@ @ cdecl _mbscspn(str str) @ cdecl _mbscspn_l(str str ptr) @ cdecl _mbsdec(ptr ptr) -@ stub _mbsdec_l +@ cdecl _mbsdec_l(ptr ptr ptr) @ cdecl _mbsicmp(str str) @ cdecl _mbsicmp_l(str str ptr) @ cdecl _mbsicoll(str str) diff --git a/dlls/msvcr120/msvcr120.spec b/dlls/msvcr120/msvcr120.spec index 9576cd52edb..b004a9c51d4 100644 --- a/dlls/msvcr120/msvcr120.spec +++ b/dlls/msvcr120/msvcr120.spec @@ -1478,7 +1478,7 @@ @ cdecl _mbscspn(str str) @ cdecl _mbscspn_l(str str ptr) @ cdecl _mbsdec(ptr ptr) -@ stub _mbsdec_l +@ cdecl _mbsdec_l(ptr ptr ptr) @ cdecl _mbsicmp(str str) @ cdecl _mbsicmp_l(str str ptr) @ cdecl _mbsicoll(str str) diff --git a/dlls/msvcr80/msvcr80.spec b/dlls/msvcr80/msvcr80.spec index 6c3c87ada0f..bca11a6c9c3 100644 --- a/dlls/msvcr80/msvcr80.spec +++ b/dlls/msvcr80/msvcr80.spec @@ -782,7 +782,7 @@ @ cdecl _mbscspn(str str) @ cdecl _mbscspn_l(str str ptr) @ cdecl _mbsdec(ptr ptr) -@ stub _mbsdec_l +@ cdecl _mbsdec_l(ptr ptr ptr) @ cdecl _mbsicmp(str str) @ cdecl _mbsicmp_l(str str ptr) @ cdecl _mbsicoll(str str) diff --git a/dlls/msvcr90/msvcr90.spec b/dlls/msvcr90/msvcr90.spec index efaef544b7d..0ead41a4f8d 100644 --- a/dlls/msvcr90/msvcr90.spec +++ b/dlls/msvcr90/msvcr90.spec @@ -760,7 +760,7 @@ @ cdecl _mbscspn(str str) @ cdecl _mbscspn_l(str str ptr) @ cdecl _mbsdec(ptr ptr) -@ stub _mbsdec_l +@ cdecl _mbsdec_l(ptr ptr ptr) @ cdecl _mbsicmp(str str) @ cdecl _mbsicmp_l(str str ptr) @ cdecl _mbsicoll(str str) diff --git a/dlls/msvcrt/mbcs.c b/dlls/msvcrt/mbcs.c index c8390288d4a..f389a49c88d 100644 --- a/dlls/msvcrt/mbcs.c +++ b/dlls/msvcrt/mbcs.c @@ -669,20 +669,6 @@ unsigned int CDECL _mbcjmstojis(unsigned int c) return _mbcjmstojis_l(c, NULL); }
-/********************************************************************* - * _mbsdec(MSVCRT.@) - */ -unsigned char* CDECL _mbsdec(const unsigned char* start, const unsigned char* cur) -{ - if(start >= cur) - return NULL; - - if(get_mbcinfo()->ismbcodepage) - return (unsigned char *)(_ismbstrail(start,cur-1) ? cur - 2 : cur -1); - - return (unsigned char *)cur - 1; /* ASCII CP or SB char */ -} - /********************************************************************* * _mbclen_l(MSVCRT.@) */ @@ -1970,6 +1956,38 @@ int CDECL _ismbstrail(const unsigned char* start, const unsigned char* str) return _ismbstrail_l(start, str, NULL); }
+/********************************************************************* + * _mbsdec_l(MSVCRT.@) + */ +unsigned char* CDECL _mbsdec_l(const unsigned char* start, const unsigned char* cur, _locale_t locale) +{ + pthreadmbcinfo mbcinfo; + + if (!MSVCRT_CHECK_PMT(start && cur)) + return NULL; + if (start >= cur) + return NULL; + + if (!locale) + mbcinfo = get_mbcinfo(); + else + mbcinfo = locale->mbcinfo; + + if (mbcinfo->ismbcodepage) + return (unsigned char *)(_ismbstrail_l(start, cur-1, locale) ? cur - 2 : cur -1); + + return (unsigned char *)cur - 1; /* ASCII CP or SB char */ +} + +/********************************************************************* + * _mbsdec(MSVCRT.@) + */ +unsigned char* CDECL _mbsdec(const unsigned char* start, const unsigned char* cur) +{ + return _mbsdec_l(start, cur, NULL); +} + + /********************************************************************* * _mbbtype_l(MSVCRT.@) */ diff --git a/dlls/msvcrt/msvcrt.spec b/dlls/msvcrt/msvcrt.spec index 8515f13263f..a0dbc5f8fe4 100644 --- a/dlls/msvcrt/msvcrt.spec +++ b/dlls/msvcrt/msvcrt.spec @@ -729,7 +729,7 @@ @ cdecl _mbscspn(str str) @ cdecl _mbscspn_l(str str ptr) @ cdecl _mbsdec(ptr ptr) -# stub _mbsdec_l(ptr ptr ptr) +@ cdecl _mbsdec_l(ptr ptr ptr) @ cdecl _mbsdup(str) _strdup # stub _strdup_dbg(str long str long) @ cdecl _mbsicmp(str str) diff --git a/dlls/ucrtbase/ucrtbase.spec b/dlls/ucrtbase/ucrtbase.spec index bb505b42afb..ec580948af7 100644 --- a/dlls/ucrtbase/ucrtbase.spec +++ b/dlls/ucrtbase/ucrtbase.spec @@ -625,7 +625,7 @@ @ cdecl _mbscspn(str str) @ cdecl _mbscspn_l(str str ptr) @ cdecl _mbsdec(ptr ptr) -@ stub _mbsdec_l +@ cdecl _mbsdec_l(ptr ptr ptr) @ cdecl _mbsdup(str) _strdup @ cdecl _mbsicmp(str str) @ cdecl _mbsicmp_l(str str ptr) @@ -1195,7 +1195,7 @@ @ cdecl _o__mbscspn(str str) _mbscspn @ cdecl _o__mbscspn_l(str str ptr) _mbscspn_l @ cdecl _o__mbsdec(ptr ptr) _mbsdec -@ stub _o__mbsdec_l +@ cdecl _o__mbsdec_l(ptr ptr ptr) _mbsdec_l @ cdecl _o__mbsicmp(str str) _mbsicmp @ cdecl _o__mbsicmp_l(str str ptr) _mbsicmp_l @ cdecl _o__mbsicoll(str str) _mbsicoll
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, 44 insertions(+), 28 deletions(-)
diff --git a/dlls/msvcr100/msvcr100.spec b/dlls/msvcr100/msvcr100.spec index 4f6e01ca065..bb85301bce6 100644 --- a/dlls/msvcr100/msvcr100.spec +++ b/dlls/msvcr100/msvcr100.spec @@ -1120,7 +1120,7 @@ @ cdecl _mbslen(str) @ cdecl _mbslen_l(str ptr) @ cdecl _mbslwr(str) -@ stub _mbslwr_l +@ cdecl _mbslwr_l(str ptr) @ cdecl _mbslwr_s(str long) @ cdecl _mbslwr_s_l(str long ptr) @ cdecl _mbsnbcat(str str long) diff --git a/dlls/msvcr110/msvcr110.spec b/dlls/msvcr110/msvcr110.spec index 51a68603d4f..29a16dbdc40 100644 --- a/dlls/msvcr110/msvcr110.spec +++ b/dlls/msvcr110/msvcr110.spec @@ -1477,7 +1477,7 @@ @ cdecl _mbslen(str) @ cdecl _mbslen_l(str ptr) @ cdecl _mbslwr(str) -@ stub _mbslwr_l +@ cdecl _mbslwr_l(str ptr) @ cdecl _mbslwr_s(str long) @ cdecl _mbslwr_s_l(str long ptr) @ cdecl _mbsnbcat(str str long) diff --git a/dlls/msvcr120/msvcr120.spec b/dlls/msvcr120/msvcr120.spec index b004a9c51d4..97331627485 100644 --- a/dlls/msvcr120/msvcr120.spec +++ b/dlls/msvcr120/msvcr120.spec @@ -1488,7 +1488,7 @@ @ cdecl _mbslen(str) @ cdecl _mbslen_l(str ptr) @ cdecl _mbslwr(str) -@ stub _mbslwr_l +@ cdecl _mbslwr_l(str ptr) @ cdecl _mbslwr_s(str long) @ cdecl _mbslwr_s_l(str long ptr) @ cdecl _mbsnbcat(str str long) diff --git a/dlls/msvcr80/msvcr80.spec b/dlls/msvcr80/msvcr80.spec index bca11a6c9c3..55f058965d5 100644 --- a/dlls/msvcr80/msvcr80.spec +++ b/dlls/msvcr80/msvcr80.spec @@ -792,7 +792,7 @@ @ cdecl _mbslen(str) @ cdecl _mbslen_l(str ptr) @ cdecl _mbslwr(str) -@ stub _mbslwr_l +@ cdecl _mbslwr_l(str ptr) @ cdecl _mbslwr_s(str long) @ cdecl _mbslwr_s_l(str long ptr) @ cdecl _mbsnbcat(str str long) diff --git a/dlls/msvcr90/msvcr90.spec b/dlls/msvcr90/msvcr90.spec index 0ead41a4f8d..cdd0117aeb4 100644 --- a/dlls/msvcr90/msvcr90.spec +++ b/dlls/msvcr90/msvcr90.spec @@ -770,7 +770,7 @@ @ cdecl _mbslen(str) @ cdecl _mbslen_l(str ptr) @ cdecl _mbslwr(str) -@ stub _mbslwr_l +@ cdecl _mbslwr_l(str ptr) @ cdecl _mbslwr_s(str long) @ cdecl _mbslwr_s_l(str long ptr) @ cdecl _mbsnbcat(str str long) diff --git a/dlls/msvcrt/mbcs.c b/dlls/msvcrt/mbcs.c index f389a49c88d..99a05ca0082 100644 --- a/dlls/msvcrt/mbcs.c +++ b/dlls/msvcrt/mbcs.c @@ -2270,30 +2270,46 @@ unsigned char* CDECL _mbsncat(unsigned char* dst, const unsigned char* src, size
/********************************************************************* - * _mbslwr(MSVCRT.@) + * _mbslwr_l(MSVCRT.@) */ -unsigned char* CDECL _mbslwr(unsigned char* s) +unsigned char* CDECL _mbslwr_l(unsigned char* s, _locale_t locale) { - unsigned char *ret = s; - if (!s) - return NULL; - if (get_mbcinfo()->ismbcodepage) - { - unsigned int c; - while (*s) + pthreadmbcinfo mbcinfo; + unsigned char *ret = s; + + if (!s) + return NULL; + + if (locale) + mbcinfo = locale->mbcinfo; + else + mbcinfo = get_mbcinfo(); + + if (mbcinfo->ismbcodepage) { - c = _mbctolower(_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 = _mbctolower_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 = _tolower_l(*s, NULL); - return ret; + else for ( ; *s; s++) *s = _tolower_l(*s, locale); + return ret; +} + +/********************************************************************* + * _mbslwr(MSVCRT.@) + */ +unsigned char* CDECL _mbslwr(unsigned char* s) +{ + return _mbslwr_l(s, NULL); }
/********************************************************************* diff --git a/dlls/msvcrt/msvcrt.spec b/dlls/msvcrt/msvcrt.spec index a0dbc5f8fe4..bce48873271 100644 --- a/dlls/msvcrt/msvcrt.spec +++ b/dlls/msvcrt/msvcrt.spec @@ -741,7 +741,7 @@ @ cdecl _mbslen(str) @ cdecl _mbslen_l(str ptr) @ cdecl _mbslwr(str) -# stub _mbslwr_l(str ptr) +@ cdecl _mbslwr_l(str ptr) @ cdecl _mbslwr_s(str long) @ cdecl _mbslwr_s_l(str long ptr) @ cdecl _mbsnbcat(str str long) diff --git a/dlls/ucrtbase/ucrtbase.spec b/dlls/ucrtbase/ucrtbase.spec index ec580948af7..28805ceb98f 100644 --- a/dlls/ucrtbase/ucrtbase.spec +++ b/dlls/ucrtbase/ucrtbase.spec @@ -636,7 +636,7 @@ @ cdecl _mbslen(str) @ cdecl _mbslen_l(str ptr) @ cdecl _mbslwr(str) -@ stub _mbslwr_l +@ cdecl _mbslwr_l(str ptr) @ cdecl _mbslwr_s(str long) @ cdecl _mbslwr_s_l(str long ptr) @ cdecl _mbsnbcat(str str long) @@ -1205,7 +1205,7 @@ @ cdecl _o__mbslen(str) _mbslen @ cdecl _o__mbslen_l(str ptr) _mbslen_l @ cdecl _o__mbslwr(str) _mbslwr -@ stub _o__mbslwr_l +@ cdecl _o__mbslwr_l(str ptr) _mbslwr_l @ cdecl _o__mbslwr_s(str long) _mbslwr_s @ cdecl _o__mbslwr_s_l(str long ptr) _mbslwr_s_l @ cdecl _o__mbsnbcat(str str long) _mbsnbcat
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 | 47 ++++++++++++++++++++++++------------- dlls/msvcrt/msvcrt.spec | 2 +- dlls/ucrtbase/ucrtbase.spec | 4 ++-- 8 files changed, 39 insertions(+), 24 deletions(-)
diff --git a/dlls/msvcr100/msvcr100.spec b/dlls/msvcr100/msvcr100.spec index bb85301bce6..a39b15c6707 100644 --- a/dlls/msvcr100/msvcr100.spec +++ b/dlls/msvcr100/msvcr100.spec @@ -1176,7 +1176,7 @@ @ cdecl _mbspbrk(str str) @ stub _mbspbrk_l @ cdecl _mbsrchr(str long) -@ stub _mbsrchr_l +@ cdecl _mbsrchr_l(str long ptr) @ cdecl _mbsrev(str) @ stub _mbsrev_l @ cdecl _mbsset(ptr long) diff --git a/dlls/msvcr110/msvcr110.spec b/dlls/msvcr110/msvcr110.spec index 29a16dbdc40..a48d98455ce 100644 --- a/dlls/msvcr110/msvcr110.spec +++ b/dlls/msvcr110/msvcr110.spec @@ -1533,7 +1533,7 @@ @ cdecl _mbspbrk(str str) @ stub _mbspbrk_l @ cdecl _mbsrchr(str long) -@ stub _mbsrchr_l +@ cdecl _mbsrchr_l(str long ptr) @ cdecl _mbsrev(str) @ stub _mbsrev_l @ cdecl _mbsset(ptr long) diff --git a/dlls/msvcr120/msvcr120.spec b/dlls/msvcr120/msvcr120.spec index 97331627485..b23663783a7 100644 --- a/dlls/msvcr120/msvcr120.spec +++ b/dlls/msvcr120/msvcr120.spec @@ -1544,7 +1544,7 @@ @ cdecl _mbspbrk(str str) @ stub _mbspbrk_l @ cdecl _mbsrchr(str long) -@ stub _mbsrchr_l +@ cdecl _mbsrchr_l(str long ptr) @ cdecl _mbsrev(str) @ stub _mbsrev_l @ cdecl _mbsset(ptr long) diff --git a/dlls/msvcr80/msvcr80.spec b/dlls/msvcr80/msvcr80.spec index 55f058965d5..ec570c8ab1f 100644 --- a/dlls/msvcr80/msvcr80.spec +++ b/dlls/msvcr80/msvcr80.spec @@ -848,7 +848,7 @@ @ cdecl _mbspbrk(str str) @ stub _mbspbrk_l @ cdecl _mbsrchr(str long) -@ stub _mbsrchr_l +@ cdecl _mbsrchr_l(str long ptr) @ cdecl _mbsrev(str) @ stub _mbsrev_l @ cdecl _mbsset(ptr long) diff --git a/dlls/msvcr90/msvcr90.spec b/dlls/msvcr90/msvcr90.spec index cdd0117aeb4..b7d60374372 100644 --- a/dlls/msvcr90/msvcr90.spec +++ b/dlls/msvcr90/msvcr90.spec @@ -826,7 +826,7 @@ @ cdecl _mbspbrk(str str) @ stub _mbspbrk_l @ cdecl _mbsrchr(str long) -@ stub _mbsrchr_l +@ cdecl _mbsrchr_l(str long ptr) @ cdecl _mbsrev(str) @ stub _mbsrev_l @ cdecl _mbsset(ptr long) diff --git a/dlls/msvcrt/mbcs.c b/dlls/msvcrt/mbcs.c index 99a05ca0082..1f1630fa522 100644 --- a/dlls/msvcrt/mbcs.c +++ b/dlls/msvcrt/mbcs.c @@ -1441,27 +1441,42 @@ unsigned char* CDECL _mbschr(const unsigned char* s, unsigned int x) return _mbschr_l(s, x, NULL); }
+/********************************************************************* + * _mbsrchr_l(MSVCRT.@) + */ +unsigned char* CDECL _mbsrchr_l(const unsigned char* s, unsigned int x, _locale_t locale) +{ + pthreadmbcinfo mbcinfo; + + if (!MSVCRT_CHECK_PMT(s)) + return NULL; + + if (locale) + mbcinfo = locale->mbcinfo; + else + mbcinfo = get_mbcinfo(); + if (mbcinfo->ismbcodepage) + { + unsigned int c; + unsigned char* match=NULL; + while (1) { + c = _mbsnextc_l(s, locale); + if (c == x) + match=(unsigned char*)s; + if (!c) + return match; + s += (c > 255) ? 2 : 1; + } + } + return u_strrchr(s, x); +} + /********************************************************************* * _mbsrchr(MSVCRT.@) */ unsigned char* CDECL _mbsrchr(const unsigned char* s, unsigned int x) { - if(get_mbcinfo()->ismbcodepage) - { - unsigned int c; - unsigned char* match=NULL; - if(!s) - return NULL; - while (1) { - c = _mbsnextc(s); - if (c == x) - match=(unsigned char*)s; - if (!c) - return match; - s +=(c > 255) ? 2 : 1; - } - } - return u_strrchr(s, x); + return _mbsrchr_l(s, x, NULL); }
/********************************************************************* diff --git a/dlls/msvcrt/msvcrt.spec b/dlls/msvcrt/msvcrt.spec index bce48873271..fae66edf6a4 100644 --- a/dlls/msvcrt/msvcrt.spec +++ b/dlls/msvcrt/msvcrt.spec @@ -797,7 +797,7 @@ @ cdecl _mbspbrk(str str) # stub _mbspbrk_l(str str ptr) @ cdecl _mbsrchr(str long) -# stub _mbsrchr_l(str long ptr) +@ cdecl _mbsrchr_l(str long ptr) @ cdecl _mbsrev(str) # stub _mbsrev_l(str ptr) @ cdecl _mbsset(ptr long) diff --git a/dlls/ucrtbase/ucrtbase.spec b/dlls/ucrtbase/ucrtbase.spec index 28805ceb98f..5b4c2beb491 100644 --- a/dlls/ucrtbase/ucrtbase.spec +++ b/dlls/ucrtbase/ucrtbase.spec @@ -692,7 +692,7 @@ @ cdecl _mbspbrk(str str) @ stub _mbspbrk_l @ cdecl _mbsrchr(str long) -@ stub _mbsrchr_l +@ cdecl _mbsrchr_l(str long ptr) @ cdecl _mbsrev(str) @ stub _mbsrev_l @ cdecl _mbsset(ptr long) @@ -1261,7 +1261,7 @@ @ cdecl _o__mbspbrk(str str) _mbspbrk @ stub _o__mbspbrk_l @ cdecl _o__mbsrchr(str long) _mbsrchr -@ stub _o__mbsrchr_l +@ cdecl _o__mbsrchr_l(str long ptr) _mbsrchr_l @ cdecl _o__mbsrev(str) _mbsrev @ stub _o__mbsrev_l @ cdecl _o__mbsset(ptr long) _mbsset
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/console.c | 17 +++++++++++++++++ dlls/msvcrt/msvcrt.spec | 2 +- 7 files changed, 23 insertions(+), 6 deletions(-)
diff --git a/dlls/msvcr100/msvcr100.spec b/dlls/msvcr100/msvcr100.spec index a39b15c6707..b0a4cffc9d6 100644 --- a/dlls/msvcr100/msvcr100.spec +++ b/dlls/msvcr100/msvcr100.spec @@ -736,7 +736,7 @@ @ cdecl _copysign(double double) copysign @ cdecl -arch=!i386 _copysignf(float float) copysignf @ varargs _cprintf(str) -@ stub _cprintf_l +@ varargs _cprintf_l(str ptr) @ stub _cprintf_p @ stub _cprintf_p_l @ stub _cprintf_s diff --git a/dlls/msvcr110/msvcr110.spec b/dlls/msvcr110/msvcr110.spec index a48d98455ce..660986a92f7 100644 --- a/dlls/msvcr110/msvcr110.spec +++ b/dlls/msvcr110/msvcr110.spec @@ -1084,7 +1084,7 @@ @ cdecl _copysign(double double) copysign @ cdecl -arch=!i386 _copysignf(float float) copysignf @ varargs _cprintf(str) -@ stub _cprintf_l +@ varargs _cprintf_l(str ptr) @ stub _cprintf_p @ stub _cprintf_p_l @ stub _cprintf_s diff --git a/dlls/msvcr120/msvcr120.spec b/dlls/msvcr120/msvcr120.spec index b23663783a7..16bc8495882 100644 --- a/dlls/msvcr120/msvcr120.spec +++ b/dlls/msvcr120/msvcr120.spec @@ -1076,7 +1076,7 @@ @ cdecl _copysign(double double) copysign @ cdecl _copysignf(float float) copysignf @ varargs _cprintf(str) -@ stub _cprintf_l +@ varargs _cprintf_l(str ptr) @ stub _cprintf_p @ stub _cprintf_p_l @ stub _cprintf_s diff --git a/dlls/msvcr80/msvcr80.spec b/dlls/msvcr80/msvcr80.spec index ec570c8ab1f..9035a39c1e7 100644 --- a/dlls/msvcr80/msvcr80.spec +++ b/dlls/msvcr80/msvcr80.spec @@ -400,7 +400,7 @@ @ cdecl _copysign(double double) copysign @ cdecl -arch=!i386 _copysignf(float float) copysignf @ varargs _cprintf(str) -@ stub _cprintf_l +@ varargs _cprintf_l(str ptr) @ stub _cprintf_p @ stub _cprintf_p_l @ stub _cprintf_s diff --git a/dlls/msvcr90/msvcr90.spec b/dlls/msvcr90/msvcr90.spec index b7d60374372..fdf5e56b5f0 100644 --- a/dlls/msvcr90/msvcr90.spec +++ b/dlls/msvcr90/msvcr90.spec @@ -383,7 +383,7 @@ @ cdecl _copysign(double double) copysign @ cdecl -arch=!i386 _copysignf(float float) copysignf @ varargs _cprintf(str) -@ stub _cprintf_l +@ varargs _cprintf_l(str ptr) @ stub _cprintf_p @ stub _cprintf_p_l @ stub _cprintf_s diff --git a/dlls/msvcrt/console.c b/dlls/msvcrt/console.c index 2c92f0b3811..99cf35872aa 100644 --- a/dlls/msvcrt/console.c +++ b/dlls/msvcrt/console.c @@ -540,6 +540,23 @@ int CDECL _vcprintf(const char* format, va_list valist) return pf_printf_a(puts_clbk_console_a, NULL, format, NULL, 0, arg_clbk_valist, NULL, &valist); }
+#if _MSVCR_VER<=120 +/********************************************************************* + * _cprintf_l (MSVCRT.@) + */ +int WINAPIV _cprintf_l(const char* format, _locale_t locale, ...) +{ + int retval; + va_list valist; + + va_start(valist, locale); + retval = _vcprintf_l(format, locale, valist); + va_end(valist); + + return retval; +} +#endif + /********************************************************************* * _cprintf (MSVCRT.@) */ diff --git a/dlls/msvcrt/msvcrt.spec b/dlls/msvcrt/msvcrt.spec index fae66edf6a4..6891c5e84ed 100644 --- a/dlls/msvcrt/msvcrt.spec +++ b/dlls/msvcrt/msvcrt.spec @@ -370,7 +370,7 @@ @ cdecl _copysign(double double) copysign @ cdecl -arch=!i386 _copysignf(float float) copysignf @ varargs _cprintf(str) -# stub _cprintf_l(str ptr) +@ varargs _cprintf_l(str ptr) # stub _cprintf_p(str) # stub _cprintf_p_l(str ptr) # stub _cprintf_s(str)
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/console.c | 17 +++++++++++++++++ dlls/msvcrt/msvcrt.spec | 2 +- 7 files changed, 23 insertions(+), 6 deletions(-)
diff --git a/dlls/msvcr100/msvcr100.spec b/dlls/msvcr100/msvcr100.spec index b0a4cffc9d6..f33973f856d 100644 --- a/dlls/msvcr100/msvcr100.spec +++ b/dlls/msvcr100/msvcr100.spec @@ -757,7 +757,7 @@ @ cdecl _ctime64_s(str long ptr) @ cdecl _cwait(ptr long long) @ varargs _cwprintf(wstr) -@ stub _cwprintf_l +@ varargs _cwprintf_l(wstr ptr) @ stub _cwprintf_p @ stub _cwprintf_p_l @ stub _cwprintf_s diff --git a/dlls/msvcr110/msvcr110.spec b/dlls/msvcr110/msvcr110.spec index 660986a92f7..418387e1d29 100644 --- a/dlls/msvcr110/msvcr110.spec +++ b/dlls/msvcr110/msvcr110.spec @@ -1105,7 +1105,7 @@ @ cdecl _ctime64_s(str long ptr) @ cdecl _cwait(ptr long long) @ varargs _cwprintf(wstr) -@ stub _cwprintf_l +@ varargs _cwprintf_l(wstr ptr) @ stub _cwprintf_p @ stub _cwprintf_p_l @ stub _cwprintf_s diff --git a/dlls/msvcr120/msvcr120.spec b/dlls/msvcr120/msvcr120.spec index 16bc8495882..786f4b18caf 100644 --- a/dlls/msvcr120/msvcr120.spec +++ b/dlls/msvcr120/msvcr120.spec @@ -1097,7 +1097,7 @@ @ cdecl _ctime64_s(str long ptr) @ cdecl _cwait(ptr long long) @ varargs _cwprintf(wstr) -@ stub _cwprintf_l +@ varargs _cwprintf_l(wstr ptr) @ stub _cwprintf_p @ stub _cwprintf_p_l @ stub _cwprintf_s diff --git a/dlls/msvcr80/msvcr80.spec b/dlls/msvcr80/msvcr80.spec index 9035a39c1e7..cbd720580ac 100644 --- a/dlls/msvcr80/msvcr80.spec +++ b/dlls/msvcr80/msvcr80.spec @@ -421,7 +421,7 @@ @ cdecl _ctime64_s(str long ptr) @ cdecl _cwait(ptr long long) @ varargs _cwprintf(wstr) -@ stub _cwprintf_l +@ varargs _cwprintf_l(wstr ptr) @ stub _cwprintf_p @ stub _cwprintf_p_l @ stub _cwprintf_s diff --git a/dlls/msvcr90/msvcr90.spec b/dlls/msvcr90/msvcr90.spec index fdf5e56b5f0..6bdbe9ee0e9 100644 --- a/dlls/msvcr90/msvcr90.spec +++ b/dlls/msvcr90/msvcr90.spec @@ -404,7 +404,7 @@ @ cdecl _ctime64_s(str long ptr) @ cdecl _cwait(ptr long long) @ varargs _cwprintf(wstr) -@ stub _cwprintf_l +@ varargs _cwprintf_l(wstr ptr) @ stub _cwprintf_p @ stub _cwprintf_p_l @ stub _cwprintf_s diff --git a/dlls/msvcrt/console.c b/dlls/msvcrt/console.c index 99cf35872aa..6fedb8f434f 100644 --- a/dlls/msvcrt/console.c +++ b/dlls/msvcrt/console.c @@ -572,6 +572,7 @@ int WINAPIV _cprintf(const char* format, ...) return retval; }
+#if _MSVCR_VER<=120 /********************************************************************* * _vcwprintf_l (MSVCRT.@) */ @@ -588,6 +589,21 @@ int CDECL _vcwprintf(const wchar_t* format, va_list valist) return pf_printf_w(puts_clbk_console_w, NULL, format, NULL, 0, arg_clbk_valist, NULL, &valist); }
+/********************************************************************* + * _cwprintf_l (MSVCRT.@) + */ +int WINAPIV _cwprintf_l(const wchar_t* format, _locale_t locale, ...) +{ + int retval; + va_list valist; + + va_start(valist, locale); + retval = _vcwprintf_l(format, locale, valist); + va_end(valist); + + return retval; +} + /********************************************************************* * _cwprintf (MSVCRT.@) */ @@ -602,6 +618,7 @@ int WINAPIV _cwprintf(const wchar_t* format, ...)
return retval; } +#endif
#if _MSVCR_VER>=140
diff --git a/dlls/msvcrt/msvcrt.spec b/dlls/msvcrt/msvcrt.spec index 6891c5e84ed..a77ed171fb1 100644 --- a/dlls/msvcrt/msvcrt.spec +++ b/dlls/msvcrt/msvcrt.spec @@ -393,7 +393,7 @@ @ extern _ctype MSVCRT__ctype @ cdecl _cwait(ptr long long) @ varargs _cwprintf(wstr) -# stub _cwprintf_l(wstr ptr) +@ varargs _cwprintf_l(wstr ptr) # stub _cwprintf_p(wstr) # stub _cwprintf_p_l(wstr ptr) # stub _cwprintf_s(wstr)
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 | 42 +++++++++++++++++++++++++------------ dlls/msvcrt/msvcrt.spec | 2 +- dlls/ucrtbase/ucrtbase.spec | 4 ++-- 8 files changed, 37 insertions(+), 21 deletions(-)
diff --git a/dlls/msvcr100/msvcr100.spec b/dlls/msvcr100/msvcr100.spec index f33973f856d..9659cd1f3a2 100644 --- a/dlls/msvcr100/msvcr100.spec +++ b/dlls/msvcr100/msvcr100.spec @@ -1124,7 +1124,7 @@ @ cdecl _mbslwr_s(str long) @ cdecl _mbslwr_s_l(str long ptr) @ cdecl _mbsnbcat(str str long) -@ stub _mbsnbcat_l +@ cdecl _mbsnbcat_l(str str long ptr) @ cdecl _mbsnbcat_s(str long ptr long) @ stub _mbsnbcat_s_l @ cdecl _mbsnbcmp(str str long) diff --git a/dlls/msvcr110/msvcr110.spec b/dlls/msvcr110/msvcr110.spec index 418387e1d29..4bab0eddc99 100644 --- a/dlls/msvcr110/msvcr110.spec +++ b/dlls/msvcr110/msvcr110.spec @@ -1481,7 +1481,7 @@ @ cdecl _mbslwr_s(str long) @ cdecl _mbslwr_s_l(str long ptr) @ cdecl _mbsnbcat(str str long) -@ stub _mbsnbcat_l +@ cdecl _mbsnbcat_l(str str long ptr) @ cdecl _mbsnbcat_s(str long ptr long) @ stub _mbsnbcat_s_l @ cdecl _mbsnbcmp(str str long) diff --git a/dlls/msvcr120/msvcr120.spec b/dlls/msvcr120/msvcr120.spec index 786f4b18caf..e0d87f7f7f1 100644 --- a/dlls/msvcr120/msvcr120.spec +++ b/dlls/msvcr120/msvcr120.spec @@ -1492,7 +1492,7 @@ @ cdecl _mbslwr_s(str long) @ cdecl _mbslwr_s_l(str long ptr) @ cdecl _mbsnbcat(str str long) -@ stub _mbsnbcat_l +@ cdecl _mbsnbcat_l(str str long ptr) @ cdecl _mbsnbcat_s(str long ptr long) @ stub _mbsnbcat_s_l @ cdecl _mbsnbcmp(str str long) diff --git a/dlls/msvcr80/msvcr80.spec b/dlls/msvcr80/msvcr80.spec index cbd720580ac..5cc72177a33 100644 --- a/dlls/msvcr80/msvcr80.spec +++ b/dlls/msvcr80/msvcr80.spec @@ -796,7 +796,7 @@ @ cdecl _mbslwr_s(str long) @ cdecl _mbslwr_s_l(str long ptr) @ cdecl _mbsnbcat(str str long) -@ stub _mbsnbcat_l +@ cdecl _mbsnbcat_l(str str long ptr) @ cdecl _mbsnbcat_s(str long ptr long) @ stub _mbsnbcat_s_l @ cdecl _mbsnbcmp(str str long) diff --git a/dlls/msvcr90/msvcr90.spec b/dlls/msvcr90/msvcr90.spec index 6bdbe9ee0e9..556ba1fa1a7 100644 --- a/dlls/msvcr90/msvcr90.spec +++ b/dlls/msvcr90/msvcr90.spec @@ -774,7 +774,7 @@ @ cdecl _mbslwr_s(str long) @ cdecl _mbslwr_s_l(str long ptr) @ cdecl _mbsnbcat(str str long) -@ stub _mbsnbcat_l +@ cdecl _mbsnbcat_l(str str long ptr) @ cdecl _mbsnbcat_s(str long ptr long) @ stub _mbsnbcat_s_l @ cdecl _mbsnbcmp(str str long) diff --git a/dlls/msvcrt/mbcs.c b/dlls/msvcrt/mbcs.c index 1f1630fa522..f26e8bf4de9 100644 --- a/dlls/msvcrt/mbcs.c +++ b/dlls/msvcrt/mbcs.c @@ -2183,24 +2183,32 @@ size_t CDECL _mbsnbcnt(const unsigned char* str, size_t len) }
/********************************************************************* - * _mbsnbcat(MSVCRT.@) + * _mbsnbcat_l(MSVCRT.@) */ -unsigned char* CDECL _mbsnbcat(unsigned char* dst, const unsigned char* src, size_t len) +unsigned char* CDECL _mbsnbcat_l(unsigned char* dst, const unsigned char* src, size_t len, _locale_t locale) { - if(get_mbcinfo()->ismbcodepage) + pthreadmbcinfo mbcinfo; + + if (!MSVCRT_CHECK_PMT(dst && src)) + return NULL; + if (locale) + mbcinfo = locale->mbcinfo; + else + mbcinfo = get_mbcinfo(); + if (mbcinfo->ismbcodepage) { unsigned char *res = dst; while (*dst) { - if (_ismbblead(*dst++)) { - if (*dst) { - dst++; - } else { - /* as per msdn overwrite the lead byte in front of '\0' */ - dst--; - break; - } - } - } + if (_ismbblead_l(*dst++, locale)) { + if (*dst) { + dst++; + } else { + /* as per msdn overwrite the lead byte in front of '\0' */ + dst--; + break; + } + } + } while (*src && len--) *dst++ = *src++; *dst = '\0'; return res; @@ -2208,6 +2216,14 @@ unsigned char* CDECL _mbsnbcat(unsigned char* dst, const unsigned char* src, siz return u_strncat(dst, src, len); /* ASCII CP */ }
+/********************************************************************* + * _mbsnbcat(MSVCRT.@) + */ +unsigned char* CDECL _mbsnbcat(unsigned char* dst, const unsigned char* src, size_t len) +{ + return _mbsnbcat_l(dst, src, len, NULL); +} + int CDECL _mbsnbcat_s(unsigned char *dst, size_t size, const unsigned char *src, size_t len) { unsigned char *ptr = dst; diff --git a/dlls/msvcrt/msvcrt.spec b/dlls/msvcrt/msvcrt.spec index a77ed171fb1..e5e938959b8 100644 --- a/dlls/msvcrt/msvcrt.spec +++ b/dlls/msvcrt/msvcrt.spec @@ -745,7 +745,7 @@ @ cdecl _mbslwr_s(str long) @ cdecl _mbslwr_s_l(str long ptr) @ cdecl _mbsnbcat(str str long) -# stub _mbsnbcat_l(str str long ptr) +@ cdecl _mbsnbcat_l(str str long ptr) @ cdecl _mbsnbcat_s(str long ptr long) # stub _mbsnbcat_s_l(str long ptr long ptr) @ cdecl _mbsnbcmp(str str long) diff --git a/dlls/ucrtbase/ucrtbase.spec b/dlls/ucrtbase/ucrtbase.spec index 5b4c2beb491..4f54e1641fc 100644 --- a/dlls/ucrtbase/ucrtbase.spec +++ b/dlls/ucrtbase/ucrtbase.spec @@ -640,7 +640,7 @@ @ cdecl _mbslwr_s(str long) @ cdecl _mbslwr_s_l(str long ptr) @ cdecl _mbsnbcat(str str long) -@ stub _mbsnbcat_l +@ cdecl _mbsnbcat_l(str str long ptr) @ cdecl _mbsnbcat_s(str long ptr long) @ stub _mbsnbcat_s_l @ cdecl _mbsnbcmp(str str long) @@ -1209,7 +1209,7 @@ @ cdecl _o__mbslwr_s(str long) _mbslwr_s @ cdecl _o__mbslwr_s_l(str long ptr) _mbslwr_s_l @ cdecl _o__mbsnbcat(str str long) _mbsnbcat -@ stub _o__mbsnbcat_l +@ 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__mbsnbcmp(str str long) _mbsnbcmp