/*====================================================================* * * uint64_t uintspec (char const * string, uint64_t minimum, uint64_t maximum); * * number.h * * convert a numeric string to an unsigned integer; confirm that * the result does not exceed the specified range; report errors * and terminate the program on error; * * Motley Tools by Charles Maier <cmaier@cmassoc.net>; * Copyright (c) 2001-2006 by Charles Maier Associates; * Licensed under the Internet Software Consortium License; * *--------------------------------------------------------------------*/ #ifndef UINTSPEC_SOURCE #define UINTSPEC_SOURCE #include <stdlib.h> #include <inttypes.h> #include <ctype.h> #include <errno.h> #include "../tools/number.h" #include "../tools/error.h" #include "../tools/types.h" uint64_t uintspec (char const * string, uint64_t minimum, uint64_t maximum) { char const * number = string; unsigned radix = RADIX_DEC; uint64_t value = 0; unsigned digit; if (*number == '0') { number++; if ((*number == 'b') || (*number == 'B')) { radix = RADIX_BIN; number++; } else if ((*number == 'x') || (*number == 'X')) { radix = RADIX_HEX; number++; } } while ((digit = todigit (*number)) < radix) { value *= radix; value += digit; number++; } if (*number) { error (1, EINVAL, "Have '%s' but want base %d integer", string, radix); } if ((value < minimum) || (value > maximum)) { error (1, ERANGE, "Have %s but want %" PRId64 " thru %" PRId64, string, minimum, maximum); } return (value); } #endif