7 /* Lookup table for digit values. -1==255>=36 -> invalid */
8 static const unsigned char digits[] = {
9 -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
10 -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
11 -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
12 0, 1, 2, 3, 4, 5, 6, 7, 8, 9,-1,-1,-1,-1,-1,-1,
13 -1,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,
14 25,26,27,28,29,30,31,32,33,34,35,-1,-1,-1,-1,-1,
15 -1,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,
16 25,26,27,28,29,30,31,32,33,34,35,-1,-1,-1,-1,-1,
17 -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
18 -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
19 -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
20 -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
21 -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
22 -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
23 -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
24 -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
27 uintmax_t strtoumax(const char *s1, char **p, int base)
29 const unsigned char *s = s1;
35 if (!p) p = (char **)&s1;
37 /* Initial whitespace */
38 for (; isspace(*s); s++);
41 if (*s == '-') sign = *s++;
42 else if (*s == '+') s++;
44 /* Default base 8, 10, or 16 depending on prefix */
47 if ((s[1]|32) == 'x') base = 16;
54 if ((unsigned)base-2 > 36-2 || digits[*s]>=base) {
60 /* Main loops. Only use big types if we have to. */
62 for (x1=0; isdigit(*s) && x1<=SIZE_MAX/10-10; s++)
64 for (x=x1; isdigit(*s) && x<=UINTMAX_MAX/10-10; s++)
67 if (isdigit(s[1]) || 10*x>UINTMAX_MAX-(*s-'0'))
71 } else if (!(base & base/2)) {
73 if (s[0]=='0' && (s[1]|32)=='x' && digits[s[2]]<16)
78 } else if (base == 8) {
82 } else if (base == 2) {
86 } else if (base == 4) {
90 } else /* if (base == 32) */ {
95 for (x1=0; digits[*s]<base && x1<=z1; s++)
96 x1 = (x1<<shift) + digits[*s];
97 for (x=x1; digits[*s]<base && x<=z; s++)
98 x = (x<<shift) + digits[*s];
99 if (digits[*s] < base) goto overflow;
101 z1 = SIZE_MAX/base-base;
102 for (x1=0; digits[*s]<base && x1<=z1; s++)
103 x1 = x1*base + digits[*s];
105 z = UINTMAX_MAX/base-base;
106 for (x=x1; digits[*s]<base && x<=z; s++)
107 x = x*base + digits[*s];
108 if (digits[*s] < base) {
109 if (digits[s[1]]<base || x*base>UINTMAX_MAX-digits[*s])
111 x = x*base + digits[*s];
116 return sign ? -x : x;
119 for (; digits[*s] < base; s++);