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