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