C++程序  |  222行  |  6.84 KB

// test the basename, dirname, basename_r and dirname_r
#include <libgen.h>
#include <errno.h>
#include <stdio.h>
#include <string.h>

static int  fail = 0;

static void
test_basename(char*  _input, const char*  _expected, int  _errno)
{
    char   temp[256], *input = _input;
    char*  ret;
#if HOST
    /* GLibc does modify the input string. bummer */
    if (_input) {
        strcpy(temp, _input);
        input = temp;
    }
#endif
    errno = 0;
    ret   = basename(input);
    if (_expected == NULL) {
        if (ret != NULL) {
            fprintf(stderr,
                    "KO: basename(\"%s\") returned \"%s\", NULL expected)\n",
                    _input, ret);
            fail += 1;
        } else if (errno != _errno) {
            fprintf(stderr,
                    "KO: basename(\"%s\") returned NULL with error: %d (%d expected)\n",
                    _input, errno, _errno);
            fail += 1;
        } else {
            printf( "OK: basename(\"%s\") returned NULL with error %d\n",
                    _input, _errno );
        }
    } else {
        if (ret == NULL) {
            fprintf(stderr, "KO: basename(\"%s\") returned NULL with error %d\n",
                    _input, errno);
            fail += 1;
        }
        else if (strcmp(ret, _expected)) {
            fprintf(stderr, "KO: basename(\"%s\") returned \"%s\", instead of \"%s\"\n",
                    _input, ret, _expected);
        }
        else {
            printf( "OK: basename(\"%s\") returned \"%s\"\n",
                    _input, ret );
        }
    }
}


#if !HOST
static void
test_basename_r(char*  _input, const char*  _expected_content, int  _expected, char*  _buff, size_t  _bufflen, int  _errno)
{
    int   ret;
    errno = 0;
    ret   = basename_r(_input, _buff, _bufflen );
    if (ret != _expected) {
        fprintf(stderr,
                "KO: basename_r(\"%s\", <buff>, %d) returned %d (expected %d)\n",
                _input, _bufflen, ret, _expected);
        fail += 1;
        return;
    }
    if (ret == -1) {
        if (errno != _errno) {
            fprintf(stderr,
                    "KO: basename_r(\"%s\", <buff>, %d) returned -1 with errno=%d (expected %d)\n",
                    _input, _bufflen, errno, _errno);
            fail += 1;
            return;
        }
    }
    else if (_buff != NULL && memcmp( _buff, _expected_content, ret ) ) {
        fprintf(stderr,
                "KO: basename_r(\"%s\", <buff>, %d) returned \"%s\", expected \"%s\"\n",
                _input, _bufflen, _buff, _expected_content );
        fail += 1;
        return;
    }
    printf("OK: basename_r(\"%s\", <buff>, %d) returned \"%s\"\n",
            _input, _bufflen, _expected_content );
}

static void
test_dirname_r(char*  _input, const char*  _expected_content, int  _expected, char*  _buff, size_t  _bufflen, int  _errno)
{
    int   ret;
    errno = 0;
    ret   = dirname_r(_input, _buff, _bufflen );
    if (ret != _expected) {
        fprintf(stderr,
                "KO: dirname_r(\"%s\", <buff>, %d) returned %d (expected %d)\n",
                _input, _bufflen, ret, _expected);
        fail += 1;
        return;
    }
    if (ret == -1) {
        if (errno != _errno) {
            fprintf(stderr,
                    "KO: dirname_r(\"%s\", <buff>, %d) returned -1 with errno=%d (expected %d)\n",
                    _input, _bufflen, errno, _errno);
            fail += 1;
            return;
        }
    }
    else if (_buff != NULL &&  memcmp( _buff, _expected_content, ret ) ) {
        fprintf(stderr,
                "KO: dirname_r(\"%s\", <buff>, %d) returned \"%s\", expected \"%s\"\n",
                _input, _bufflen, _buff, _expected_content );
        fail += 1;
        return;
    }
    printf("OK: dirname_r(\"%s\", <buff>, %d) returned \"%s\"\n",
            _input, _bufflen, _expected_content );
}
#endif


