Module: wine Branch: master Commit: 23d0369d9d519f5b4fa5ba82bc01a542ceaf1a2a URL: http://source.winehq.org/git/wine.git/?a=commit;h=23d0369d9d519f5b4fa5ba82bc...
Author: Piotr Caban piotr@codeweavers.com Date: Tue Apr 20 21:39:11 2010 +0200
msvcrt: Added strncpy_s implementation.
---
dlls/msvcr80/msvcr80.spec | 2 +- dlls/msvcr90/msvcr90.spec | 2 +- dlls/msvcrt/heap.c | 38 ++++++++++++++++++++++++++++++++++++++ dlls/msvcrt/msvcrt.spec | 2 +- 4 files changed, 41 insertions(+), 3 deletions(-)
diff --git a/dlls/msvcr80/msvcr80.spec b/dlls/msvcr80/msvcr80.spec index 0bbbfda..945bf4b 100644 --- a/dlls/msvcr80/msvcr80.spec +++ b/dlls/msvcr80/msvcr80.spec @@ -1388,7 +1388,7 @@ @ stub strncat_s @ cdecl strncmp(str str long) msvcrt.strncmp @ cdecl strncpy(ptr str long) msvcrt.strncpy -@ stub strncpy_s +@ cdecl strncpy_s(ptr long str long) msvcrt.strncpy_s @ cdecl strnlen(str long) msvcrt.strnlen @ cdecl strpbrk(str str) msvcrt.strpbrk @ cdecl strrchr(str long) msvcrt.strrchr diff --git a/dlls/msvcr90/msvcr90.spec b/dlls/msvcr90/msvcr90.spec index 45cd885..db16a0b 100644 --- a/dlls/msvcr90/msvcr90.spec +++ b/dlls/msvcr90/msvcr90.spec @@ -1372,7 +1372,7 @@ @ stub strncat_s @ cdecl strncmp(str str long) msvcrt.strncmp @ cdecl strncpy(ptr str long) msvcrt.strncpy -@ stub strncpy_s +@ cdecl strncpy_s(ptr long str long) msvcrt.strncpy_s @ cdecl strnlen(str long) msvcrt.strnlen @ cdecl strpbrk(str str) msvcrt.strpbrk @ cdecl strrchr(str long) msvcrt.strrchr diff --git a/dlls/msvcrt/heap.c b/dlls/msvcrt/heap.c index 7fd5d3b..c57a46c 100644 --- a/dlls/msvcrt/heap.c +++ b/dlls/msvcrt/heap.c @@ -550,3 +550,41 @@ int CDECL memmove_s(void *dest, MSVCRT_size_t numberOfElements, const void *src, memmove(dest, src, count); return 0; } + +/********************************************************************* + * strncpy_s (MSVCRT.@) + */ +int CDECL strncpy_s(char *dest, MSVCRT_size_t numberOfElements, + const char *src, MSVCRT_size_t count) +{ + MSVCRT_size_t i, end; + + TRACE("(%s %lu %s %lu)\n", dest, numberOfElements, src, count); + + if(!count) + return 0; + + if(!dest || !src || !numberOfElements) { + MSVCRT__invalid_parameter(NULL, NULL, NULL, 0, 0); + *MSVCRT__errno() = MSVCRT_EINVAL; + return MSVCRT_EINVAL; + } + + if(count!=_TRUNCATE && count<numberOfElements) + end = count; + else + end = numberOfElements-1; + + for(i=0; i<end && src[i]; i++) + dest[i] = src[i]; + + if(!src[i] || end==count || count==_TRUNCATE) { + dest[i] = '\0'; + return 0; + } + + MSVCRT__invalid_parameter(NULL, NULL, NULL, 0, 0); + dest[0] = '\0'; + *MSVCRT__errno() = MSVCRT_EINVAL; + return MSVCRT_EINVAL; +} diff --git a/dlls/msvcrt/msvcrt.spec b/dlls/msvcrt/msvcrt.spec index 98db83f..f21588f 100644 --- a/dlls/msvcrt/msvcrt.spec +++ b/dlls/msvcrt/msvcrt.spec @@ -1328,7 +1328,7 @@ # stub strncat_s @ cdecl strncmp(str str long) ntdll.strncmp @ cdecl strncpy(ptr str long) ntdll.strncpy -# stub strncpy_s +@ cdecl strncpy_s(ptr long str long) @ cdecl strnlen(str long) MSVCRT_strnlen @ cdecl strpbrk(str str) ntdll.strpbrk @ cdecl strrchr(str long) ntdll.strrchr