4 strtoull(const char *nptr
, char **endptr
, int base
)
7 unsigned long long acc
;
9 unsigned long long cutoff
;
10 int neg
= 0, any
, cutlim
;
13 * See strtol for comments as to the logic used.
25 if ((base
== 0 || base
== 16) &&
26 c
== '0' && (*s
== 'x' || *s
== 'X'))
33 base
= c
== '0' ? 8 : 10;
34 cutoff
= (unsigned long long)ULLONG_MAX
/ (unsigned long long)base
;
35 cutlim
= (unsigned long long)ULLONG_MAX
% (unsigned long long)base
;
36 for (acc
= 0, any
= 0;; c
= *s
++)
41 c
-= isupper(c
) ? 'A' - 10 : 'a' - 10;
46 if (any
< 0 || acc
> cutoff
|| (acc
== cutoff
&& c
> cutlim
))
64 *endptr
= any
? (char *)((size_t)(s
- 1)) : (char *)((size_t)nptr
);