00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022 #include <config.h>
00023
00024 #include <ctype.h>
00025 #include <errno.h>
00026 #include <limits.h>
00027
00028 #include <isc/parseint.h>
00029 #include <isc/result.h>
00030 #include <isc/stdlib.h>
00031
00032 isc_result_t
00033 isc_parse_uint32(isc_uint32_t *uip, const char *string, int base) {
00034 unsigned long n;
00035 isc_uint32_t r;
00036 char *e;
00037 if (! isalnum((unsigned char)(string[0])))
00038 return (ISC_R_BADNUMBER);
00039 errno = 0;
00040 n = strtoul(string, &e, base);
00041 if (*e != '\0')
00042 return (ISC_R_BADNUMBER);
00043
00044
00045
00046
00047
00048 r = (isc_uint32_t)n;
00049 if ((n == ULONG_MAX && errno == ERANGE) || (n != (unsigned long)r))
00050 return (ISC_R_RANGE);
00051 *uip = r;
00052 return (ISC_R_SUCCESS);
00053 }
00054
00055 isc_result_t
00056 isc_parse_uint16(isc_uint16_t *uip, const char *string, int base) {
00057 isc_uint32_t val;
00058 isc_result_t result;
00059 result = isc_parse_uint32(&val, string, base);
00060 if (result != ISC_R_SUCCESS)
00061 return (result);
00062 if (val > 0xFFFF)
00063 return (ISC_R_RANGE);
00064 *uip = (isc_uint16_t) val;
00065 return (ISC_R_SUCCESS);
00066 }
00067
00068 isc_result_t
00069 isc_parse_uint8(isc_uint8_t *uip, const char *string, int base) {
00070 isc_uint32_t val;
00071 isc_result_t result;
00072 result = isc_parse_uint32(&val, string, base);
00073 if (result != ISC_R_SUCCESS)
00074 return (result);
00075 if (val > 0xFF)
00076 return (ISC_R_RANGE);
00077 *uip = (isc_uint8_t) val;
00078 return (ISC_R_SUCCESS);
00079 }