From b39c59e75d0cc33ab68ec384d4c4bf63048341f1 Mon Sep 17 00:00:00 2001 From: Damjan Jovanovic Date: Tue, 19 Oct 2010 07:24:52 +0200 Subject: [PATCH] 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 b56834512c6..85e4cf36681 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 98aa6c5656e..d7d2fd468be 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; -- 2.11.4.GIT