/*====================================================================*
*
* 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