Blame src/strtoul.c

Packit e8bc57
/* strtoul.c - replacement strtoul */
Packit e8bc57
/* (C) 2004 by Matthias Andree. License: GNU GPL v2. */
Packit e8bc57
Packit e8bc57
#include <errno.h>
Packit e8bc57
#include <limits.h>
Packit e8bc57
Packit e8bc57
unsigned long strtoul(const char *str, char **endptr, int base)
Packit e8bc57
{
Packit e8bc57
    unsigned long ret = 0;
Packit e8bc57
    if (base != 10) { errno = EINVAL; return 0ul; }
Packit e8bc57
Packit e8bc57
    while (*str >= '0' && *str <= '9')
Packit e8bc57
    {
Packit e8bc57
	if (ret * 10 < ret) goto ovl;
Packit e8bc57
	ret *= 10;
Packit e8bc57
	if (ret + (*str - '0') < ret) goto ovl;
Packit e8bc57
	ret += (*str - '0');
Packit e8bc57
	str++;
Packit e8bc57
    }
Packit e8bc57
    if (endptr) *endptr = (char *)str;
Packit e8bc57
    return 0;
Packit e8bc57
ovl:
Packit e8bc57
    errno = ERANGE;
Packit e8bc57
    return ULONG_MAX;
Packit e8bc57
}