msvcrt: Improve wcsncat_s.

This commit is contained in:
Damjan Jovanovic 2010-10-19 07:24:52 +02:00 committed by Alexandre Julliard
parent c7536ef868
commit b39c59e75d
2 changed files with 18 additions and 14 deletions

View File

@ -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)

View File

@ -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;