|
|
1.1 root 1: /* Copyright (c) 1979 Regents of the University of California */
2: #
3: /*
4: * pi - Pascal interpreter code translator
5: *
6: * Charles Haley, Bill Joy UCB
7: * Version 1.2 November 1978
8: */
9:
10: #include "whoami"
11: #include "0.h"
12: #include "tree.h"
13:
14: /*
15: * Const enters the definitions
16: * of the constant declaration
17: * part into the namelist.
18: */
19: #ifndef PI1
20: constbeg()
21: {
22:
23: if (parts & (TPRT|VPRT))
24: error("Constant declarations must precede type and variable declarations");
25: if (parts & CPRT)
26: error("All constants must be declared in one const part");
27: parts |= CPRT;
28: }
29: #endif
30:
31: const(cline, cid, cdecl)
32: int cline;
33: register char *cid;
34: register int *cdecl;
35: {
36: register struct nl *np;
37:
38: #ifdef PI0
39: send(REVCNST, cline, cid, cdecl);
40: #endif
41: line = cline;
42: gconst(cdecl);
43: np = enter(defnl(cid, CONST, con.ctype, con.cival));
44: #ifndef PI0
45: np->nl_flags |= NMOD;
46: #endif
47: # ifdef PTREE
48: {
49: pPointer Const = ConstDecl( cid , cdecl );
50: pPointer *Consts;
51:
52: pSeize( PorFHeader[ nesting ] );
53: Consts = &( pDEF( PorFHeader[ nesting ] ).PorFConsts );
54: *Consts = ListAppend( *Consts , Const );
55: pRelease( PorFHeader[ nesting ] );
56: }
57: # endif
58: if (con.ctype == NIL)
59: return;
60: if ( con.ctype == nl + TSTR )
61: np->ptr[0] = con.cpval;
62: if (isa(con.ctype, "i"))
63: np->range[0] = con.crval;
64: else if (isa(con.ctype, "d"))
65: np->real = con.crval;
66: }
67:
68: #ifndef PI0
69: #ifndef PI1
70: constend()
71: {
72:
73: }
74: #endif
75: #endif
76:
77: /*
78: * Gconst extracts
79: * a constant declaration
80: * from the tree for it.
81: * only types of constants
82: * are integer, reals, strings
83: * and scalars, the first two
84: * being possibly signed.
85: */
86: gconst(r)
87: int *r;
88: {
89: register struct nl *np;
90: register *cn;
91: char *cp;
92: int negd, sgnd;
93: long ci;
94:
95: con.ctype = NIL;
96: cn = r;
97: negd = sgnd = 0;
98: loop:
99: if (cn == NIL || cn[1] == NIL)
100: return (NIL);
101: switch (cn[0]) {
102: default:
103: panic("gconst");
104: case T_MINUSC:
105: negd = 1 - negd;
106: case T_PLUSC:
107: sgnd++;
108: cn = cn[1];
109: goto loop;
110: case T_ID:
111: np = lookup(cn[1]);
112: if (np == NIL)
113: return;
114: if (np->class != CONST) {
115: derror("%s is a %s, not a constant as required", cn[1], classes[np->class]);
116: return;
117: }
118: con.ctype = np->type;
119: switch (classify(np->type)) {
120: case TINT:
121: con.crval = np->range[0];
122: break;
123: case TDOUBLE:
124: con.crval = np->real;
125: break;
126: case TBOOL:
127: case TCHAR:
128: case TSCAL:
129: con.cival = np->value[0];
130: con.crval = con.cival;
131: break;
132: case TSTR:
133: con.cpval = np->ptr[0];
134: break;
135: case NIL:
136: con.ctype = NIL;
137: return;
138: default:
139: panic("gconst2");
140: }
141: break;
142: case T_CBINT:
143: con.crval = a8tol(cn[1]);
144: goto restcon;
145: case T_CINT:
146: con.crval = atof(cn[1]);
147: if (con.crval > MAXINT || con.crval < MININT) {
148: derror("Constant too large for this implementation");
149: con.crval = 0;
150: }
151: restcon:
152: ci = con.crval;
153: #ifndef PI0
154: if (bytes(ci, ci) <= 2)
155: con.ctype = nl+T2INT;
156: else
157: #endif
158: con.ctype = nl+T4INT;
159: break;
160: case T_CFINT:
161: con.ctype = nl+TDOUBLE;
162: con.crval = atof(cn[1]);
163: break;
164: case T_CSTRNG:
165: cp = cn[1];
166: if (cp[1] == 0) {
167: con.ctype = nl+T1CHAR;
168: con.cival = cp[0];
169: con.crval = con.cival;
170: break;
171: }
172: con.ctype = nl+TSTR;
173: con.cpval = savestr(cp);
174: break;
175: }
176: if (sgnd) {
177: if (isnta(con.ctype, "id"))
178: derror("%s constants cannot be signed", nameof(con.ctype));
179: else {
180: if (negd)
181: con.crval = -con.crval;
182: ci = con.crval;
183: #ifndef PI0
184: if (bytes(ci, ci) <= 2)
185: con.ctype = nl+T2INT;
186: #endif
187: }
188: }
189: }
190:
191: #ifndef PI0
192: isconst(r)
193: register int *r;
194: {
195:
196: if (r == NIL)
197: return (1);
198: switch (r[0]) {
199: case T_MINUS:
200: r[0] = T_MINUSC;
201: r[1] = r[2];
202: return (isconst(r[1]));
203: case T_PLUS:
204: r[0] = T_PLUSC;
205: r[1] = r[2];
206: return (isconst(r[1]));
207: case T_VAR:
208: if (r[3] != NIL)
209: return (0);
210: r[0] = T_ID;
211: r[1] = r[2];
212: return (1);
213: case T_BINT:
214: r[0] = T_CBINT;
215: r[1] = r[2];
216: return (1);
217: case T_INT:
218: r[0] = T_CINT;
219: r[1] = r[2];
220: return (1);
221: case T_FINT:
222: r[0] = T_CFINT;
223: r[1] = r[2];
224: return (1);
225: case T_STRNG:
226: r[0] = T_CSTRNG;
227: r[1] = r[2];
228: return (1);
229: }
230: return (0);
231: }
232: #endif
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.