|
|
1.1 root 1: /*% cc -c -O %
2: */
3: #include "vars.h"
4: int *
5: address()
6: {
7: register int sign, *a;
8: int opcnt, nextopand, *b;
9: register c;
10:
11: nextopand = -1;
12: sign = 1;
13: opcnt = 0;
14: a = dot;
15: do {
16: do c = getchar(); while (c==' ' || c=='\t');
17: if ('0'<=c && c<='9') {
18: peekc = c;
19: if (!opcnt)
20: a = zero;
21: a += sign*getnum();
22: } else switch (c) {
23: case '$':
24: a = dol;
25: /* fall through */
26: case '.':
27: if (opcnt)
28: error('a');
29: break;
30: case '\'':
31: c = getchar();
32: if (opcnt)
33: error('a');
34: if(posn(c, bname)<0)
35: error('k');
36: a = zero;
37: c = posn(c, bname); /* outside loop for efficiency */
38: do a++; while (a<=dol && names[c]!=(*a|01));
39: break;
40: case '?':
41: sign = -sign;
42: /* fall through */
43: case '/':
44: compile(c);
45: b = a;
46: for (;;) {
47: a += sign;
48: if (a<zero)
49: a = dol;
50: if (a>dol)
51: a = zero;
52: if (execute(a))
53: break;
54: if (a==b)
55: error('/');
56: }
57: break;
58: default:
59: if (nextopand == opcnt) {
60: a += sign;
61: if (a<zero || dol<a)
62: continue; /* error('$'); */
63: }
64: if (c!='+' && c!='-' && c!='^') {
65: peekc = c;
66: if (opcnt==0)
67: a = 0;
68: return (a);
69: }
70: sign = 1;
71: if (c!='+')
72: sign = -sign;
73: nextopand = ++opcnt;
74: continue;
75: }
76: sign = 1;
77: opcnt++;
78: } while (zero<=a && a<=dol);
79: error('$');
80: /*NOTREACHED*/
81: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.