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