uintspec.c
Author: cmaier@cmassoc.net

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

[PREV] [HOME] [NEXT]