mbtest.c

来自「开放源码的编译器open watcom 1.6.0版的源代码」· C语言 代码 · 共 1,019 行 · 第 1/2 页

C
1,019
字号
/****************************************************************************
*
*                            Open Watcom Project
*
*    Portions Copyright (c) 1983-2002 Sybase, Inc. All Rights Reserved.
*
*  ========================================================================
*
*    This file contains Original Code and/or Modifications of Original
*    Code as defined in and that are subject to the Sybase Open Watcom
*    Public License version 1.0 (the 'License'). You may not use this file
*    except in compliance with the License. BY USING THIS FILE YOU AGREE TO
*    ALL TERMS AND CONDITIONS OF THE LICENSE. A copy of the License is
*    provided with the Original Code and Modifications, and is also
*    available at www.sybase.com/developer/opensource.
*
*    The Original Code and all software distributed under the License are
*    distributed on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER
*    EXPRESS OR IMPLIED, AND SYBASE AND ALL CONTRIBUTORS HEREBY DISCLAIM
*    ALL SUCH WARRANTIES, INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF
*    MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR
*    NON-INFRINGEMENT. Please see the License for the specific language
*    governing rights and limitations under the License.
*
*  ========================================================================
*
* Description:  WHEN YOU FIGURE OUT WHAT THIS FILE DOES, PLEASE
*               DESCRIBE IT HERE!
*
****************************************************************************/


/*
 *  MBTEST.C
 *  Non-exhaustive test of the C library multibyte character functions.
 *
 */

#include <mbstring.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <wchar.h>
#ifdef __SW_BW
    #include <wdefwin.h>
#endif


/* DUMMY_DBCS won't be needed now that Windows and DOS are fully supported */
//#if !defined(__NT__) && !defined(__OS2__) && !defined(__WINDOWS__)
//    #define DUMMY_DBCS
//#endif


#define VERIFY( exp )   if( !(exp) ) {                                      \
                            printf( "%s: ***FAILURE*** at line %d of %s.\n",\
                                    ProgramName, __LINE__,                  \
                                    _mbslwr(__FILE__) );                    \
                            NumErrors++;                                    \
                        }


void TestCompare( void );
void TestCompareM( void );
void TestCase( void );
void TestCaseM( void );
void TestSearch( void );
void TestSearchM( void );
void TestSubstring( void );
void TestSubstringM( void );
void TestCopy( void );
void TestCopyM( void );
void TestToWide( void );
void TestFromWide( void );
void TestSet( void );
void TestSetM( void );
void TestToken( void );
void TestAddendum( void );
void TestMisc( void );
void TestInvalidDbcs( void );


char ProgramName[128];                          /* executable filename */
int NumErrors = 0;                              /* number of errors */



/****
***** Program entry point.
****/

void main( int argc, char *argv[] )
{
    int                 exitcode;

    /*** Initialize ***/
    #ifdef __SW_BW
        FILE *          my_stdout;
        my_stdout = freopen( "tmp.log", "a", stdout );
        if( my_stdout == NULL ) {
            fprintf( stderr, "Unable to redirect stdout\n" );
            exit( -1 );
        }
    #endif
    strcpy( ProgramName, strlwr(argv[0]) );     /* store executable filename */
    if( _setmbcp( 932 ) != 0 ) {
        printf( "Cannot initialize code page.\n\n" );
        exit( EXIT_FAILURE );
    }

    /*** Test various functions ***/
    TestCompare();                              /* comparison stuff */
    TestCase();                                 /* upper/lower case stuff */
    TestSearch();                               /* string searching */
    TestSubstring();                            /* substring stuff */
    TestCopy();                                 /* copying stuff */
    TestToWide();                               /* conversion to wide chars */
    TestFromWide();                             /* conversion from wide chars */
    TestSet();                                  /* test _mbsset() family */
    TestToken();                                /* test _mbstok() */
    TestAddendum();                             /* Normative Addendum stuff */
    TestMisc();                                 /* assorted string stuff */

    TestCompareM();
    TestCaseM();
    TestSearchM();
    TestSubstringM();
    TestCopyM();
    TestSetM();

    #ifndef DUMMY_DBCS
        TestInvalidDbcs();
    #endif

    /*** Print a pass/fail message and quit ***/
    if( NumErrors == 0 ) {
        printf( "%s: SUCCESS.\n", ProgramName );
        #ifdef __SW_BW
            fprintf( stderr, "%s: SUCCESS.\n", ProgramName );
        #endif
        exitcode = EXIT_SUCCESS;
    } else {
        printf( "%s: FAILURE (%d errors).\n", ProgramName, NumErrors );
        #ifdef __SW_BW
            fprintf( stderr, "%s: FAILURE (%d errors).\n",
                     ProgramName, NumErrors );
        #endif
        exitcode = EXIT_FAILURE;
    }

    #ifdef __SW_BW
        fclose( my_stdout );
        _dwShutDown();
    #endif
    exit( exitcode );
}



