new restartable integer parsing framework.
[musl] / src / stdlib / strtoimax.c
1 #include <inttypes.h>
2 #include <errno.h>
3 #include <ctype.h>
4 #include "intparse.h"
5
6 intmax_t strtoimax(const char *s1, char **p, int base)
7 {
8         const unsigned char *s = (void *)s1;
9         struct intparse ip = {0};
10
11         if (p) *p = (char *)s1;
12
13         if (base && base-2U > 34) {
14                 errno = EINVAL;
15                 return 0;
16         }
17
18         for (; isspace(*s); s++);
19
20         ip.base = base;
21         __intparse(&ip, s, SIZE_MAX);
22
23         if (p && ip.err != EINVAL)
24                 *p = (char *)s + ip.cnt;
25
26         if (ip.err) {
27                 errno = ip.err;
28                 if (ip.err = EINVAL) return 0;
29                 return ip.neg ? INTMAX_MIN : INTMAX_MAX;
30         }
31
32         if (ip.val > INTMAX_MAX) {
33                 if (!ip.neg || -ip.val != INTMAX_MIN)
34                         errno = ERANGE;
35                 return ip.neg ? INTMAX_MIN : INTMAX_MAX;
36         }
37         return ip.neg ? -ip.val : ip.val;
38 }