/*==========================================================*/
/*  Number.c  -  Show how to acquire a (signed) number      */
/*               including doing error-checking             */
/*==========================================================*/
/*  Author:      Bary W Pollack                             */
/*  Modified:    March 11, 2005                             */
/*==========================================================*/

#include <stdio.h>
#include <stdlib.h>
#include <ctype.h>
#include <string.h>

#define  true  1
#define  false 0

/*==========================================================*/
/*  isAllNumerics is true if the buffere contains only      */
/*  valid numeric characters and/or whitespace              */
/*==========================================================*/

int isAllNumerics (char *buffer)
{
    int  goodNum = true;
    char *p;

    for (p = buffer; *p; p++)
        if (!isdigit (*p) && !isspace (*p) && *p != '-' && *p != '+')
        {
            goodNum = false;
            break;
        }
    return goodNum;
}

/*==========================================================*/
/*  getNumber acquires one (signed) number from the user    */
/*  It returns a -9 on input error or end-of-file           */
/*==========================================================*/

int getNumber (void)
{
    int   number;
    int   done = false;
    char  buffer [512];

    while (! done)
    {
        printf ("\nPlease type a number, then Enter:  ");
        if (fgets (buffer, sizeof (buffer), stdin) == NULL)
        {
            printf ("\nAn error or end-of-file has been encountered\n");
            printf ("getNumber will return '-9'\n\n");
            strcpy (buffer, "-9");
        }
        if (isAllNumerics (buffer))
        {
            number = atoi (buffer);
            done = true;
        }
        else
        {
            buffer [strlen(buffer) - 1] = '\0';
            printf ("\nThe information you typed: '%s' is NOT a valid number.  ", buffer);
            printf ("Try again...\n");
        }
    }

    return number;
}

/*==========================================================*/
/*  Drive getNumber; terminate when user presents -9        */
/*==========================================================*/

int main (void)
{
    int  number;

    printf ("\nType a number when asked; end the program by typing:  -9\n\n");

    do {
        number = getNumber ();
        printf ("The (valid) number you entered is: %d\n", number);
    } while (number != -9);

    printf ("\nFini!\n\n");
    getchar ();

    return 0;
}

/*==========================================================*/
