Damjan Jovanovic : msvcrt: Implement wcsncat_s.

Alexandre Julliard julliard at winehq.org
Mon Oct 18 13:36:55 CDT 2010


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

Author: Damjan Jovanovic <damjan.jov at gmail.com>
Date:   Mon Oct 18 14:06:16 2010 +0200

msvcrt: Implement wcsncat_s.

---

 dlls/msvcr100/msvcr100.spec |    2 +-
 dlls/msvcr80/msvcr80.spec   |    2 +-
 dlls/msvcr90/msvcr90.spec   |    2 +-
 dlls/msvcrt/msvcrt.spec     |    2 +-
 dlls/msvcrt/tests/string.c  |   37 +++++++++++++++++++++++++++++++
 dlls/msvcrt/wcs.c           |   50 +++++++++++++++++++++++++++++++++++++++++++
 6 files changed, 91 insertions(+), 4 deletions(-)

diff --git a/dlls/msvcr100/msvcr100.spec b/dlls/msvcr100/msvcr100.spec
index 3468cbb..6573f1c 100644
--- a/dlls/msvcr100/msvcr100.spec
+++ b/dlls/msvcr100/msvcr100.spec
@@ -1640,7 +1640,7 @@
 @ cdecl wcsftime(ptr long wstr ptr) msvcrt.wcsftime
 @ cdecl wcslen(wstr) msvcrt.wcslen
 @ cdecl wcsncat(wstr wstr long) msvcrt.wcsncat
-@ stub wcsncat_s
+@ cdecl wcsncat_s(wstr long wstr long) msvcrt.wcsncat_s
 @ cdecl wcsncmp(wstr wstr long) msvcrt.wcsncmp
 @ cdecl wcsncpy(ptr wstr long) msvcrt.wcsncpy
 @ cdecl wcsncpy_s(ptr long wstr long) msvcrt.wcsncpy_s
diff --git a/dlls/msvcr80/msvcr80.spec b/dlls/msvcr80/msvcr80.spec
index 8f70693..819ed0a 100644
--- a/dlls/msvcr80/msvcr80.spec
+++ b/dlls/msvcr80/msvcr80.spec
@@ -1494,7 +1494,7 @@
 @ cdecl wcsftime(ptr long wstr ptr) msvcrt.wcsftime
 @ cdecl wcslen(wstr) msvcrt.wcslen
 @ cdecl wcsncat(wstr wstr long) msvcrt.wcsncat
-@ stub wcsncat_s
+@ cdecl wcsncat_s(wstr long wstr long) msvcrt.wcsncat_s
 @ cdecl wcsncmp(wstr wstr long) msvcrt.wcsncmp
 @ cdecl wcsncpy(ptr wstr long) msvcrt.wcsncpy
 @ cdecl wcsncpy_s(ptr long wstr long) msvcrt.wcsncpy_s
diff --git a/dlls/msvcr90/msvcr90.spec b/dlls/msvcr90/msvcr90.spec
index a9f6b01..7a8123d 100644
--- a/dlls/msvcr90/msvcr90.spec
+++ b/dlls/msvcr90/msvcr90.spec
@@ -1478,7 +1478,7 @@
 @ cdecl wcsftime(ptr long wstr ptr) msvcrt.wcsftime
 @ cdecl wcslen(wstr) msvcrt.wcslen
 @ cdecl wcsncat(wstr wstr long) msvcrt.wcsncat
-@ stub wcsncat_s
+@ cdecl wcsncat_s(wstr long wstr long) msvcrt.wcsncat_s
 @ cdecl wcsncmp(wstr wstr long) msvcrt.wcsncmp
 @ cdecl wcsncpy(ptr wstr long) msvcrt.wcsncpy
 @ cdecl wcsncpy_s(ptr long wstr long) msvcrt.wcsncpy_s
diff --git a/dlls/msvcrt/msvcrt.spec b/dlls/msvcrt/msvcrt.spec
index e6a8670..c0f3d35 100644
--- a/dlls/msvcrt/msvcrt.spec
+++ b/dlls/msvcrt/msvcrt.spec
@@ -1440,7 +1440,7 @@
 @ cdecl wcsftime(ptr long wstr ptr) MSVCRT_wcsftime
 @ cdecl wcslen(wstr) ntdll.wcslen
 @ cdecl wcsncat(wstr wstr long) ntdll.wcsncat
-# stub wcsncat_s
+@ cdecl wcsncat_s(wstr long wstr long) MSVCRT_wcsncat_s
 @ cdecl wcsncmp(wstr wstr long) ntdll.wcsncmp
 @ cdecl wcsncpy(ptr wstr long) ntdll.wcsncpy
 @ cdecl wcsncpy_s(ptr long wstr long) MSVCRT_wcsncpy_s
