5 /* Lookup table for digit values. -1==255>=36 -> invalid */
6 static const unsigned char table[] = { -1,
7 -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
8 -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
9 -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
10 0, 1, 2, 3, 4, 5, 6, 7, 8, 9,-1,-1,-1,-1,-1,-1,
11 -1,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,
12 25,26,27,28,29,30,31,32,33,34,35,-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,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
16 -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-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,
25 unsigned long long __intscan(FILE *f, unsigned base, int pok, unsigned long long lim)
27 const unsigned char *val = table+1;
35 while (isspace((c=shgetc(f))));
36 if (c=='+' || c=='-') {
40 if ((base == 0 || base == 16) && c=='0') {
51 } else if (base == 0) {
55 if (base == 0) base = 10;
64 for (x=0; c-'0'<10U && x<=UINT_MAX/10-1; c=shgetc(f))
66 for (y=x; c-'0'<10U && y<=ULLONG_MAX/10 && 10*y<=ULLONG_MAX-(c-'0'); c=shgetc(f))
68 if (c-'0'>=10U) goto done;
69 } else if (!(base & base-1)) {
70 int bs = "\0\1\2\4\7\3\6\5"[(0x17*base)>>5&7];
71 for (x=0; val[c]<base && x<=UINT_MAX/32; c=shgetc(f))
73 for (y=x; val[c]<base && y<=ULLONG_MAX>>bs; c=shgetc(f))
76 for (x=0; val[c]<base && x<=UINT_MAX/36-1; c=shgetc(f))
78 for (y=x; val[c]<base && y<=ULLONG_MAX/base && base*y<=ULLONG_MAX-val[c]; c=shgetc(f))
82 for (; val[c]<base; c=shgetc(f));
89 if (!(lim&1) && !neg) {