23a2f3b6590bdfc3e4b114902abed698ca6b2388
[musl] / src / stdlib / strtol.c
1 #include "stdio_impl.h"
2 #include "intscan.h"
3 #include "shgetc.h"
4
5 static unsigned long long strtox(const char *s, char **p, int base, unsigned long long lim)
6 {
7         /* FIXME: use a helper function or macro to setup the FILE */
8         FILE f;
9         f.flags = 0;
10         f.buf = f.rpos = (void *)s;
11         if ((size_t)s > (size_t)-1/2)
12                 f.rend = (void *)-1;
13         else
14                 f.rend = (unsigned char *)s+(size_t)-1/2;
15         f.lock = -1;
16         shlim(&f, 0);
17         unsigned long long y = __intscan(&f, base, 1, lim);
18         if (p) {
19                 size_t cnt = shcnt(&f);
20                 *p = (char *)s + cnt;
21         }
22         return y;
23 }
24
25 unsigned long long strtoull(const char *restrict s, char **restrict p, int base)
26 {
27         return strtox(s, p, base, ULLONG_MAX);
28 }
29
30 long long strtoll(const char *restrict s, char **restrict p, int base)
31 {
32         return strtox(s, p, base, LLONG_MIN);
33 }
34
35 unsigned long strtoul(const char *restrict s, char **restrict p, int base)
36 {
37         return strtox(s, p, base, ULONG_MAX);
38 }
39
40 long strtol(const char *restrict s, char **restrict p, int base)
41 {
42         return strtox(s, p, base, 0UL+LONG_MIN);
43 }
44
45 intmax_t strtoimax(const char *restrict s, char **restrict p, int base)
46 {
47         return strtoll(s, p, base);
48 }
49
50 uintmax_t strtoumax(const char *restrict s, char **restrict p, int base)
51 {
52         return strtoull(s, p, base);
53 }