Commit 1eb07756 authored by Andrew Nguyen's avatar Andrew Nguyen Committed by Alexandre Julliard

msvcrt: Implement and test _wcsupr_s.

parent 44ac91d7
...@@ -548,6 +548,7 @@ ...@@ -548,6 +548,7 @@
@ cdecl _wcsrev(wstr) @ cdecl _wcsrev(wstr)
@ cdecl _wcsset(wstr long) @ cdecl _wcsset(wstr long)
@ cdecl _wcsupr(wstr) ntdll._wcsupr @ cdecl _wcsupr(wstr) ntdll._wcsupr
@ cdecl _wcsupr_s(wstr long) MSVCRT__wcsupr_s
@ cdecl _wctime(ptr) MSVCRT__wctime @ cdecl _wctime(ptr) MSVCRT__wctime
@ cdecl _wctime32(ptr) MSVCRT__wctime32 @ cdecl _wctime32(ptr) MSVCRT__wctime32
@ cdecl _wctime64(ptr) MSVCRT__wctime64 @ cdecl _wctime64(ptr) MSVCRT__wctime64
......
...@@ -51,6 +51,7 @@ static int (__cdecl *pstrcpy_s)(char *dst, size_t len, const char *src); ...@@ -51,6 +51,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 *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_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_wcscpy_s)(wchar_t *wcDest, size_t size, const wchar_t *wcSrc);
static int (__cdecl *p_wcsupr_s)(wchar_t *str, size_t size);
static int *p__mb_cur_max; static int *p__mb_cur_max;
static unsigned char *p_mbctype; static unsigned char *p_mbctype;
...@@ -597,6 +598,93 @@ static void test_wcscpy_s(void) ...@@ -597,6 +598,93 @@ static void test_wcscpy_s(void)
ok(szDestShort[0] == 0, "szDestShort[0] not 0\n"); ok(szDestShort[0] == 0, "szDestShort[0] not 0\n");
} }
static void test__wcsupr_s(void)
{
static const WCHAR mixedString[] = {'M', 'i', 'X', 'e', 'D', 'l', 'o', 'w',
'e', 'r', 'U', 'P', 'P', 'E', 'R', 0};
static const WCHAR expectedString[] = {'M', 'I', 'X', 'E', 'D', 'L', 'O',
'W', 'E', 'R', 'U', 'P', 'P', 'E',
'R', 0};
WCHAR testBuffer[2*sizeof(mixedString)/sizeof(WCHAR)];
int ret;
if (!p_wcsupr_s)
{
win_skip("_wcsupr_s not found\n");
return;
}
/* Test NULL input string and invalid size. */
errno = EBADF;
ret = p_wcsupr_s(NULL, 0);
ok(ret == EINVAL, "Expected _wcsupr_s to fail with EINVAL, got %d\n", ret);
ok(errno == EINVAL, "Expected errno to be EINVAL, got %d\n", errno);
/* Test NULL input string and valid size. */
errno = EBADF;
ret = p_wcsupr_s(NULL, sizeof(testBuffer)/sizeof(WCHAR));
ok(ret == EINVAL, "Expected _wcsupr_s to fail with EINVAL, got %d\n", ret);
ok(errno == EINVAL, "Expected errno to be EINVAL, got %d\n", errno);
/* Test empty string with zero size. */
errno = EBADF;
testBuffer[0] = '\0';
ret = p_wcsupr_s(testBuffer, 0);
ok(ret == EINVAL, "Expected _wcsupr_s to fail with EINVAL, got %d\n", ret);
ok(errno == EINVAL, "Expected errno to be EINVAL, got %d\n", errno);
ok(testBuffer[0] == '\0', "Expected the buffer to be unchanged\n");
/* Test empty string with size of one. */
testBuffer[0] = '\0';
ret = p_wcsupr_s(testBuffer, 1);
ok(ret == 0, "Expected _wcsupr_s to succeed, got %d\n", ret);
ok(testBuffer[0] == '\0', "Expected the buffer to be unchanged\n");
/* Test one-byte buffer with zero size. */
errno = EBADF;
testBuffer[0] = 'x';
ret = p_wcsupr_s(testBuffer, 0);
ok(ret == EINVAL, "Expected _wcsupr_s to fail with EINVAL, got %d\n", ret);
ok(errno == EINVAL, "Expected errno to be EINVAL, got %d\n", errno);
ok(testBuffer[0] == '\0', "Expected the first buffer character to be null\n");
/* Test one-byte buffer with size of one. */
errno = EBADF;
testBuffer[0] = 'x';
ret = p_wcsupr_s(testBuffer, 1);
ok(ret == EINVAL, "Expected _wcsupr_s to fail with EINVAL, got %d\n", ret);
ok(errno == EINVAL, "Expected errno to be EINVAL, got %d\n", errno);
ok(testBuffer[0] == '\0', "Expected the first buffer character to be null\n");
/* Test invalid size. */
wcscpy(testBuffer, mixedString);
errno = EBADF;
ret = p_wcsupr_s(testBuffer, 0);
ok(ret == EINVAL, "Expected _wcsupr_s to fail with EINVAL, got %d\n", ret);
ok(errno == EINVAL, "Expected errno to be EINVAL, got %d\n", errno);
ok(testBuffer[0] == '\0', "Expected the first buffer character to be null\n");
/* Test normal string uppercasing. */
wcscpy(testBuffer, mixedString);
ret = p_wcsupr_s(testBuffer, sizeof(mixedString)/sizeof(WCHAR));
ok(ret == 0, "Expected _wcsupr_s to succeed, got %d\n", ret);
ok(!wcscmp(testBuffer, expectedString), "Expected the string to be fully upper-case\n");
/* Test uppercasing with a shorter buffer size count. */
wcscpy(testBuffer, mixedString);
errno = EBADF;
ret = p_wcsupr_s(testBuffer, sizeof(mixedString)/sizeof(WCHAR) - 1);
ok(ret == EINVAL, "Expected _wcsupr_s to fail with EINVAL, got %d\n", ret);
ok(errno == EINVAL, "Expected errno to be EINVAL, got %d\n", errno);
ok(testBuffer[0] == '\0', "Expected the first buffer character to be null\n");
/* Test uppercasing with a longer buffer size count. */
wcscpy(testBuffer, mixedString);
ret = p_wcsupr_s(testBuffer, sizeof(testBuffer)/sizeof(WCHAR));
ok(ret == 0, "Expected _wcsupr_s to succeed, got %d\n", ret);
ok(!wcscmp(testBuffer, expectedString), "Expected the string to be fully upper-case\n");
}
static void test_mbcjisjms(void) static void test_mbcjisjms(void)
{ {
/* List of value-pairs to test. The test assumes the last pair to be {0, ..} */ /* List of value-pairs to test. The test assumes the last pair to be {0, ..} */
...@@ -721,6 +809,7 @@ START_TEST(string) ...@@ -721,6 +809,7 @@ START_TEST(string)
pstrcat_s = (void *)GetProcAddress( hMsvcrt,"strcat_s" ); pstrcat_s = (void *)GetProcAddress( hMsvcrt,"strcat_s" );
p_mbsnbcpy_s = (void *)GetProcAddress( hMsvcrt,"_mbsnbcpy_s" ); p_mbsnbcpy_s = (void *)GetProcAddress( hMsvcrt,"_mbsnbcpy_s" );
p_wcscpy_s = (void *)GetProcAddress( hMsvcrt,"wcscpy_s" ); p_wcscpy_s = (void *)GetProcAddress( hMsvcrt,"wcscpy_s" );
p_wcsupr_s = (void *)GetProcAddress( hMsvcrt,"_wcsupr_s" );
/* MSVCRT memcpy behaves like memmove for overlapping moves, /* MSVCRT memcpy behaves like memmove for overlapping moves,
MFC42 CString::Insert seems to rely on that behaviour */ MFC42 CString::Insert seems to rely on that behaviour */
...@@ -746,5 +835,6 @@ START_TEST(string) ...@@ -746,5 +835,6 @@ START_TEST(string)
test_mbcjisjms(); test_mbcjisjms();
test_strtok(); test_strtok();
test_wcscpy_s(); test_wcscpy_s();
test__wcsupr_s();
test_strtol(); test_strtol();
} }
...@@ -90,6 +90,35 @@ MSVCRT_wchar_t* CDECL _wcsset( MSVCRT_wchar_t* str, MSVCRT_wchar_t c ) ...@@ -90,6 +90,35 @@ MSVCRT_wchar_t* CDECL _wcsset( MSVCRT_wchar_t* str, MSVCRT_wchar_t c )
return ret; return ret;
} }
/******************************************************************
* _wcsupr_s (MSVCRT.@)
*
*/
INT CDECL MSVCRT__wcsupr_s( MSVCRT_wchar_t* str, MSVCRT_size_t n )
{
MSVCRT_wchar_t* ptr = str;
if (!str || !n)
{
if (str) *str = '\0';
*MSVCRT__errno() = MSVCRT_EINVAL;
return MSVCRT_EINVAL;
}
while (n--)
{
if (!*ptr) return 0;
*ptr = toupperW(*ptr);
ptr++;
}
/* MSDN claims that the function should return and set errno to
* ERANGE, which doesn't seem to be true based on the tests. */
*str = '\0';
*MSVCRT__errno() = MSVCRT_EINVAL;
return MSVCRT_EINVAL;
}
/********************************************************************* /*********************************************************************
* wcstod (MSVCRT.@) * wcstod (MSVCRT.@)
*/ */
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment