|
|
BSD 4.3
#include "../h/rt.h"
/*
* cvint - convert the value represented by d into an integer and write
* the value into the location referenced by i. cvint returns one of
* T_INTEGER, T_LONGINT, and NULL depending on the outcome of the conversion.
*/
cvint(d, i)
register struct descrip *d;
long *i;
{
DclSave
union numeric result;
/*
* Use cvnum to attempt the conversion into "result".
*/
switch (cvnum(d, &result)) {
case T_LONGINT:
/*
* The value converted into an integer. Assign the value to *i.
* On systems with longs, distinguish between integer and long
* integer results via the return value.
*/
*i = result.integer;
#ifdef LONGS
if (*i < (long)(int)MINSHORT || *i > (long)(int)MAXSHORT)
return (T_LONGINT);
#endif LONGS
return (T_INTEGER);
case T_REAL:
/*
* The value converted into a real number. If it's not in the
* range of an integer, return a 0, otherwise convert the
* real value into an integer. As before, distinguish between
* integers and long integers if necessary.
*/
if (result.real > MAXLONG || result.real < MINLONG)
return (NULL);
*i = (long)result.real;
#ifdef LONGS
if (*i < MINSHORT || *i > MAXSHORT)
return (T_LONGINT);
#endif LONGS
return (T_INTEGER);
default:
return (NULL);
}
}
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.