|
Packit |
fcad23 |
/* HEADER Testing strtoull(). */
|
|
Packit |
fcad23 |
|
|
Packit |
fcad23 |
#ifdef HAVE_STRTOULL
|
|
Packit |
fcad23 |
|
|
Packit |
fcad23 |
OK(1, "Skipping strtoull() test because using strtoull() from C library.\n");
|
|
Packit |
fcad23 |
|
|
Packit |
fcad23 |
#else
|
|
Packit |
fcad23 |
|
|
Packit |
fcad23 |
/*
|
|
Packit |
fcad23 |
* UINT64_C: C99 macro for the suffix for uint64_t constants.
|
|
Packit |
fcad23 |
*/
|
|
Packit |
fcad23 |
#ifndef UINT64_C
|
|
Packit |
fcad23 |
#ifdef _MSC_VER
|
|
Packit |
fcad23 |
#define UINT64_C(c) c##ui64
|
|
Packit |
fcad23 |
#else
|
|
Packit |
fcad23 |
#define UINT64_C(c) c##ULL
|
|
Packit |
fcad23 |
#endif
|
|
Packit |
fcad23 |
#endif
|
|
Packit |
fcad23 |
|
|
Packit |
fcad23 |
/*
|
|
Packit |
fcad23 |
* According to the C99 standard, the constant ULLONG_MAX must be defined in
|
|
Packit |
fcad23 |
* <limits.h>. Define it here for pre-C99 compilers.
|
|
Packit |
fcad23 |
*/
|
|
Packit |
fcad23 |
#ifndef ULLONG_MAX
|
|
Packit |
fcad23 |
#define ULLONG_MAX UINT64_C(0xffffffffffffffff)
|
|
Packit |
fcad23 |
#endif
|
|
Packit |
fcad23 |
|
|
Packit |
fcad23 |
#ifndef PRIu64
|
|
Packit |
fcad23 |
#ifdef _MSC_VER
|
|
Packit |
fcad23 |
#define PRIu64 "I64u"
|
|
Packit |
fcad23 |
#else
|
|
Packit |
fcad23 |
#define PRIu64 "llu"
|
|
Packit |
fcad23 |
#endif
|
|
Packit |
fcad23 |
#endif
|
|
Packit |
fcad23 |
|
|
Packit |
fcad23 |
struct strtoull_testcase {
|
|
Packit |
fcad23 |
/*
|
|
Packit |
fcad23 |
* inputs
|
|
Packit |
fcad23 |
*/
|
|
Packit |
fcad23 |
const char *nptr;
|
|
Packit |
fcad23 |
int base;
|
|
Packit |
fcad23 |
/*
|
|
Packit |
fcad23 |
* expected outputs
|
|
Packit |
fcad23 |
*/
|
|
Packit |
fcad23 |
int expected_errno;
|
|
Packit |
fcad23 |
int expected_end;
|
|
Packit |
fcad23 |
uint64_t expected_result;
|
|
Packit |
fcad23 |
};
|
|
Packit |
fcad23 |
|
|
Packit |
fcad23 |
static const struct strtoull_testcase test_input[] = {
|
|
Packit |
fcad23 |
{"0x0", 0, 0, 3, 0},
|
|
Packit |
fcad23 |
{"1", 0, 0, 1, 1},
|
|
Packit |
fcad23 |
{"0x1", 0, 0, 3, 1},
|
|
Packit |
fcad23 |
{" -0666", 0, 0, 7, -0666},
|
|
Packit |
fcad23 |
{" -0x666", 0, 0, 8, -0x666},
|
|
Packit |
fcad23 |
{"18446744073709551614", 0, 0, 20, UINT64_C(0xfffffffffffffffe)},
|
|
Packit |
fcad23 |
{"0xfffffffffffffffe", 0, 0, 18, UINT64_C(0xfffffffffffffffe)},
|
|
Packit |
fcad23 |
{"18446744073709551615", 0, 0, 20, UINT64_C(0xffffffffffffffff)},
|
|
Packit |
fcad23 |
{"0xffffffffffffffff", 0, 0, 18, UINT64_C(0xffffffffffffffff)},
|
|
Packit |
fcad23 |
{"18446744073709551616", 0, ERANGE, 20, UINT64_C(0xffffffffffffffff)},
|
|
Packit |
fcad23 |
{"0x10000000000000000", 0, ERANGE, 19, UINT64_C(0xffffffffffffffff)},
|
|
Packit |
fcad23 |
{"ff", 16, 0, 2, 255},
|
|
Packit |
fcad23 |
{"0xff", 16, 0, 4, 255},
|
|
Packit |
fcad23 |
{" ", 0, 0, 0, 0},
|
|
Packit |
fcad23 |
{"0x", 0, 0, 1, 0},
|
|
Packit |
fcad23 |
{"0x", 8, 0, 1, 0},
|
|
Packit |
fcad23 |
{"0x", 16, 0, 1, 0},
|
|
Packit |
fcad23 |
{"zyyy", 0, 0, 0, 0},
|
|
Packit |
fcad23 |
{"0xfffffffffffffffff", 0, ERANGE, 19, ULLONG_MAX},
|
|
Packit |
fcad23 |
{"0xfffffffffffffffffz", 0, ERANGE, 19, ULLONG_MAX}
|
|
Packit |
fcad23 |
};
|
|
Packit |
fcad23 |
|
|
Packit |
fcad23 |
unsigned int i;
|
|
Packit |
fcad23 |
|
|
Packit |
fcad23 |
for (i = 0; i < sizeof(test_input) / sizeof(test_input[0]); i++) {
|
|
Packit |
fcad23 |
const struct strtoull_testcase *const p = &test_input[i];
|
|
Packit |
fcad23 |
char *endptr;
|
|
Packit |
fcad23 |
uint64_t result;
|
|
Packit |
fcad23 |
|
|
Packit |
fcad23 |
errno = 0;
|
|
Packit |
fcad23 |
result = strtoull(p->nptr, &endptr, p->base);
|
|
Packit |
fcad23 |
OKF(errno == p->expected_errno,
|
|
Packit |
fcad23 |
("test %d (input \"%s\"): expected errno %d, got errno %d",
|
|
Packit |
fcad23 |
i, p->nptr, p->expected_errno, errno));
|
|
Packit |
fcad23 |
OKF(result == p->expected_result,
|
|
Packit |
fcad23 |
("test %d (input \"%s\"): expected result %" PRIu64
|
|
Packit |
fcad23 |
", got result %" PRIu64,
|
|
Packit |
fcad23 |
i, p->nptr, p->expected_result, result));
|
|
Packit |
fcad23 |
OKF(endptr - p->nptr == p->expected_end,
|
|
Packit |
fcad23 |
("test %d (input \"%s\"): expected end %d, got end %d",
|
|
Packit |
fcad23 |
i, p->nptr, p->expected_end, (int) (endptr - p->nptr)));
|
|
Packit |
fcad23 |
}
|
|
Packit |
fcad23 |
|
|
Packit |
fcad23 |
#endif
|