|
|
1.1 root 1: #include "defs"
2:
3:
4: ptr mkcomm(s)
5: register char *s;
6: {
7: register ptr p;
8: register char *t;
9:
10: for(p = (int *)commonlist ; p ; p = p->nextp)
11: if(equals(s, ((struct comentry *)p->datap)->comname))
12: return(p->datap);
13:
14: p = (int *)ALLOC(comentry);
15: for(t = p->comname ; *t++ = *s++ ; ) ;
16: p->tag = TCOMMON;
17: p->blklevel = (blklevel>0? 1 : 0);
18: commonlist = mkchain(p, commonlist);
19: return(commonlist->datap);
20: }
21:
22:
23:
24:
25: ptr mkname(s)
26: char *s;
27: {
28: char *copys();
29: register ptr p;
30:
31: if( (p = (int *)name(s,1)) == 0)
32: {
33: p = (int *)name(s,0);
34: p->tag = TNAME;
35: p->blklevel = blklevel;
36: }
37: return(p);
38: }
39:
40: ptr mknode(t, o, l, r)
41: int t,o;
42: register ptr l;
43: register ptr r;
44: {
45: register struct exprblock *p;
46: ptr q;
47: int lt, rt;
48: int ll, rl;
49: ptr mksub1(), mkchcon();
50:
51: p = (struct exprblock *)allexpblock();
52: TEST fprintf(diagfile, "mknode(%d,%d,%o,%o) = %o\n", t, o, l, r, p);
53:
54: top:
55: if(t!=TLIST && t!=TCONST && l!=0 && l->tag==TERROR)
56: {
57: frexpr(r);
58: frexpblock(p);
59: return(l);
60: }
61:
62: if(r!=0 && r->tag==TERROR)
63: {
64: frexpr(l);
65: frexpblock(p);
66: return(r);
67: }
68: p->tag = t;
69: p->subtype = o;
70: p->leftp = l;
71: p->rightp = r;
72:
73: switch(t)
74: {
75: case TAROP:
76: ckdcl(l);
77: ckdcl(r);
78: switch(lt = l->vtype)
79: {
80: case TYCHAR:
81: case TYSTRUCT:
82: case TYLOG:
83: exprerr("non-arithmetic operand of arith op","");
84: goto err;
85: }
86:
87: switch(rt = r->vtype)
88: {
89: case TYCHAR:
90: case TYSTRUCT:
91: case TYLOG:
92: exprerr("non-arithmetic operand of arith op","");
93: goto err;
94: }
95: if(lt==rt || (o==OPPOWER && rt==TYINT) )
96: p->vtype = lt;
97: else if( (lt==TYREAL && rt==TYLREAL) ||
98: (lt==TYLREAL && rt==TYREAL) )
99: p->vtype = TYLREAL;
100: else if(lt==TYINT)
101: {
102: l = coerce(rt,l);
103: goto top;
104: }
105: else if(rt==TYINT)
106: {
107: r = coerce(lt,r);
108: goto top;
109: }
110: else if( (lt==TYREAL && rt==TYCOMPLEX) ||
111: (lt==TYCOMPLEX && rt==TYREAL) )
112: p->vtype = TYCOMPLEX;
113: else if( (lt==TYLREAL && rt==TYCOMPLEX) ||
114: (lt==TYCOMPLEX && rt==TYLREAL) )
115: p->vtype = TYLCOMPLEX;
116: else {
117: exprerr("mixed mode", CNULL);
118: goto err;
119: }
120:
121: if( (o==OPPLUS||o==OPSTAR) && l->tag==TCONST && r->tag!=TCONST )
122: {
123: p->leftp = r;
124: p->rightp = l;
125: }
126:
127: if(o==OPPLUS && l->tag==TNEGOP &&
128: (r->tag!=TCONST || ((struct headbits *)l->leftp)->tag==TCONST) )
129: {
130: p->subtype = OPMINUS;
131: p->leftp = r;
132: p->rightp = l->leftp;
133: }
134:
135: break;
136:
137: case TRELOP:
138: ckdcl(l);
139: ckdcl(r);
140: p->vtype = TYLOG;
141: lt = l->vtype;
142: rt = r->vtype;
143: if(lt==TYCHAR || rt==TYCHAR)
144: {
145: if(l->vtype != r->vtype)
146: {
147: exprerr("comparison of character and noncharacter data",CNULL);
148: goto err;
149: }
150: ll = conval(l->vtypep);
151: rl = conval(r->vtypep);
152: if( (o==OPEQ || o==OPNE) &&
153: ( (ll==1 && rl==1 && tailor.charcomp==1)
154: || (ll<=tailor.ftnchwd && rl<=tailor.ftnchwd
155: && tailor.charcomp==2) ))
156: {
157: if(l->tag == TCONST)
158: {
159: q = cpexpr( mkchcon(l->leftp) );
160: frexpr(l);
161: l = q;
162: }
163: if(r->tag == TCONST)
164: {
165: q = cpexpr( mkchcon(r->leftp) );
166: frexpr(r);
167: r = q;
168: }
169: if(l->vsubs == 0)
170: l->vsubs = mksub1();
171: if(r->vsubs == 0)
172: r->vsubs = mksub1();
173: p->leftp = l;
174: p->rightp = r;
175: }
176: else {
177: p->leftp = mkcall(builtin(TYINT,"ef1cmc"), arg4(l,r));
178: p->rightp = mkint(0);
179: }
180: }
181:
182: else if(lt==TYLOG || rt==TYLOG)
183: exprerr("relational involving logicals", CNULL);
184: else if( (lt==TYCOMPLEX || rt==TYCOMPLEX) &&
185: o!=OPEQ && o!=OPNE)
186: exprerr("order comparison of complex numbers", CNULL);
187: else if(lt != rt)
188: {
189: if(lt==TYINT)
190: p->leftp = coerce(rt, l);
191: else if(rt == TYINT)
192: p->rightp = coerce(lt, r);
193: }
194: break;
195:
196: case TLOGOP:
197: ckdcl(l);
198: ckdcl(r);
199: if(r->vtype != TYLOG)
200: {
201: exprerr("non-logical operand of logical operator",CNULL);
202: goto err;
203: }
204: case TNOTOP:
205: ckdcl(l);
206: if(l->vtype != TYLOG)
207: {
208: exprerr("non-logical operand of logical operator",CNULL);
209: }
210: p->vtype = TYLOG;
211: break;
212:
213: case TNEGOP:
214: ckdcl(l);
215: lt = l->vtype;
216: if(lt!=TYINT && lt!=TYREAL && lt!=TYLREAL && lt!=TYCOMPLEX)
217: {
218: exprerr("impossible unary + or - operation",CNULL);
219: goto err;
220: }
221: p->vtype = lt;
222: break;
223:
224: case TCALL:
225: p->vtype = l->vtype;
226: p->vtypep = l->vtypep;
227: break;
228:
229: case TASGNOP:
230: ckdcl(l);
231: ckdcl(r);
232: lt = l->vtype;
233: if(lt==TYFIELD)
234: lt = TYINT;
235: rt = r->vtype;
236: if(lt==TYCHAR || rt==TYCHAR || lt==TYLOG || rt==TYLOG)
237: {
238: if(lt != rt)
239: {
240: exprerr("illegal assignment",CNULL);
241: goto err;
242: }
243: }
244: else if(lt==TYSTRUCT || rt==TYSTRUCT)
245: {
246: if(lt!=rt || ((struct typeblock *)l->vtypep)->strsize!=((struct typeblock *)r->vtypep)->strsize
247: || ((struct typeblock *)l->vtypep)->stralign!=((struct typeblock *)r->vtypep)->stralign)
248: {
249: exprerr("illegal structure assignment",CNULL);
250: goto err;
251: }
252: }
253: else if ( (lt==TYCOMPLEX || rt==TYCOMPLEX) && lt!=rt)
254: /* p->rightp = r = coerce(lt, r) */ ;
255:
256: p->vtype = lt;
257: p->vtypep = l->vtypep;
258: break;
259:
260: case TCONST:
261: case TLIST:
262: case TREPOP:
263: break;
264:
265: default:
266: badtag("mknode", t);
267: }
268:
269: return((int *)p);
270:
271: err: frexpr(p);
272: return( errnode() );
273: }
274:
275:
276:
277: ckdcl(p)
278: ptr p;
279: {
280: if(p->vtype==TYUNDEFINED || (p->tag==TNAME&&p->vdcldone==0&&p->vadjdim==0))
281: {
282: /*debug*/ printf("tag=%d, typed=%d\n", p->tag, p->vtype);
283: fatal("untyped subexpression");
284: }
285: if(p->tag==TNAME) setvproc(p,PROCNO);
286: }
287:
288: ptr mkvar(p)
289: register ptr p;
290: {
291: register ptr q;
292:
293: TEST fprintf(diagfile, "mkvar(%s), blk %d\n", p->namep, blklevel);
294:
295: if(p->blklevel > blklevel)
296: p->blklevel = blklevel;
297:
298: if(p->tag == TLABEL)
299: {
300: laberr("attempt to use label as variable", p->namep);
301: return( errnode() );
302: }
303: if(instruct || p->varp==0 || ((struct headbits *)p->varp)->blklevel<blklevel)
304: {
305: q = allexpblock();
306: q->tag = TNAME;
307: q->sthead = p;
308: q->blklevel = blklevel;
309: if(! instruct)
310: ++ndecl[blklevel];
311: }
312: else q = p->varp;
313:
314: if(!instruct)
315: {
316: if(p->varp && ((struct headbits *)p->varp)->blklevel<blklevel)
317: hide(p);
318: if(p->varp == 0)
319: p->varp = q;
320: }
321:
322: p->tag = TNAME;
323: return(q);
324: }
325:
326:
327: ptr mkstruct(v,s)
328: register ptr v;
329: ptr s;
330: {
331: register ptr p;
332:
333: p = (int *)ALLOC(typeblock);
334: p->sthead = v;
335: p->tag = TSTRUCT;
336: p->blklevel = blklevel;
337: p->strdesc = s;
338: offsets(p);
339: if(v) {
340: v->blklevel = blklevel;
341: ++ndecl[blklevel];
342: v->varp = p;
343: }
344: else temptypelist = mkchain(p, temptypelist);
345: return(p);
346: }
347:
348:
349: ptr mkcall(fn1, args)
350: ptr fn1, args;
351: {
352: int i, j, first;
353: register ptr funct, p, q;
354: ptr r;
355:
356: if(fn1->tag == TERROR)
357: return( errnode() );
358: else if(fn1->tag == TNAME)
359: {
360: funct = ((struct stentry *)fn1->sthead)->varp;
361: frexpblock(fn1);
362: }
363: else
364: funct = fn1;
365: if(funct->vclass!=0 && funct->vclass!=CLARG)
366: {
367: exprerr("invalid invocation of %s",((struct stentry *)funct->sthead)->namep);
368: frexpr(args);
369: return( errnode() );
370: }
371: else extname(funct);
372:
373: if(args) for(p = args->leftp; p ; p = p->nextp)
374: {
375: q = p->datap;
376: if( (q->tag==TCALL&&q->vtype==TYUNDEFINED) ||
377: (q->tag==TNAME&&q->vdcldone==0) )
378: dclit(q);
379: if(q->tag==TNAME && q->vproc==PROCUNKNOWN)
380: setvproc(q, PROCNO);
381: if( q->vtype == TYSTRUCT)
382: {
383: first = 1;
384: for(i = 0; i<NFTNTYPES ; ++i)
385: if(q->vbase[i] != 0)
386: {
387: r = cpexpr(q);
388: if(first)
389: {
390: p->datap = r;
391: first = 0;
392: }
393: else p = p->nextp = (int *)mkchain(r, p->nextp);
394: r->vtype = ftnefl[i];
395: for(j=0; j<NFTNTYPES; ++j)
396: if(i != j) r->vbase[j] = 0;
397: }
398: frexpblock(q);
399: }
400: }
401:
402: return( mknode(TCALL,0,cpexpr(funct), args) );
403: }
404:
405:
406:
407: mkcase(p,here)
408: ptr p;
409: int here;
410: {
411: register ptr q, s;
412:
413: for(s = thisctl ; s!=0 && s->subtype!=STSWITCH ; s = s->prevctl)
414: ;
415: if(s==0 || (here && s!=thisctl) )
416: {
417: laberr("invalid case label location",CNULL);
418: return(0);
419: }
420:
421: p = simple(RVAL,p);
422: for(q = s->loopctl ; q!=0 && !eqcon(p,q->casexpr) ; q = q->nextcase)
423: ;
424: if(q == 0)
425: {
426: q = (int *)ALLOC(caseblock);
427: q->tag = TCASE;
428: q->casexpr = p;
429: q->labelno = ( here ? thislab() : nextlab() );
430: q->nextcase = s->loopctl;
431: s->loopctl = q;
432: }
433: else if(here)
434: if(thisexec->labelno == 0)
435: thisexec->labelno = q->labelno;
436: else if(thisexec->labelno != q->labelno)
437: {
438: exnull();
439: thisexec->labelno = q->labelno;
440: thisexec->labused = 0;
441: }
442: if(here)
443: if(q->labdefined)
444: laberr("multiply defined case",CNULL);
445: else
446: q->labdefined = 1;
447: return(q->labelno);
448: }
449:
450:
451: ptr mkilab(p)
452: ptr p;
453: {
454: char *s, l[30];
455:
456: if(p->tag!=TCONST || p->vtype!=TYINT)
457: {
458: execerr("invalid label","");
459: s = "";
460: }
461: else s = (char *)p->leftp;
462:
463: while(*s == '0')
464: ++s;
465: sprintf(l,"#%s", s);
466:
467:
468: TEST fprintf(diagfile,"numeric label = %s\n", l);
469: return( mkname(l) );
470: }
471:
472:
473:
474:
475: mklabel(p,here)
476: ptr p;
477: int here;
478: {
479: register ptr q;
480:
481: if(q = p->varp)
482: {
483: if(q->tag != TLABEL)
484: laberr("%s is already a nonlabel\n", p->namep);
485: else if(q->labinacc)
486: warn1("label %s is inaccessible", p->namep);
487: else if(here)
488: if(q->labdefined)
489: laberr("%s is already defined\n", p->namep);
490: /*
491: else if(blklevel > q->blklevel)
492: laberr("%s is illegally placed\n",p->namep);
493: */
494: /* dirty fixup for wm coughran */
495: else {
496: if(blklevel > q->blklevel)
497: labwarn("%s is illegally placed\n",p->namep);
498:
499: q->labdefined = 1;
500: if(thisexec->labelno == 0)
501: thisexec->labelno = q->labelno;
502: else if(thisexec->labelno != q->labelno)
503: {
504: exnull();
505: thisexec->labelno = q->labelno;
506: thisexec->labused = 0;
507: }
508: }
509: }
510: else {
511: q = (int *)ALLOC(labelblock);
512: p->varp = q;
513: q->tag = TLABEL;
514: q->subtype = 0;
515: q->blklevel = blklevel;
516: ++ndecl[blklevel];
517: q->labdefined = here;
518: q->labelno = ( here ? thislab() : nextlab() );
519: q->sthead = p;
520: }
521:
522: return(q->labelno);
523: }
524:
525:
526: thislab()
527: {
528: if(thisexec->labelno == 0)
529: thisexec->labelno = nextlab();
530: return(thisexec->labelno);
531: }
532:
533:
534: nextlab()
535: {
536: stnos[++labno] = 0;
537: return( labno );
538: }
539:
540:
541: nextindif()
542: {
543: if(++nxtindif < MAXINDIFS)
544: return(nxtindif);
545: fatal("too many indifs"); return 0;
546: }
547:
548:
549:
550:
551: mkkeywd(s, n)
552: char *s;
553: int n;
554: {
555: register ptr p;
556: register ptr q;
557:
558: p = (int *)name(s, 2);
559: q = (int *)ALLOC(keyblock);
560: p->tag = TKEYWORD;
561: q->tag = TKEYWORD;
562: p->subtype = n;
563: q->subtype = n;
564: p->blklevel = 0;
565: p->varp = q;
566: q->sthead = p;
567: }
568:
569:
570: ptr mkdef(s, v)
571: char *s, *v;
572: {
573: register ptr p;
574: register ptr q;
575:
576: if(p = (int *)name(s,1))
577: if(p->blklevel == 0)
578: {
579: if(blklevel > 0)
580: hide(p);
581: else if(p->tag != TDEFINE)
582: dclerr("attempt to DEFINE a variable name", s);
583: else {
584: if( strcmp(v, ((struct defblock *)(q=p->varp))->valp) )
585: {
586: warn("macro value replaced");
587: cfree(q->valp);
588: q->valp = copys(v);
589: }
590: return(p);
591: }
592: }
593: else {
594: dclerr("type already defined", s);
595: return( errnode() );
596: }
597: else p = (int *)name(s,0);
598:
599: q = (int *)ALLOC(defblock);
600: p->tag = TDEFINE;
601: q->tag = TDEFINE;
602: p->blklevel = q->blklevel = (blklevel==0 ? 0 : 1);
603: q->sthead = p;
604: p->varp = q;
605: ((struct defblock *)p->varp)->valp = copys(v);
606: return(p);
607: }
608:
609:
610:
611: mkknown(s,t)
612: char *s;
613: int t;
614: {
615: register ptr p;
616:
617: p = (int *)ALLOC(knownname);
618: p->nextfunct = knownlist;
619: p->tag = TKNOWNFUNCT;
620: knownlist = p;
621: p->funcname = s;
622: p->functype = t;
623: }
624:
625:
626:
627:
628:
629:
630:
631: ptr mkint(k)
632: int k;
633: {
634: return( mkconst(TYINT, convic(k) ) );
635: }
636:
637:
638: ptr mkconst(t,p)
639: int t;
640: ptr p;
641: {
642: ptr q;
643:
644: q = mknode(TCONST, 0, copys(p), PNULL);
645: q->vtype = t;
646: if(t == TYCHAR)
647: q->vtypep = mkint( strlen(p) );
648: return(q);
649: }
650:
651:
652:
653: ptr mkimcon(t,p)
654: int t;
655: char *p;
656: {
657: ptr q;
658: char *zero, buff[100];
659:
660: zero = (t==TYCOMPLEX ? "0." : "0d0");
661: sprintf(buff, "(%s,%s)", zero, p);
662: q = mknode(TCONST, 0, copys(buff), PNULL);
663: q->vtype = t;
664: return(q);
665: }
666:
667:
668:
669: ptr mkarrow(p,t)
670: register ptr p;
671: ptr t;
672: {
673: register ptr q, s;
674:
675: if(p->vsubs == 0)
676: if(p->vdim==0 && p->vtype!=TYCHAR && p->vtype!=TYSTRUCT)
677: {
678: exprerr("need an aggregate to the left of arrow",CNULL);
679: frexpr(p);
680: return( errnode() );
681: }
682: else {
683: if(p->vdim)
684: {
685: s = 0;
686: for(q = ((chainp)p->vdim)->datap ; q ; q = q->nextp)
687: s = (int *)mkchain( mkint(1), s);
688: subscript(p, mknode(TLIST,0,s,PNULL) );
689: }
690: }
691:
692: p->vtype = TYSTRUCT;
693: p->vtypep = t->varp;
694: return(p);
695: }
696:
697:
698:
699:
700:
701: mkequiv(p)
702: ptr p;
703: {
704: ptr q, t;
705: int first;
706:
707: swii(iefile);
708: putic(ICBEGIN, 0);
709: putic(ICINDENT, 0);
710: putic(ICKEYWORD, FEQUIVALENCE);
711: putic(ICOP, OPLPAR);
712: first = 1;
713:
714: for(q = p ; q ; q = q->nextp)
715: {
716: if(first) first = 0;
717: else putic(ICOP, OPCOMMA);
718: prexpr( t = simple(LVAL,q->datap) );
719: frexpr(t);
720: }
721:
722: putic(ICOP, OPRPAR);
723: swii(icfile);
724: frchain( &p );
725: }
726:
727:
728:
729:
730: mkgeneric(gname,atype,fname,ftype)
731: char *gname, *fname;
732: int atype, ftype;
733: {
734: register ptr p;
735: ptr generic();
736:
737: if(p = generic(gname))
738: {
739: if(p->genfname[atype])
740: fatal1("generic name already defined", gname);
741: }
742: else {
743: p = (int *)ALLOC(genblock);
744: p->tag = TGENERIC;
745: p->nextgenf = generlist;
746: generlist = p;
747: p->genname = gname;
748: }
749:
750: p->genfname[atype] = fname;
751: p->genftype[atype] = ftype;
752: }
753:
754:
755: ptr generic(s)
756: char *s;
757: {
758: register ptr p;
759:
760: for(p= generlist; p ; p = p->nextgenf)
761: if(equals(s, p->genname))
762: return(p);
763: return(0);
764: }
765:
766:
767: knownfunct(s)
768: char *s;
769: {
770: register ptr p;
771:
772: for(p = knownlist ; p ; p = p->nextfunct)
773: if(equals(s, p->funcname))
774: return(p->functype);
775: return(0);
776: }
777:
778:
779:
780:
781:
782: ptr funcinv(p)
783: register ptr p;
784: {
785: ptr fp, fp1;
786: register ptr g;
787: char *s;
788: register int t;
789: int vt;
790:
791: if(g = generic(s = ((struct stentry *)((struct typeblock *)p->leftp)->sthead)->namep))
792: {
793: if(((struct headbits *)p->rightp)->tag==TLIST && ((struct exprblock *)p->rightp)->leftp
794: && ( (vt = typearg(((struct exprblock *)p->rightp)->leftp)) >=0)
795: && (t = g->genftype[vt]) )
796: {
797: p->leftp = builtin(t, g->genfname[vt]);
798: }
799: else {
800: dclerr("improper use of generic function", s);
801: frexpr(p);
802: return( errnode() );
803: }
804: }
805:
806: fp = p->leftp;
807: setvproc(fp, PROCYES);
808: fp1 = ((struct stentry *)fp->sthead)->varp;
809: s = ((struct stentry *)fp->sthead)->namep;
810:
811: if(p->vtype==TYUNDEFINED && fp->vclass!=CLARG)
812: if(t = knownfunct(s))
813: {
814: p->vtype = t;
815: setvproc(fp, PROCINTRINSIC);
816: setvproc(fp1, PROCINTRINSIC);
817: fp1->vtype = t;
818: builtin(t,((struct stentry *)fp1->sthead)->namep);
819: cpblock(fp1, fp, sizeof(struct exprblock));
820: }
821:
822: dclit(p);
823: return(p);
824: }
825:
826:
827:
828:
829: typearg(p0)
830: register chainp p0;
831: {
832: register chainp p;
833: register int vt, maxt;
834:
835: if(p0 == NULL)
836: return(-1);
837: maxt = ((struct exprblock *)p0->datap)->vtype;
838:
839: for(p = (chainp)p0->nextp ; p ; p = (chainp)p->nextp)
840: if( (vt = ((struct exprblock *)p->datap)->vtype) > maxt)
841: maxt = vt;
842:
843: for(p = p0 ; p ; p = (chainp)p->nextp)
844: p->datap = coerce(maxt, p->datap);
845:
846: return(maxt);
847: }
848:
849:
850:
851:
852: ptr typexpr(t,e)
853: register ptr t, e;
854: {
855: ptr e1;
856: int etag;
857:
858: if(t->atdim!=0 || (e->tag==TLIST && t->attype!=TYCOMPLEX) )
859: goto typerr;
860:
861: switch(t->attype)
862: {
863: case TYCOMPLEX:
864: if(e->tag==TLIST)
865: if(e->leftp==0 || ((chainp)e->leftp)->nextp==0
866: || ((chainp)((chainp)e->leftp)->nextp)->nextp!=0)
867: {
868: exprerr("bad conversion to complex", "");
869: return( errnode() );
870: }
871: else {
872: ((chainp)e->leftp)->datap = simple(RVAL,
873: ((chainp)e->leftp)->datap);
874: ((chainp)((chainp)e->leftp)->nextp)->datap = simple(RVAL,
875: ((chainp)((chainp)e->leftp)->nextp)->datap);
876: if(isconst(((chainp)e->leftp)->datap) &&
877: isconst(((chainp)((chainp)e->leftp)->nextp)->datap) )
878: return( compconst(e) );
879: e1 = mkcall(builtin(TYCOMPLEX,"cmplx"),
880: arg2( coerce(TYREAL,((chainp)e->leftp)->datap),
881: coerce(TYREAL,((chainp)((chainp)e->leftp)->nextp)->datap)));
882: frchain( &(e->leftp) );
883: frexpblock(e);
884: return(e1);
885: }
886:
887: case TYINT:
888: case TYREAL:
889: case TYLREAL:
890: case TYLOG:
891: case TYFIELD:
892: e = coerce(t->attype, simple(RVAL, e) );
893: etag = e->tag;
894: if(etag==TAROP || etag==TLOGOP || etag==TRELOP)
895: e->needpar = YES;
896: return(e);
897:
898: case TYCHAR:
899: case TYSTRUCT:
900: goto typerr;
901: }
902:
903: typerr:
904: exprerr("typexpr not fully implemented", "");
905: frexpr(e);
906: return( errnode() );
907: }
908:
909:
910:
911:
912: ptr compconst(p)
913: register ptr p;
914: {
915: register ptr a, b;
916: int as, bs;
917: int prec;
918:
919: prec = TYREAL;
920: p = p->leftp;
921: if(p == 0)
922: goto err;
923: if(((struct exprblock *)p->datap)->vtype == TYLREAL)
924: prec = TYLREAL;
925: a = coerce(TYLREAL, p->datap);
926: p = p->nextp;
927: if(p->nextp)
928: goto err;
929: if(((struct exprblock *)p->datap)->vtype == TYLREAL)
930: a = coerce(prec = TYLREAL,a);
931: b = coerce(TYLREAL, p->datap);
932:
933: if(a->tag==TNEGOP)
934: {
935: as = '-';
936: a = a->leftp;
937: }
938: else as = ' ';
939:
940: if(b->tag==TNEGOP)
941: {
942: bs = '-';
943: b = b->leftp;
944: }
945: else bs = ' ';
946:
947: if(a->tag!=TCONST || a->vtype!=prec ||
948: b->tag!=TCONST || b->vtype!=prec )
949: goto err;
950:
951: if(prec==TYLREAL && tailor.lngcxtype==NULL)
952: {
953: ptr q, e1, e2;
954: struct dimblock *dp;
955: sprintf(msg, "_const%d", ++constno);
956: q = mkvar(mkname(msg));
957: q->vtype = TYLREAL;
958: dclit(q);
959: dp = ALLOC(dimblock);
960: dp->upperb = mkint(2);
961: q->vdim = (int *)mkchain(dp,CHNULL);
962: sprintf(msg, "%c%s", as, a->leftp);
963: e1 = mkconst(TYLREAL, msg);
964: sprintf(msg, "%c%s", bs, b->leftp);
965: e2 = mkconst(TYLREAL, msg);
966: mkinit(q, mknode(TLIST,0, mkchain(e1,mkchain(e2,CHNULL)),PNULL) );
967: cfree(q->vdim);
968: q->vtype = TYLCOMPLEX;
969: return(q);
970: }
971: else
972: {
973: sprintf(msg, "(%c%s, %c%s)", as, a->leftp, bs, b->leftp);
974: return( mkconst(TYCOMPLEX, msg) );
975: }
976:
977: err: exprerr("invalid complex constant", "");
978: return( errnode() );
979: }
980:
981:
982:
983:
984: ptr mkchcon(p)
985: char *p;
986: {
987: register ptr q;
988: char buf[10];
989:
990: sprintf(buf, "_const%d", ++constno);
991: q = mkvar(mkname(buf));
992: q->vtype = TYCHAR;
993: q->vtypep = mkint(strlen(p));
994: mkinit(q, mkconst(TYCHAR, p));
995: return(q);
996: }
997:
998:
999:
1000: ptr mksub1()
1001: {
1002: return( mknode(TLIST,0, mkchain(mkint(1),CHNULL), PNULL) );
1003: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.