/****
***** Test _mbscmp(), _mbsicmp(), _mbsncmp(), _mbsnicmp(), _mbsnbcmp(),
***** and _mbsnbicmp().
****/

void TestCompare( void )
{
    unsigned char       bufA[] = "FoO bAr";
    int                 status;

    status = _mbscmp( bufA, "FoO bAr" );
    VERIFY( status == 0 );

    status = _mbscmp( bufA, "FoO bA" );
    VERIFY( status != 0 );


    status = _mbsicmp( bufA, "fOo BaR" );
    VERIFY( status == 0 );

    status = _mbsicmp( bufA, "fOo Ba" );
    VERIFY( status != 0 );


    status = _mbsncmp( bufA, "FoO bA", 6 );
    VERIFY( status == 0 );

    status = _mbsncmp( bufA, "", 0 );
    VERIFY( status == 0 );

    status = _mbsncmp( bufA, "FoO#$*(%%^*()", 3 );
    VERIFY( status == 0 );

    status = _mbsncmp( bufA, "FOo bAr", 7 );
    VERIFY( status != 0 );


    status = _mbsnicmp( bufA, "foo BA", 6 );
    VERIFY( status == 0 );

    status = _mbsnicmp( bufA, "", 0 );
    VERIFY( status == 0 );

    status = _mbsnicmp( bufA, "foO#$*(%%^*()", 3 );
    VERIFY( status == 0 );


    status = _mbsnbcmp( bufA, "FoO bA", 6 );
    VERIFY( status == 0 );

    status = _mbsnbcmp( bufA, "", 0 );
    VERIFY( status == 0 );

    status = _mbsnbcmp( bufA, "FoO#$*(%%^*()", 3 );
    VERIFY( status == 0 );

    status = _mbsnbcmp( bufA, "FOo bAr", 7 );
    VERIFY( status != 0 );


    status = _mbsnbicmp( bufA, "Foo BA", 6 );
    VERIFY( status == 0 );

    status = _mbsnbicmp( bufA, "", 0 );
    VERIFY( status == 0 );

    status = _mbsnbicmp( bufA, "foO#$*(%%^*()", 3 );
    VERIFY( status == 0 );
}


