|
|
1.1 ! root 1: /* ! 2: * Copyright (c) 1980 Regents of the University of California. ! 3: * All rights reserved. The Berkeley software License Agreement ! 4: * specifies the terms and conditions for redistribution. ! 5: */ ! 6: ! 7: #ifndef lint ! 8: static char sccsid[] = "@(#)put.c 5.1 (Berkeley) 6/18/85"; ! 9: #endif not lint ! 10: ! 11: #include "whoami.h" ! 12: #include "opcode.h" ! 13: #include "0.h" ! 14: #include "objfmt.h" ! 15: #ifdef PC ! 16: # include "pc.h" ! 17: # include "align.h" ! 18: #else ! 19: short *obufp = obuf; ! 20: #endif ! 21: ! 22: /* ! 23: * If DEBUG is defined, include the table ! 24: * of the printing opcode names. ! 25: */ ! 26: #ifdef DEBUG ! 27: #include "OPnames.h" ! 28: #endif ! 29: ! 30: #ifdef OBJ ! 31: /* ! 32: * Put is responsible for the interpreter equivalent of code ! 33: * generation. Since the interpreter is specifically designed ! 34: * for Pascal, little work is required here. ! 35: */ ! 36: /*VARARGS*/ ! 37: put(a) ! 38: { ! 39: register int *p, i; ! 40: register char *cp; ! 41: register short *sp; ! 42: register long *lp; ! 43: int n, subop, suboppr, op, oldlc; ! 44: char *string; ! 45: static int casewrd; ! 46: ! 47: /* ! 48: * It would be nice to do some more ! 49: * optimizations here. The work ! 50: * done to collapse offsets in lval ! 51: * should be done here, the IFEQ etc ! 52: * relational operators could be used ! 53: * etc. ! 54: */ ! 55: oldlc = (int) lc; /* its either this or change put to return a char * */ ! 56: if ( !CGENNING ) ! 57: /* ! 58: * code disabled - do nothing ! 59: */ ! 60: return (oldlc); ! 61: p = &a; ! 62: n = *p++; ! 63: suboppr = subop = (*p >> 8) & 0377; ! 64: op = *p & 0377; ! 65: string = 0; ! 66: #ifdef DEBUG ! 67: if ((cp = otext[op]) == NIL) { ! 68: printf("op= %o\n", op); ! 69: panic("put"); ! 70: } ! 71: #endif ! 72: switch (op) { ! 73: case O_ABORT: ! 74: cp = "*"; ! 75: break; ! 76: case O_AS: ! 77: switch(p[1]) { ! 78: case 0: ! 79: break; ! 80: case 2: ! 81: op = O_AS2; ! 82: n = 1; ! 83: break; ! 84: case 4: ! 85: op = O_AS4; ! 86: n = 1; ! 87: break; ! 88: case 8: ! 89: op = O_AS8; ! 90: n = 1; ! 91: break; ! 92: default: ! 93: goto pack; ! 94: } ! 95: # ifdef DEBUG ! 96: cp = otext[op]; ! 97: # endif DEBUG ! 98: break; ! 99: case O_FOR1U: ! 100: case O_FOR2U: ! 101: case O_FOR4U: ! 102: case O_FOR1D: ! 103: case O_FOR2D: ! 104: case O_FOR4D: ! 105: /* relative addressing */ ! 106: p[1] -= ( unsigned ) lc + sizeof(short); ! 107: /* try to pack the jump */ ! 108: if (p[1] <= 127 && p[1] >= -128) { ! 109: suboppr = subop = p[1]; ! 110: p++; ! 111: n--; ! 112: } else { ! 113: /* have to allow for extra displacement */ ! 114: p[1] -= sizeof(short); ! 115: } ! 116: break; ! 117: case O_CONG: ! 118: case O_LVCON: ! 119: case O_CON: ! 120: case O_LINO: ! 121: case O_NEW: ! 122: case O_DISPOSE: ! 123: case O_DFDISP: ! 124: case O_IND: ! 125: case O_OFF: ! 126: case O_INX2: ! 127: case O_INX4: ! 128: case O_CARD: ! 129: case O_ADDT: ! 130: case O_SUBT: ! 131: case O_MULT: ! 132: case O_IN: ! 133: case O_CASE1OP: ! 134: case O_CASE2OP: ! 135: case O_CASE4OP: ! 136: case O_FRTN: ! 137: case O_WRITES: ! 138: case O_WRITEC: ! 139: case O_WRITEF: ! 140: case O_MAX: ! 141: case O_MIN: ! 142: case O_ARGV: ! 143: case O_CTTOT: ! 144: case O_INCT: ! 145: case O_RANG2: ! 146: case O_RSNG2: ! 147: case O_RANG42: ! 148: case O_RSNG42: ! 149: case O_SUCC2: ! 150: case O_SUCC24: ! 151: case O_PRED2: ! 152: case O_PRED24: ! 153: if (p[1] == 0) ! 154: break; ! 155: case O_CON2: ! 156: case O_CON24: ! 157: pack: ! 158: if (p[1] <= 127 && p[1] >= -128) { ! 159: suboppr = subop = p[1]; ! 160: p++; ! 161: n--; ! 162: if (op == O_CON2) { ! 163: op = O_CON1; ! 164: # ifdef DEBUG ! 165: cp = otext[O_CON1]; ! 166: # endif DEBUG ! 167: } ! 168: if (op == O_CON24) { ! 169: op = O_CON14; ! 170: # ifdef DEBUG ! 171: cp = otext[O_CON14]; ! 172: # endif DEBUG ! 173: } ! 174: } ! 175: break; ! 176: case O_CON8: ! 177: { ! 178: short *sp = (short *) (&p[1]); ! 179: ! 180: #ifdef DEBUG ! 181: if ( opt( 'k' ) ) ! 182: printf ( "%5d\tCON8\t%22.14e\n" , ! 183: lc - HEADER_BYTES , ! 184: * ( ( double * ) &p[1] ) ); ! 185: #endif ! 186: # ifdef DEC11 ! 187: word(op); ! 188: # else ! 189: word(op << 8); ! 190: # endif DEC11 ! 191: for ( i = 1 ; i <= 4 ; i ++ ) ! 192: word ( *sp ++ ); ! 193: return ( oldlc ); ! 194: } ! 195: default: ! 196: if (op >= O_REL2 && op <= O_REL84) { ! 197: if ((i = (subop >> INDX) * 5 ) >= 30) ! 198: i -= 30; ! 199: else ! 200: i += 2; ! 201: #ifdef DEBUG ! 202: string = &"IFEQ\0IFNE\0IFLT\0IFGT\0IFLE\0IFGE"[i]; ! 203: #endif ! 204: suboppr = 0; ! 205: } ! 206: break; ! 207: case O_IF: ! 208: case O_TRA: ! 209: /***** ! 210: codeline = 0; ! 211: *****/ ! 212: /* relative addressing */ ! 213: p[1] -= ( unsigned ) lc + sizeof(short); ! 214: break; ! 215: case O_CONC: ! 216: #ifdef DEBUG ! 217: (string = "'x'")[1] = p[1]; ! 218: #endif ! 219: suboppr = 0; ! 220: op = O_CON1; ! 221: # ifdef DEBUG ! 222: cp = otext[O_CON1]; ! 223: # endif DEBUG ! 224: subop = p[1]; ! 225: goto around; ! 226: case O_CONC4: ! 227: #ifdef DEBUG ! 228: (string = "'x'")[1] = p[1]; ! 229: #endif ! 230: suboppr = 0; ! 231: op = O_CON14; ! 232: subop = p[1]; ! 233: goto around; ! 234: case O_CON1: ! 235: case O_CON14: ! 236: suboppr = subop = p[1]; ! 237: around: ! 238: n--; ! 239: break; ! 240: case O_CASEBEG: ! 241: casewrd = 0; ! 242: return (oldlc); ! 243: case O_CASEEND: ! 244: if ((unsigned) lc & 1) { ! 245: lc--; ! 246: word(casewrd); ! 247: } ! 248: return (oldlc); ! 249: case O_CASE1: ! 250: #ifdef DEBUG ! 251: if (opt('k')) ! 252: printf("%5d\tCASE1\t%d\n" ! 253: , lc - HEADER_BYTES, p[1]); ! 254: #endif ! 255: /* ! 256: * this to build a byte size case table ! 257: * saving bytes across calls in casewrd ! 258: * so they can be put out by word() ! 259: */ ! 260: lc++; ! 261: if ((unsigned) lc & 1) ! 262: # ifdef DEC11 ! 263: casewrd = p[1] & 0377; ! 264: # else ! 265: casewrd = (p[1] & 0377) << 8; ! 266: # endif DEC11 ! 267: else { ! 268: lc -= 2; ! 269: # ifdef DEC11 ! 270: word(((p[1] & 0377) << 8) | casewrd); ! 271: # else ! 272: word((p[1] & 0377) | casewrd); ! 273: # endif DEC11 ! 274: } ! 275: return (oldlc); ! 276: case O_CASE2: ! 277: #ifdef DEBUG ! 278: if (opt('k')) ! 279: printf("%5d\tCASE2\t%d\n" ! 280: , lc - HEADER_BYTES , p[1]); ! 281: #endif ! 282: word(p[1]); ! 283: return (oldlc); ! 284: case O_PUSH: ! 285: lp = (long *)&p[1]; ! 286: if (*lp == 0) ! 287: return (oldlc); ! 288: /* and fall through */ ! 289: case O_RANG4: ! 290: case O_RANG24: ! 291: case O_RSNG4: ! 292: case O_RSNG24: ! 293: case O_SUCC4: ! 294: case O_PRED4: ! 295: /* sub opcode optimization */ ! 296: lp = (long *)&p[1]; ! 297: if (*lp < 128 && *lp >= -128 && *lp != 0) { ! 298: suboppr = subop = *lp; ! 299: p += (sizeof(long) / sizeof(int)); ! 300: n--; ! 301: } ! 302: goto longgen; ! 303: case O_TRA4: ! 304: case O_CALL: ! 305: case O_FSAV: ! 306: case O_GOTO: ! 307: case O_NAM: ! 308: case O_READE: ! 309: /* absolute long addressing */ ! 310: lp = (long *)&p[1]; ! 311: *lp -= HEADER_BYTES; ! 312: goto longgen; ! 313: case O_RV1: ! 314: case O_RV14: ! 315: case O_RV2: ! 316: case O_RV24: ! 317: case O_RV4: ! 318: case O_RV8: ! 319: case O_RV: ! 320: case O_LV: ! 321: /* ! 322: * positive offsets represent arguments ! 323: * and must use "ap" display entry rather ! 324: * than the "fp" entry ! 325: */ ! 326: if (p[1] >= 0) { ! 327: subop++; ! 328: suboppr++; ! 329: } ! 330: # ifdef PDP11 ! 331: break; ! 332: # else ! 333: /* ! 334: * offsets out of range of word addressing ! 335: * must use long offset opcodes ! 336: */ ! 337: if (p[1] < SHORTADDR && p[1] >= -SHORTADDR) ! 338: break; ! 339: else { ! 340: op += O_LRV - O_RV; ! 341: # ifdef DEBUG ! 342: cp = otext[op]; ! 343: # endif DEBUG ! 344: } ! 345: /* and fall through */ ! 346: # endif PDP11 ! 347: case O_BEG: ! 348: case O_NODUMP: ! 349: case O_CON4: ! 350: case O_CASE4: ! 351: longgen: ! 352: n = (n << 1) - 1; ! 353: if ( op == O_LRV ) { ! 354: n--; ! 355: # if defined(ADDR32) && !defined(DEC11) ! 356: p[n / 2] <<= 16; ! 357: # endif ! 358: } ! 359: #ifdef DEBUG ! 360: if (opt('k')) { ! 361: printf("%5d\t%s", lc - HEADER_BYTES, cp+1); ! 362: if (suboppr) ! 363: printf(":%d", suboppr); ! 364: for ( i = 2, lp = (long *)&p[1]; i < n ! 365: ; i += sizeof ( long )/sizeof ( short ) ) ! 366: printf( "\t%D " , *lp ++ ); ! 367: if (i == n) { ! 368: sp = (short *)lp; ! 369: printf( "\t%d ", *sp ); ! 370: } ! 371: pchr ( '\n' ); ! 372: } ! 373: #endif ! 374: if ( op != O_CASE4 ) ! 375: # ifdef DEC11 ! 376: word((op & 0377) | subop << 8); ! 377: # else ! 378: word(op << 8 | (subop & 0377)); ! 379: # endif DEC11 ! 380: for ( i = 1, sp = (short *)&p[1]; i < n; i++) ! 381: word ( *sp ++ ); ! 382: return ( oldlc ); ! 383: } ! 384: #ifdef DEBUG ! 385: if (opt('k')) { ! 386: printf("%5d\t%s", lc - HEADER_BYTES, cp+1); ! 387: if (suboppr) ! 388: printf(":%d", suboppr); ! 389: if (string) ! 390: printf("\t%s",string); ! 391: if (n > 1) ! 392: pchr('\t'); ! 393: for (i=1; i<n; i++) ! 394: printf("%d ", p[i]); ! 395: pchr('\n'); ! 396: } ! 397: #endif ! 398: if (op != NIL) ! 399: # ifdef DEC11 ! 400: word((op & 0377) | subop << 8); ! 401: # else ! 402: word(op << 8 | (subop & 0377)); ! 403: # endif DEC11 ! 404: for (i=1; i<n; i++) ! 405: word(p[i]); ! 406: return (oldlc); ! 407: } ! 408: #endif OBJ ! 409: ! 410: /* ! 411: * listnames outputs a list of enumerated type names which ! 412: * can then be selected from to output a TSCAL ! 413: * a pointer to the address in the code of the namelist ! 414: * is kept in value[ NL_ELABEL ]. ! 415: */ ! 416: listnames(ap) ! 417: ! 418: register struct nl *ap; ! 419: { ! 420: struct nl *next; ! 421: #ifdef OBJ ! 422: register int oldlc; ! 423: #endif ! 424: register int len; ! 425: register unsigned w; ! 426: register char *strptr; ! 427: ! 428: if ( !CGENNING ) ! 429: /* code is off - do nothing */ ! 430: return(NIL); ! 431: if (ap->class != TYPE) ! 432: ap = ap->type; ! 433: if (ap->value[ NL_ELABEL ] != 0) { ! 434: /* the list already exists */ ! 435: return( ap -> value[ NL_ELABEL ] ); ! 436: } ! 437: # ifdef OBJ ! 438: oldlc = (int) lc; /* same problem as put */ ! 439: (void) put(2, O_TRA, lc); ! 440: ap->value[ NL_ELABEL ] = (int) lc; ! 441: # endif OBJ ! 442: # ifdef PC ! 443: putprintf(" .data", 0); ! 444: aligndot(A_STRUCT); ! 445: ap -> value[ NL_ELABEL ] = (int) getlab(); ! 446: (void) putlab((char *) ap -> value[ NL_ELABEL ] ); ! 447: # endif PC ! 448: /* number of scalars */ ! 449: next = ap->type; ! 450: len = next->range[1]-next->range[0]+1; ! 451: # ifdef OBJ ! 452: (void) put(2, O_CASE2, len); ! 453: # endif OBJ ! 454: # ifdef PC ! 455: putprintf( " .word %d" , 0 , len ); ! 456: # endif PC ! 457: /* offsets of each scalar name */ ! 458: len = (len+1)*sizeof(short); ! 459: # ifdef OBJ ! 460: (void) put(2, O_CASE2, len); ! 461: # endif OBJ ! 462: # ifdef PC ! 463: putprintf( " .word %d" , 0 , len ); ! 464: # endif PC ! 465: next = ap->chain; ! 466: do { ! 467: for(strptr = next->symbol; *strptr++; len++) ! 468: continue; ! 469: len++; ! 470: # ifdef OBJ ! 471: (void) put(2, O_CASE2, len); ! 472: # endif OBJ ! 473: # ifdef PC ! 474: putprintf( " .word %d" , 0 , len ); ! 475: # endif PC ! 476: } while (next = next->chain); ! 477: /* list of scalar names */ ! 478: strptr = getnext(ap, &next); ! 479: # ifdef OBJ ! 480: do { ! 481: # ifdef DEC11 ! 482: w = (unsigned) *strptr; ! 483: # else ! 484: w = *strptr << 8; ! 485: # endif DEC11 ! 486: if (!*strptr++) ! 487: strptr = getnext(next, &next); ! 488: # ifdef DEC11 ! 489: w |= *strptr << 8; ! 490: # else ! 491: w |= (unsigned) *strptr; ! 492: # endif DEC11 ! 493: if (!*strptr++) ! 494: strptr = getnext(next, &next); ! 495: word((int) w); ! 496: } while (next); ! 497: /* jump over the mess */ ! 498: patch((PTR_DCL) oldlc); ! 499: # endif OBJ ! 500: # ifdef PC ! 501: while ( next ) { ! 502: while ( *strptr ) { ! 503: putprintf( " .byte 0%o" , 1 , *strptr++ ); ! 504: for ( w = 2 ; ( w <= 8 ) && *strptr ; w ++ ) { ! 505: putprintf( ",0%o" , 1 , *strptr++ ); ! 506: } ! 507: putprintf( "" , 0 ); ! 508: } ! 509: putprintf( " .byte 0" , 0 ); ! 510: strptr = getnext( next , &next ); ! 511: } ! 512: putprintf( " .text" , 0 ); ! 513: # endif PC ! 514: return( ap -> value[ NL_ELABEL ] ); ! 515: } ! 516: ! 517: char * ! 518: getnext(next, new) ! 519: ! 520: struct nl *next, **new; ! 521: { ! 522: if (next != NIL) { ! 523: next = next->chain; ! 524: *new = next; ! 525: } ! 526: if (next == NLNIL) ! 527: return(""); ! 528: #ifdef OBJ ! 529: if (opt('k') && CGENNING ) ! 530: printf("%5d\t\t\"%s\"\n", lc-HEADER_BYTES, next->symbol); ! 531: #endif OBJ ! 532: return(next->symbol); ! 533: } ! 534: ! 535: #ifdef OBJ ! 536: /* ! 537: * Putspace puts out a table ! 538: * of nothing to leave space ! 539: * for the case branch table e.g. ! 540: */ ! 541: putspace(n) ! 542: int n; ! 543: { ! 544: register i; ! 545: ! 546: if ( !CGENNING ) ! 547: /* ! 548: * code disabled - do nothing ! 549: */ ! 550: return; ! 551: #ifdef DEBUG ! 552: if (opt('k')) ! 553: printf("%5d\t.=.+%d\n", lc - HEADER_BYTES, n); ! 554: #endif ! 555: for (i = even(n); i > 0; i -= 2) ! 556: word(0); ! 557: } ! 558: ! 559: putstr(sptr, padding) ! 560: ! 561: char *sptr; ! 562: int padding; ! 563: { ! 564: register unsigned short w; ! 565: register char *strptr = sptr; ! 566: register int pad = padding; ! 567: ! 568: if ( !CGENNING ) ! 569: /* ! 570: * code disabled - do nothing ! 571: */ ! 572: return; ! 573: #ifdef DEBUG ! 574: if (opt('k')) ! 575: printf("%5d\t\t\"%s\"\n", lc-HEADER_BYTES, strptr); ! 576: #endif ! 577: if (pad == 0) { ! 578: do { ! 579: # ifdef DEC11 ! 580: w = (unsigned short) * strptr; ! 581: # else ! 582: w = (unsigned short)*strptr<<8; ! 583: # endif DEC11 ! 584: if (w) ! 585: # ifdef DEC11 ! 586: w |= *++strptr << 8; ! 587: # else ! 588: w |= *++strptr; ! 589: # endif DEC11 ! 590: word((int) w); ! 591: } while (*strptr++); ! 592: } else { ! 593: # ifdef DEC11 ! 594: do { ! 595: w = (unsigned short) * strptr; ! 596: if (w) { ! 597: if (*++strptr) ! 598: w |= *strptr << 8; ! 599: else { ! 600: w |= ' ' << 8; ! 601: pad--; ! 602: } ! 603: word((int) w); ! 604: } ! 605: } while (*strptr++); ! 606: # else ! 607: do { ! 608: w = (unsigned short)*strptr<<8; ! 609: if (w) { ! 610: if (*++strptr) ! 611: w |= *strptr; ! 612: else { ! 613: w |= ' '; ! 614: pad--; ! 615: } ! 616: word(w); ! 617: } ! 618: } while (*strptr++); ! 619: # endif DEC11 ! 620: while (pad > 1) { ! 621: # ifdef DEC11 ! 622: word(' ' | (' ' << 8)); ! 623: # else ! 624: word((' ' << 8) | ' '); ! 625: # endif DEC11 ! 626: pad -= 2; ! 627: } ! 628: if (pad == 1) ! 629: # ifdef DEC11 ! 630: word(' '); ! 631: # else ! 632: word(' ' << 8); ! 633: # endif DEC11 ! 634: else ! 635: word(0); ! 636: } ! 637: } ! 638: #endif OBJ ! 639: ! 640: #ifndef PC ! 641: lenstr(sptr, padding) ! 642: ! 643: char *sptr; ! 644: int padding; ! 645: ! 646: { ! 647: register int cnt; ! 648: register char *strptr = sptr; ! 649: ! 650: cnt = padding; ! 651: do { ! 652: cnt++; ! 653: } while (*strptr++); ! 654: return((++cnt) & ~1); ! 655: } ! 656: #endif ! 657: ! 658: /* ! 659: * Patch repairs the branch ! 660: * at location loc to come ! 661: * to the current location. ! 662: * for PC, this puts down the label ! 663: * and the branch just references that label. ! 664: * lets here it for two pass assemblers. ! 665: */ ! 666: patch(loc) ! 667: PTR_DCL loc; ! 668: { ! 669: ! 670: # ifdef OBJ ! 671: patchfil(loc, (long)(lc-loc-2), 1); ! 672: # endif OBJ ! 673: # ifdef PC ! 674: (void) putlab((char *) loc ); ! 675: # endif PC ! 676: } ! 677: ! 678: #ifdef OBJ ! 679: patch4(loc) ! 680: PTR_DCL loc; ! 681: { ! 682: patchfil(loc, (long)(lc - HEADER_BYTES), 2); ! 683: } ! 684: ! 685: /* ! 686: * Patchfil makes loc+2 have jmploc ! 687: * as its contents. ! 688: */ ! 689: patchfil(loc, jmploc, words) ! 690: PTR_DCL loc; ! 691: long jmploc; ! 692: int words; ! 693: { ! 694: register i; ! 695: extern long lseek(); ! 696: short val; ! 697: ! 698: if ( !CGENNING ) ! 699: return; ! 700: if (loc > (unsigned) lc) ! 701: panic("patchfil"); ! 702: #ifdef DEBUG ! 703: if (opt('k')) ! 704: printf("\tpatch %u %D\n", loc - HEADER_BYTES, jmploc); ! 705: #endif ! 706: val = jmploc; ! 707: do { ! 708: # ifndef DEC11 ! 709: if (words > 1) ! 710: val = jmploc >> 16; ! 711: else ! 712: val = jmploc; ! 713: # endif DEC11 ! 714: i = ((unsigned) loc + 2 - ((unsigned) lc & ~01777))/2; ! 715: if (i >= 0 && i < 1024) { ! 716: obuf[i] = val; ! 717: } else { ! 718: (void) lseek(ofil, (long) loc+2, 0); ! 719: write(ofil, (char *) (&val), 2); ! 720: (void) lseek(ofil, (long) 0, 2); ! 721: } ! 722: loc += 2; ! 723: # ifdef DEC11 ! 724: val = jmploc >> 16; ! 725: # endif DEC11 ! 726: } while (--words); ! 727: } ! 728: ! 729: /* ! 730: * Put the word o into the code ! 731: */ ! 732: word(o) ! 733: int o; ! 734: { ! 735: ! 736: *obufp = o; ! 737: obufp++; ! 738: lc += 2; ! 739: if (obufp >= obuf+512) ! 740: pflush(); ! 741: } ! 742: ! 743: extern char *obj; ! 744: /* ! 745: * Flush the code buffer ! 746: */ ! 747: pflush() ! 748: { ! 749: register i; ! 750: ! 751: i = (obufp - ( ( short * ) obuf ) ) * 2; ! 752: if (i != 0 && write(ofil, (char *) obuf, i) != i) ! 753: perror(obj), pexit(DIED); ! 754: obufp = obuf; ! 755: } ! 756: #endif OBJ ! 757: ! 758: /* ! 759: * Getlab - returns the location counter. ! 760: * included here for the eventual code generator. ! 761: * for PC, thank you! ! 762: */ ! 763: char * ! 764: getlab() ! 765: { ! 766: # ifdef OBJ ! 767: ! 768: return (lc); ! 769: # endif OBJ ! 770: # ifdef PC ! 771: static long lastlabel; ! 772: ! 773: return ( (char *) ++lastlabel ); ! 774: # endif PC ! 775: } ! 776: ! 777: /* ! 778: * Putlab - lay down a label. ! 779: * for PC, just print the label name with a colon after it. ! 780: */ ! 781: char * ! 782: putlab(l) ! 783: char *l; ! 784: { ! 785: ! 786: # ifdef PC ! 787: putprintf( PREFIXFORMAT , 1 , (int) LABELPREFIX , (int) l ); ! 788: putprintf( ":" , 0 ); ! 789: # endif PC ! 790: return (l); ! 791: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.