xref: /aosp_15_r20/external/musl/src/stdlib/strtol.c (revision c9945492fdd68bbe62686c5b452b4dc1be3f8453)
1*c9945492SAndroid Build Coastguard Worker #include "stdio_impl.h"
2*c9945492SAndroid Build Coastguard Worker #include "intscan.h"
3*c9945492SAndroid Build Coastguard Worker #include "shgetc.h"
4*c9945492SAndroid Build Coastguard Worker #include <inttypes.h>
5*c9945492SAndroid Build Coastguard Worker #include <limits.h>
6*c9945492SAndroid Build Coastguard Worker #include <ctype.h>
7*c9945492SAndroid Build Coastguard Worker 
strtox(const char * s,char ** p,int base,unsigned long long lim)8*c9945492SAndroid Build Coastguard Worker static unsigned long long strtox(const char *s, char **p, int base, unsigned long long lim)
9*c9945492SAndroid Build Coastguard Worker {
10*c9945492SAndroid Build Coastguard Worker 	FILE f;
11*c9945492SAndroid Build Coastguard Worker 	sh_fromstring(&f, s);
12*c9945492SAndroid Build Coastguard Worker 	shlim(&f, 0);
13*c9945492SAndroid Build Coastguard Worker 	unsigned long long y = __intscan(&f, base, 1, lim);
14*c9945492SAndroid Build Coastguard Worker 	if (p) {
15*c9945492SAndroid Build Coastguard Worker 		size_t cnt = shcnt(&f);
16*c9945492SAndroid Build Coastguard Worker 		*p = (char *)s + cnt;
17*c9945492SAndroid Build Coastguard Worker 	}
18*c9945492SAndroid Build Coastguard Worker 	return y;
19*c9945492SAndroid Build Coastguard Worker }
20*c9945492SAndroid Build Coastguard Worker 
strtoull(const char * restrict s,char ** restrict p,int base)21*c9945492SAndroid Build Coastguard Worker unsigned long long strtoull(const char *restrict s, char **restrict p, int base)
22*c9945492SAndroid Build Coastguard Worker {
23*c9945492SAndroid Build Coastguard Worker 	return strtox(s, p, base, ULLONG_MAX);
24*c9945492SAndroid Build Coastguard Worker }
25*c9945492SAndroid Build Coastguard Worker 
strtoll(const char * restrict s,char ** restrict p,int base)26*c9945492SAndroid Build Coastguard Worker long long strtoll(const char *restrict s, char **restrict p, int base)
27*c9945492SAndroid Build Coastguard Worker {
28*c9945492SAndroid Build Coastguard Worker 	return strtox(s, p, base, LLONG_MIN);
29*c9945492SAndroid Build Coastguard Worker }
30*c9945492SAndroid Build Coastguard Worker 
strtoul(const char * restrict s,char ** restrict p,int base)31*c9945492SAndroid Build Coastguard Worker unsigned long strtoul(const char *restrict s, char **restrict p, int base)
32*c9945492SAndroid Build Coastguard Worker {
33*c9945492SAndroid Build Coastguard Worker 	return strtox(s, p, base, ULONG_MAX);
34*c9945492SAndroid Build Coastguard Worker }
35*c9945492SAndroid Build Coastguard Worker 
strtol(const char * restrict s,char ** restrict p,int base)36*c9945492SAndroid Build Coastguard Worker long strtol(const char *restrict s, char **restrict p, int base)
37*c9945492SAndroid Build Coastguard Worker {
38*c9945492SAndroid Build Coastguard Worker 	return strtox(s, p, base, 0UL+LONG_MIN);
39*c9945492SAndroid Build Coastguard Worker }
40*c9945492SAndroid Build Coastguard Worker 
strtoimax(const char * restrict s,char ** restrict p,int base)41*c9945492SAndroid Build Coastguard Worker intmax_t strtoimax(const char *restrict s, char **restrict p, int base)
42*c9945492SAndroid Build Coastguard Worker {
43*c9945492SAndroid Build Coastguard Worker 	return strtoll(s, p, base);
44*c9945492SAndroid Build Coastguard Worker }
45*c9945492SAndroid Build Coastguard Worker 
strtoumax(const char * restrict s,char ** restrict p,int base)46*c9945492SAndroid Build Coastguard Worker uintmax_t strtoumax(const char *restrict s, char **restrict p, int base)
47*c9945492SAndroid Build Coastguard Worker {
48*c9945492SAndroid Build Coastguard Worker 	return strtoull(s, p, base);
49*c9945492SAndroid Build Coastguard Worker }
50*c9945492SAndroid Build Coastguard Worker 
51*c9945492SAndroid Build Coastguard Worker weak_alias(strtol, __strtol_internal);
52*c9945492SAndroid Build Coastguard Worker weak_alias(strtoul, __strtoul_internal);
53*c9945492SAndroid Build Coastguard Worker weak_alias(strtoll, __strtoll_internal);
54*c9945492SAndroid Build Coastguard Worker weak_alias(strtoull, __strtoull_internal);
55*c9945492SAndroid Build Coastguard Worker weak_alias(strtoimax, __strtoimax_internal);
56*c9945492SAndroid Build Coastguard Worker weak_alias(strtoumax, __strtoumax_internal);
57