static void
test_dirname(char*  _input, const char*  _expected, int  _errno)
{
    char   temp[256], *input = _input;
    char*  ret;
#if HOST
    /* GLibc does modify the input string. bummer */
    if (_input) {
        strcpy(temp, _input);
        input = temp;
    }
#endif
    errno = 0;
    ret   = dirname(input);
    if (_expected == NULL) {
        if (ret != NULL) {
            fprintf(stderr,
                    "KO: dirname(\"%s\") returned \"%s\", NULL expected)\n",
                    _input, ret);
            fail += 1;
        } else if (errno != _errno) {
            fprintf(stderr,
                    "KO: dirname(\"%s\") returned NULL with error: %d (%d expected)\n",
                    _input, errno, _errno);
            fail += 1;
        } else {
            printf( "OK: dirname(\"%s\") returned NULL with error %d\n",
                    _input, _errno );
        }
    } else {
        if (ret == NULL) {
            fprintf(stderr, "KO: dirname(\"%s\") returned NULL with error %d\n",
                    _input, errno);
            fail += 1;
        }
        else if (strcmp(ret, _expected)) {
            fprintf(stderr, "KO: dirname(\"%s\") returned \"%s\", instead of \"%s\"\n",
                    _input, ret, _expected);
        }
        else {
            printf( "OK: dirname(\"%s\") returned \"%s\"\n",
                    _input, ret );
        }
    }
}




int  main( void )
{
    char  buff[256];

    test_basename( "", ".", 0 );
    test_basename( "/usr/lib", "lib", 0 );
    test_basename( "/usr/", "usr", 0 );
    test_basename( "usr", "usr", 0 );
    test_basename( "/", "/", 0 );
    test_basename( ".", ".", 0 );
    test_basename( "..", "..", 0 );

#if !HOST
    test_basename_r( "", ".",  1, NULL, 0, 0 );
    test_basename_r( "", ".", -1, buff, 0, ERANGE );
    test_basename_r( "", ".", -1, buff, 1, ERANGE );
    test_basename_r( "", ".", 1, buff, 2, 0 );
    test_basename_r( "", ".", 1, buff, sizeof(buff), 0 );
    test_basename_r( "/usr/lib", "lib", 3, buff, sizeof(buff), 0 );
    test_basename_r( "/usr/", "usr", 3, buff, sizeof(buff), 0 );
    test_basename_r( "usr", "usr", 3, buff, sizeof(buff), 0 );
    test_basename_r( "/", "/", 1, buff, sizeof(buff), 0 );
    test_basename_r( ".", ".", 1, buff, sizeof(buff), 0 );
    test_basename_r( "..", "..", 2, buff, sizeof(buff), 0 );
#endif

    test_dirname( "", ".", 0 );
    test_dirname( "/usr/lib", "/usr", 0 );
    test_dirname( "/usr/", "/", 0 );
    test_dirname( "usr", ".", 0 );
    test_dirname( ".", ".", 0 );
    test_dirname( "..", ".", 0 );

#if !HOST
    test_dirname_r( "", ".",  1, NULL, 0, 0 );
    test_dirname_r( "", ".", -1, buff, 0, ERANGE );
    test_dirname_r( "", ".", -1, buff, 1, ERANGE );
    test_dirname_r( "", ".", 1, buff, 2, 0 );
    test_dirname_r( "/usr/lib", "/usr", 4, buff, sizeof(buff), 0 );
    test_dirname_r( "/usr/", "/", 1, buff, sizeof(buff), 0 );
    test_dirname_r( "usr", ".", 1, buff, sizeof(buff), 0 );
    test_dirname_r( ".", ".", 1, buff, sizeof(buff), 0 );
    test_dirname_r( "..", ".", 1, buff, sizeof(buff), 0 );
#endif

    return (fail > 0);
}