Annotation of 43BSDReno/pgrm/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.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.