|
|
1.1 root 1: /*
2: * Lexical analysis routines.
3: */
4:
5: #include "ilink.h"
6: #include "opcode.h"
7:
8: static int nlflag = 0; /* newline last seen */
9:
10: /*
11: * getop - get an opcode from infile, return the opcode number (via
12: * binary search of opcode table), and point id at the name of the opcode.
13: */
14: getop(id)
15: char **id;
16: {
17: register char *s;
18: register struct opentry *p;
19: register int test;
20: int low, high, cmp;
21: extern char *getstr();
22:
23: s = getstr();
24: if (s == NULL)
25: return (EOF);
26: low = 0;
27: high = NOPCODES;
28: do {
29: test = (low + high) / 2;
30: p = &optable[test];
31: if ((cmp = strcmp(p->op_name, s)) < 0)
32: low = test + 1;
33: else if (cmp > 0)
34: high = test;
35: else {
36: *id = p->op_name;
37: return (p->op_code);
38: }
39: } while (low < high);
40: *id = s;
41: return (NULL);
42: }
43:
44: /*
45: * getid - get an identifier from infile, put it in the identifier
46: * table, and return a pointer to it.
47: */
48: char *getid()
49: {
50: register char *s;
51: extern char *getstr();
52: extern char *putident();
53:
54: s = getstr();
55: if (s == NULL)
56: return (NULL);
57: return (putident(strlen(s)+1));
58: }
59:
60: /*
61: * getstr - get an identifier from infile and return a pointer to it.
62: */
63: char *getstr()
64: {
65: register int c;
66: register char *p;
67:
68: p = sfree;
69: while ((c = getc(infile)) == ' ' || c == '\t') ;
70: if (c == EOF)
71: return (NULL);
72: while (c != ' ' && c != '\t' && c != '\n' && c != ',' && c != EOF) {
73: *p++ = c;
74: c = getc(infile);
75: }
76: *p = 0;
77: nlflag = (c == '\n');
78: return (sfree);
79: }
80:
81: /*
82: * getdec - get a decimal integer from infile, and return it.
83: */
84: getdec()
85: {
86: register int c, n;
87:
88: n = 0;
89: while ((c = getc(infile)) == ' ' || c == '\t') ;
90: if (c == EOF)
91: return (0);
92: while (c >= '0' && c <= '9') {
93: n = n * 10 + (c - '0');
94: c = getc(infile);
95: }
96: nlflag = (c == '\n');
97: return (n);
98: }
99:
100: /*
101: * getoct - get an octal number from infile, and return it.
102: */
103: getoct()
104: {
105: register int c, n;
106:
107: n = 0;
108: while ((c = getc(infile)) == ' ' || c == '\t') ;
109: if (c == EOF)
110: return (0);
111: while (c >= '0' && c <= '7') {
112: n = (n << 3) | (c - '0');
113: c = getc(infile);
114: }
115: nlflag = (c == '\n');
116: return (n);
117: }
118:
119: /*
120: * getint - get an Icon integer from infile, and return it.
121: */
122: long getint()
123: {
124: register c;
125: register int r;
126: long int n;
127:
128: n = 0L;
129: while ((c = getc(infile)) >= '0' && c <= '9')
130: n = n * 10 + (c - '0');
131: if (c == 'r' || c == 'R') {
132: r = n;
133: n = 0L;
134: while (c = getc(infile)) {
135: if (c >= '0' && c <= '9')
136: c -= '0';
137: else if (c >= 'a' && c <= 'z')
138: c -= 'a' - 10;
139: else if (c >= 'A' && c <= 'Z')
140: c -= 'A' - 10;
141: else
142: break;
143: n = n * r + c;
144: }
145: }
146: nlflag = (c == '\n');
147: return (n);
148: }
149:
150: /*
151: * getreal - get an Icon real number from infile, and return it.
152: */
153: double getreal()
154: {
155: double n;
156: register int c, d, e;
157: int esign;
158: static double tens[] = {
159: 1.0e0, 1.0e1, 1.0e2, 1.0e3, 1.0e4, 1.0e5,
160: 1.0e6, 1.0e7, 1.0e8, 1.0e9, 1.0e10, 1.0e11,
161: 1.0e12, 1.0e13, 1.0e14, 1.0e15, 1.0e16, 1.0e17,
162: 1.0e18, 1.0e19, 1.0e20, 1.0e21, 1.0e22, 1.0e23,
163: 1.0e24, 1.0e25, 1.0e26, 1.0e27, 1.0e28, 1.0e29,
164: 1.0e30, 1.0e31, 1.0e32, 1.0e33, 1.0e34, 1.0e35,
165: 1.0e36, 1.0e37, 1.0e38
166: };
167: static double ntens[] = {
168: 1.0e0, 1.0e-1, 1.0e-2, 1.0e-3, 1.0e-4, 1.0e-5,
169: 1.0e-6, 1.0e-7, 1.0e-8, 1.0e-9, 1.0e-10, 1.0e-11,
170: 1.0e-12, 1.0e-13, 1.0e-14, 1.0e-15, 1.0e-16, 1.0e-17,
171: 1.0e-18, 1.0e-19, 1.0e-20, 1.0e-21, 1.0e-22, 1.0e-23,
172: 1.0e-24, 1.0e-25, 1.0e-26, 1.0e-27, 1.0e-28, 1.0e-29,
173: 1.0e-30, 1.0e-31, 1.0e-32, 1.0e-33, 1.0e-34, 1.0e-35,
174: 1.0e-36, 1.0e-37, 1.0e-38
175: };
176:
177: n = 0.0;
178: d = e = 0;
179: esign = 1;
180: while ((c = getc(infile)) >= '0' && c <= '9')
181: n = n * 10 + (c - '0');
182: if (c == '.') {
183: while ((c = getc(infile)) >= '0' && c <= '9') {
184: n = n * 10 + (c - '0');
185: d++;
186: }
187: }
188: if (c == 'e' || c == 'E') {
189: if ((c = getc(infile)) == '+' || c == '-') {
190: if (c == '-')
191: esign = -1;
192: c = getc(infile);
193: }
194: while (c >= '0' && c <= '9') {
195: e = e * 10 + (c - '0');
196: c = getc(infile);
197: }
198: }
199: if (esign < 0)
200: e = -e;
201: e = e - d;
202: if (e >= -38 && e < 0)
203: n = n * ntens[-e];
204: else if (e > 0 && e <= 38)
205: n = n * tens[e];
206: nlflag = (c == '\n');
207: return (n);
208: }
209:
210: /*
211: * getlab - get a label ("L" followed by a number) from infile,
212: * and return the number.
213: */
214:
215: getlab()
216: {
217: register int c;
218:
219: while ((c = getc(infile)) != 'L' && c != EOF && c != '\n') ;
220: if (c == 'L')
221: return (getdec());
222: nlflag = (c == '\n');
223: return (0);
224: }
225:
226: /*
227: * getstrlit - get a string literal from infile, as a string
228: * of octal bytes, and return it.
229: */
230: char *getstrlit(l)
231: register int l;
232: {
233: register char *p;
234: extern char *putident();
235:
236: p = sfree;
237: while (!nlflag && l--)
238: *p++ = getoct();
239: *p++ = 0;
240: return (putident(p-sfree));
241: }
242:
243: /*
244: * newline - skip to next line.
245: */
246: newline()
247: {
248: register int c;
249:
250: if (!nlflag) {
251: while ((c = getc(infile)) != '\n' && c != EOF) ;
252: }
253: nlflag = 0;
254: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.