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