mbtest.c
来自「开放源码的编译器open watcom 1.6.0版的源代码」· C语言 代码 · 共 1,019 行 · 第 1/2 页
C
1,019 行
ptr = _mbsncat( bufA, "Fred!", 4 );
VERIFY( ptr == bufA );
VERIFY( _mbscmp(bufA,"BobFred") == 0 );
ptr = _mbsnbcpy( bufA, "Bob", 30 );
VERIFY( ptr == bufA );
ptr = _mbsnbcat( bufA, "Fred!", 0 );
VERIFY( ptr == bufA );
VERIFY( _mbscmp(bufA,"Bob") == 0 );
ptr = _mbsnbcat( bufA, "Fred!", 4 );
VERIFY( ptr == bufA );
VERIFY( _mbscmp(bufA,"BobFred") == 0 );
strcat( bufA, "\x90" ); /* strcat, not _mbscat -- just one byte */
ptr = _mbsnbcat( bufA, "Grok", 5 );
VERIFY( ptr == bufA );
#ifndef DUMMY_DBCS
VERIFY( _mbscmp(bufA,"BobFredGrok") == 0 );
#else
VERIFY( _mbscmp(bufA,"BobFred""\x90""Grok") == 0 );
#endif
}
void TestCopyM( void )
{
unsigned char bufA[80] = "";
unsigned char bufB[] = "Foo\x81\xFC"" Bar";
unsigned char * ptr;
_mbsncpy( bufA, "!!!!!!!!\x90\x90""!!!!!!!", 20 );
VERIFY( _mbscmp(bufA,"!!!!!!!!\x90\x90""!!!!!!!") == 0 );
ptr = _mbsncpy( bufA, bufB, 10 );
VERIFY( ptr == bufA );
VERIFY( _mbscmp(bufA,bufB) == 0 );
ptr = _mbsncpy( bufA, "Bob", 30 );
VERIFY( ptr == bufA );
ptr = _mbsncat( bufA, "Fred!\x81\xFC", 0 );
VERIFY( ptr == bufA );
VERIFY( _mbscmp(bufA,"Bob") == 0 );
ptr = _mbsncat( bufA, "Fred\x81\xFC!", 5 );
VERIFY( ptr == bufA );
#ifndef DUMMY_DBCS
VERIFY( _mbscmp(bufA,"BobFred\x81\xFC") == 0 );
#else
VERIFY( _mbscmp(bufA,"BobFred\x81") == 0 );
#endif
ptr = _mbsnbcpy( bufA, "Bob\x81\xFC", 6 );
VERIFY( ptr == bufA );
ptr = _mbsnbcat( bufA, "Fred!", 0 );
VERIFY( ptr == bufA );
VERIFY( _mbscmp(bufA,"Bob\x81\xFC") == 0 );
ptr = _mbsnbcat( bufA, "Fred\x81\xFC!", 6 );
VERIFY( ptr == bufA );
VERIFY( _mbscmp(bufA,"Bob\x81\xFC""Fred\x81\xFC") == 0 );
}
/****
***** Test mbtowc() and mbstowcs().
****/
void TestToWide( void )
{
wchar_t wc = L'\0';
wchar_t wcs[20];
int rc;
rc = mbtowc( &wc, NULL, 1 );
VERIFY( rc == 0 );
rc = mbtowc( NULL, "!", 1 );
VERIFY( rc == 1 );
VERIFY( wc == L'\0' );
rc = mbtowc( &wc, "", 1 );
VERIFY( rc == 0 );
rc = mbtowc( &wc, "", 0 );
VERIFY( rc == -1 );
rc = mbtowc( &wc, "foo", 0 );
VERIFY( rc == -1 );
rc = mbtowc( &wc, "foo", 1 );
VERIFY( rc == 1 );
VERIFY( wc == 'f' );
rc = mbtowc( &wc, "\x81\xFC""foo", 2 );
#ifndef DUMMY_DBCS
VERIFY( rc == 2 );
#else
VERIFY( rc == 1 );
#endif
VERIFY( wc != 0 );
rc = mbstowcs( wcs, "", 20 );
VERIFY( rc == 0 );
VERIFY( wcs[0] == L'\0' );
rc = mbstowcs( wcs, "foo", 0 );
VERIFY( rc == 0 );
rc = mbstowcs( wcs, "\x81\xFC""foo", 0 );
VERIFY( rc == 0 );
rc = mbstowcs( wcs, "foo", 20 );
VERIFY( rc == 3 );
rc = mbstowcs( wcs, "\x81\xFC""foo", 20 );
#ifndef DUMMY_DBCS
VERIFY( rc == 4 );
VERIFY( wcs[1] == 'f' );
VERIFY( wcs[2] == 'o' );
VERIFY( wcs[3] == 'o' );
VERIFY( wcs[4] == '\0' );
#else
VERIFY( rc == 5 );
VERIFY( wcs[2] == 'f' );
VERIFY( wcs[3] == 'o' );
VERIFY( wcs[4] == 'o' );
VERIFY( wcs[5] == '\0' );
#endif
VERIFY( mbstowcs( NULL, "\x81\xFC""foo", 20 ) == rc );
}
/****
***** Test wctomb() and wcstombs().
****/
void TestFromWide( void )
{
unsigned char mbs[20];
wchar_t wc = L'\0';
wchar_t wcs[] = { 'H', 'e', 'l', 'l', 'o', '\0' };
int len;
len = wctomb( NULL, 0 );
VERIFY( len == 0 );
len = wctomb( mbs, L'\0' );
VERIFY( len == 1 );
VERIFY( mbs[0] == '\0' );
len = wctomb( mbs, 'H' );
VERIFY( len == 1 );
VERIFY( mbs[0] == 'H' );
len = wcstombs( mbs, wcs, 20 );
VERIFY( len == 5 );
VERIFY( !_mbscmp(mbs,"Hello") );
VERIFY( wcstombs( NULL, wcs, 20 ) == len );
len = wcstombs( mbs, &wc, 20 );
VERIFY( len == 0 );
VERIFY( mbs[0] == '\0' );
}
/****
***** Test _mbsset(), _mbsnset(), and _mbsnbset().
****/
void TestSet( void )
{
unsigned char buf[] = "abcdefghij";
unsigned char * ptr;
unsigned int mbc = '!';
ptr = _mbsset( buf, mbc );
VERIFY( ptr == buf );
VERIFY( buf[0] == '!' );
VERIFY( buf[9] == '!' );
VERIFY( buf[10] == '\0' );
_mbscpy( buf, "abcdefghij" );
ptr = _mbsnset( buf, mbc, 5 );
VERIFY( ptr == buf );
VERIFY( buf[0] == '!' );
VERIFY( buf[4] == '!' );
VERIFY( buf[5] == 'f' );
_mbscpy( buf, "abcdefghij" );
ptr = _mbsnbset( buf, mbc, 5 );
VERIFY( ptr == buf );
VERIFY( buf[0] == '!' );
VERIFY( buf[4] == '!' );
VERIFY( buf[5] == 'f' );
}
void TestSetM( void )
{
unsigned char buf[] = "abcdefghij";
unsigned char * ptr;
unsigned int mbc;
mbc = _mbsnextc( "\x81\xFC" );
ptr = _mbsset( buf, mbc );
VERIFY( ptr == buf );
VERIFY( buf[0] == '\x81' );
#ifndef DUMMY_DBCS
VERIFY( buf[1] == '\xFC' );
#else
VERIFY( buf[1] == '\x81' );
#endif
_mbscpy( buf, "abcdefghij" );
ptr = _mbsnset( buf, mbc, 4 );
VERIFY( ptr == buf );
VERIFY( buf[0] == '\x81' );
#ifndef DUMMY_DBCS
VERIFY( buf[1] == '\xFC' );
VERIFY( buf[8] == 'i' );
#else
VERIFY( buf[1] == '\x81' );
VERIFY( buf[4] == 'e' );
#endif
_mbscpy( buf, "abcdefghij" );
ptr = _mbsnbset( buf, mbc, 5 );
VERIFY( ptr == buf );
VERIFY( buf[0] == '\x81' );
#ifndef DUMMY_DBCS
VERIFY( buf[4] == ' ' );
#else
VERIFY( buf[4] == '\x81' );
#endif
VERIFY( buf[5] == 'f' );
}
/****
***** Test _mbstok().
****/
void TestToken( void )
{
unsigned char buf[] = "F\x81\xFC""ind\x90\x90""all;the.tokens,";
unsigned char * ptr;
ptr = _mbstok( buf, " ;.,!\x90\x90" ); /* find a token */
VERIFY( !_mbscmp(ptr,"F\x81\xFC""ind") );
ptr = _mbstok( NULL, " ;.,!" ); /* find a token */
#ifndef DUMMY_DBCS
VERIFY( !_mbscmp(ptr,"all") );
#else
VERIFY( !_mbscmp(ptr,"\x90""all") );
#endif
ptr = _mbstok( NULL, " ;.,!" ); /* find a token */
VERIFY( !_mbscmp(ptr,"the") );
ptr = _mbstok( NULL, " ;.,!" ); /* find a token */
VERIFY( !_mbscmp(ptr,"tokens") );
ptr = _mbstok( NULL, " '.,!" ); /* try to find another */
VERIFY( ptr == NULL );
}
/****
***** Test mbtob(), sisinit(), mbrlen(), mbrtowc(), wcrtomb(), mbsrtowcs(),
***** wcsrtombs(), ie. all Normative Addendum functions.
****/
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;
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 );
status = mbrlen( "\x90\x90""!", 1, &state );
#ifndef DUMMY_DBCS
VERIFY( status == -2 );
#else
VERIFY( status == 1 );
#endif
status = mbrtowc( NULL, NULL, 0, &state );
VERIFY( status == 0 );
status = mbrtowc( &wc, "!", 20, &state );
VERIFY( status == 1 );
VERIFY( wc == L'!' );
status = wcrtomb( NULL, wc, &state );
VERIFY( status == 0 );
status = wcrtomb( mbc, wc, &state );
VERIFY( status == 1 );
VERIFY( *mbc == '!' );
_mbscpy( mbcs, "Foo!\x90\x90" );
mbcsPtr = mbcs;
wcs[5] = wcs[6] = L'-';
#ifndef DUMMY_DBCS
status = mbsrtowcs( wcs, (const char**)(&mbcsPtr), 5, &state );
VERIFY( status == 5 );
#else
status = mbsrtowcs( wcs, (const char**)(&mbcsPtr), 6, &state );
VERIFY( status == 6 );
#endif
VERIFY( wcs[0] == L'F' );
VERIFY( wcs[1] == L'o' );
VERIFY( wcs[2] == L'o' );
VERIFY( wcs[3] == L'!' );
#ifndef DUMMY_DBCS
VERIFY( wcs[4] & 0xFF00 );
VERIFY( wcs[5] == L'-' );
wcs[5] = L'\0';
#else
VERIFY( wcs[4] == 0x90 );
VERIFY( wcs[5] == 0x90 );
VERIFY( wcs[6] == L'-' );
wcs[6] = L'\0';
#endif
mbcsPtr = mbcs;
status = mbsrtowcs( NULL, (const char**)(&mbcsPtr), 1, &state );
#ifdef DUMMY_DBCS
VERIFY( status == 6 ); /* ignore len when dst==NULL */
#else
VERIFY( status == 5 ); /* ignore len when dst==NULL */
#endif
wcsPtr = wcs;
_mbsset( mbcs, _mbsnextc("#") );
status = wcsrtombs( mbcs, (const wchar_t**)(&wcsPtr), 6, &state );
VERIFY( status == 6 );
mbcs[status] = '\0';
VERIFY( _mbscmp( mbcs, "Foo!\x90\x90" ) == 0 );
wcsPtr = wcs;
status = wcsrtombs( NULL, (const wchar_t**)(&wcsPtr), 20, &state );
VERIFY( status == 6 );
}
/****
***** Test _mbsrev(), _mbslen(), _mbsninc(), _mbsnextc(), _mbsnbcnt(),
***** _mbsdec(), and _mbsnccnt().
****/
void TestMisc( void )
{
unsigned char buf[] = "abcde\x81\xFC""fghij";
unsigned char foo[] = "foo""\x82\x81\x81\xFC\x90\x90\x81\x81\x81\x81""bar";
unsigned char * ptr;
int len;
unsigned int ch;
char mbc[MB_LEN_MAX+1];
VERIFY( _mbsdec( foo, foo ) == NULL );
VERIFY( _mbsdec( foo, foo-1 ) == NULL );
VERIFY( _mbsdec( foo, foo+2 ) == foo+1 );
VERIFY( _mbsdec( foo, foo+3 ) == foo+2 );
VERIFY( _mbsdec( foo, foo+5 ) == foo+3 );
VERIFY( _mbsdec( foo, foo+7 ) == foo+5 );
VERIFY( _mbsdec( foo, foo+9 ) == foo+7 );
VERIFY( _mbsdec( foo, foo+11 ) == foo+9 );
VERIFY( _mbsdec( foo, foo+13 ) == foo+11 );
len = _mbslen( buf );
#ifndef DUMMY_DBCS
VERIFY( len == 11 );
#else
VERIFY( len == 12 );
#endif
ptr = _mbsninc( buf, 4 );
VERIFY( ptr == buf+4 );
ptr = _mbsninc( buf, 6 );
#ifndef DUMMY_DBCS
VERIFY( ptr == buf+7 );
#else
VERIFY( ptr == buf+6 );
#endif
ch = _mbsnextc( ptr );
_mbvtop( ch, mbc );
mbc[_mbclen(mbc)] = '\0';
VERIFY( _mbccmp(mbc,ptr) == 0 );
len = _mbsnbcnt( buf, 30 );
VERIFY( len == 12 );
len = _mbsnbcnt( "a\x81\xFC""bc\x90\0", 30 );
#ifndef DUMMY_DBCS
VERIFY( len == 5 );
#else
VERIFY( len == 6 );
#endif
len = _mbsnbcnt( buf, 5 );
VERIFY( len == 5 );
len = _mbsnccnt( buf, 5 );
VERIFY( len == 5 );
len = _mbsnccnt( buf, 6 );
#ifndef DUMMY_DBCS
VERIFY( len == 5 );
#else
VERIFY( len == 6 );
#endif
len = _mbsnccnt( buf, 7 );
#ifndef DUMMY_DBCS
VERIFY( len == 6 );
#else
VERIFY( len == 7 );
#endif
ptr = _mbsninc( NULL, 10 );
VERIFY( ptr == NULL );
ptr = _mbsninc( buf, 6 );
#ifndef DUMMY_DBCS
VERIFY( ptr == buf+7 );
#else
VERIFY( ptr == buf+6 );
#endif
ptr = _mbsrev( buf );
VERIFY( ptr == buf );
#ifndef DUMMY_DBCS
VERIFY( !_mbscmp(buf,"jihgf\x81\xFC""edcba") );
#else
VERIFY( !_mbscmp(buf,"jihgf\xFC\x81""edcba") );
#endif
}
/****
***** Test a few lead_byte:null_byte situations.
****/
void TestInvalidDbcs( void )
{
unsigned char bufA[80] = "foo\x81";
unsigned char bufB[] = "abcde\x81\xFC""fghij";
unsigned char * ptr = "\x81";
VERIFY( _mbslen( bufA ) == 3 );
VERIFY( _mbclen( "\x81" ) == 2 ); /* for MS compatability */
VERIFY( _mbsinc( ptr ) == ptr+1 );
_mbsnbcat( bufA, bufB, 6 );
VERIFY( _mbscmp( bufA, "fooabcde" ) == 0 );
strset( bufA, '\0' );
_mbsnbcpy( bufA, bufB, 6 );
VERIFY( strcmp( bufA, "abcde" ) == 0 );
}
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?