strtest.c

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

C
759
字号

/****
***** Test strchr(), strrchr(), strlen()
****/

void TestSearch( void )
{
    char            buf[] = "The quick brown fox jumped over the lazy dogs.";
    char            *ptr;

    ptr = strchr( buf, '!' );                   /* try to find a '!' */
    VERIFY( ptr == NULL );

    ptr = strchr( buf, 0x00 );                  /* try to find the NULL */
    VERIFY( ptr == buf+strlen(buf) );

    ptr = strchr( buf, 'k' );                   /* try to find a 'k' */
    VERIFY( ptr == buf+8 );

    ptr = strrchr( buf, '!' );                  /* try to find a '!' */
    VERIFY( ptr == NULL );

    ptr = strrchr( buf, 0x00 );                 /* try to find the NULL */
    VERIFY( ptr == buf+strlen(buf) );

    ptr = strrchr( buf, 'k' );                  /* try to find a 'k' */
    VERIFY( ptr == buf+8 );
}


#ifdef __X86__
void TestSearchF( void )
{
    char            buf[] = "The quick brown fox jumped over the lazy dogs.";
    char __far      *ptr;

    ptr = _fstrchr( buf, '!' );                 /* try to find a '!' */
    VERIFY( ptr == NULL );

    ptr = _fstrchr( buf, 0x00 );                /* try to find the NULL */
    VERIFY( ptr == buf+strlen(buf) );

    ptr = _fstrchr( buf, 'k' );                 /* try to find a 'k' */
    VERIFY( ptr == buf+8 );

    ptr = _fstrrchr( buf, '!' );                /* try to find a '!' */
    VERIFY( ptr == NULL );

    ptr = _fstrrchr( buf, 0x00 );               /* try to find the NULL */
    VERIFY( ptr == buf+strlen(buf) );

    ptr = _fstrrchr( buf, 'k' );                /* try to find a 'k' */
    VERIFY( ptr == buf+8 );
}
#endif



/****
***** Test strcspn(), strpbrk(), strspn(), and strstr().
****/

void TestSubstring( void )
{
    char            buf[] = "The quick brown fox jumped over the lazy dogs.";
    int             status;
    char            *ptr;

    status = strcspn( "abcdefghij", "bca" );    /* should be zero chars */
    VERIFY( status == 0 );

    status = strcspn( "123456", "cab" );        /* should be whole string */
    VERIFY( status == 6 );

    status = strcspn( "!x,y:zfoo", "t.7of" );   /* should be 6 chars */
    VERIFY( status == 6 );

    ptr = strpbrk( "aBcDeFgHiJ", "1234567" );   /* should be NULL */
    VERIFY( ptr == NULL );

    ptr = strpbrk( "Foo", "" );                 /* should be NULL */
    VERIFY( ptr == NULL );

    ptr = strpbrk( buf, "t!q-");                /* find the 'q' */
    VERIFY( ptr == buf+4 );

    status = strspn( buf, "!1@2#3$4%5^6&7" );   /* should be zero */
    VERIFY( status == 0 );

    status = strspn( buf, "kciuq ehT" );        /* should be 10 */
    VERIFY( status == 10);

    ptr = strstr( buf, "foo" );                 /* should be NULL */
    VERIFY( ptr == NULL );

    ptr = strstr( buf, "ck br" );               /* find "ck br" */
    VERIFY( ptr == buf+7 );
}


