From 969279fc8a9c9045b303326745ac713ccbc9a592 Mon Sep 17 00:00:00 2001 From: Christoph von Wittich Date: Thu, 22 Jan 2009 14:41:57 +0000 Subject: [PATCH] add _mbsnbcpy_s to msvcrt (imported from wine) svn path=/trunk/; revision=39014 --- reactos/dll/win32/msvcrt/msvcrt.def | 2 + reactos/include/crt/mbstring.h | 1 + reactos/lib/sdk/crt/mbstring/mbsncpy.c | 64 ++++++++++++++++++++++++++ 3 files changed, 67 insertions(+) diff --git a/reactos/dll/win32/msvcrt/msvcrt.def b/reactos/dll/win32/msvcrt/msvcrt.def index ca3800fb507..6fb9b60a93f 100644 --- a/reactos/dll/win32/msvcrt/msvcrt.def +++ b/reactos/dll/win32/msvcrt/msvcrt.def @@ -847,4 +847,6 @@ EXPORTS wprintf @841 wscanf @842 + _mbsnbcpy_s + _swprintf=swprintf diff --git a/reactos/include/crt/mbstring.h b/reactos/include/crt/mbstring.h index 951bfad43e0..cbcff718617 100644 --- a/reactos/include/crt/mbstring.h +++ b/reactos/include/crt/mbstring.h @@ -75,6 +75,7 @@ extern "C" { _CRTIMP size_t __cdecl _mbsnbcnt(const unsigned char *_Str,size_t _MaxCount); _CRTIMP size_t __cdecl _mbsnbcnt_l(const unsigned char *_Str,size_t _MaxCount,_locale_t _Locale); _CRTIMP unsigned char *__cdecl _mbsnbcpy(unsigned char *_Dest,const unsigned char *_Source,size_t _Count); + _CRTIMP int __cdecl _mbsnbcpy_s(unsigned char* dst, size_t size, const unsigned char* src, size_t n); _CRTIMP unsigned char *__cdecl _mbsnbcpy_l(unsigned char *_Dest,const unsigned char *_Source,size_t _Count,_locale_t _Locale); _CRTIMP int __cdecl _mbsnbicmp(const unsigned char *_Str1,const unsigned char *_Str2,size_t _MaxCount); _CRTIMP int __cdecl _mbsnbicmp_l(const unsigned char *_Str1,const unsigned char *_Str2,size_t _MaxCount,_locale_t _Locale); diff --git a/reactos/lib/sdk/crt/mbstring/mbsncpy.c b/reactos/lib/sdk/crt/mbstring/mbsncpy.c index 016765e9ef2..407a8204cda 100644 --- a/reactos/lib/sdk/crt/mbstring/mbsncpy.c +++ b/reactos/lib/sdk/crt/mbstring/mbsncpy.c @@ -10,6 +10,7 @@ * */ +#include #include extern int g_mbcp_is_multibyte; @@ -91,3 +92,66 @@ unsigned char * _mbsnbcpy(unsigned char *dst, const unsigned char *src, size_t n while (n--) *dst++ = 0; return ret; } + +/* + * Unlike _mbsnbcpy this function does not pad the rest of the dest + * string with 0 +*/ +int CDECL _mbsnbcpy_s(unsigned char* dst, size_t size, const unsigned char* src, size_t n) +{ + size_t pos = 0; + + if(!dst || size == 0) + return EINVAL; + if(!src) + { + dst[0] = '\0'; + return EINVAL; + } + if(!n) + return 0; + + if(g_mbcp_is_multibyte) + { + int is_lead = 0; + while (*src && n) + { + if(pos == size) + { + dst[0] = '\0'; + return ERANGE; + } + is_lead = (!is_lead && _ismbblead(*src)); + n--; + dst[pos++] = *src++; + } + + if (is_lead) /* if string ends with a lead, remove it */ + dst[pos - 1] = 0; + } + else + { + while (n) + { + n--; + if(pos == size) + { + dst[0] = '\0'; + return ERANGE; + } + + if(!(*src)) break; + dst[pos++] = *src++; + } + } + + if(pos < size) + dst[pos] = '\0'; + else + { + dst[0] = '\0'; + return ERANGE; + } + + return 0; +}