|
|
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.