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