Files
musl/src/stdlib/wcstoumax.c
Rich Felker ecc9c5fcfa new restartable integer parsing framework.
this fixes a number of bugs in integer parsing due to lazy haphazard
wrapping, as well as some misinterpretations of the standard. the new
parser is able to work character-at-a-time or on whole strings, making
it easy to support the wide functions without unbounded space for
conversion. it will also be possible to update scanf to use the new
parser.
2011-07-14 00:51:45 -04:00

36 lines
611 B
C

#include <wchar.h>
#include <wctype.h>
#include <stdlib.h>
#include <inttypes.h>
#include <errno.h>
#include "intparse.h"
uintmax_t wcstoumax(const wchar_t *s, wchar_t **p, int base)
{
struct intparse ip = {0};
unsigned char tmp;
if (p) *p = (wchar_t *)s;
if (base && base-2U > 34) {
errno = EINVAL;
return 0;
}
for (; iswspace(*s); s++);
ip.base = base;
for (; *s<256 && (tmp=*s, __intparse(&ip, &tmp, 1)); s++);
if (p && ip.err != EINVAL)
*p = (wchar_t *)s;
if (ip.err) {
errno = ip.err;
if (ip.err = EINVAL) return 0;
return UINTMAX_MAX;
}
return ip.neg ? -ip.val : ip.val;
}