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