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