ING_DB
This commit is contained in:
parent
243ab6f7bd
commit
e498b354aa
|
|
@ -0,0 +1,125 @@
|
|||
# include "amx.h"
|
||||
|
||||
/*
|
||||
** Scans numerical constants (both integer and floating). Each
|
||||
** constant is converted from ascii to its numerical representation
|
||||
** and is entered into the symbol table, indexed by 'yylval'.
|
||||
** A token is returned for the number type.
|
||||
**
|
||||
** Due to the current atof in the utility library, floating overflow
|
||||
** is not checked.
|
||||
*/
|
||||
number(chr)
|
||||
register int chr;
|
||||
{
|
||||
register char *ptr;
|
||||
register int lsave;
|
||||
double ftemp;
|
||||
long ltemp;
|
||||
char buf[MAXFIELD];
|
||||
extern char *yylval;
|
||||
extern char *syment();
|
||||
|
||||
lsave = Lcase;
|
||||
Lcase = 0;
|
||||
ptr = buf;
|
||||
|
||||
if ((*ptr = chr) != '.')
|
||||
{
|
||||
do
|
||||
{
|
||||
/* get integer portion */
|
||||
if ((ptr - buf) >= MAXFIELD)
|
||||
{
|
||||
/* number too long */
|
||||
amxerror(84);
|
||||
break;
|
||||
}
|
||||
*(++ptr) = chr = gtchar();
|
||||
} while (CMAP(chr) == NUMBR);
|
||||
}
|
||||
|
||||
/* do rest of type determination */
|
||||
switch (chr)
|
||||
{
|
||||
case '.':
|
||||
/* floating point */
|
||||
do
|
||||
{
|
||||
/* fill into ptr with up to next non-digit */
|
||||
if ((ptr - buf) >= MAXFIELD)
|
||||
{
|
||||
/* number too long */
|
||||
amxerror(84);
|
||||
break;
|
||||
}
|
||||
*(++ptr) = chr = gtchar();
|
||||
} while (CMAP(chr) == NUMBR);
|
||||
if (chr != 'e' && chr != 'E')
|
||||
{
|
||||
backup(chr);
|
||||
goto convr;
|
||||
}
|
||||
|
||||
case 'e':
|
||||
case 'E':
|
||||
if ((ptr - buf) >= MAXFIELD)
|
||||
{
|
||||
/* number too long */
|
||||
amxerror(84);
|
||||
goto convb;
|
||||
}
|
||||
*(++ptr) = chr = gtchar();
|
||||
if (CMAP(chr) == NUMBR || chr == '-' || chr == '+')
|
||||
{
|
||||
do
|
||||
{
|
||||
/* get exponent */
|
||||
if ((ptr - buf) >= MAXFIELD)
|
||||
{
|
||||
/* number too long */
|
||||
amxerror(84);
|
||||
break;
|
||||
}
|
||||
*(++ptr) = chr = gtchar();
|
||||
} while (CMAP(chr) == NUMBR);
|
||||
}
|
||||
backup(chr);
|
||||
convr:
|
||||
*ptr = 0;
|
||||
if (AA_atof(buf, &ftemp))
|
||||
{
|
||||
/* floating conversion error */
|
||||
amxerror(85, buf);
|
||||
convb:
|
||||
ftemp = 0;
|
||||
}
|
||||
yylval = syment(buf, AAlength(buf) + 1);
|
||||
chr = Tokens.rconst;
|
||||
break;
|
||||
|
||||
default:
|
||||
/* integer */
|
||||
backup(chr);
|
||||
*ptr = 0;
|
||||
if (AA_atol(buf, <emp))
|
||||
{
|
||||
/* integer conversion error */
|
||||
amxerror(86, buf);
|
||||
ltemp = 0;
|
||||
}
|
||||
if (ltemp < -32768 || ltemp > 32767)
|
||||
{
|
||||
yylval = syment(<emp, sizeof (long) + 1);
|
||||
chr = Tokens.lconst;
|
||||
}
|
||||
else
|
||||
{
|
||||
yylval = (char *) ltemp;
|
||||
chr = Tokens.iconst;
|
||||
}
|
||||
break;
|
||||
}
|
||||
Lcase = lsave;
|
||||
return (chr);
|
||||
}
|
||||
Loading…
Reference in New Issue