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