Damjan Jovanovic : msvcrt: Improve wcsncat_s.

Alexandre Julliard julliard at winehq.org
Tue Oct 19 13:03:44 CDT 2010


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

Author: Damjan Jovanovic <damjan.jov at gmail.com>
Date:   Tue Oct 19 07:24:52 2010 +0200

msvcrt: Improve wcsncat_s.

---

 dlls/msvcrt/tests/string.c |    7 ++++++-
 dlls/msvcrt/wcs.c          |   25 ++++++++++++-------------
 2 files changed, 18 insertions(+), 14 deletions(-)

diff --git a/dlls/msvcrt/tests/string.c b/dlls/msvcrt/tests/string.c
index b568345..85e4cf3 100644
--- a/dlls/msvcrt/tests/string.c
+++ b/dlls/msvcrt/tests/string.c
@@ -1459,8 +1459,13 @@ static void test_wcsncat_s(void)
 
     dst[0] = 0;
     ret = p_wcsncat_s(dst, 2, src, _TRUNCATE);
-    todo_wine ok(ret == 80, "err = %d\n", ret);
+    ok(ret == STRUNCATE, "err = %d\n", ret);
     ok(dst[0] == 'a' && dst[1] == 0, "dst is %s\n", wine_dbgstr_w(dst));
+
+    memcpy(dst, abcW, sizeof(abcW));
+    dst[3] = 'd';
+    ret = p_wcsncat_s(dst, 4, src, 4);
+    ok(ret == EINVAL, "err = %d\n", ret);
 }
 
 START_TEST(string)
diff --git a/dlls/msvcrt/wcs.c b/dlls/msvcrt/wcs.c
index 98aa6c5..d7d2fd4 100644
--- a/dlls/msvcrt/wcs.c
+++ b/dlls/msvcrt/wcs.c
@@ -1588,8 +1588,8 @@ INT CDECL MSVCRT_wcsncat_s(MSVCRT_wchar_t *dst, MSVCRT_size_t elem,
         const MSVCRT_wchar_t *src, MSVCRT_size_t count)
 {
     MSVCRT_size_t srclen;
-    MSVCRT_size_t i;
     MSVCRT_wchar_t dststart;
+    INT ret = 0;
 
     if (src == NULL && count > 0)
         return MSVCRT_EINVAL;
@@ -1597,34 +1597,33 @@ INT CDECL MSVCRT_wcsncat_s(MSVCRT_wchar_t *dst, MSVCRT_size_t elem,
         return MSVCRT_EINVAL;
     if (elem == 0)
         return MSVCRT_EINVAL;
+    if (count == 0)
+        return 0;
 
-    for (i = 0; i < elem; i++)
+    for (dststart = 0; dststart < elem; dststart++)
     {
-        dststart = i;
-        if (dst[i] == '\0')
+        if (dst[dststart] == '\0')
             break;
     }
     if (dststart == elem)
         return MSVCRT_EINVAL;
 
     if (count == MSVCRT__TRUNCATE)
-        srclen = elem - dststart - 1;
-    else
-        srclen = count;
-    for (i = 0; i < srclen; i++)
     {
-        if (src[i] == '\0')
+        srclen = strlenW(src);
+        if (srclen >= (elem - dststart))
         {
-            srclen = i;
-            break;
+            srclen = elem - dststart - 1;
+            ret = MSVCRT_STRUNCATE;
         }
     }
-
+    else
+        srclen = min(strlenW(src), count);
     if (srclen < (elem - dststart))
     {
         memcpy(&dst[dststart], src, srclen*sizeof(MSVCRT_wchar_t));
         dst[srclen] = '\0';
-        return 0;
+        return ret;
     }
     dst[0] = '\0';
     return MSVCRT_ERANGE;




More information about the wine-cvs mailing list