1570af302Sopenharmony_ci#include <stdlib.h> 2570af302Sopenharmony_ci#include "shgetc.h" 3570af302Sopenharmony_ci#include "floatscan.h" 4570af302Sopenharmony_ci#include "stdio_impl.h" 5570af302Sopenharmony_ci 6570af302Sopenharmony_cistatic long double strtox(const char *s, char **p, int prec) 7570af302Sopenharmony_ci{ 8570af302Sopenharmony_ci FILE f; 9570af302Sopenharmony_ci sh_fromstring(&f, s); 10570af302Sopenharmony_ci shlim(&f, 0); 11570af302Sopenharmony_ci long double y = __floatscan(&f, prec, 1); 12570af302Sopenharmony_ci off_t cnt = shcnt(&f); 13570af302Sopenharmony_ci if (p) *p = cnt ? (char *)s + cnt : (char *)s; 14570af302Sopenharmony_ci return y; 15570af302Sopenharmony_ci} 16570af302Sopenharmony_ci 17570af302Sopenharmony_cifloat strtof(const char *restrict s, char **restrict p) 18570af302Sopenharmony_ci{ 19570af302Sopenharmony_ci return strtox(s, p, 0); 20570af302Sopenharmony_ci} 21570af302Sopenharmony_ci 22570af302Sopenharmony_cidouble strtod(const char *restrict s, char **restrict p) 23570af302Sopenharmony_ci{ 24570af302Sopenharmony_ci return strtox(s, p, 1); 25570af302Sopenharmony_ci} 26570af302Sopenharmony_ci 27570af302Sopenharmony_cilong double strtold(const char *restrict s, char **restrict p) 28570af302Sopenharmony_ci{ 29570af302Sopenharmony_ci return strtox(s, p, 2); 30570af302Sopenharmony_ci} 31570af302Sopenharmony_ci 32570af302Sopenharmony_ciweak_alias(strtof, strtof_l); 33570af302Sopenharmony_ciweak_alias(strtod, strtod_l); 34570af302Sopenharmony_ciweak_alias(strtold, strtold_l); 35570af302Sopenharmony_ciweak_alias(strtof, __strtof_l); 36570af302Sopenharmony_ciweak_alias(strtod, __strtod_l); 37570af302Sopenharmony_ciweak_alias(strtold, __strtold_l); 38