extern "C" size_t __cdecl wcrtomb( char *dst, wchar_t wchar, mbstate_t *mbst ) { size_t retValue = -1; wcrtomb_s(&retValue, dst, (dst == NULL ? 0 : MB_LEN_MAX), wchar, mbst); return retValue; }
void TestAddendum( void ) { wchar_t wc; wchar_t wcs[10]; wchar_t * wcsPtr; int status; mbstate_t state; unsigned char mbc[MB_LEN_MAX]; unsigned char mbcs[10*MB_LEN_MAX+1]; unsigned char * mbcsPtr; errno_t rc; size_t retval; int violations = NumViolations; status = wctob( L'!' ); VERIFY( status == '!' ); status = mbtowc( &wc, "\x90\x90", 2 ); #ifndef DUMMY_DBCS VERIFY( status == 2 ); status = wctob( wc ); VERIFY( status == EOF ); #else VERIFY( status == 1 ); status = wctob( wc ); VERIFY( status == 0x90 ); #endif status = sisinit( NULL ); VERIFY( status != 0 ); state = 0; status = sisinit( &state ); VERIFY( status == 0 ); state = 123; status = sisinit( &state ); VERIFY( status == 0 ); status = mbrlen( "\0""!", 2, &state ); VERIFY( status == 0 ); status = mbrlen( "!", 2, &state ); VERIFY( status == 1 ); wc = L'\0'; rc = wcrtomb_s( &retval, mbc, MB_LEN_MAX, wc, &state ); VERIFY( rc == 0 ); VERIFY( *mbc == '\0' ); VERIFY( retval == 1 ); VERIFY( violations == NumViolations ); rc = wcrtomb_s( &retval, mbc, MB_LEN_MAX, L'X', &state ); VERIFY( rc == 0 ); VERIFY( *mbc == 'X' ); VERIFY( retval == 1 ); VERIFY( violations == NumViolations ); rc = wcrtomb_s( &retval, NULL, 0, L'X', &state ); VERIFY( rc == 0 ); VERIFY( retval == 1 ); VERIFY( violations == NumViolations ); _mbscpy( mbcs, "Foo!\x90\x90" ); mbcsPtr = mbcs; wcs[5] = wcs[6] = L'-'; rc = mbsrtowcs_s( &retval, wcs, 10, (const char**)(&mbcsPtr), 6, &state ); VERIFY( rc == 0 ); VERIFY( retval == 5 ); VERIFY( wcs[0] == L'F' ); VERIFY( wcs[1] == L'o' ); VERIFY( wcs[2] == L'o' ); VERIFY( wcs[3] == L'!' ); mbcsPtr = mbcs; rc = mbsrtowcs_s( &retval, NULL, 0, (const char**)(&mbcsPtr), 1, &state ); VERIFY( rc == 0 ); VERIFY( retval == 5 ); wcsPtr = wcs; _mbsset( mbcs, _mbsnextc("#") ); rc = wcsrtombs_s( &retval, mbcs, 10, (const wchar_t**)(&wcsPtr), 6, &state ); VERIFY( rc == 0 ); VERIFY( retval == 6 ); mbcs[retval] = '\0'; VERIFY( _mbscmp( mbcs, "Foo!\x90\x90" ) == 0 ); wcsPtr = wcs; rc = wcsrtombs_s( &retval, NULL, 0, (const wchar_t**)(&wcsPtr), 20, &state ); VERIFY( rc == 0 ); VERIFY( retval == 6 ); /***********************************************************************/ /* test runtime-constraints */ /***********************************************************************/ *mbc = 'X'; rc = wcrtomb_s( NULL, mbc, MB_LEN_MAX, wc, &state ); VERIFY( rc != 0 ); VERIFY( *mbc == '\0' ); VERIFY( ++violations == NumViolations ); *mbc = 'X'; rc = wcrtomb_s( &retval, mbc, MB_LEN_MAX, L'X', NULL ); VERIFY( rc != 0 ); VERIFY( *mbc == '\0' ); VERIFY( retval == -1 ); VERIFY( ++violations == NumViolations ); rc = wcrtomb_s( &retval, NULL, MB_LEN_MAX, L'X', &state ); VERIFY( rc != 0 ); VERIFY( retval == -1 ); VERIFY( ++violations == NumViolations ); *mbc = 'X'; rc = wcrtomb_s( &retval, mbc, 0, L'X', &state ); VERIFY( rc != 0 ); VERIFY( *mbc == 'X' ); VERIFY( retval == -1 ); VERIFY( ++violations == NumViolations ); #if RSIZE_MAX != SIZE_MAX rc = wcrtomb_s( &retval, mbc, ~0, L'X', &state ); VERIFY( rc != 0 ); VERIFY( retval == -1 ); VERIFY( *mbc == 'X' ); VERIFY( ++violations == NumViolations ); #endif mbcsPtr = mbcs; rc = mbsrtowcs_s( NULL, NULL, 0, (const char**)(&mbcsPtr), 1, &state ); VERIFY( rc != 0 ); VERIFY( ++violations == NumViolations ); rc = mbsrtowcs_s( &retval, NULL, 0, NULL, 1, &state ); VERIFY( rc != 0 ); VERIFY( retval == -1 ); VERIFY( ++violations == NumViolations ); mbcsPtr = NULL; rc = mbsrtowcs_s( &retval, NULL, 0, (const char**)(&mbcsPtr), 1, &state ); VERIFY( rc != 0 ); VERIFY( retval == -1 ); VERIFY( ++violations == NumViolations ); rc = mbsrtowcs_s( &retval, NULL, 0, (const char**)(&wcsPtr), 1, NULL ); VERIFY( rc != 0 ); VERIFY( retval == -1 ); VERIFY( ++violations == NumViolations ); rc = mbsrtowcs_s( &retval, NULL, 111, (const char**)(&wcsPtr), 1, &state ); VERIFY( rc != 0 ); VERIFY( retval == -1 ); VERIFY( ++violations == NumViolations ); wcsPtr = wcs; rc = wcsrtombs_s( &retval, mbcs, 5, (const wchar_t**)(&wcsPtr), 10, &state ); VERIFY( rc != 0 ); VERIFY( retval == -1 ); VERIFY( ++violations == NumViolations ); }