1: # include <ingres.h>
2: # include <aux.h>
3: # include "scanner.h"
4: # include <sccs.h>
5: # include <errors.h>
6:
7: SCCSID(@(#)s_number.c 8.3 1/31/86)
8:
9: /*
10: ** NUMBER
11: ** scans numerical constants (both integer and floating). Each
12: ** constant is converted from ascii to its numerical representation
13: ** and is entered into the symbol table, indexed by 'yylval'.
14: ** A token is returned for the number type.
15: **
16: ** due to the current atof in the utility library, floating overflow
17: ** is not checked.
18: */
19: number(chr)
20: char chr;
21: {
22: extern char Cmap[];
23: extern int yylval;
24: double ftemp;
25: long ltemp;
26: short itemp;
27: char buf[256];
28: register int lsave;
29: register char *ptr;
30:
31: lsave = Lcase;
32: Lcase = 0;
33: ptr = buf;
34: if ((*ptr = chr) != '.')
35: {
36: do
37: {
38: /* get integer portion */
39: if ((ptr - buf) >= 256)
40: /* buffer overflow */
41: par_error(NUMBUFOFLO, WARN, 0);
42: *++ptr = get_scan(NORMAL);
43: } while (Cmap[*ptr] == NUMBR);
44: }
45:
46: /* do rest of type determination */
47: switch (*ptr)
48: {
49: case '.':
50: /* floating point */
51: do
52: {
53: /* fill into ptr with up to next non-digit */
54: if ((ptr - buf) >= 256)
55: par_error(NUMBUFOFLO, WARN, 0); /* buf oflo */
56: *++ptr = get_scan(NORMAL);
57: } while (Cmap[*ptr] == NUMBR);
58: if (*ptr != 'e' && *ptr != 'E')
59: {
60: backup(*ptr);
61: *ptr = 0;
62: goto convr;
63: }
64:
65: case 'e':
66: case 'E':
67: if ((ptr - buf) >= 256)
68: par_error(NUMBUFOFLO, WARN, 0); /* buf oflo */
69: *++ptr = get_scan(NORMAL);
70: if (Cmap[*ptr] == NUMBR || *ptr == '-' || *ptr == '+')
71: {
72: do
73: {
74: /* get exponent */
75: if ((ptr - buf) >= 256)
76: par_error(NUMBUFOFLO, WARN, 0); /* buf oflo */
77: *++ptr = get_scan(NORMAL);
78: } while (Cmap[*ptr] == NUMBR);
79: }
80: backup(*ptr);
81: *ptr = 0;
82: convr:
83: if (atof(buf, &ftemp))
84: par_error(FCONSTERR, WARN, buf, 0); /* floating conversion error */
85: yylval = syment(&ftemp, 8);
86: Lastok.toktyp = Tokens.f8const;
87: break;
88:
89: default:
90: /* integer */
91: backup(*ptr);
92: *ptr = 0;
93: if (atol(buf, <emp)) /* long conversion error */
94: goto convr;
95: if (ltemp > 32767)
96: {
97: yylval = syment(<emp, 4);
98: Lastok.toktyp = Tokens.i4const;
99: break;
100: }
101: itemp = ltemp;
102: yylval = syment(&itemp, 2);
103: Lastok.toktyp = Tokens.i2const;
104: break;
105: }
106: Lcase = lsave;
107: Lastok.tok = (char *) yylval;
108: Lastok.tokop = 0;
109: return (Lastok.toktyp);
110: }
Defined functions
number
defined in line
7; used 2 times