From 12a00363f68fd12f3a1319eba7ccbce95df4e275 Mon Sep 17 00:00:00 2001 From: Bartosz Kosiorek Date: Mon, 6 Nov 2023 20:35:53 +0100 Subject: [PATCH] msvcrt: Add _mbsnbset_l implementation. --- 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 | 63 +++++++++++++++++++++++-------------- dlls/msvcrt/msvcrt.spec | 2 +- dlls/ucrtbase/ucrtbase.spec | 4 +-- 8 files changed, 48 insertions(+), 31 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 @@ -2199,34 +2199,51 @@ unsigned char* CDECL _mbsset(unsigned char* str, unsigned int c) return ret; } +/********************************************************************* + * _mbsnbset_l(MSVCRT.@) + */ +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 (!MSVCRT_CHECK_PMT(str)) + return NULL; + + if (locale) + mbcinfo = locale->mbcinfo; + else + mbcinfo = get_mbcinfo(); + + 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)) + { + *str++ = c >> 8; + len--; + *str++ = c & 0xff; + len--; + } + 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) { - unsigned char *ret = str; - - if(!len) - return ret; - - if(!get_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)) - { - *str++ = c >> 8; - len--; - *str++ = c & 0xff; - len--; - } - if(len && str[0]) { - /* as per msdn pad with a blank character */ - str[0] = ' '; - } - - return ret; + return _mbsnbset_l(str, c, len, NULL); } /********************************************************************* 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