musl/src/stdlib/strtoumax.c
Rich Felker 47d027ee1a fix various bugs in new integer parser framework
1. my interpretation of subject sequence definition was wrong. adjust
parser to conform to the standard.

2. some code for handling tail overflow case was missing (forgot to
finish writing it).

3. typo (= instead of ==) caused ERANGE to wrongly behave like EINVAL
2011-07-14 22:11:00 -04:00

35 lines
579 B
C

#include <inttypes.h>
#include <stdlib.h>
#include <errno.h>
#include <ctype.h>
#include "intparse.h"
uintmax_t strtoumax(const char *s1, char **p, int base)
{
const unsigned char *s = (void *)s1;
struct intparse ip = {0};
if (p) *p = (char *)s1;
if (base && base-2U > 34) {
errno = EINVAL;
return 0;
}
for (; isspace(*s); s++);
ip.base = base;
__intparse(&ip, s, SIZE_MAX);
if (p && ip.err != EINVAL)
*p = (char *)s + ip.cnt;
if (ip.err) {
errno = ip.err;
if (ip.err == EINVAL) return 0;
return UINTMAX_MAX;
}
return ip.neg ? -ip.val : ip.val;
}