Annotation of 43BSDReno/pgrm/pascal/src/put.c, revision 1.1.1.1

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

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.