]>
Commit | Line | Data |
---|---|---|
28f540f4 RM |
1 | /* My bet is this was written by Chris Torek. |
2 | I reformatted and ansidecl-ized it, and tweaked it a little. */ | |
3 | ||
28f540f4 RM |
4 | #include <ctype.h> |
5 | #include <stdio.h> | |
6 | #include <errno.h> | |
7 | #include <stdlib.h> | |
8 | #include <strings.h> | |
9 | ||
10 | struct ltest | |
11 | { | |
2c6fe0bd | 12 | const char *str; /* Convert this. */ |
28f540f4 RM |
13 | unsigned long int expect; /* To get this. */ |
14 | int base; /* Use this base. */ | |
15 | char left; /* With this left over. */ | |
16 | int err; /* And this in errno. */ | |
17 | }; | |
2c6fe0bd | 18 | static const struct ltest tests[] = |
28f540f4 | 19 | { |
b20e47cb | 20 | #if ~0UL == 0xffffffff |
28f540f4 RM |
21 | /* First, signed numbers. */ |
22 | { " -17", -17, 0, 0, 0 }, | |
23 | { " +0x123fg", 0x123f, 0, 'g', 0 }, | |
24 | { "2147483647", 2147483647, 0, 0, 0 }, | |
25 | { "2147483648", 2147483647, 0, 0, ERANGE }, | |
26 | { "214748364888", 2147483647, 0, 0, ERANGE }, | |
27 | { "2147483650", 2147483647, 0, 0, ERANGE }, | |
01c901a5 UD |
28 | { "-2147483649", 0x80000000, 0, 0, ERANGE }, |
29 | { "-2147483648", 0x80000000, 0, 0, 0 }, | |
28f540f4 RM |
30 | { "0123", 0123, 0, 0, 0 }, |
31 | { "0x1122334455z", 2147483647, 16, 'z', ERANGE }, | |
32 | { "0x0xc", 0, 0, 'x', 0 }, | |
33 | { "yz!", 34*36+35, 36, '!', 0 }, | |
34 | { NULL, 0, 0, 0, 0 }, | |
35 | ||
36 | /* Then unsigned. */ | |
37 | { " 0", 0, 0, 0, 0 }, | |
38 | { "0xffffffffg", 0xffffffff, 0, 'g', 0 }, | |
39 | { "0xf1f2f3f4f5", 0xffffffff, 0, 0, ERANGE }, | |
5290baf0 | 40 | { "-0x123456789", 0xffffffff, 0, 0, ERANGE }, |
2f6d1f1b | 41 | { "-0xfedcba98", 0x01234568, 0, 0, 0 }, |
28f540f4 | 42 | { NULL, 0, 0, 0, 0 }, |
b20e47cb RM |
43 | #else |
44 | /* assume 64 bit long... */ | |
45 | ||
46 | /* First, signed numbers. */ | |
47 | { " -17", -17, 0, 0, 0 }, | |
48 | { " +0x123fg", 0x123f, 0, 'g', 0 }, | |
49 | { "2147483647", 2147483647, 0, 0, 0 }, | |
50 | { "9223372036854775807", 9223372036854775807, 0, 0, 0 }, | |
51 | { "9223372036854775808", 9223372036854775807, 0, 0, ERANGE }, | |
52 | { "922337203685477580777", 9223372036854775807, 0, 0, ERANGE }, | |
53 | { "9223372036854775810", 9223372036854775807, 0, 0, ERANGE }, | |
54 | { "-2147483648", -2147483648, 0, 0, 0 }, | |
55 | { "-9223372036854775808", -9223372036854775808, 0, 0, 0 }, | |
56 | { "-9223372036854775809", -9223372036854775808, 0, 0, ERANGE }, | |
57 | { "0123", 0123, 0, 0, 0 }, | |
58 | { "0x112233445566778899z", 9223372036854775807, 16, 'z', ERANGE }, | |
59 | { "0x0xc", 0, 0, 'x', 0 }, | |
60 | { "yz!", 34*36+35, 36, '!', 0 }, | |
61 | { NULL, 0, 0, 0, 0 }, | |
62 | ||
63 | /* Then unsigned. */ | |
64 | { " 0", 0, 0, 0, 0 }, | |
65 | { "0xffffffffg", 0xffffffff, 0, 'g', 0 }, | |
66 | { "0xffffffffffffffffg", 0xffffffffffffffff, 0, 'g', 0 }, | |
67 | { "0xf1f2f3f4f5f6f7f8f9", 0xffffffffffffffff, 0, 0, ERANGE }, | |
5290baf0 | 68 | { "-0x123456789abcdef01", 0xffffffffffffffff, 0, 0, ERANGE }, |
2f6d1f1b | 69 | { "-0xfedcba987654321", 0x0123456789abcdf, 0, 0, 0 }, |
b20e47cb RM |
70 | { NULL, 0, 0, 0, 0 }, |
71 | #endif | |
28f540f4 RM |
72 | }; |
73 | ||
2c6fe0bd | 74 | static void expand __P ((char *dst, int c)); |
28f540f4 RM |
75 | |
76 | int | |
84384f5b | 77 | main (int argc, char ** argv) |
28f540f4 | 78 | { |
2c6fe0bd | 79 | register const struct ltest *lt; |
28f540f4 RM |
80 | char *ep; |
81 | int status = 0; | |
f752bfe3 | 82 | int save_errno; |
28f540f4 RM |
83 | |
84 | for (lt = tests; lt->str != NULL; ++lt) | |
85 | { | |
86 | register long int l; | |
87 | ||
88 | errno = 0; | |
f752bfe3 UD |
89 | l = strtol (lt->str, &ep, lt->base); |
90 | save_errno = errno; | |
91 | printf ("strtol(\"%s\", , %d) test %u", | |
92 | lt->str, lt->base, (unsigned int) (lt - tests)); | |
93 | if (l == (long int) lt->expect && *ep == lt->left | |
94 | && save_errno == lt->err) | |
28f540f4 RM |
95 | puts("\tOK"); |
96 | else | |
97 | { | |
98 | puts("\tBAD"); | |
99 | if (l != (long int) lt->expect) | |
100 | printf(" returns %ld, expected %ld\n", | |
101 | l, (long int) lt->expect); | |
102 | if (lt->left != *ep) | |
103 | { | |
104 | char exp1[5], exp2[5]; | |
f752bfe3 UD |
105 | expand (exp1, *ep); |
106 | expand (exp2, lt->left); | |
107 | printf (" leaves '%s', expected '%s'\n", exp1, exp2); | |
28f540f4 | 108 | } |
5ae9d168 | 109 | if (save_errno != lt->err) |
f752bfe3 | 110 | printf (" errno %d (%s) instead of %d (%s)\n", |
5ae9d168 UD |
111 | save_errno, strerror (save_errno), |
112 | lt->err, strerror (lt->err)); | |
28f540f4 RM |
113 | status = 1; |
114 | } | |
115 | } | |
116 | ||
117 | for (++lt; lt->str != NULL; lt++) | |
118 | { | |
119 | register unsigned long int ul; | |
120 | ||
121 | errno = 0; | |
f752bfe3 | 122 | ul = strtoul (lt->str, &ep, lt->base); |
5ae9d168 | 123 | save_errno = errno; |
f752bfe3 UD |
124 | printf ("strtoul(\"%s\", , %d) test %u", |
125 | lt->str, lt->base, (unsigned int) (lt - tests)); | |
5ae9d168 | 126 | if (ul == lt->expect && *ep == lt->left && save_errno == lt->err) |
28f540f4 RM |
127 | puts("\tOK"); |
128 | else | |
129 | { | |
f752bfe3 | 130 | puts ("\tBAD"); |
28f540f4 | 131 | if (ul != lt->expect) |
f752bfe3 UD |
132 | printf (" returns %lu, expected %lu\n", |
133 | ul, lt->expect); | |
28f540f4 RM |
134 | if (lt->left != *ep) |
135 | { | |
136 | char exp1[5], exp2[5]; | |
f752bfe3 UD |
137 | expand (exp1, *ep); |
138 | expand (exp2, lt->left); | |
139 | printf (" leaves '%s', expected '%s'\n", exp1, exp2); | |
28f540f4 | 140 | } |
5ae9d168 | 141 | if (save_errno != lt->err) |
f752bfe3 | 142 | printf (" errno %d (%s) instead of %d (%s)\n", |
5ae9d168 UD |
143 | save_errno, strerror (save_errno), |
144 | lt->err, strerror (lt->err)); | |
28f540f4 RM |
145 | status = 1; |
146 | } | |
147 | } | |
148 | ||
f752bfe3 | 149 | exit (status ? EXIT_FAILURE : EXIT_SUCCESS); |
28f540f4 RM |
150 | } |
151 | ||
152 | static void | |
2c6fe0bd UD |
153 | expand (dst, c) |
154 | char *dst; | |
155 | int c; | |
28f540f4 | 156 | { |
f752bfe3 | 157 | if (isprint (c)) |
28f540f4 RM |
158 | { |
159 | dst[0] = c; | |
160 | dst[1] = '\0'; | |
161 | } | |
162 | else | |
f752bfe3 | 163 | (void) sprintf (dst, "%#.3o", (unsigned int) c); |
28f540f4 | 164 | } |