1570af302Sopenharmony_ci#include "stdio_impl.h"
2570af302Sopenharmony_ci#include "intscan.h"
3570af302Sopenharmony_ci#include "shgetc.h"
4570af302Sopenharmony_ci#include <inttypes.h>
5570af302Sopenharmony_ci#include <limits.h>
6570af302Sopenharmony_ci#include <ctype.h>
7570af302Sopenharmony_ci
8570af302Sopenharmony_cistatic unsigned long long strtox(const char *s, char **p, int base, unsigned long long lim)
9570af302Sopenharmony_ci{
10570af302Sopenharmony_ci	FILE f;
11570af302Sopenharmony_ci	sh_fromstring(&f, s);
12570af302Sopenharmony_ci	shlim(&f, 0);
13570af302Sopenharmony_ci	unsigned long long y = __intscan(&f, base, 1, lim);
14570af302Sopenharmony_ci	if (p) {
15570af302Sopenharmony_ci		size_t cnt = shcnt(&f);
16570af302Sopenharmony_ci		*p = (char *)s + cnt;
17570af302Sopenharmony_ci	}
18570af302Sopenharmony_ci	return y;
19570af302Sopenharmony_ci}
20570af302Sopenharmony_ci
21570af302Sopenharmony_ciunsigned long long strtoull(const char *restrict s, char **restrict p, int base)
22570af302Sopenharmony_ci{
23570af302Sopenharmony_ci	return strtox(s, p, base, ULLONG_MAX);
24570af302Sopenharmony_ci}
25570af302Sopenharmony_ci
26570af302Sopenharmony_cilong long strtoll(const char *restrict s, char **restrict p, int base)
27570af302Sopenharmony_ci{
28570af302Sopenharmony_ci	return strtox(s, p, base, LLONG_MIN);
29570af302Sopenharmony_ci}
30570af302Sopenharmony_ci
31570af302Sopenharmony_ci#ifndef __LITEOS__
32570af302Sopenharmony_ciunsigned long strtoul_weak(const char *restrict s, char **restrict p, int base)
33570af302Sopenharmony_ci#else
34570af302Sopenharmony_ciunsigned long strtoul(const char *restrict s, char **restrict p, int base)
35570af302Sopenharmony_ci#endif
36570af302Sopenharmony_ci{
37570af302Sopenharmony_ci	return strtox(s, p, base, ULONG_MAX);
38570af302Sopenharmony_ci}
39570af302Sopenharmony_ci
40570af302Sopenharmony_cilong strtol(const char *restrict s, char **restrict p, int base)
41570af302Sopenharmony_ci{
42570af302Sopenharmony_ci	return strtox(s, p, base, 0UL+LONG_MIN);
43570af302Sopenharmony_ci}
44570af302Sopenharmony_ci
45570af302Sopenharmony_ci#ifndef __LITEOS__
46570af302Sopenharmony_ciintmax_t strtoimax_weak(const char *restrict s, char **restrict p, int base)
47570af302Sopenharmony_ci#else
48570af302Sopenharmony_ciintmax_t strtoimax(const char *restrict s, char **restrict p, int base)
49570af302Sopenharmony_ci#endif
50570af302Sopenharmony_ci{
51570af302Sopenharmony_ci	return strtoll(s, p, base);
52570af302Sopenharmony_ci}
53570af302Sopenharmony_ci
54570af302Sopenharmony_ci#ifndef __LITEOS__
55570af302Sopenharmony_ciuintmax_t strtoumax_weak(const char *restrict s, char **restrict p, int base)
56570af302Sopenharmony_ci#else
57570af302Sopenharmony_ciuintmax_t strtoumax(const char *restrict s, char **restrict p, int base)
58570af302Sopenharmony_ci#endif
59570af302Sopenharmony_ci{
60570af302Sopenharmony_ci	return strtoull(s, p, base);
61570af302Sopenharmony_ci}
62570af302Sopenharmony_ci
63570af302Sopenharmony_ciweak_alias(strtol, __strtol_internal);
64570af302Sopenharmony_ci#ifndef __LITEOS__
65570af302Sopenharmony_ciweak_alias(strtoul_weak, strtoul);
66570af302Sopenharmony_ci#endif
67570af302Sopenharmony_ciweak_alias(strtoul, __strtoul_internal);
68570af302Sopenharmony_ciweak_alias(strtoll, __strtoll_internal);
69570af302Sopenharmony_ciweak_alias(strtoull, __strtoull_internal);
70570af302Sopenharmony_ci#ifndef __LITEOS__
71570af302Sopenharmony_ciweak_alias(strtoimax_weak, strtoimax);
72570af302Sopenharmony_ciweak_alias(strtoumax_weak, strtoumax);
73570af302Sopenharmony_ci#endif
74570af302Sopenharmony_ciweak_alias(strtoimax, __strtoimax_internal);
75570af302Sopenharmony_ciweak_alias(strtoumax, __strtoumax_internal);
76