#include "rocklibc.h" unsigned long int strtoul(const char *ptr, char **endptr, int base) { int neg = 0, overflow = 0; unsigned long int v=0; const char* orig; const char* nptr=ptr; while(isspace(*nptr)) ++nptr; if (*nptr == '-') { neg=1; nptr++; } else if (*nptr == '+') ++nptr; orig=nptr; if (base==16 && nptr[0]=='0') goto skip0x; if (base) { register unsigned int b=base-2; if (__unlikely(b>34)) { errno=EINVAL; return 0; } } else { if (*nptr=='0') { base=8; skip0x: if ((nptr[1]=='x'||nptr[1]=='X') && isxdigit(nptr[2])) { nptr+=2; base=16; } } else base=10; } while(__likely(*nptr)) { register unsigned char c=*nptr; c=(c>='a'?c-'a'+10:c>='A'?c-'A'+10:c<='9'?c-'0':0xff); if (__unlikely(c>=base)) break; /* out of base */ { register unsigned long x=(v&0xff)*base+c; register unsigned long w=(v>>8)*base+(x>>8); if (w>(ULONG_MAX>>8)) overflow=1; v=(w<<8)+(x&0xff); } ++nptr; } if (__unlikely(nptr==orig)) { /* no conversion done */ nptr=ptr; errno=EINVAL; v=0; } if (endptr) *endptr=(char *)nptr; if (overflow) { errno=ERANGE; return ULONG_MAX; } return (neg?-v:v); } e='switch'/> My Rockbox treeFranklin Wei
summaryrefslogtreecommitdiff
path: root/apps/codecs/libfaad/is.c
blob: 127558fb7d4ef7fedcb525a3d08d0c3629865e3e (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
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106