Module: wine Branch: master Commit: 94e960c861c013771d72022ef994d38e937cef58 URL: https://source.winehq.org/git/wine.git/?a=commit;h=94e960c861c013771d72022ef...
Author: Alexandre Julliard julliard@winehq.org Date: Wed Jun 29 11:49:38 2022 +0200
ntdll: Add strncpy_s and wcsncpy_s.
Implementation copied from msvcrt.
Signed-off-by: Alexandre Julliard julliard@winehq.org
---
dlls/ntdll/ntdll.spec | 2 ++ dlls/ntdll/string.c | 42 ++++++++++++++++++++++++++++++++++++++++++ dlls/ntdll/wcstring.c | 42 ++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 86 insertions(+)
diff --git a/dlls/ntdll/ntdll.spec b/dlls/ntdll/ntdll.spec index 1e94d23c7df..95b2e652b3d 100644 --- a/dlls/ntdll/ntdll.spec +++ b/dlls/ntdll/ntdll.spec @@ -1597,6 +1597,7 @@ @ cdecl strncat(str str long) @ cdecl strncmp(str str long) @ cdecl strncpy(ptr str long) +@ cdecl strncpy_s(ptr long str long) @ cdecl strnlen(ptr long) @ cdecl strpbrk(str str) @ cdecl strrchr(str long) @@ -1627,6 +1628,7 @@ @ cdecl wcsncat(wstr wstr long) @ cdecl wcsncmp(wstr wstr long) @ cdecl wcsncpy(ptr wstr long) +@ cdecl wcsncpy_s(ptr long wstr long) @ cdecl wcsnlen(ptr long) @ cdecl wcspbrk(wstr wstr) @ cdecl wcsrchr(wstr long) diff --git a/dlls/ntdll/string.c b/dlls/ntdll/string.c index 8a37cd6d8d4..212cd30e2f1 100644 --- a/dlls/ntdll/string.c +++ b/dlls/ntdll/string.c @@ -356,6 +356,48 @@ char * __cdecl strncpy( char *dst, const char *src, size_t len ) }
+/********************************************************************* + * strncpy_s (NTDLL.@) + */ +errno_t __cdecl strncpy_s( char *dst, size_t len, const char *src, size_t count ) +{ + size_t i, end; + + if (!count) + { + if (dst && len) *dst = 0; + return 0; + } + if (!dst || !len) return EINVAL; + if (!src) + { + *dst = 0; + return EINVAL; + } + + if (count != _TRUNCATE && count < len) + end = count; + else + end = len - 1; + + for (i = 0; i < end; i++) + if (!(dst[i] = src[i])) return 0; + + if (count == _TRUNCATE) + { + dst[i] = 0; + return STRUNCATE; + } + if (end == count) + { + dst[i] = 0; + return 0; + } + dst[0] = 0; + return ERANGE; +} + + /********************************************************************* * strnlen (NTDLL.@) */ diff --git a/dlls/ntdll/wcstring.c b/dlls/ntdll/wcstring.c index d5e50981153..cb45986207d 100644 --- a/dlls/ntdll/wcstring.c +++ b/dlls/ntdll/wcstring.c @@ -292,6 +292,48 @@ LPWSTR __cdecl wcsncpy( LPWSTR s1, LPCWSTR s2, size_t n ) }
+/********************************************************************* + * wcsncpy_s (NTDLL.@) + */ +errno_t __cdecl wcsncpy_s( wchar_t *dst, size_t len, const wchar_t *src, size_t count ) +{ + size_t i, end; + + if (!count) + { + if (dst && len) *dst = 0; + return 0; + } + if (!dst || !len) return EINVAL; + if (!src) + { + *dst = 0; + return EINVAL; + } + + if (count != _TRUNCATE && count < len) + end = count; + else + end = len - 1; + + for (i = 0; i < end; i++) + if (!(dst[i] = src[i])) return 0; + + if (count == _TRUNCATE) + { + dst[i] = 0; + return STRUNCATE; + } + if (end == count) + { + dst[i] = 0; + return 0; + } + dst[0] = 0; + return ERANGE; +} + + /********************************************************************* * wcsnlen (NTDLL.@) */