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 #define SLIM (UINT_MAX/36-1)
28 #define LLIM (UINTMAX_MAX/36-1)
30 int __intparse(struct intparse *v, const void *buf, size_t n)
32 const unsigned char *s = buf;
36 for (; n; n--, s++) switch (v->state) {
40 if (*s=='+' || *s=='-') {
46 if (*s=='0' && (!b || b==16)) continue;
47 if (!b) v->base = b = 10;
52 if ((!b || b==16) && (*s|32) == 'x') {
57 if (!b) v->base = b = 8;
61 if (digits[*s] >= b) {
70 for (; n && *s-'0'<10U && v->small<=SLIM; n--, s++)
71 v->small = v->small * 10 + (*s-'0');
72 } else if ((b&-b) == b) {
73 /* Compute bitshift for power-of-two bases
74 * using a De Bruijn B(2,3) sequence. */
75 int bs = "\0\1\2\4\7\3\6\5"[(0x17*b)>>5&7];
76 for (; n && (d=digits[*s])<b && v->small<=SLIM; n--, s++)
77 v->small = (v->small<<bs) + d;
79 for (; n && (d=digits[*s])<b && v->small<=SLIM; n--, s++)
80 v->small = v->small * b + d;
86 for (; n && (d=digits[*s])<b && v->val<=LLIM; n--, s++)
87 v->val = v->val * b + d;
89 if (d >= b) goto finished;
90 if (v->val < (UINTMAX_MAX-d)/b)
91 v->val = v->val * b + d;
97 if (n && digits[*s]<b) {
101 for (; n && digits[*s]<b; n--, s++);