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