|
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 |
}
|