|
|
1.1 root 1: #include <ctype.h>
2: #include "defs"
3:
4: char * copys(s)
5: register char *s;
6: {
7: register char *t;
8: char *k;
9: ptr calloc();
10:
11: for(t=s; *t++ ; );
12: if( (k = (char *)calloc( t-s , sizeof(char))) == NULL)
13: fatal("Cannot allocate memory");
14:
15: for(t=k ; *t++ = *s++ ; );
16: return(k);
17: }
18:
19:
20:
21: equals(a,b)
22: register char *a,*b;
23: {
24: if(a==b) return(YES);
25:
26: while(*a == *b)
27: if(*a == '\0') return(YES);
28: else {++a; ++b;}
29:
30: return(NO);
31: }
32:
33:
34: char *concat(a,b,c) /* c = concatenation of a and b */
35: register char *a,*b;
36: char *c;
37: {
38: register char *t;
39: t = c;
40:
41: while(*t = *a++) t++;
42: while(*t++ = *b++);
43: return(c);
44: }
45:
46:
47:
48:
49:
50: ptr conrep(a,b)
51: char *a, *b;
52: {
53: char *s;
54:
55: s = (char *)intalloc( strlen(a)+strlen(b)+1 );
56: concat(a,b,s);
57: cfree(a);
58: return((int *)s);
59: }
60:
61:
62: eqcon(p,q)
63: register ptr p, q;
64: {
65: int pt, qt;
66:
67: if(p==q) return(YES);
68: if(p==NULL || q==NULL) return(NO);
69: pt = p->tag;
70: qt = q->tag;
71: if(pt==TNEGOP && qt==TNEGOP)
72: return( eqcon(p->leftp, q->leftp) );
73: if(pt==TCONST && qt==TNEGOP)
74: return(NO);
75: if(pt==TNEGOP && qt==TCONST)
76: return(NO);
77: if(p->tag==TCONST && q->tag==TCONST)
78: return( equals(p->leftp,q->leftp) );
79:
80: fatal("eqcon: nonconstant argument");
81: /* NOTREACHED */ return 0;
82: }
83:
84:
85:
86: char *convic(n)
87: register int n;
88: {
89: static char s[20];
90: register char *t;
91:
92: s[19] = '\0';
93: t = s+19;
94:
95: do {
96: *--t = '0' + n%10;
97: n /= 10;
98: } while(n > 0);
99:
100: return(t);
101: }
102:
103:
104:
105: conval(p)
106: register ptr p;
107: {
108: int val;
109: if(isicon(p, &val))
110: return(val);
111: fatal("bad conval");
112: return 0;
113: }
114:
115:
116:
117: isicon(p, valp)
118: ptr p;
119: int *valp;
120: {
121: int val1;
122:
123: if(p)
124: switch(p->tag)
125: {
126: case TNEGOP:
127: if(isicon(p->leftp, &val1))
128: {
129: *valp = - val1;
130: return(1);
131: }
132: break;
133:
134: case TCONST:
135: if(p->vtype == TYINT)
136: {
137: *valp = convci(p->leftp);
138: return(YES);
139: }
140: default:
141: break;
142: }
143: return(NO);
144: }
145:
146:
147:
148: isconst(p)
149: ptr p;
150: {
151: return(p->tag==TCONST || (p->tag==TNEGOP && isconst(p->leftp)) );
152: }
153:
154:
155:
156: iszero(s)
157: register char *s;
158: {
159: if(s == NULL)
160: return(YES);
161: while( *s=='+' || *s=='-' || *s==' ' )
162: ++s;
163: while( *s=='0' || *s=='.' )
164: ++s;
165: switch( *s )
166: {
167: case 'd':
168: case 'e':
169: case 'D':
170: case 'E':
171: case ' ':
172: case '\0':
173: return(YES);
174: default:
175: return(NO);
176: }
177: }
178:
179:
180:
181:
182: convci(p)
183: register char *p;
184: {
185: register int n;
186: register int sgn;
187:
188: n = 0;
189: sgn = 1;
190: for( ; *p ; ++p)
191: if(*p == '-')
192: sgn = -1;
193: else if( isdigit(*p) )
194: n = 10*n + (*p - '0');
195:
196: return(sgn * n);
197: }
198:
199:
200:
201: chainp hookup(x,y)
202: register chainp x, y;
203: {
204: register chainp p;
205:
206: if(x == NULL)
207: return(y);
208: for(p=x ; p->nextp ; p = (chainp)p->nextp)
209: ;
210:
211: p->nextp = (int *)y;
212: return(x);
213: }
214:
215:
216: ptr cpexpr(p)
217: register ptr p;
218: {
219: register ptr e;
220: ptr q, q1;
221:
222: if(p == NULL)
223: return(NULL);
224:
225: e = allexpblock();
226: cpblock(p, e, sizeof(struct exprblock));
227:
228: switch(p->tag)
229: {
230: case TAROP:
231: case TRELOP:
232: case TLOGOP:
233: case TASGNOP:
234: case TCALL:
235: e->rightp = cpexpr(p->rightp);
236:
237: case TNOTOP:
238: case TNEGOP:
239: e->leftp = cpexpr(p->leftp);
240: break;
241:
242: case TCONST:
243: e->leftp = (int *)copys(p->leftp);
244: if(p->rightp)
245: e->rightp = (int *)copys(p->rightp);
246: if(p->vtype == TYCHAR)
247: e->vtypep = cpexpr(p->vtypep);
248: break;
249:
250: case TLIST:
251: q1 = (int *)&(e->leftp);
252: for(q = p->leftp ; q ; q = q->nextp)
253: q1 = q1->nextp = (int *)mkchain( cpexpr(q->datap), CHNULL);
254: break;
255:
256: case TTEMP:
257: case TNAME:
258: case TFTNBLOCK:
259: if(p->vsubs)
260: e->vsubs = cpexpr(p->vsubs);
261: if(p->voffset)
262: e->voffset = cpexpr(p->voffset);
263: break;
264:
265: case TERROR:
266: break;
267:
268: default:
269: badtag("cpexpr", p->tag);
270: }
271: return(e);
272: }
273:
274:
275: mvexpr(p,q)
276: char *p, *q;
277: {
278: cpblock(p,q, sizeof(struct exprblock) );
279: frexpblock(p);
280: }
281:
282:
283: cpblock(p,q,n)
284: register char *p, *q;
285: int n;
286: {
287: register int i;
288:
289: for(i=0; i<n; ++i)
290: *q++ = *p++;
291: }
292:
293:
294:
295: strlen(s)
296: register char *s;
297: {
298: register char *t;
299: for(t=s ; *t ; t++ ) ;
300: return(t-s);
301: }
302:
303:
304: char *procnm() /* name of the current procedure */
305: {
306: return( procname ? ((struct stentry *)procname->sthead)->namep : "" );
307: }
308:
309:
310:
311:
312:
313: ptr arg1(a) /* make an argument list of one value */
314: ptr a;
315: {
316: return( mknode(TLIST,0, mkchain(a,CHNULL), PNULL) );
317: }
318:
319:
320:
321: ptr arg2(a,b) /* make an argumentlist (a,b) */
322: ptr a,b;
323: {
324: register ptr p;
325:
326: p = (int *)mkchain(a, mkchain(b,CHNULL) );
327: return( mknode(TLIST,0, p,0) );
328: }
329:
330:
331:
332:
333: ptr arg4(a,b) /* make an argument list of (a,len(a), b,len(b)) */
334: ptr a,b;
335: {
336: register ptr p;
337: p = (int *)mkchain(b, mkchain(cpexpr(b->vtypep), CHNULL));
338: p = (int *)mkchain(a, mkchain(cpexpr(a->vtypep), p));
339: return( mknode(TLIST,0,p,PNULL));
340: }
341:
342:
343:
344: ptr builtin(type,s)
345: int type;
346: char *s;
347: {
348: register ptr p, q = 0;
349: ptr mkvar(), mkname();
350:
351: if(p = (int *)name(s,1))
352: {
353: if(p->blklevel>1 || (p->tag!=TNAME && p->tag!=TKEYWORD)
354: || (q=p->varp)==0 || q->vext
355: || (q->vtype!=type && q->vtype!=TYUNDEFINED) )
356: {
357: exprerr("error involving builtin %s", s);
358: return(errnode());
359: }
360: if(q && q->vtype != TYUNDEFINED)
361: return( cpexpr(q) );
362: }
363: else {
364: q = mkvar( mkname(s) );
365: if(blklevel > 1)
366: {
367: q->blklevel = 1;
368: ((struct headbits *)q->sthead)->blklevel = 1;
369: --ndecl[blklevel];
370: ++ndecl[1];
371: }
372: }
373:
374: q->vtype = type;
375: q->vdclstart = 1;
376: mkftnp(q);
377: return( cpexpr(q) );
378: }
379:
380:
381:
382: ptr errnode()
383: {
384: register struct exprblock * p;
385:
386: p = (struct exprblock *)allexpblock();
387: p->tag = TERROR;
388: p->vtype = TYINT;
389: return((int *)p);
390: }
391:
392:
393:
394: min(a,b)
395: int a,b;
396: {
397: return( a<b ? a : b);
398: }
399:
400:
401:
402: setvproc(p, v)
403: register ptr p;
404: register int v;
405: {
406: ptr q;
407: register int k;
408:
409: q = ((struct stentry *)p->sthead)->varp;
410: k = q->vproc;
411: /*debug printf("setvproc(%s ,%d)\n", ((struct stentry *)q->sthead)->namep, v); */
412: if(p != q)
413: p->vproc = k;
414: if(k == v)
415: return;
416:
417: if(k==PROCUNKNOWN || (k==PROCYES && v==PROCINTRINSIC) )
418: p->vproc = q->vproc = v;
419: else if( !(k==PROCINTRINSIC && v==PROCYES) && ((struct stentry *)p->sthead)->varp!=procname)
420: execerr("attempt to use %s as variable and procedure",
421: ((struct stentry *)p->sthead)->namep);
422: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.