blob: 5f7d6d8c1a28ffa985bce644296d6b40828cb8c9 [file]
#include <assert.h>
#include <errno.h>
#include <stdio.h>
#include <stdlib.h>
#include <wchar.h>
/* mingw-w64 headers */
#include "libtest.h"
static int handler_called = 0;
static int handler_errno = -1;
static void handler(const wchar_t *expression __attribute__((unused)), const wchar_t *function __attribute__((unused)), const wchar_t *file __attribute__((unused)), unsigned int line __attribute__((unused)), uintptr_t reserved __attribute__((unused))) {
handler_called = 1;
handler_errno = errno;
}
int main() {
const wchar_t input[] = L"ABC CDE FGH";
wchar_t wcs[sizeof(input)/sizeof(input[0])];
wchar_t *state;
wchar_t *token;
mingw_test_init ();
_set_invalid_parameter_handler(handler);
/* wcstok normal usage without errors */
handler_called = 0;
handler_errno = -1;
errno = -1;
memcpy(wcs, input, sizeof(input));
token = wcstok(wcs, L" ", &state);
assert(wcscmp(token, L"ABC") == 0);
token = wcstok(NULL, L" ", &state);
assert(wcscmp(token, L"CDE") == 0);
token = wcstok(NULL, L" ", &state);
assert(wcscmp(token, L"FGH") == 0);
token = wcstok(NULL, L" ", &state);
assert(!token);
assert(errno == -1);
assert(handler_called == 0);
assert(handler_errno == -1);
/* msvcrt wcstok for NULL string and state returns NULL and does not set errno and does not call handler */
/* UCRT wcstok for NULL string expects that the state is non-NULL and dereference it, so do not call this test for UCRT */
#ifndef _UCRT
handler_called = 0;
handler_errno = -1;
errno = -1;
state = NULL;
token = wcstok(NULL, L"", &state);
assert(!token);
assert(errno == -1);
assert(handler_called == 0);
assert(handler_errno == -1);
#endif
/* wcstok_s normal usage without errors */
handler_called = 0;
handler_errno = -1;
errno = -1;
memcpy(wcs, input, sizeof(input));
token = wcstok_s(wcs, L" ", &state);
assert(wcscmp(token, L"ABC") == 0);
token = wcstok_s(NULL, L" ", &state);
assert(wcscmp(token, L"CDE") == 0);
token = wcstok_s(NULL, L" ", &state);
assert(wcscmp(token, L"FGH") == 0);
token = wcstok_s(NULL, L" ", &state);
assert(!token);
assert(errno == -1);
assert(handler_called == 0);
assert(handler_errno == -1);
/* wcstok_s for NULL string and state returns NULL and sets errno and calls handler */
handler_called = 0;
handler_errno = -1;
errno = -1;
state = NULL;
token = wcstok_s(NULL, L" ", &state);
assert(!token);
assert(errno == EINVAL);
assert(handler_called == 1);
assert(handler_errno == EINVAL);
/* wcstok_s validates parameters and on error sets errno and calls handler */
handler_called = 0;
handler_errno = -1;
memcpy(wcs, input, sizeof(input));
errno = -1;
token = wcstok_s(wcs, L" ", NULL);
assert(!token);
assert(errno == EINVAL);
assert(handler_called == 1);
assert(handler_errno == EINVAL);
handler_called = 0;
handler_errno = -1;
memcpy(wcs, input, sizeof(input));
errno = -1;
state = NULL;
token = wcstok_s(wcs, NULL, &state);
assert(!token);
assert(errno == EINVAL);
assert(handler_called == 1);
assert(handler_errno == EINVAL);
return 0;
}