Eryk Wieliczko : msvcrt: Implement strncat_s.

Alexandre Julliard julliard at winehq.org
Mon Nov 15 13:28:56 CST 2010


Module: wine
Branch: master
Commit: 37cf8dc57de3547d690ab8ca59ad536b56d8fa14
URL:    http://source.winehq.org/git/wine.git/?a=commit;h=37cf8dc57de3547d690ab8ca59ad536b56d8fa14

Author: Eryk Wieliczko <ewdevel at 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);




More information about the wine-cvs mailing list