Module: wine Branch: master Commit: b39c59e75d0cc33ab68ec384d4c4bf63048341f1 URL: http://source.winehq.org/git/wine.git/?a=commit;h=b39c59e75d0cc33ab68ec384d4...
Author: Damjan Jovanovic damjan.jov@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;