blob: e9c09fb59628fc9a223e847be61f3b06b58c0ea6 (
plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
|
#include <ctype.h>
#include "dietfeatures.h"
#include <errno.h>
#include <limits.h>
#include <stdlib.h>
unsigned long int strtoul(const char *nptr, char **endptr, int base)
{
int neg = 0;
unsigned long int v=0;
while(isspace(*nptr)) ++nptr;
if (*nptr == '-') { neg=1; nptr++; }
if (*nptr == '+') ++nptr;
if (base==16 && nptr[0]=='0') goto skip0x;
if (!base) {
if (*nptr=='0') {
base=8;
skip0x:
if (nptr[1]=='x'||nptr[1]=='X') {
nptr+=2;
base=16;
}
} else
base=10;
}
while(*nptr) {
register unsigned char c=*nptr;
c=(c>='a'?c-'a'+10:c>='A'?c-'A'+10:c<='9'?c-'0':0xff);
if (c>=base) break;
{
register unsigned long int w=v*base;
if (w<v) {
errno=ERANGE;
return ULONG_MAX;
}
v=w+c;
}
++nptr;
}
if (endptr) *endptr=(char *)nptr;
errno=0; /* in case v==ULONG_MAX, ugh! */
return (neg?-v:v);
}
|