79unsigned long strtoul(nptr, endptr, base)
const char* nptr;
109 if((base == 0 || base == 16) && c ==
'0' && (*s ==
'x' || *s ==
'X'))
115 else if((base == 0 || base == 2) && c ==
'0' && (*s ==
'b' || *s ==
'B'))
124 base = c ==
'0' ? 8 : 10;
127 cutoff = (
unsigned long)ULONG_MAX / (
unsigned long)base;
128 cutlim = (int)((
unsigned long)ULONG_MAX % (
unsigned long)base);
130 for(acc = 0, any = 0;; c = *s++)
138 c -= isupper(c) ?
'A' - 10 :
'a' - 10;
148 if(any < 0 || acc > cutoff || (acc == cutoff && c > cutlim))
155 acc *= (
unsigned long)base;
156 acc += (
unsigned long)c;
172 *endptr = (
char*)(uintptr_t)(any ? s - 1 : nptr);