diff --git a/dlls/msvcrt/tests/string.c b/dlls/msvcrt/tests/string.c
index a7d033a..b568345 100644
--- a/dlls/msvcrt/tests/string.c
+++ b/dlls/msvcrt/tests/string.c
@@ -52,6 +52,7 @@ static int (__cdecl *pstrcpy_s)(char *dst, size_t len, const char *src);
 static int (__cdecl *pstrcat_s)(char *dst, size_t len, const char *src);
 static int (__cdecl *p_mbsnbcpy_s)(unsigned char * dst, size_t size, const unsigned char * src, size_t count);
 static int (__cdecl *p_wcscpy_s)(wchar_t *wcDest, size_t size, const wchar_t *wcSrc);
+static int (__cdecl *p_wcsncat_s)(wchar_t *dst, size_t elem, const wchar_t *src, size_t count);
 static int (__cdecl *p_wcsupr_s)(wchar_t *str, size_t size);
 static size_t (__cdecl *p_strnlen)(const char *, size_t);
 static __int64 (__cdecl *p_strtoi64)(const char *, char **, int);
@@ -1428,6 +1429,40 @@ static void test__strlwr_s(void)
        buffer);
 }
 
+static void test_wcsncat_s(void)
+{
+    static wchar_t abcW[] = {'a','b','c',0};
+    int ret;
+    wchar_t dst[4];
+    wchar_t src[4];
+
+    if (!p_wcsncat_s)
+    {
+        win_skip("skipping wcsncat_s tests\n");
+        return;
+    }
+
+    memcpy(src, abcW, sizeof(abcW));
+    dst[0] = 0;
+    ret = p_wcsncat_s(NULL, 4, src, 4);
+    ok(ret == EINVAL, "err = %d\n", ret);
+    ret = p_wcsncat_s(dst, 0, src, 4);
+    ok(ret == EINVAL, "err = %d\n", ret);
+    ret = p_wcsncat_s(dst, 0, src, _TRUNCATE);
+    ok(ret == EINVAL, "err = %d\n", ret);
+    ret = p_wcsncat_s(dst, 4, NULL, 0);
+    ok(ret == 0, "err = %d\n", ret);
+
+    dst[0] = 0;
+    ret = p_wcsncat_s(dst, 2, src, 4);
+    ok(ret == ERANGE, "err = %d\n", ret);
+
+    dst[0] = 0;
+    ret = p_wcsncat_s(dst, 2, src, _TRUNCATE);
+    todo_wine ok(ret == 80, "err = %d\n", ret);
+    ok(dst[0] == 'a' && dst[1] == 0, "dst is %s\n", wine_dbgstr_w(dst));
+}
+
 START_TEST(string)
 {
     char mem[100];
@@ -1446,6 +1481,7 @@ START_TEST(string)
     pstrcat_s = (void *)GetProcAddress( hMsvcrt,"strcat_s" );
     p_mbsnbcpy_s = (void *)GetProcAddress( hMsvcrt,"_mbsnbcpy_s" );
     p_wcscpy_s = (void *)GetProcAddress( hMsvcrt,"wcscpy_s" );
+    p_wcsncat_s = (void *)GetProcAddress( hMsvcrt,"wcsncat_s" );
     p_wcsupr_s = (void *)GetProcAddress( hMsvcrt,"_wcsupr_s" );
     p_strnlen = (void *)GetProcAddress( hMsvcrt,"strnlen" );
     p_strtoi64 = (void *)GetProcAddress(hMsvcrt, "_strtoi64");
@@ -1491,4 +1527,5 @@ START_TEST(string)
     test_gcvt();
     test__itoa_s();
     test__strlwr_s();
+    test_wcsncat_s();
 }
diff --git a/dlls/msvcrt/wcs.c b/dlls/msvcrt/wcs.c
index 47a50b6..98aa6c5 100644
--- a/dlls/msvcrt/wcs.c
+++ b/dlls/msvcrt/wcs.c
@@ -1581,6 +1581,56 @@ INT CDECL MSVCRT_wcscat_s(MSVCRT_wchar_t* dst, MSVCRT_size_t elem, const MSVCRT_
 }
 
 /*********************************************************************
+ *  wcsncat_s (MSVCRT.@)
+ *
+ */
+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;
+
+    if (src == NULL && count > 0)
+        return MSVCRT_EINVAL;
+    if (dst == NULL)
+        return MSVCRT_EINVAL;
+    if (elem == 0)
+        return MSVCRT_EINVAL;
+
+    for (i = 0; i < elem; i++)
+    {
+        dststart = i;
+        if (dst[i] == '\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 = i;
+            break;
+        }
+    }
+
+    if (srclen < (elem - dststart))
+    {
+        memcpy(&dst[dststart], src, srclen*sizeof(MSVCRT_wchar_t));
+        dst[srclen] = '\0';
+        return 0;
+    }
+    dst[0] = '\0';
+    return MSVCRT_ERANGE;
+}
+
+/*********************************************************************
  *  _wcstoi64_l (MSVCRT.@)
  *
  * FIXME: locale parameter is ignored




More information about the wine-cvs mailing list