|
|
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: * This is the array of class
16: * names for the classes returned
17: * by classify. The order of the
18: * classes is the same as the base
19: * of the namelist, with special
20: * negative index entries for structures,
21: * scalars, pointers, sets and strings
22: * to be collapsed into.
23: */
24: char *clnxxxx[] =
25: {
26: "file", /* -7 TFILE */
27: "record", /* -6 TREC */
28: "array", /* -5 TARY */
29: "scalar", /* -4 TSCAL */
30: "pointer", /* -3 TPTR */
31: "set", /* -2 TSET */
32: "string", /* -1 TSTR */
33: "SNARK", /* 0 NIL */
34: "Boolean", /* 1 TBOOL */
35: "char", /* 2 TCHAR */
36: "integer", /* 3 TINT */
37: "real", /* 4 TREAL */
38: "\"nil\"", /* 5 TNIL */
39: };
40:
41: char **clnames = &clnxxxx[-(TFIRST)];
42:
43: /*
44: * Classify takes a pointer
45: * to a type and returns one
46: * of several interesting group
47: * classifications for easy use.
48: */
49: classify(p1)
50: struct nl *p1;
51: {
52: register struct nl *p;
53:
54: p = p1;
55: swit:
56: if (p == NIL) {
57: nocascade();
58: return (NIL);
59: }
60: if (p == &nl[TSTR])
61: return (TSTR);
62: switch (p->class) {
63: case PTR:
64: return (TPTR);
65: case ARRAY:
66: if (p->type == nl+T1CHAR)
67: return (TSTR);
68: return (TARY);
69: case STR:
70: return (TSTR);
71: case SET:
72: return (TSET);
73: case RANGE:
74: p = p->type;
75: goto swit;
76: case TYPE:
77: if (p <= nl+TLAST)
78: return (p - nl);
79: panic("clas2");
80: case FILET:
81: return (TFILE);
82: case RECORD:
83: return (TREC);
84: case SCAL:
85: return (TSCAL);
86: default:
87: panic("clas");
88: }
89: }
90:
91: #ifndef PI0
92: /*
93: * Is p a text file?
94: */
95: text(p)
96: struct nl *p;
97: {
98:
99: return (p != NIL && p->class == FILET && p->type == nl+T1CHAR);
100: }
101: #endif
102:
103: /*
104: * Scalar returns a pointer to
105: * the the base scalar type of
106: * its argument if its argument
107: * is a SCALar else NIL.
108: */
109: scalar(p1)
110: struct nl *p1;
111: {
112: register struct nl *p;
113:
114: p = p1;
115: if (p == NIL)
116: return (NIL);
117: if (p->class == RANGE)
118: p = p->type;
119: if (p == NIL)
120: return (NIL);
121: return (p->class == SCAL ? p : NIL);
122: }
123:
124: /*
125: * Isa tells whether p
126: * is one of a group of
127: * namelist classes. The
128: * classes wanted are specified
129: * by the characters in s.
130: * (Note that s would more efficiently,
131: * if less clearly, be given by a mask.)
132: */
133: isa(p, s)
134: register struct nl *p;
135: char *s;
136: {
137: register i;
138: register char *cp;
139:
140: if (p == NIL)
141: return (NIL);
142: /*
143: * map ranges down to
144: * the base type
145: */
146: if (p->class == RANGE)
147: p = p->type;
148: /*
149: * the following character/class
150: * associations are made:
151: *
152: * s scalar
153: * b Boolean
154: * c character
155: * i integer
156: * d double (real)
157: * t set
158: */
159: switch (p->class) {
160: case SET:
161: i = TDOUBLE+1;
162: break;
163: case SCAL:
164: i = 0;
165: break;
166: default:
167: i = p - nl;
168: }
169: if (i >= 0 && i <= TDOUBLE+1) {
170: i = "sbcidt"[i];
171: cp = s;
172: while (*cp)
173: if (*cp++ == i)
174: return (1);
175: }
176: return (NIL);
177: }
178:
179: /*
180: * Isnta is !isa
181: */
182: isnta(p, s)
183: {
184:
185: return (!isa(p, s));
186: }
187:
188: /*
189: * "shorthand"
190: */
191: nameof(p)
192: {
193:
194: return (clnames[classify(p)]);
195: }
196:
197: #ifndef PI0
198: nowexp(r)
199: int *r;
200: {
201: if (r[0] == T_WEXP) {
202: if (r[2] == NIL)
203: error("Oct/hex allowed only on writeln/write calls");
204: else
205: error("Width expressions allowed only in writeln/write calls");
206: return (1);
207: }
208: return (NIL);
209: }
210: #endif
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.