Annotation of 43BSD/ucb/pascal/src/put.c, revision 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.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: }

unix.superglobalmegacorp.com

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