void TestCompareM( void )
{
    unsigned char       bufA[] = "FoO\x81\xFC"" bAr";
    int                 status;

    status = _mbscmp( bufA, "FoO\x81\xFC"" bAr" );
    VERIFY( status == 0 );

    status = _mbscmp( bufA, "FoO\x81\xFC"" bA" );
    VERIFY( status != 0 );


    status = _mbsicmp( bufA, "fOo\x81\xFC"" BaR" );
    VERIFY( status == 0 );

    status = _mbsicmp( bufA, "fOo\x81\xFC"" Ba" );
    VERIFY( status != 0 );


    status = _mbsncmp( bufA, "FoO\x81\xFC b!", 6 );
    VERIFY( status == 0 );

    status = _mbsncmp( bufA, "", 0 );
    VERIFY( status == 0 );

    status = _mbsncmp( bufA, "FoO\x81\xFC""#$*(%%^*()", 4 );
    VERIFY( status == 0 );

    status = _mbsncmp( bufA, "FOo\x81\xFC"" bAr", 8 );
    VERIFY( status != 0 );


    status = _mbsnicmp( bufA, "foo\x81\xFC"" BA", 7 );
    VERIFY( status == 0 );

    status = _mbsnicmp( bufA, "", 0 );
    VERIFY( status == 0 );

    status = _mbsnicmp( bufA, "foO\x81\xFC""#$*(%%^*()", 4 );
    VERIFY( status == 0 );


    status = _mbsnbcmp( bufA, "FoO\x81\xFC"" !!", 5 );
    VERIFY( status == 0 );

    status = _mbsnbcmp( bufA, "", 0 );
    VERIFY( status == 0 );

    status = _mbsnbcmp( bufA, "FoO\x81\xFC""#$*(%%^*()", 5 );
    VERIFY( status == 0 );

    status = _mbsnbcmp( bufA, "FOo\x81\xFC"" bAr", 30 );
    VERIFY( status != 0 );


    status = _mbsnbicmp( bufA, "Foo\x81\xFC""!BA", 5 );
    VERIFY( status == 0 );

    status = _mbsnbicmp( bufA, "", 0 );
    VERIFY( status == 0 );

    status = _mbsnbicmp( bufA, "foO#$*(%%^*()", 3 );
    VERIFY( status == 0 );
}



/****
***** Test _mbslwr() and _mbsupr().
****/

void TestCase( void )
{
    unsigned char       buf[] = "FOO BAR!";

    _mbslwr( buf );
    VERIFY( _mbscmp(buf,"foo bar!") == 0 );

    _mbsupr( buf );
    VERIFY( _mbscmp(buf,"FOO BAR!") == 0 );
}

void TestCaseM( void )
{
    unsigned char       buf[] = "FOO\x90\x90"" BAR!";

    _mbslwr( buf );
    VERIFY( _mbscmp(buf,"foo\x90\x90"" bar!") == 0 );

    _mbsupr( buf );
    VERIFY( _mbscmp(buf,"FOO\x90\x90"" BAR!") == 0 );
}


/****
***** Test _mbschr() and _mbsrchr().
****/

void TestSearch( void )
{
    unsigned char       buf[] = "foo!";
    unsigned char *     ptr;

    ptr = _mbschr( buf, _mbsnextc("!") );
    VERIFY( ptr == buf+3 );

    ptr = _mbschr( buf, _mbsnextc("#") );
    VERIFY( ptr == NULL );

    ptr = _mbschr( buf, (unsigned int) 0 );
    VERIFY( ptr == buf+4 );

    ptr = _mbsrchr( buf, _mbsnextc("f") );
    VERIFY( ptr == buf );

    ptr = _mbsrchr( buf, _mbsnextc("#") );
    VERIFY( ptr == NULL );

    ptr = _mbsrchr( buf, (unsigned int) 0 );
    VERIFY( ptr == buf+4 );
}


void TestSearchM( void )
{
    unsigned char       buf[] = "foo\x81\xFC""!";
    unsigned char *     ptr;

    ptr = _mbschr( buf, _mbsnextc("\x81\xFC") );
    VERIFY( ptr == buf+3 );

    ptr = _mbschr( buf, _mbsnextc("#") );
    VERIFY( ptr == NULL );

    ptr = _mbschr( buf, (unsigned int) 0 );
    VERIFY( ptr == buf+6 );

    ptr = _mbsrchr( buf, _mbsnextc("\x81\xFC") );
    VERIFY( ptr == buf+3 );

    ptr = _mbsrchr( buf, _mbsnextc("#") );
    VERIFY( ptr == NULL );

    ptr = _mbsrchr( buf, (unsigned int) 0 );
    VERIFY( ptr == buf+6 );
}



/****
***** Test _mbscspn(), _mbspbrk(), _mbsspn(), _mbsspnp(), and _mbsstr().
****/

