blob: 2a78c78824c4ee2328051759c002bcbbae996d45 [file] [log] [blame]
#ifdef NDEBUG
#undef NDEBUG
#endif
#include <assert.h>
#include <errno.h>
#include <locale.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <wchar.h>
wchar_t AsciiText[] = L"Simple English text.";
wchar_t SBCSText[] = L"Sömè fÛnnÿ têxt";
wchar_t DBCSText[] = L"日本語テクスト";
wchar_t MixedText[] = L"日NI本HON語GO";
wchar_t BadText[] = {L'テ', L'く', WEOF, L'ト'};
int main (void) {
#ifdef _UCRT
return 77;
#endif
const wchar_t *original_text = NULL;
const wchar_t *text = NULL;
size_t text_length = 0;
char buffer[BUFSIZ];
mbstate_t state = {0};
/**
* Test "C" locale
*/
assert (setlocale (LC_ALL, "C") != NULL);
assert (MB_CUR_MAX == 1);
/* Test ASCII input */
original_text = AsciiText;
text_length = _countof (AsciiText) - 1;
/**
* Get length of converted AsciiText
*
* - return value must be `text_length`
* - value of `test` must not change
* - value of `errno` must not change
* - `state` must be in initial state
*/
text = original_text;
assert (wcsrtombs (NULL, &text, 0, &state) == text_length);
assert (text == original_text);
assert (mbsinit (&state));
assert (errno == 0);
/**
* Convert AsciiText
*
* - return value must be `text_length`
* - value of `test` must be NULL
* - value of `errno` must not change
* - `state` must be in initial state
* - converted string must be terminated with '\0'
*/
memset (buffer, EOF, BUFSIZ);
text = original_text;
assert (wcsrtombs (buffer, &text, BUFSIZ, &state) == text_length);
assert (text == NULL);
assert (mbsinit (&state));
assert (errno == 0);
assert (buffer[text_length] == '\0');
/**
* Convert 10 wide characters in AsciiText
*
* - return value must be 10
* - value of `test` must be `original_text + 10`
* - value of `errno` must not change
* - `state` must be in initial state
* - converted string must not be terminated with '\0'
*/
memset (buffer, EOF, BUFSIZ);
text = original_text;
assert (wcsrtombs (buffer, &text, 10, &state) == 10);
assert (text == original_text + 10);
assert (mbsinit (&state));
assert (errno == 0);
assert (buffer[10] == EOF);
/* Test SBCS input */
original_text = SBCSText;
text_length = _countof (SBCSText) - 1;
/**
* Get length of converted SBCSText
*
* - return value must be 15
* - value of `text` must not change
* - value of `errno` must not change
* - `state` must be in initial state
*/
text = original_text;
assert (wcsrtombs (NULL, &text, 0, &state) == text_length);
assert (text == original_text);
assert (mbsinit (&state));
assert (errno == 0);
/**
* Convert SBCSText
*
* - return value must be 15
* - value of `text` must be NULL
* - value of `errno` must not change
* - `state` must be in initial state
* - converted string must be terminated with '\0'
*/
memset (buffer, EOF, BUFSIZ);
text = original_text;
assert (wcsrtombs (buffer, &text, BUFSIZ, &state) == text_length);
assert (text == NULL);
assert (mbsinit (&state));
assert (errno == 0);
assert (buffer[text_length] == '\0');
/**
* Convert 10 wide characters in SBCSText
*
* - return value must be 10
* - value of `text` must be `original_text + 10`
* - value of `errno` must not change
* - `state` must be in initial state
* - converted string must not be terminated with '\0'
*/
memset (buffer, EOF, BUFSIZ);
text = original_text;
assert (wcsrtombs (buffer, &text, 10, &state) == 10);
assert (text == original_text + 10);
assert (mbsinit (&state));
assert (errno == 0);
assert (buffer[10] == EOF);
/* Test DBCS input */
original_text = DBCSText;
text_length = _countof (DBCSText) - 1;
/**
* Try get length of converted DBCSText
*
* - return value must be (size_t)-1
* - value of `text` must not change
* - value of `errno` must be EILSEQ
* - `state` must be in initial state
*/
memset (buffer, EOF, BUFSIZ);
text = original_text;
assert (wcsrtombs (buffer, &text, BUFSIZ, &state) == (size_t) -1);
assert (text == original_text);
assert (mbsinit (&state));
assert (errno == EILSEQ);
assert (buffer[0] == EOF);
// reset errno
_set_errno (0);
/**
* Try convert DBCSText
*
* - return value must be (size_t)-1
* - value of `text` must not change
* - value of `errno` must be EILSEQ
* - `state` must be in initial state
*/
text = original_text;
assert (wcsrtombs (NULL, &text, 0, &state) == (size_t) -1);
assert (text == original_text);
assert (mbsinit (&state));
assert (errno == EILSEQ);
// reset errno
_set_errno (0);
/**
* Test SBCS code page
*/
assert (setlocale (LC_ALL, "English_United States.1252") != NULL);
assert (MB_CUR_MAX == 1);
/* Test ASCII input */
original_text = AsciiText;
text_length = _countof (AsciiText) - 1;
/**
* Get length of converted AsciiText
*
* - return value must be `text_length`
* - value of `test` must not change
* - value of `errno` must not change
* - `state` must be in initial state
*/
text = original_text;
assert (wcsrtombs (NULL, &text, 0, &state) == text_length);
assert (text == original_text);
assert (mbsinit (&state));
assert (errno == 0);
/**
* Convert AsciiText
*
* - return value must be `text_length`
* - value of `test` must be NULL
* - value of `errno` must not change
* - `state` must be in initial state
* - converted string must be terminated with '\0'
*/
memset (buffer, EOF, BUFSIZ);
text = original_text;
assert (wcsrtombs (buffer, &text, BUFSIZ, &state) == text_length);
assert (text == NULL);
assert (mbsinit (&state));
assert (errno == 0);
assert (buffer[text_length] == '\0');
/**
* Convert 10 wide characters in AsciiText
*
* - return value must be 10
* - value of `test` must be `original_text + 10`
* - value of `errno` must not change
* - `state` must be in initial state
* - converted string must not be terminated with '\0'
*/
memset (buffer, EOF, BUFSIZ);
text = original_text;
assert (wcsrtombs (buffer, &text, 10, &state) == 10);
assert (text == original_text + 10);
assert (mbsinit (&state));
assert (errno == 0);
assert (buffer[10] == EOF);
/* Test SBCS input */
original_text = SBCSText;
text_length = _countof (SBCSText) - 1;
/**
* Get length of converted SBCSText
*
* - return value must be 15
* - value of `text` must not change
* - value of `errno` must not change
* - `state` must be in initial state
*/
text = original_text;
assert (wcsrtombs (NULL, &text, 0, &state) == text_length);
assert (text == original_text);
assert (mbsinit (&state));
assert (errno == 0);
/**
* Convert SBCSText
*
* - return value must be 15
* - value of `text` must be NULL
* - value of `errno` must not change
* - `state` must be in initial state
* - converted string must be terminated with '\0'
*/
memset (buffer, EOF, BUFSIZ);
text = original_text;
assert (wcsrtombs (buffer, &text, BUFSIZ, &state) == text_length);
assert (text == NULL);
assert (mbsinit (&state));
assert (errno == 0);
assert (buffer[text_length] == '\0');
/**
* Convert 10 wide characters in SBCSText
*
* - return value must be 10
* - value of `text` must be `original_text + 10`
* - value of `errno` must not change
* - `state` must be in initial state
* - converted string must not be terminated with '\0'
*/
memset (buffer, EOF, BUFSIZ);
text = original_text;
assert (wcsrtombs (buffer, &text, 10, &state) == 10);
assert (text == original_text + 10);
assert (mbsinit (&state));
assert (errno == 0);
assert (buffer[10] == EOF);
/* Test DBCS input */
original_text = DBCSText;
text_length = _countof (DBCSText) - 1;
/**
* Try get length of converted DBCSText
*
* - return value must be (size_t)-1
* - value of `text` must not change
* - value of `errno` must be EILSEQ
* - `state` must be in initial state
*/
text = original_text;
assert (wcsrtombs (NULL, &text, 0, &state) == (size_t) -1);
assert (text == original_text);
assert (mbsinit (&state));
assert (errno == EILSEQ);
// reset errno
_set_errno (0);
/**
* Try convert DBCSText
*
* - return value must be (size_t)-1
* - value of `text` must not change
* - value of `errno` must be EILSEQ
* - `state` must be in initial state
* - nothing must be written to `buffer`
*/
memset (buffer, EOF, BUFSIZ);
text = original_text;
assert (wcsrtombs (buffer, &text, BUFSIZ, &state) == (size_t) -1);
assert (text == original_text);
assert (mbsinit (&state));
assert (errno == EILSEQ);
/* This assertion fails with CRT's version */
assert (buffer[0] == EOF);
// reset errno
_set_errno (0);
/**
* Disable tests for DBCS code pages with msvcrt10.dll since it does not
* support multibyte characters.
*
* Calling setlocale with locale string which requests DBCS code page
* result in runtime error.
*/
#if __MSVCRT_VERSION__ != 0x0100
/**
* Test DBCS code page
*/
assert (setlocale (LC_ALL, "Japanese_Japan.932") != NULL);
assert (MB_CUR_MAX == 2);
/* Test ASCII input */
original_text = AsciiText;
text_length = _countof (AsciiText) - 1;
/**
* Get length of converted AsciiText
*
* - return value must be `text_length`
* - value of `test` must not change
* - value of `errno` must not change
* - `state` must be in initial state
*/
text = original_text;
assert (wcsrtombs (NULL, &text, 0, &state) == text_length);
assert (text == original_text);
assert (mbsinit (&state));
assert (errno == 0);
/**
* Convert AsciiText
*
* - return value must be `text_length`
* - value of `test` must be NULL
* - value of `errno` must not change
* - `state` must be in initial state
* - converted string must be terminated with '\0'
*/
memset (buffer, EOF, BUFSIZ);
text = original_text;
assert (wcsrtombs (buffer, &text, BUFSIZ, &state) == text_length);
assert (text == NULL);
assert (mbsinit (&state));
assert (errno == 0);
assert (buffer[text_length] == '\0');
/**
* Convert 10 wide characters in AsciiText
*
* - return value must be 10
* - value of `test` must be `original_text + 10`
* - value of `errno` must not change
* - `state` must be in initial state
* - converted string must not be terminated with '\0'
*/
memset (buffer, EOF, BUFSIZ);
text = original_text;
assert (wcsrtombs (buffer, &text, 10, &state) == 10);
assert (text == original_text + 10);
assert (mbsinit (&state));
assert (errno == 0);
assert (buffer[10] == EOF);
/* Test DBCS input */
original_text = DBCSText;
text_length = _countof (DBCSText) - 1;
/**
* Get length of converted DBCSText
*
* - return value must be 14
* - value of `text` must not change
* - value of `errno` must not change
* - `state` must be in initial state
*/
text = original_text;
assert (wcsrtombs (NULL, &text, 0, &state) == 14);
assert (text == original_text);
assert (mbsinit (&state));
assert (errno == 0);
/**
* Convert DBCSText
*
* - return value must be 14
* - value of `text` must be NULL
* - value of `errno` must not change
* - `state` must be in initial state
* - converted string must be terminated with '\0'
*/
memset (buffer, EOF, BUFSIZ);
text = original_text;
assert (wcsrtombs (buffer, &text, BUFSIZ, &state) == 14);
assert (text == NULL);
assert (mbsinit (&state));
assert (errno == 0);
assert (buffer[14] == '\0');
/**
* Convert 5 wide characters in DBCSText
*
* - return value must be 10
* - value of `text` must be `original_text + 5`
* - value of `errno` must not change
* - `state` must be in initial state
* - converted string must not be terminated with '\0'
*/
memset (buffer, EOF, BUFSIZ);
text = original_text;
assert (wcsrtombs (buffer, &text, 11, &state) == 10);
assert (text == original_text + 5);
assert (mbsinit (&state));
assert (errno == 0);
assert (buffer[10] == EOF);
/* Test mixed input */
original_text = MixedText;
text_length = _countof (MixedText) - 1;
/**
* Get length of converted MixedText
*
* - return value must be 13
* - value of `test` must not change
* - value of `errno` must not change
* - `state` must be in initial state
*/
text = original_text;
assert (wcsrtombs (NULL, &text, 0, &state) == 13);
assert (text == original_text);
assert (mbsinit (&state));
assert (errno == 0);
/**
* Convert MixedText
*
* - return value must be 13
* - value of `test` must be NULL
* - value of `errno` must not change
* - `state` must be in initial state
* - converted string must be teminated with '\0'
*/
memset (buffer, EOF, BUFSIZ);
text = original_text;
assert (wcsrtombs (buffer, &text, BUFSIZ, &state) == 13);
assert (text == NULL);
assert (mbsinit (&state));
assert (errno == 0);
assert (buffer[13] == '\0');
/**
* Convert 7 wide characters in MixedText
*
* - return value must be 9
* - value of `test` must be `original_text + 7`
* - value of `errno` must not change
* - `state` must be in initial state
* - converted string must not be teminated with '\0'
*/
memset (buffer, EOF, BUFSIZ);
text = original_text;
assert (wcsrtombs (buffer, &text, 10, &state) == 9);
assert (text == original_text + 7);
assert (mbsinit (&state));
assert (errno == 0);
assert (buffer[9] == EOF);
/* Test bad input */
original_text = BadText;
text_length = _countof (BadText) - 1;
/**
* Try get length of converted BadText
*
* - return value must be (size_t)-1
* - value of `text` must not change
* - value of `errno` must be EILSEQ
* - `state` must be in initial state
*/
text = original_text;
assert (wcsrtombs (NULL, &text, 0, &state) == (size_t) -1);
assert (text == original_text);
assert (mbsinit (&state));
assert (errno == EILSEQ);
/**
* Try convert BadText
*
* - return value must be (size_t)-1
* - value of `text` must be `original_text + 2`
* - value of `errno` must be EILSEQ
* - `state` must be in initial state
*/
memset (buffer, EOF, BUFSIZ);
text = original_text;
assert (wcsrtombs (buffer, &text, BUFSIZ, &state) == (size_t) -1);
assert (text == original_text + 2);
assert (mbsinit (&state));
assert (errno == EILSEQ);
/* This assertion fails with CRT's version */
assert (buffer[3] != EOF && buffer[4] == EOF);
// reset errno
_set_errno (0);
#endif
return 0;
}