|
|
1.1 root 1: #include "defs"
2:
3:
4:
5: cpn(n, a, b)
6: register int n;
7: register char *a, *b;
8: {
9: while(--n >= 0)
10: *b++ = *a++;
11: }
12:
13:
14:
15: eqn(n, a, b)
16: register int n;
17: register char *a, *b;
18: {
19: while(--n >= 0)
20: if(*a++ != *b++)
21: return(NO);
22: return(YES);
23: }
24:
25:
26:
27:
28:
29:
30:
31: cmpstr(a, b, la, lb) /* compare two strings */
32: register char *a, *b;
33: ftnint la, lb;
34: {
35: register char *aend, *bend;
36: aend = a + la;
37: bend = b + lb;
38:
39:
40: if(la <= lb)
41: {
42: while(a < aend)
43: if(*a != *b)
44: return( *a - *b );
45: else
46: { ++a; ++b; }
47:
48: while(b < bend)
49: if(*b != ' ')
50: return(' ' - *b);
51: else
52: ++b;
53: }
54:
55: else
56: {
57: while(b < bend)
58: if(*a != *b)
59: return( *a - *b );
60: else
61: { ++a; ++b; }
62: while(a < aend)
63: if(*a != ' ')
64: return(*a - ' ');
65: else
66: ++a;
67: }
68: return(0);
69: }
70:
71:
72:
73:
74:
75: chainp hookup(x,y)
76: register chainp x, y;
77: {
78: register chainp p;
79:
80: if(x == NULL)
81: return(y);
82:
83: for(p = x ; p->nextp ; p = p->nextp)
84: ;
85: p->nextp = y;
86: return(x);
87: }
88:
89:
90:
91: struct Listblock *mklist(p)
92: chainp p;
93: {
94: register struct Listblock *q;
95:
96: q = ALLOC(Listblock);
97: q->tag = TLIST;
98: q->listp = p;
99: return(q);
100: }
101:
102:
103: chainp mkchain(p,q)
104: register tagptr p;
105: register chainp q;
106: {
107: register chainp r;
108:
109: if(chains)
110: {
111: r = chains;
112: chains = chains->nextp;
113: }
114: else
115: r = ALLOC(Chain);
116:
117: r->datap = p;
118: r->nextp = q;
119: return(r);
120: }
121:
122:
123:
124: char * varstr(n, s)
125: register int n;
126: register char *s;
127: {
128: register int i;
129: static char name[XL+1];
130:
131: for(i=0; i<n && *s!=' ' && *s!='\0' ; ++i)
132: name[i] = *s++;
133:
134: name[i] = '\0';
135:
136: return( name );
137: }
138:
139:
140:
141:
142: char * varunder(n, s)
143: register int n;
144: register char *s;
145: {
146: register int i;
147: static char name[XL+1];
148:
149: for(i=0; i<n && *s!=' ' && *s!='\0' ; ++i)
150: name[i] = *s++;
151:
152: #if TARGET != GCOS
153: name[i++] = '_';
154: #endif
155:
156: name[i] = '\0';
157:
158: return( name );
159: }
160:
161:
162:
163:
164:
165: char * nounder(n, s)
166: register int n;
167: register char *s;
168: {
169: register int i;
170: static char name[XL+1];
171:
172: for(i=0; i<n && *s!=' ' && *s!='\0' ; ++s)
173: if(*s != '_')
174: name[i++] = *s;
175:
176: name[i] = '\0';
177:
178: return( name );
179: }
180:
181:
182:
183: char *copyn(n, s)
184: register int n;
185: register char *s;
186: {
187: register char *p, *q;
188:
189: p = q = (char *) ckalloc(n);
190: while(--n >= 0)
191: *q++ = *s++;
192: return(p);
193: }
194:
195:
196:
197: char *copys(s)
198: char *s;
199: {
200: return( copyn( strlen(s)+1 , s) );
201: }
202:
203:
204:
205: ftnint convci(n, s)
206: register int n;
207: register char *s;
208: {
209: ftnint sum;
210: sum = 0;
211: while(n-- > 0)
212: sum = 10*sum + (*s++ - '0');
213: return(sum);
214: }
215:
216: char *convic(n)
217: ftnint n;
218: {
219: static char s[20];
220: register char *t;
221:
222: s[19] = '\0';
223: t = s+19;
224:
225: do {
226: *--t = '0' + n%10;
227: n /= 10;
228: } while(n > 0);
229:
230: return(t);
231: }
232:
233:
234:
235: double convcd(n, s)
236: int n;
237: register char *s;
238: {
239: double atof();
240: char v[100];
241: register char *t;
242: if(n > 90)
243: {
244: err("too many digits in floating constant");
245: n = 90;
246: }
247: for(t = v ; n-- > 0 ; s++)
248: *t++ = (*s=='d' ? 'e' : *s);
249: *t = '\0';
250: return( atof(v) );
251: }
252:
253:
254:
255: Namep mkname(l, s)
256: int l;
257: register char *s;
258: {
259: struct Hashentry *hp;
260: int hash;
261: register Namep q;
262: register int i;
263: char n[VL];
264:
265: hash = 0;
266: for(i = 0 ; i<l && *s!='\0' ; ++i)
267: {
268: hash += *s;
269: n[i] = *s++;
270: }
271: hash %= maxhash;
272: while( i < VL )
273: n[i++] = ' ';
274:
275: hp = hashtab + hash;
276: while(q = hp->varp)
277: if( hash==hp->hashval && eqn(VL,n,q->varname) )
278: return(q);
279: else if(++hp >= lasthash)
280: hp = hashtab;
281:
282: if(++nintnames >= maxhash-1)
283: many("names", 'n', maxhash);
284: hp->varp = q = ALLOC(Nameblock);
285: hp->hashval = hash;
286: q->tag = TNAME;
287: cpn(VL, n, q->varname);
288: return(q);
289: }
290:
291:
292:
293: struct Labelblock *mklabel(l)
294: ftnint l;
295: {
296: register struct Labelblock *lp;
297:
298: if(l <= 0)
299: return(NULL);
300:
301: for(lp = labeltab ; lp < highlabtab ; ++lp)
302: if(lp->stateno == l)
303: return(lp);
304:
305: if(++highlabtab > labtabend)
306: many("statement numbers", 's', maxstno);
307:
308: lp->stateno = l;
309: lp->labelno = newlabel();
310: lp->blklevel = 0;
311: lp->labused = NO;
312: lp->labdefined = NO;
313: lp->labinacc = NO;
314: lp->labtype = LABUNKNOWN;
315: return(lp);
316: }
317:
318:
319: newlabel()
320: {
321: return( ++lastlabno );
322: }
323:
324:
325: /* this label appears in a branch context */
326:
327: struct Labelblock *execlab(stateno)
328: ftnint stateno;
329: {
330: register struct Labelblock *lp;
331:
332: if(lp = mklabel(stateno))
333: {
334: if(lp->labinacc)
335: warn1("illegal branch to inner block, statement %s",
336: convic(stateno) );
337: else if(lp->labdefined == NO)
338: lp->blklevel = blklevel;
339: lp->labused = YES;
340: if(lp->labtype == LABFORMAT)
341: err("may not branch to a format");
342: else
343: lp->labtype = LABEXEC;
344: }
345: else
346: execerr("illegal label %s", convic(stateno));
347:
348: return(lp);
349: }
350:
351:
352:
353:
354:
355: /* find or put a name in the external symbol table */
356:
357: struct Extsym *mkext(s)
358: char *s;
359: {
360: int i;
361: register char *t;
362: char n[XL];
363: struct Extsym *p;
364:
365: i = 0;
366: t = n;
367: while(i<XL && *s)
368: *t++ = *s++;
369: while(t < n+XL)
370: *t++ = ' ';
371:
372: for(p = extsymtab ; p<nextext ; ++p)
373: if(eqn(XL, n, p->extname))
374: return( p );
375:
376: if(nextext >= lastext)
377: many("external symbols", 'x', maxext);
378:
379: cpn(XL, n, nextext->extname);
380: nextext->extstg = STGUNKNOWN;
381: nextext->extsave = NO;
382: nextext->extp = 0;
383: nextext->cv = 0;
384: nextext->extleng = 0;
385: nextext->maxleng = 0;
386: nextext->extinit = NO;
387: return( nextext++ );
388: }
389:
390:
391:
392:
393:
394:
395:
396:
397: Addrp builtin(t, s)
398: int t;
399: char *s;
400: {
401: register struct Extsym *p;
402: register Addrp q;
403:
404: p = mkext(s);
405: if(p->extstg == STGUNKNOWN)
406: p->extstg = STGEXT;
407: else if(p->extstg != STGEXT)
408: {
409: errstr("improper use of builtin %s", s);
410: return(0);
411: }
412:
413: q = ALLOC(Addrblock);
414: q->tag = TADDR;
415: q->vtype = t;
416: q->vclass = CLPROC;
417: q->vstg = STGEXT;
418: q->memno = p - extsymtab;
419: return(q);
420: }
421:
422:
423:
424: frchain(p)
425: register chainp *p;
426: {
427: register chainp q;
428:
429: if(p==0 || *p==0)
430: return;
431:
432: for(q = *p; q->nextp ; q = q->nextp)
433: ;
434: q->nextp = chains;
435: chains = *p;
436: *p = 0;
437: }
438:
439:
440: tagptr cpblock(n,p)
441: register int n;
442: register char * p;
443: {
444: register char *q;
445: ptr q0;
446:
447: q0 = ckalloc(n);
448: q = (char *) q0;
449: while(n-- > 0)
450: *q++ = *p++;
451: return( (tagptr) q0);
452: }
453:
454:
455:
456: max(a,b)
457: int a,b;
458: {
459: return( a>b ? a : b);
460: }
461:
462:
463: ftnint lmax(a, b)
464: ftnint a, b;
465: {
466: return( a>b ? a : b);
467: }
468:
469: ftnint lmin(a, b)
470: ftnint a, b;
471: {
472: return(a < b ? a : b);
473: }
474:
475:
476:
477:
478: maxtype(t1, t2)
479: int t1, t2;
480: {
481: int t;
482:
483: t = max(t1, t2);
484: if(t==TYCOMPLEX && (t1==TYDREAL || t2==TYDREAL) )
485: t = TYDCOMPLEX;
486: return(t);
487: }
488:
489:
490:
491: /* return log base 2 of n if n a power of 2; otherwise -1 */
492: #if FAMILY == PCC
493: log2(n)
494: ftnint n;
495: {
496: int k;
497:
498: /* trick based on binary representation */
499:
500: if(n<=0 || (n & (n-1))!=0)
501: return(-1);
502:
503: for(k = 0 ; n >>= 1 ; ++k)
504: ;
505: return(k);
506: }
507: #endif
508:
509:
510:
511: frrpl()
512: {
513: struct Rplblock *rp;
514:
515: while(rpllist)
516: {
517: rp = rpllist->rplnextp;
518: free( (charptr) rpllist);
519: rpllist = rp;
520: }
521: }
522:
523:
524:
525: expptr callk(type, name, args)
526: int type;
527: char *name;
528: chainp args;
529: {
530: register expptr p;
531:
532: p = mkexpr(OPCALL, builtin(type,name), args);
533: p->exprblock.vtype = type;
534: return(p);
535: }
536:
537:
538:
539: expptr call4(type, name, arg1, arg2, arg3, arg4)
540: int type;
541: char *name;
542: expptr arg1, arg2, arg3, arg4;
543: {
544: struct Listblock *args;
545: args = mklist( mkchain(arg1, mkchain(arg2, mkchain(arg3,
546: mkchain(arg4, CHNULL)) ) ) );
547: return( callk(type, name, args) );
548: }
549:
550:
551:
552:
553: expptr call3(type, name, arg1, arg2, arg3)
554: int type;
555: char *name;
556: expptr arg1, arg2, arg3;
557: {
558: struct Listblock *args;
559: args = mklist( mkchain(arg1, mkchain(arg2, mkchain(arg3, CHNULL) ) ) );
560: return( callk(type, name, args) );
561: }
562:
563:
564:
565:
566:
567: expptr call2(type, name, arg1, arg2)
568: int type;
569: char *name;
570: expptr arg1, arg2;
571: {
572: struct Listblock *args;
573:
574: args = mklist( mkchain(arg1, mkchain(arg2, CHNULL) ) );
575: return( callk(type,name, args) );
576: }
577:
578:
579:
580:
581: expptr call1(type, name, arg)
582: int type;
583: char *name;
584: expptr arg;
585: {
586: return( callk(type,name, mklist(mkchain(arg,CHNULL)) ));
587: }
588:
589:
590: expptr call0(type, name)
591: int type;
592: char *name;
593: {
594: return( callk(type, name, PNULL) );
595: }
596:
597:
598:
599: struct Impldoblock *mkiodo(dospec, list)
600: chainp dospec, list;
601: {
602: register struct Impldoblock *q;
603:
604: q = ALLOC(Impldoblock);
605: q->tag = TIMPLDO;
606: q->impdospec = dospec;
607: q->datalist = list;
608: return(q);
609: }
610:
611:
612:
613:
614: ptr ckalloc(n)
615: register int n;
616: {
617: register ptr p;
618: ptr calloc();
619:
620: if( p = calloc(1, (unsigned) n) )
621: return(p);
622:
623: fatal("out of memory");
624: /* NOTREACHED */
625: }
626:
627:
628:
629:
630:
631: isaddr(p)
632: register expptr p;
633: {
634: if(p->tag == TADDR)
635: return(YES);
636: if(p->tag == TEXPR)
637: switch(p->exprblock.opcode)
638: {
639: case OPCOMMA:
640: return( isaddr(p->exprblock.rightp) );
641:
642: case OPASSIGN:
643: case OPPLUSEQ:
644: return( isaddr(p->exprblock.leftp) );
645: }
646: return(NO);
647: }
648:
649:
650:
651:
652: isstatic(p)
653: register expptr p;
654: {
655: if(p->headblock.vleng && !ISCONST(p->headblock.vleng))
656: return(NO);
657:
658: switch(p->tag)
659: {
660: case TCONST:
661: return(YES);
662:
663: case TADDR:
664: if(ONEOF(p->addrblock.vstg,MSKSTATIC) &&
665: ISCONST(p->addrblock.memoffset))
666: return(YES);
667:
668: default:
669: return(NO);
670: }
671: }
672:
673:
674:
675: addressable(p)
676: register expptr p;
677: {
678: switch(p->tag)
679: {
680: case TCONST:
681: return(YES);
682:
683: case TADDR:
684: return( addressable(p->addrblock.memoffset) );
685:
686: default:
687: return(NO);
688: }
689: }
690:
691:
692:
693: hextoi(c)
694: register int c;
695: {
696: register char *p;
697: static char p0[17] = "0123456789abcdef";
698:
699: for(p = p0 ; *p ; ++p)
700: if(*p == c)
701: return( p-p0 );
702: return(16);
703: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.