|
|
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 = commonlist ; p ; p = p->nextp)
11: if(equals(s, p->datap->comname))
12: return(p->datap);
13:
14: p = 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 = name(s,1)) == 0)
32: {
33: p = 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 = 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 || 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 || l->vtypep->strsize!=r->vtypep->strsize
247: || l->vtypep->stralign!=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(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(instruct || p->varp==0 || p->varp->blklevel<blklevel)
299: {
300: q = allexpblock();
301: q->tag = TNAME;
302: q->sthead = p;
303: q->blklevel = blklevel;
304: if(! instruct)
305: ++ndecl[blklevel];
306: }
307: else q = p->varp;
308:
309: if(!instruct)
310: {
311: if(p->varp && p->varp->blklevel<blklevel)
312: hide(p);
313: if(p->varp == 0)
314: p->varp = q;
315: }
316:
317: p->tag = TNAME;
318: return(q);
319: }
320:
321:
322: ptr mkstruct(v,s)
323: register ptr v;
324: ptr s;
325: {
326: register ptr p;
327:
328: p = ALLOC(typeblock);
329: p->sthead = v;
330: p->tag = TSTRUCT;
331: p->blklevel = blklevel;
332: p->strdesc = s;
333: offsets(p);
334: if(v) {
335: v->blklevel = blklevel;
336: ++ndecl[blklevel];
337: v->varp = p;
338: }
339: else temptypelist = mkchain(p, temptypelist);
340: return(p);
341: }
342:
343:
344: ptr mkcall(fn1, args)
345: ptr fn1, args;
346: {
347: int i, j, first;
348: register ptr funct, p, q;
349: ptr r;
350:
351: if(fn1->tag == TERROR)
352: return( errnode() );
353: else if(fn1->tag == TNAME)
354: {
355: funct = fn1->sthead->varp;
356: frexpblock(fn1);
357: }
358: else
359: funct = fn1;
360: if(funct->vclass!=0 && funct->vclass!=CLARG)
361: {
362: exprerr("invalid invocation of %s",funct->sthead->namep);
363: frexpr(args);
364: return( errnode() );
365: }
366: else extname(funct);
367:
368: if(args) for(p = args->leftp; p ; p = p->nextp)
369: {
370: q = p->datap;
371: if( (q->tag==TCALL&&q->vtype==TYUNDEFINED) ||
372: (q->tag==TNAME&&q->vdcldone==0) )
373: dclit(q);
374: if(q->tag==TNAME && q->vproc==PROCUNKNOWN)
375: setvproc(q, PROCNO);
376: if( q->vtype == TYSTRUCT)
377: {
378: first = 1;
379: for(i = 0; i<NFTNTYPES ; ++i)
380: if(q->vbase[i] != 0)
381: {
382: r = cpexpr(q);
383: if(first)
384: {
385: p->datap = r;
386: first = 0;
387: }
388: else p = p->nextp = mkchain(r, p->nextp);
389: r->vtype = ftnefl[i];
390: for(j=0; j<NFTNTYPES; ++j)
391: if(i != j) r->vbase[j] = 0;
392: }
393: frexpblock(q);
394: }
395: }
396:
397: return( mknode(TCALL,0,cpexpr(funct), args) );
398: }
399:
400:
401:
402: mkcase(p,here)
403: ptr p;
404: int here;
405: {
406: register ptr q, s;
407:
408: for(s = thisctl ; s!=0 && s->subtype!=STSWITCH ; s = s->prevctl)
409: ;
410: if(s==0 || (here && s!=thisctl) )
411: {
412: laberr("invalid case label location",CNULL);
413: return(0);
414: }
415: for(q = s->loopctl ; q!=0 && !eqcon(p,q->casexpr) ; q = q->nextcase)
416: ;
417: if(q == 0)
418: {
419: q = ALLOC(caseblock);
420: q->tag = TCASE;
421: q->casexpr = p;
422: q->labelno = ( here ? thislab() : nextlab() );
423: q->nextcase = s->loopctl;
424: s->loopctl = q;
425: }
426: else if(here)
427: if(thisexec->labelno == 0)
428: thisexec->labelno = q->labelno;
429: else if(thisexec->labelno != q->labelno)
430: {
431: exnull();
432: thisexec->labelno = q->labelno;
433: thisexec->labused = 0;
434: }
435: if(here)
436: if(q->labdefined)
437: laberr("multiply defined case",CNULL);
438: else
439: q->labdefined = 1;
440: return(q->labelno);
441: }
442:
443:
444: ptr mkilab(p)
445: ptr p;
446: {
447: char *s, l[30];
448:
449: if(p->tag!=TCONST || p->vtype!=TYINT)
450: {
451: execerr("invalid label","");
452: s = "";
453: }
454: else s = p->leftp;
455:
456: while(*s == '0')
457: ++s;
458: sprintf(l,"#%s", s);
459:
460:
461: TEST fprintf(diagfile,"numeric label = %s\n", l);
462: return( mkname(l) );
463: }
464:
465:
466:
467:
468: mklabel(p,here)
469: ptr p;
470: int here;
471: {
472: register ptr q;
473:
474: if(q = p->varp)
475: {
476: if(q->tag != TLABEL)
477: laberr("%s is already a nonlabel\n", p->namep);
478: else if(q->labinacc)
479: warn1("label %s is inaccessible", p->namep);
480: else if(here)
481: if(q->labdefined)
482: laberr("%s is already defined\n", p->namep);
483: else if(blklevel > q->blklevel)
484: laberr("%s is illegally placed\n",p->namep);
485: else {
486: q->labdefined = 1;
487: if(thisexec->labelno == 0)
488: thisexec->labelno = q->labelno;
489: else if(thisexec->labelno != q->labelno)
490: {
491: exnull();
492: thisexec->labelno = q->labelno;
493: thisexec->labused = 0;
494: }
495: }
496: }
497: else {
498: q = ALLOC(labelblock);
499: p->varp = q;
500: q->tag = TLABEL;
501: q->subtype = 0;
502: q->blklevel = blklevel;
503: ++ndecl[blklevel];
504: q->labdefined = here;
505: q->labelno = ( here ? thislab() : nextlab() );
506: q->sthead = p;
507: }
508:
509: return(q->labelno);
510: }
511:
512:
513: thislab()
514: {
515: if(thisexec->labelno == 0)
516: thisexec->labelno = nextlab();
517: return(thisexec->labelno);
518: }
519:
520:
521: nextlab()
522: {
523: stnos[++labno] = 0;
524: return( labno );
525: }
526:
527:
528: nextindif()
529: {
530: if(++nxtindif < MAXINDIFS)
531: return(nxtindif);
532: fatal("too many indifs");
533: }
534:
535:
536:
537:
538: mkkeywd(s, n)
539: char *s;
540: int n;
541: {
542: register ptr p;
543: register ptr q;
544:
545: p = name(s, 2);
546: q = ALLOC(keyblock);
547: p->tag = TKEYWORD;
548: q->tag = TKEYWORD;
549: p->subtype = n;
550: q->subtype = n;
551: p->blklevel = 0;
552: p->varp = q;
553: q->sthead = p;
554: }
555:
556:
557: ptr mkdef(s, v)
558: char *s, *v;
559: {
560: register ptr p;
561: register ptr q;
562:
563: if(p = name(s,1))
564: if(p->blklevel == 0)
565: {
566: if(blklevel > 0)
567: hide(p);
568: else if(p->tag != TDEFINE)
569: dclerr("attempt to DEFINE a variable name", s);
570: else {
571: if( strcmp(v, (q=p->varp) ->valp) )
572: {
573: warn("macro value replaced");
574: cfree(q->valp);
575: q->valp = copys(v);
576: }
577: return(p);
578: }
579: }
580: else {
581: dclerr("type already defined", s);
582: return( errnode() );
583: }
584: else p = name(s,0);
585:
586: q = ALLOC(defblock);
587: p->tag = TDEFINE;
588: q->tag = TDEFINE;
589: p->blklevel = q->blklevel = (blklevel==0 ? 0 : 1);
590: q->sthead = p;
591: p->varp = q;
592: p->varp->valp = copys(v);
593: return(p);
594: }
595:
596:
597:
598: mkknown(s,t)
599: char *s;
600: int t;
601: {
602: register ptr p;
603:
604: p = ALLOC(knownname);
605: p->nextfunct = knownlist;
606: p->tag = TKNOWNFUNCT;
607: knownlist = p;
608: p->funcname = s;
609: p->functype = t;
610: }
611:
612:
613:
614:
615:
616:
617:
618: ptr mkint(k)
619: int k;
620: {
621: return( mkconst(TYINT, convic(k) ) );
622: }
623:
624:
625: ptr mkconst(t,p)
626: int t;
627: ptr p;
628: {
629: ptr q;
630:
631: q = mknode(TCONST, 0, copys(p), PNULL);
632: q->vtype = t;
633: if(t == TYCHAR)
634: q->vtypep = mkint( strlen(p) );
635: return(q);
636: }
637:
638:
639:
640: ptr mkimcon(t,p)
641: int t;
642: char *p;
643: {
644: ptr q;
645: char *zero, buff[100];
646:
647: zero = (t==TYCOMPLEX ? "0." : "0d0");
648: sprintf(buff, "(%s,%s)", zero, p);
649: q = mknode(TCONST, 0, copys(buff), PNULL);
650: q->vtype = t;
651: return(q);
652: }
653:
654:
655:
656: ptr mkarrow(p,t)
657: register ptr p;
658: ptr t;
659: {
660: register ptr q, s;
661:
662: if(p->vsubs == 0)
663: if(p->vdim==0 && p->vtype!=TYCHAR && p->vtype!=TYSTRUCT)
664: {
665: exprerr("need an aggregate to the left of arrow",CNULL);
666: frexpr(p);
667: return( errnode() );
668: }
669: else {
670: if(p->vdim)
671: {
672: s = 0;
673: for(q = p->vdim->datap ; q ; q = q->nextp)
674: s = mkchain( mkint(1), s);
675: subscript(p, mknode(TLIST,0,s,PNULL) );
676: }
677: }
678:
679: p->vtype = TYSTRUCT;
680: p->vtypep = t->varp;
681: return(p);
682: }
683:
684:
685:
686:
687:
688: mkequiv(p)
689: ptr p;
690: {
691: ptr q, t;
692: int first;
693:
694: swii(iefile);
695: putic(ICBEGIN, 0);
696: putic(ICINDENT, 0);
697: putic(ICKEYWORD, FEQUIVALENCE);
698: putic(ICOP, OPLPAR);
699: first = 1;
700:
701: for(q = p ; q ; q = q->nextp)
702: {
703: if(first) first = 0;
704: else putic(ICOP, OPCOMMA);
705: prexpr( t = simple(LVAL,q->datap) );
706: frexpr(t);
707: }
708:
709: putic(ICOP, OPRPAR);
710: swii(icfile);
711: frchain( &p );
712: }
713:
714:
715:
716:
717: mkgeneric(gname,atype,fname,ftype)
718: char *gname, *fname;
719: int atype, ftype;
720: {
721: register ptr p;
722: ptr generic();
723:
724: if(p = generic(gname))
725: {
726: if(p->genfname[atype])
727: fatal1("generic name already defined", gname);
728: }
729: else {
730: p = ALLOC(genblock);
731: p->tag = TGENERIC;
732: p->nextgenf = generlist;
733: generlist = p;
734: p->genname = gname;
735: }
736:
737: p->genfname[atype] = fname;
738: p->genftype[atype] = ftype;
739: }
740:
741:
742: ptr generic(s)
743: char *s;
744: {
745: register ptr p;
746:
747: for(p= generlist; p ; p = p->nextgenf)
748: if(equals(s, p->genname))
749: return(p);
750: return(0);
751: }
752:
753:
754: knownfunct(s)
755: char *s;
756: {
757: register ptr p;
758:
759: for(p = knownlist ; p ; p = p->nextfunct)
760: if(equals(s, p->funcname))
761: return(p->functype);
762: return(0);
763: }
764:
765:
766:
767:
768:
769: ptr funcinv(p)
770: register ptr p;
771: {
772: ptr fp, fp1;
773: register ptr g;
774: char *s;
775: register int t;
776: int vt;
777:
778: if(g = generic(s = p->leftp->sthead->namep))
779: {
780: if(p->rightp->tag==TLIST && p->rightp->leftp
781: && ( (vt = typearg(p->rightp->leftp)) >=0)
782: && (t = g->genftype[vt]) )
783: {
784: p->leftp = builtin(t, g->genfname[vt]);
785: }
786: else {
787: dclerr("improper use of generic function", s);
788: frexpr(p);
789: return( errnode() );
790: }
791: }
792:
793: fp = p->leftp;
794: setvproc(fp, PROCYES);
795: fp1 = fp->sthead->varp;
796: s = fp->sthead->namep;
797:
798: if(p->vtype==TYUNDEFINED && fp->vclass!=CLARG)
799: if(t = knownfunct(s))
800: {
801: p->vtype = t;
802: setvproc(fp, PROCINTRINSIC);
803: setvproc(fp1, PROCINTRINSIC);
804: fp1->vtype = t;
805: builtin(t,fp1->sthead->namep);
806: cpblock(fp1, fp, sizeof(struct exprblock));
807: }
808:
809: dclit(p);
810: return(p);
811: }
812:
813:
814:
815:
816: typearg(p0)
817: register chainp p0;
818: {
819: register chainp p;
820: register int vt, maxt;
821:
822: if(p0 == NULL)
823: return(-1);
824: maxt = p0->datap->vtype;
825:
826: for(p = p0->nextp ; p ; p = p->nextp)
827: if( (vt = p->datap->vtype) > maxt)
828: maxt = vt;
829:
830: for(p = p0 ; p ; p = p->nextp)
831: p->datap = coerce(maxt, p->datap);
832:
833: return(maxt);
834: }
835:
836:
837:
838:
839: ptr typexpr(t,e)
840: register ptr t, e;
841: {
842: ptr e1;
843: int etag;
844:
845: if(t->atdim!=0 || (e->tag==TLIST && t->attype!=TYCOMPLEX) )
846: goto typerr;
847:
848: switch(t->attype)
849: {
850: case TYCOMPLEX:
851: if(e->tag==TLIST)
852: if(e->leftp==0 || e->leftp->nextp==0
853: || e->leftp->nextp->nextp!=0)
854: {
855: exprerr("bad conversion to complex", "");
856: return( errnode() );
857: }
858: else {
859: e->leftp->datap = simple(RVAL,
860: e->leftp->datap);
861: e->leftp->nextp->datap = simple(RVAL,
862: e->leftp->nextp->datap);
863: if(isconst(e->leftp->datap) &&
864: isconst(e->leftp->nextp->datap) )
865: return( compconst(e) );
866: e1 = mkcall(builtin(TYCOMPLEX,"cmplx"),
867: arg2( coerce(TYREAL,e->leftp->datap),
868: coerce(TYREAL,e->leftp->nextp->datap)));
869: frchain( &(e->leftp) );
870: frexpblock(e);
871: return(e1);
872: }
873:
874: case TYINT:
875: case TYREAL:
876: case TYLREAL:
877: case TYLOG:
878: case TYFIELD:
879: e = coerce(t->attype, simple(RVAL, e) );
880: etag = e->tag;
881: if(etag==TAROP || etag==TLOGOP || etag==TRELOP)
882: e->needpar = YES;
883: return(e);
884:
885: case TYCHAR:
886: case TYSTRUCT:
887: goto typerr;
888: }
889:
890: typerr:
891: exprerr("typexpr not fully implemented", "");
892: frexpr(e);
893: return( errnode() );
894: }
895:
896:
897:
898:
899: ptr compconst(p)
900: register ptr p;
901: {
902: register ptr a, b;
903: int as, bs;
904: int prec;
905:
906: prec = TYREAL;
907: p = p->leftp;
908: if(p == 0)
909: goto err;
910: if(p->datap->vtype == TYLREAL)
911: prec = TYLREAL;
912: a = coerce(TYLREAL, p->datap);
913: p = p->nextp;
914: if(p->nextp)
915: goto err;
916: if(p->datap->vtype == TYLREAL)
917: a = coerce(prec = TYLREAL,a);
918: b = coerce(TYLREAL, p->datap);
919:
920: if(a->tag==TNEGOP)
921: {
922: as = '-';
923: a = a->leftp;
924: }
925: else as = ' ';
926:
927: if(b->tag==TNEGOP)
928: {
929: bs = '-';
930: b = b->leftp;
931: }
932: else bs = ' ';
933:
934: if(a->tag!=TCONST || a->vtype!=prec ||
935: b->tag!=TCONST || b->vtype!=prec )
936: goto err;
937:
938: if(prec==TYLREAL && tailor.lngcxtype==NULL)
939: {
940: ptr q, e1, e2;
941: struct dimblock *dp;
942: sprintf(msg, "_const%d", ++constno);
943: q = mkvar(mkname(msg));
944: q->vtype = TYLREAL;
945: dclit(q);
946: dp = ALLOC(dimblock);
947: dp->upperb = mkint(2);
948: q->vdim = mkchain(dp,CHNULL);
949: sprintf(msg, "%c%s", as, a->leftp);
950: e1 = mkconst(TYLREAL, msg);
951: sprintf(msg, "%c%s", bs, b->leftp);
952: e2 = mkconst(TYLREAL, msg);
953: mkinit(q, mknode(TLIST,0, mkchain(e1,mkchain(e2,CHNULL)),PNULL) );
954: cfree(q->vdim);
955: q->vtype = TYLCOMPLEX;
956: return(q);
957: }
958: else
959: {
960: sprintf(msg, "(%c%s, %c%s)", as, a->leftp, bs, b->leftp);
961: return( mkconst(TYCOMPLEX, msg) );
962: }
963:
964: err: exprerr("invalid complex constant", "");
965: return( errnode() );
966: }
967:
968:
969:
970:
971: ptr mkchcon(p)
972: char *p;
973: {
974: register ptr q;
975: char buf[10];
976:
977: sprintf(buf, "_const%d", ++constno);
978: q = mkvar(mkname(buf));
979: q->vtype = TYCHAR;
980: q->vtypep = mkint(strlen(p));
981: mkinit(q, mkconst(TYCHAR, p));
982: return(q);
983: }
984:
985:
986:
987: ptr mksub1()
988: {
989: return( mknode(TLIST,0, mkchain(mkint(1),CHNULL), PNULL) );
990: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.