2 * Acess2 C Library (Test)
3 * - By John Hodge (thePowersGang)
12 #include <string.h> // strerror
15 #define STR(v) STR_(v)
16 #define TST(t, class, base, val, exp, fmt, ofs, exp_errno) do {\
17 const char *in = val;\
20 t ret = strto##class(in, &end, base); \
22 fprintf(stderr, "FAIL strto"#class"('%s') != "#exp" (act "fmt")\n", in, ret);\
24 fprintf(stderr, "FAIL strto"#class"('%s') returned wrong end: %p (+%zi) instead of %p (+%zi)\n",\
25 in,end,end-in,in+ofs,(size_t)ofs);\
26 if( exp_errno != errno ) \
27 fprintf(stderr, "FAIL strto"#class"('%s') returned wrong errno, exp '%s', got '%s'\n",\
28 in, strerror(exp_errno), strerror(errno));\
31 #define PRIMEBUF(fmt, val) buf_len = snprintf(buf, sizeof(buf), fmt, val)
33 int main(int argc, char *argv[])
39 TST(unsigned long, ul, 0, "0x10ec", 0x10ec, "%lx", 2+4, 0);
40 TST(unsigned long long, ull, 0, "0xffeed10ec", 0xffeed10ec, "%llx", 2+9, 0);
41 TST(unsigned long long, ull, 0, "01234567", 01234567, "%llo", 8, 0);
42 TST(unsigned long long, ull, 0, "1234567", 1234567, "%lld", 7, 0);
43 TST(long long, ll, 0, "-1", -1, "%lld", 2, 0); // -1
44 TST(long long, ll, 0, "100113", 100113, "%lld", strlen(in), 0);
45 TST(long long, ll, 0, "0x101", 0x101, "0x%llx", strlen(in), 0);
48 TST(unsigned long long, ull, 0, "0x", 0, "%llx", 1, 0); // Single 0
49 TST(unsigned long long, ull, 0, "0xg", 0, "%llx", 1, 0); // Single 0
50 TST(unsigned long long, ull, 0, "-a", 0, "%llx", 0, 0); // Nothing
51 TST(long long, ll, 0, "-a", 0, "%lld", 0, 0); // Nothing
52 TST(long long, ll, 0, "-1aaatg", -1, "%lld", 2, 0); // -1 (with traling junk)
53 TST(long long, ll, 0, "-+1aaatg", 0, "%lld", 0, 0); // Nothing
54 TST(long long, ll, 0, "- 1", 0, "%lld", 0, 0); // Nothing
55 TST(long long, ll, 0, "01278 1", 0127, "%lld", 4, 0); // 0127 with junk
58 PRIMEBUF("0x%llx", ULLONG_MAX);
59 TST(unsigned long long, ull, 0, buf, ULLONG_MAX, "0x%llx", buf_len, 0);
60 PRIMEBUF("%llu", ULLONG_MAX);
61 TST(unsigned long long, ull, 0, buf, ULLONG_MAX, "%llu", buf_len, 0);
62 PRIMEBUF("-%llu", (long long)LONG_MAX);
63 TST(long, l, 0, buf, -LONG_MAX, "%ld", buf_len, 0);
66 // - When the range limit is hit, valid characters should still be consumed (just not used)
67 TST(unsigned long long, ull, 0, "0x10000FFFF0000FFFF", ULLONG_MAX, "%llx", strlen(in), ERANGE);
68 TST(unsigned long, ul, 0, "0x10000FFFF0000FFFF", ULONG_MAX, "%lx", strlen(in), ERANGE);
69 TST(long, l, 0, "0x10000FFFF0000FFFF", LONG_MAX, "%ld", strlen(in), ERANGE);
70 TST(long, l, 0, "-0x10000FFFF0000FFFF", LONG_MIN, "%ld", strlen(in), ERANGE);
71 if( LONG_MIN < -LONG_MAX )
73 // Ensure that if -LONG_MIN is greater than LONG_MAX, that converting it leaves a range error
74 PRIMEBUF("%ld", LONG_MIN);
75 TST(long, l, 0, buf+1, LONG_MAX, "%ld", buf_len-1, ERANGE);