#include <config.h>
#include <ctype.h>
#include <errno.h>
#include <limits.h>
#include <isc/parseint.h>
#include <isc/result.h>
#include <isc/stdlib.h>
isc_result_t
isc_parse_uint32(isc_uint32_t *uip, const char *string, int base) {
unsigned long n;
char *e;
if (! isalnum((unsigned char)(string[0])))
return (ISC_R_BADNUMBER);
errno = 0;
n = strtoul(string, &e, base);
if (*e != '\0')
return (ISC_R_BADNUMBER);
if (n == ULONG_MAX && errno == ERANGE)
return (ISC_R_RANGE);
*uip = n;
return (ISC_R_SUCCESS);
}
isc_result_t
isc_parse_uint16(isc_uint16_t *uip, const char *string, int base) {
isc_uint32_t val;
isc_result_t result;
result = isc_parse_uint32(&val, string, base);
if (result != ISC_R_SUCCESS)
return (result);
if (val > 0xFFFF)
return (ISC_R_RANGE);
*uip = (isc_uint16_t) val;
return (ISC_R_SUCCESS);
}
isc_result_t
isc_parse_uint8(isc_uint8_t *uip, const char *string, int base) {
isc_uint32_t val;
isc_result_t result;
result = isc_parse_uint32(&val, string, base);
if (result != ISC_R_SUCCESS)
return (result);
if (val > 0xFF)
return (ISC_R_RANGE);
*uip = (isc_uint8_t) val;
return (ISC_R_SUCCESS);
}