#ifdef __X86__
void TestSubstringF( void )
{
    char            buf[] = "The quick brown fox jumped over the lazy dogs.";
    int             status;
    char __far      *ptr;

    status = _fstrcspn( "abcdefghij", "bca" );  /* should be zero chars */
    VERIFY( status == 0 );

    status = _fstrcspn( "123456", "cab" );      /* should be whole string */
    VERIFY( status == 6 );

    status = _fstrcspn( "!x,y:zfoo", "t.7of" ); /* should be 6 chars */
    VERIFY( status == 6 );

    ptr = _fstrpbrk( "aBcDeFgHiJ", "1234567" ); /* should be NULL */
    VERIFY( ptr == NULL );

    ptr = _fstrpbrk( "Foo", "" );               /* should be NULL */
    VERIFY( ptr == NULL );

    ptr = _fstrpbrk( buf, "t!q-");              /* find the 'q' */
    VERIFY( ptr == buf+4 );

    status = _fstrspn( buf, "!1@2#3$4%5^6&7" ); /* should be zero */
    VERIFY( status == 0 );

    status = _fstrspn( buf, "kciuq ehT" );      /* should be 10 */
    VERIFY( status == 10);

    ptr = _fstrstr( buf, "foo" );               /* should be NULL */
    VERIFY( ptr == NULL );

    ptr = _fstrstr( buf, "ck br" );             /* find "ck br" */
    VERIFY( ptr == buf+7 );
}
#endif



/****
***** Test strtok().
****/

void TestToken( void )
{
    char            buf[] = "Find!all;the.tokens,";
    char            *ptr;

    ptr = strtok( buf, " ;.,!" );               /* find a token */
    VERIFY( !strcmp(ptr,"Find") );

    ptr = strtok( NULL, " ;.,!" );              /* find a token */
    VERIFY( !strcmp(ptr,"all") );

    ptr = strtok( NULL, " ;.,!" );              /* find a token */
    VERIFY( !strcmp(ptr,"the") );

    ptr = strtok( NULL, " ;.,!" );              /* find a token */
    VERIFY( !strcmp(ptr,"tokens") );

    ptr = strtok( NULL, " '.,!" );              /* try to find another */
    VERIFY( ptr == NULL );
}


#ifdef __X86__
void TestTokenF( void )
{
    char            buf[] = "Find!all;the.tokens,";
    char __far      *ptr;

    ptr = _fstrtok( buf, " ;.,!" );             /* find a token */
    VERIFY( !_fstrcmp(ptr,"Find") );

    ptr = _fstrtok( NULL, " ;.,!" );            /* find a token */
    VERIFY( !_fstrcmp(ptr,"all") );

    ptr = _fstrtok( NULL, " ;.,!" );            /* find a token */
    VERIFY( !_fstrcmp(ptr,"the") );

    ptr = _fstrtok( NULL, " ;.,!" );            /* find a token */
    VERIFY( !_fstrcmp(ptr,"tokens") );

    ptr = _fstrtok( NULL, " '.,!" );            /* try to find another */
    VERIFY( ptr == NULL );
}
#endif



/****
***** Test strcoll() and strxfrm().
****/

void TestLocale( void )
{
    char            bufA[80] = "FoO baR gOoBeR bLaH";
    char            bufB[80];
    int             status;

    setlocale( LC_ALL, "C" );                   /* set locale to "C" */

    status = strxfrm( bufB, bufA, 20 );         /* transform the string */
    VERIFY( status == 19 );

    status = strcoll( bufB, bufA );             /* compare with "C" locale */
    VERIFY( status == 0 );

    status = strcoll( bufB, "Bar" );            /* compare with "C" locale */
    VERIFY( status != 0 );
}



/****
***** Test strerror().
****/

void TestError( void )
{
    char            *error = NULL;

    error = strerror( EBADF );                  /* get an error string */
    VERIFY( strlen(error) != 0 );
}



/****
***** Test _bprintf(), sprintf(), sscanf(), _vbprintf(), vsprintf(), and
***** vsscanf().
****/

