Module: wine Branch: master Commit: 37cf8dc57de3547d690ab8ca59ad536b56d8fa14 URL: http://source.winehq.org/git/wine.git/?a=commit;h=37cf8dc57de3547d690ab8ca59...
Author: Eryk Wieliczko ewdevel@gmail.com Date: Mon Nov 15 01:04:42 2010 +0100
msvcrt: Implement strncat_s.
---
dlls/msvcr100/msvcr100.spec | 2 +- dlls/msvcr80/msvcr80.spec | 2 +- dlls/msvcr90/msvcr90.spec | 2 +- dlls/msvcrt/msvcrt.spec | 2 +- dlls/msvcrt/string.c | 38 ++++++++++++++++++++++++++++++++++++++ include/msvcrt/string.h | 1 + 6 files changed, 43 insertions(+), 4 deletions(-)
diff --git a/dlls/msvcr100/msvcr100.spec b/dlls/msvcr100/msvcr100.spec index f172f7b..08942ae 100644 --- a/dlls/msvcr100/msvcr100.spec +++ b/dlls/msvcr100/msvcr100.spec @@ -1585,7 +1585,7 @@ @ cdecl strftime(str long str ptr) msvcrt.strftime @ cdecl strlen(str) msvcrt.strlen @ cdecl strncat(str str long) msvcrt.strncat -@ stub strncat_s +@ cdecl strncat_s(str long str long) msvcrt.strncat_s @ cdecl strncmp(str str long) msvcrt.strncmp @ cdecl strncpy(ptr str long) msvcrt.strncpy @ cdecl strncpy_s(ptr long str long) msvcrt.strncpy_s diff --git a/dlls/msvcr80/msvcr80.spec b/dlls/msvcr80/msvcr80.spec index f939329..2052fde 100644 --- a/dlls/msvcr80/msvcr80.spec +++ b/dlls/msvcr80/msvcr80.spec @@ -1439,7 +1439,7 @@ @ cdecl strftime(str long str ptr) msvcrt.strftime @ cdecl strlen(str) msvcrt.strlen @ cdecl strncat(str str long) msvcrt.strncat -@ stub strncat_s +@ cdecl strncat_s(str long str long) msvcrt.strncat_s @ cdecl strncmp(str str long) msvcrt.strncmp @ cdecl strncpy(ptr str long) msvcrt.strncpy @ cdecl strncpy_s(ptr long str long) msvcrt.strncpy_s diff --git a/dlls/msvcr90/msvcr90.spec b/dlls/msvcr90/msvcr90.spec index 2799f45..2fde5eb 100644 --- a/dlls/msvcr90/msvcr90.spec +++ b/dlls/msvcr90/msvcr90.spec @@ -1423,7 +1423,7 @@ @ cdecl strftime(str long str ptr) msvcrt.strftime @ cdecl strlen(str) msvcrt.strlen @ cdecl strncat(str str long) msvcrt.strncat -@ stub strncat_s +@ cdecl strncat_s(str long str long) msvcrt.strncat_s @ cdecl strncmp(str str long) msvcrt.strncmp @ cdecl strncpy(ptr str long) msvcrt.strncpy @ cdecl strncpy_s(ptr long str long) msvcrt.strncpy_s diff --git a/dlls/msvcrt/msvcrt.spec b/dlls/msvcrt/msvcrt.spec index 4a531f4..9602f3d 100644 --- a/dlls/msvcrt/msvcrt.spec +++ b/dlls/msvcrt/msvcrt.spec @@ -1384,7 +1384,7 @@ @ cdecl strftime(str long str ptr) MSVCRT_strftime @ cdecl strlen(str) ntdll.strlen @ cdecl strncat(str str long) ntdll.strncat -# stub strncat_s +@ cdecl strncat_s(str long str long) MSVCRT_strncat_s @ cdecl strncmp(str str long) ntdll.strncmp @ cdecl strncpy(ptr str long) ntdll.strncpy @ cdecl strncpy_s(ptr long str long) diff --git a/dlls/msvcrt/string.c b/dlls/msvcrt/string.c index ea3ca1b..d657fc3 100644 --- a/dlls/msvcrt/string.c +++ b/dlls/msvcrt/string.c @@ -393,6 +393,44 @@ int CDECL MSVCRT_strcat_s( char* dst, MSVCRT_size_t elem, const char* src ) }
/********************************************************************* + * strncat_s (MSVCRT.@) + */ +int CDECL MSVCRT_strncat_s( char* dst, MSVCRT_size_t elem, const char* src, MSVCRT_size_t count ) +{ + MSVCRT_size_t i, j; + if(!MSVCRT_CHECK_PMT(dst != 0) || !MSVCRT_CHECK_PMT(elem != 0)) + return MSVCRT_EINVAL; + if(!MSVCRT_CHECK_PMT(src != 0)) + { + dst[0] = '\0'; + return MSVCRT_EINVAL; + } + + for(i = 0; i < elem; i++) + { + if(dst[i] == '\0') + { + for(j = 0; (j + i) < elem; j++) + { + if(count == MSVCRT__TRUNCATE && j + i == elem - 1) + { + dst[j + i] = '\0'; + return MSVCRT_STRUNCATE; + } + if(j == count || (dst[j + i] = src[j]) == '\0') + { + dst[j + i] = '\0'; + return 0; + } + } + } + } + /* Set the first element to 0, not the first element after the skipped part */ + dst[0] = '\0'; + return MSVCRT_ERANGE; +} + +/********************************************************************* * strxfrm (MSVCRT.@) */ MSVCRT_size_t CDECL MSVCRT_strxfrm( char *dest, const char *src, MSVCRT_size_t len ) diff --git a/include/msvcrt/string.h b/include/msvcrt/string.h index 8ab459b..24bebd0 100644 --- a/include/msvcrt/string.h +++ b/include/msvcrt/string.h @@ -68,6 +68,7 @@ size_t __cdecl strcspn(const char*,const char*); char* __cdecl strerror(int); size_t __cdecl strlen(const char*); char* __cdecl strncat(char*,const char*,size_t); +errno_t __cdecl strncat_s(char*,size_t,const char*,size_t); int __cdecl strncmp(const char*,const char*,size_t); char* __cdecl strncpy(char*,const char*,size_t); errno_t __cdecl strncpy_s(char*,size_t,const char*,size_t);