blob: 7f2e9f79934b21936b45a2a29a730b14dda4e54c [file] [log] [blame]
/*
* Name: getInt
* Input: FILE ptr
* Output: integer value read
* Return: GET_INT_SUCCESS, or
* GET_INT_GET_STRING_FAILURE
* Description: The routine reads a space delimited integer from the
* current position of the FILE pointer. The routine uses
* getString() to obtain the character string representation
* of the integer and then uses the system level strtol() to
* find the integer value. Note that the getString() routine
* does not allow the read to cross an end-of-line indicator
* as opposed to the system routines which do. In the event
* of an error, the output value is set to an implausible
* amount, MINIMUM_VALUE_OF_INT, to indicate an error occurred
* along with an appropriate return code.
* Calls:
* System:
* strlen()
* strtol()
* Author: M.L.Rivas
*
* Revision History:
*
* Date Name Revision
* ------- --------------- ------------------------------
* 24May99 Matthew Rivas Created
*
* Copyright 1999, Atlantic Aerospace Electronics Corp.
*/
#include <assert.h> /* for assert() */
#include <errno.h> /* for extern errno definition */
#include <stdlib.h> /* for NULL definition */
#include <stdio.h> /* for FILE definition */
#include <string.h> /* for strlen() definition */
#include "dataManagement.h" /* for primitive type definitions */
#include "getInt.h" /* for getInt() return codes */
extern int errno;
/*
* Function prototype
*/
extern Char *getString( FILE *file );
Int getInt( FILE *file, /* FILE stream to read */
Int *value ) /* value to output */
{ /* begin getInt() */
Char *temp; /* temporary string returned by getString() */
Char *endptr; /* residual from conversion from string to int */
Int returnCode; /* return code for this routine */
assert( file );
assert( value );
/*
* Use utility routine getString to read the string representation of the
* Int. Check return code of getString for success or errors. On
* successful read of string, use system routine strtod to convert string
* to integer value. Check for errors returned from system call and range
* errors.
*/
temp = getString( file );
if ( temp != NULL ) {
/*
* A valid string was read from the input and is reference by temp
*/
*value = strtol( temp, &endptr, 0 );
if ( *value == 0 && strlen( endptr ) > 0 && errno == ERANGE ) {
*value = MINIMUM_VALUE_OF_INT;
returnCode = GET_INT_BAD_CONVERSION;
} /* end of strtol error check */
else {
if ( *value < MINIMUM_VALUE_OF_INT ) {
*value = MINIMUM_VALUE_OF_INT;
returnCode = GET_INT_RANGE_EXCEEDED;
} /* end of value < MINIMUM_VALUE_OF_INT */
else if ( *value > MAXIMUM_VALUE_OF_INT ) {
*value = MAXIMUM_VALUE_OF_INT;
returnCode = GET_INT_RANGE_EXCEEDED;
} /* end of value > MAXIMUM_VALUE_OF_INT */
else {
returnCode = GET_INT_SUCCESS;
} /* end of else - SUCCESS */
} /* end of else strtol did not error */
} /* end if temp != NULL */
else {
*value = MINIMUM_VALUE_OF_INT;
returnCode = GET_INT_EOI;
} /* end if GET_STRING end-of-input */
return ( returnCode );
} /* end of getInt() */