1
2
3
4
5
6
7
8
9#include "libbb.h"
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32static unsigned long long ret_ERANGE(void)
33{
34 errno = ERANGE;
35 return ULLONG_MAX;
36}
37
38static unsigned long long handle_errors(unsigned long long v, char **endp)
39{
40 char next_ch = **endp;
41
42
43 if (next_ch) {
44
45 if (isalnum(next_ch) || errno)
46 return ret_ERANGE();
47
48 errno = EINVAL;
49 }
50 return v;
51}
52
53
54unsigned long long FAST_FUNC bb_strtoull(const char *arg, char **endp, int base)
55{
56 unsigned long long v;
57 char *endptr;
58
59 if (!endp) endp = &endptr;
60 *endp = (char*) arg;
61
62
63
64 if (!isalnum(arg[0])) return ret_ERANGE();
65
66
67 errno = 0;
68 v = strtoull(arg, endp, base);
69 return handle_errors(v, endp);
70}
71
72long long FAST_FUNC bb_strtoll(const char *arg, char **endp, int base)
73{
74 unsigned long long v;
75 char *endptr;
76 char first;
77
78 if (!endp) endp = &endptr;
79 *endp = (char*) arg;
80
81
82
83
84 first = (arg[0] != '-' ? arg[0] : arg[1]);
85 if (!isalnum(first)) return ret_ERANGE();
86
87 errno = 0;
88 v = strtoll(arg, endp, base);
89 return handle_errors(v, endp);
90}
91
92#if ULONG_MAX != ULLONG_MAX
93unsigned long FAST_FUNC bb_strtoul(const char *arg, char **endp, int base)
94{
95 unsigned long v;
96 char *endptr;
97
98 if (!endp) endp = &endptr;
99 *endp = (char*) arg;
100
101 if (!isalnum(arg[0])) return ret_ERANGE();
102 errno = 0;
103 v = strtoul(arg, endp, base);
104 return handle_errors(v, endp);
105}
106
107long FAST_FUNC bb_strtol(const char *arg, char **endp, int base)
108{
109 long v;
110 char *endptr;
111 char first;
112
113 if (!endp) endp = &endptr;
114 *endp = (char*) arg;
115
116 first = (arg[0] != '-' ? arg[0] : arg[1]);
117 if (!isalnum(first)) return ret_ERANGE();
118
119 errno = 0;
120 v = strtol(arg, endp, base);
121 return handle_errors(v, endp);
122}
123#endif
124
125#if UINT_MAX != ULONG_MAX
126unsigned FAST_FUNC bb_strtou(const char *arg, char **endp, int base)
127{
128 unsigned long v;
129 char *endptr;
130
131 if (!endp) endp = &endptr;
132 *endp = (char*) arg;
133
134 if (!isalnum(arg[0])) return ret_ERANGE();
135 errno = 0;
136 v = strtoul(arg, endp, base);
137 if (v > UINT_MAX) return ret_ERANGE();
138 return handle_errors(v, endp);
139}
140
141int FAST_FUNC bb_strtoi(const char *arg, char **endp, int base)
142{
143 long v;
144 char *endptr;
145 char first;
146
147 if (!endp) endp = &endptr;
148 *endp = (char*) arg;
149
150 first = (arg[0] != '-' ? arg[0] : arg[1]);
151 if (!isalnum(first)) return ret_ERANGE();
152
153 errno = 0;
154 v = strtol(arg, endp, base);
155 if (v > INT_MAX) return ret_ERANGE();
156 if (v < INT_MIN) return ret_ERANGE();
157 return handle_errors(v, endp);
158}
159#endif
160