| #include "stdio_impl.h" |
| #include "intscan.h" |
| #include "shgetc.h" |
| #include <inttypes.h> |
| #include <limits.h> |
| #include <ctype.h> |
| #include "libc.h" |
| |
| static unsigned long long strtox(const char *s, char **p, int base, unsigned long long lim) |
| { |
| /* FIXME: use a helper function or macro to setup the FILE */ |
| FILE f; |
| f.flags = 0; |
| f.buf = f.rpos = (void *)s; |
| if ((size_t)s > (size_t)-1/2) |
| f.rend = (void *)-1; |
| else |
| f.rend = (unsigned char *)s+(size_t)-1/2; |
| f.lock = -1; |
| shlim(&f, 0); |
| unsigned long long y = __intscan(&f, base, 1, lim); |
| if (p) { |
| size_t cnt = shcnt(&f); |
| *p = (char *)s + cnt; |
| } |
| return y; |
| } |
| |
| unsigned long long strtoull(const char *restrict s, char **restrict p, int base) |
| { |
| return strtox(s, p, base, ULLONG_MAX); |
| } |
| |
| long long strtoll(const char *restrict s, char **restrict p, int base) |
| { |
| return strtox(s, p, base, LLONG_MIN); |
| } |
| |
| unsigned long strtoul(const char *restrict s, char **restrict p, int base) |
| { |
| return strtox(s, p, base, ULONG_MAX); |
| } |
| |
| long strtol(const char *restrict s, char **restrict p, int base) |
| { |
| return strtox(s, p, base, 0UL+LONG_MIN); |
| } |
| |
| intmax_t strtoimax(const char *restrict s, char **restrict p, int base) |
| { |
| return strtoll(s, p, base); |
| } |
| |
| uintmax_t strtoumax(const char *restrict s, char **restrict p, int base) |
| { |
| return strtoull(s, p, base); |
| } |
| |
| weak_alias(strtol, __strtol_internal); |
| weak_alias(strtoul, __strtoul_internal); |
| weak_alias(strtoll, __strtoll_internal); |
| weak_alias(strtoull, __strtoull_internal); |
| weak_alias(strtoimax, __strtoimax_internal); |
| weak_alias(strtoumax, __strtoumax_internal); |