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