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