void TestSubstring( void )
{
    unsigned char       buf[] = "Foo Bar";
    int                 len;
    unsigned char *     ptr;

    len = _mbscspn( buf, "$oF" );
    VERIFY( len == 0 );

    len = _mbscspn( buf, "raB" );
    VERIFY( len == 4 );

    len = _mbscspn( buf, "" );
    VERIFY( len == 7 );

    len = _mbscspn( buf, "!" );
    VERIFY( len == 7 );

    ptr = _mbspbrk( buf, "%23498-\tF34t" );
    VERIFY( ptr == buf );

    ptr = _mbspbrk( buf, "0789063478\rnzcb" );
    VERIFY( ptr == NULL );

    ptr = _mbspbrk( buf, "" );
    VERIFY( ptr == NULL );

    len = _mbsspn( buf, " rFaBo" );
    VERIFY( len == 7 );

    len = _mbsspn( buf, "025686089oah;F=~" );
    VERIFY( len == 3 );

    len = _mbsspn( buf, "37225252 r" );
    VERIFY( len == 0 );

    ptr = _mbsspnp( buf, " rFaBo" );
    VERIFY( ptr == NULL );

    ptr = _mbsspnp( buf, "025686089oah;F=~" );
    VERIFY( ptr == buf+3 );

    ptr = _mbsspnp( buf, "37225252 r" );
    VERIFY( ptr == buf );

    ptr = _mbsstr( buf, " Bar" );
    VERIFY( ptr == buf+3 );

    ptr = _mbsstr( buf, "Foo Ba!" );
    VERIFY( ptr == NULL );

    ptr = _mbsstr( buf, "" );
    VERIFY( ptr == buf );
}


void TestSubstringM( void )
{
    unsigned char       buf[] = "Foo\x81\xFC"" Bar";
    int                 len;
    unsigned char *     ptr;

    len = _mbscspn( buf, "\x81\xFC""oF" );
    VERIFY( len == 0 );

    len = _mbscspn( buf, "r\x81\xFC""aB" );
    VERIFY( len == 3 );

    len = _mbscspn( buf, "" );
    VERIFY( len == 9 );

    len = _mbscspn( buf, "\x81\x90\x81\xFC" );
    VERIFY( len == 3 );

    ptr = _mbspbrk( buf, "%234\x81\xFC""98-\t34t" );
    VERIFY( ptr == buf+3 );

    ptr = _mbspbrk( buf, "0789063478\rnzcb" );
    VERIFY( ptr == NULL );

    ptr = _mbspbrk( buf, "" );
    VERIFY( ptr == NULL );

    len = _mbsspn( buf, " Fr\x81\xFC""aBo" );
    VERIFY( len == 9 );

    len = _mbsspn( buf, "025686089oah;F=~" );
    VERIFY( len == 3 );

    len = _mbsspn( buf, "37\x80\x90""225252 r" );
    VERIFY( len == 0 );

    ptr = _mbsstr( buf, "\x81\xFC"" Bar" );
    VERIFY( ptr == buf+3 );

    ptr = _mbsstr( buf, "Foo\x81\xFC"" Ba!" );
    VERIFY( ptr == NULL );

    ptr = _mbsstr( buf, "" );
    VERIFY( ptr == buf );
}



/****
***** Test _mbsncpy(), _mbsncat(), _mbsnbcpy(), and _mbsnbcat().
****/

void TestCopy( void )
{
    unsigned char       bufA[80] = "";
    unsigned char       bufB[] = "Foo Bar";
    unsigned char *     ptr;

    _mbsncpy( bufA, "!!!!!!!!!!!!!!!", 20 );
    VERIFY( _mbscmp(bufA,"!!!!!!!!!!!!!!!") == 0 );

    ptr = _mbsncpy( bufA, bufB, 30 );
    VERIFY( ptr == bufA );
    VERIFY( _mbscmp(bufA,bufB) == 0 );

    ptr = _mbsncpy( bufA, "Bob", 30 );
    VERIFY( ptr == bufA );
    ptr = _mbsncat( bufA, "Fred!", 0 );
    VERIFY( ptr == bufA );
    VERIFY( _mbscmp(bufA,"Bob") == 0 );

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?