void TestFormatted( void )
{
    char            buf[80];
    int             status, len;
    int             numA, numB;

    status = _bprintf( buf, 3, "%d", 12345 );   /* try to print too much */
    VERIFY( status <= 3 );

    status = _bprintf( buf, 80, "%d", 12345 );  /* print a string */
    VERIFY( status == 5 );
    VERIFY( !strcmp(buf,"12345") );

    status = sprintf( buf, " %d %d", 191, 67 ); /* print a string */
    VERIFY( status == 7 );

    status = sscanf( buf, "%d %d", &numA, &numB );  /* parse string */
    VERIFY( status == 2 );
    VERIFY( numA == 191 );
    VERIFY( numB == 67 );

    Test__vbprintf( buf, "%d %d", 101, 37 );
    status = Test_vsscanf( buf, "%d %d", &numA, &numB );
    VERIFY( status == 2 );
    VERIFY( numA == 101 );
    VERIFY( numB == 37 );

    Test_vsprintf( buf, "%d %d", 101, 37 );
    status = Test_vsscanf( buf, "%d %d", &numA, &numB );
    VERIFY( status == 2 );
    VERIFY( numA == 101 );
    VERIFY( numB == 37 );

    len = Test_vsnprintf( buf, "%d %d", 101, 37 );    /* try to print too much */
    status = Test_vsscanf( buf, "%d", &numA );
    VERIFY( status == 1 );
    VERIFY( numA == 101 );
    /* make sure that we get back the same length for zero size buffer */
    VERIFY( len == snprintf( NULL, 0, "%d %d", 101, 37 ) );
}


void Test__vbprintf( char *buf, char *format, ... )
{
    va_list         args;
    int             status;

    va_start( args, format );
    status = _vbprintf( buf, 80, format, args );    /* print some stuff */
    VERIFY( status <= 80 );
    va_end( args );
}

int Test_vsnprintf( char *buf, char *format, ... )
{
    va_list         args;
    int             len;

    va_start( args, format );
    memset( buf, 0, 10 );
    len = vsnprintf( buf, 4, format, args );    /* print some stuff */
    VERIFY( len > 4 );
    VERIFY( buf[4] == '\0' );   /* ensure we're not overflowing the buffer */
    VERIFY( buf[5] == '\0' );
    va_end( args );
    return len;
}


int Test_vsscanf( char *buf, char *format, ... )
{
    va_list         args;
    int             status;

    va_start( args, format );
    status = vsscanf( buf, format, args );
    va_end( args );
    return( status );
}


void Test_vsprintf( char *buf, char *format, ... )
{
    va_list         args;
    int             status;

    va_start( args, format );
    status = vsprintf( buf, format, args );     /* print some stuff */
    VERIFY( status > 0 );
    va_end( args );
}


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

int main( int argc, char *argv[] )
{
#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
    /*** Initialize ***/
    strcpy( ProgramName, strlwr( argv[0] ) );   /* store filename */

    /*** Test various functions ***/
    TestCompare();                              /* compare stuff */
    TestMove();                                 /* moving data about */
    TestCase();                                 /* upper/lowercase stuff */
    TestSearch();                               /* searching stuff */
    TestSubstring();                            /* substring stuff */
    TestToken();                                /* tokenizing stuff */
    TestLocale();                               /* locale stuff */
    TestError();                                /* error string stuff */
    TestFormatted();                            /* formatted I/O stuff */
    TestBounded();                              /* bounded string stuff */
#ifdef __X86__
    TestCompareF();
    TestMoveF();
    TestCaseF();
    TestSearchF();
    TestSubstringF();
    TestTokenF();
#endif

    /*** Print a pass/fail message and quit ***/
    if( NumErrors != 0 ) {
        printf( "%s: FAILURE (%d errors).\n", ProgramName, NumErrors );
        return( EXIT_FAILURE );
    }
    printf( "Tests completed (%s).\n", strlwr( argv[0] ) );
#ifdef __SW_BW
    fprintf( stderr, "Tests completed (%s).\n", strlwr( argv[0] ) );
    fclose( my_stdout );
    _dwShutDown();
#endif
    return( 0 );
}

⌨️ 快捷键说明

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