Annotation of 41BSD/cmd/pi/p2put.c, revision 1.1.1.1

1.1       root        1: /* Copyright (c) 1979 Regents of the University of California */
                      2: 
                      3: static char sccsid[] = "@(#)p2put.c 1.3 10/16/80";
                      4: 
                      5:     /*
                      6:      * functions to help pi put out
                      7:      * polish postfix binary portable c compiler intermediate code
                      8:      * thereby becoming the portable pascal compiler
                      9:      */
                     10: 
                     11: #include       "whoami.h"
                     12: #ifdef PC
                     13: #include       "0.h"
                     14: #include       "pcops.h"
                     15: #include       "pc.h"
                     16: 
                     17:     /*
                     18:      * mash into f77's format
                     19:      * lovely, isn't it?
                     20:      */
                     21: #define                TOF77( fop,val,rest )   ( ( ( (rest) & 0177777 ) << 16 ) \
                     22:                                        | ( ( (val) & 0377 ) << 8 )      \
                     23:                                        | ( (fop) & 0377 ) )
                     24: 
                     25:     /*
                     26:      * emits an ftext operator and a string to the pcstream
                     27:      */
                     28: puttext( string )
                     29:     char       *string;
                     30:     {
                     31:        int     length = str4len( string );
                     32: 
                     33:        if ( cgenflg )
                     34:            return;
                     35:        p2word( TOF77( P2FTEXT , length , 0 ) );
                     36: #      ifdef DEBUG
                     37:            if ( opt( 'k' ) ) {
                     38:                fprintf( stdout , "P2FTEXT | %3d | 0    " , length );
                     39:            }
                     40: #      endif
                     41:        p2string( string );
                     42:     }
                     43: 
                     44: int
                     45: str4len( string )
                     46:     char       *string;
                     47:     {
                     48:        
                     49:        return ( ( strlen( string ) + 3 ) / 4 );
                     50:     }
                     51: 
                     52:     /*
                     53:      * put formatted text into a buffer for printing to the pcstream.
                     54:      * a call to putpflush actually puts out the text.
                     55:      * none of arg1 .. arg5 need be present.
                     56:      * and you can add more if you need them.
                     57:      */
                     58:     /* VARARGS */
                     59: putprintf( format , incomplete , arg1 , arg2 , arg3 , arg4 , arg5 )
                     60:     char       *format;
                     61:     int                incomplete;
                     62:     {
                     63:        static char     ppbuffer[ BUFSIZ ];
                     64:        static char     *ppbufp = ppbuffer;
                     65: 
                     66:        if ( cgenflg )
                     67:            return;
                     68:        sprintf( ppbufp , format , arg1 , arg2 , arg3 , arg4 , arg5 );
                     69:        ppbufp = &( ppbuffer[ strlen( ppbuffer ) ] );
                     70:        if ( ppbufp >= &( ppbuffer[ BUFSIZ ] ) )
                     71:            panic( "putprintf" );
                     72:        if ( ! incomplete ) {
                     73:            puttext( ppbuffer );
                     74:            ppbufp = ppbuffer;
                     75:        }
                     76:     }
                     77: 
                     78:     /*
                     79:      * emit a left bracket operator to pcstream
                     80:      * with function number, the maximum temp register, and total local bytes
                     81:      * until i figure out how to use them, regs 0 .. 11 are free.
                     82:      * one idea for one reg is to save the display pointer on block entry
                     83:      */
                     84: putlbracket( ftnno , localbytes )
                     85:     int        ftnno;
                     86:     int        localbytes;
                     87:     {
                     88: #      define  MAXTP2REG       11
                     89: 
                     90:        p2word( TOF77( P2FLBRAC , MAXTP2REG , ftnno ) );
                     91:        p2word( BITSPERBYTE * localbytes );
                     92: #      ifdef DEBUG
                     93:            if ( opt( 'k' ) ) {
                     94:                fprintf( stdout
                     95:                        , "P2FLBRAC | %3d | %d  " , MAXTP2REG , ftnno );
                     96:                fprintf( stdout , "%d\n"
                     97:                        , BITSPERBYTE * localbytes );
                     98:            }
                     99: #      endif
                    100:     }
                    101: 
                    102:     /*
                    103:      * emit a right bracket operator
                    104:      * which for the binary (fortran) interface
                    105:      * forces the stack allocate and register mask
                    106:      */
                    107: putrbracket( ftnno )
                    108:     int        ftnno;
                    109:     {
                    110: 
                    111:        p2word( TOF77( P2FRBRAC , 0 , ftnno ) );
                    112: #      ifdef DEBUG
                    113:            if ( opt( 'k' ) ) {
                    114:                fprintf( stdout , "P2FRBRAC |   0 | %d\n" , ftnno );
                    115:            }
                    116: #      endif
                    117:     }
                    118: 
                    119:     /*
                    120:      * emit an eof operator
                    121:      */
                    122: puteof()
                    123:     {
                    124:        
                    125:        p2word( P2FEOF );
                    126: #      ifdef DEBUG
                    127:            if ( opt( 'k' ) ) {
                    128:                fprintf( stdout , "P2FEOF\n" );
                    129:            }
                    130: #      endif
                    131:     }
                    132: 
                    133:     /*
                    134:      * emit a dot operator,
                    135:      * with a source file line number and name
                    136:      * if line is negative, there was an error on that line, but who cares?
                    137:      */
                    138: putdot( filename , line )
                    139:     char       *filename;
                    140:     int                line;
                    141:     {
                    142:        int     length = str4len( filename );
                    143: 
                    144:        if ( line < 0 ) {
                    145:            line = -line;
                    146:        }
                    147:        p2word( TOF77( P2FEXPR , length , line ) );
                    148: #      ifdef DEBUG
                    149:            if ( opt( 'k' ) ) {
                    150:                fprintf( stdout , "P2FEXPR | %3d | %d   " , length , line );
                    151:            }
                    152: #      endif
                    153:        p2string( filename );
                    154:     }
                    155: 
                    156:     /*
                    157:      * put out a leaf node
                    158:      */
                    159: putleaf( op , lval , rval , type , name )
                    160:     int                op;
                    161:     int                lval;
                    162:     int                rval;
                    163:     int                type;
                    164:     char       *name;
                    165:     {
                    166:        if ( cgenflg )
                    167:            return;
                    168:        switch ( op ) {
                    169:            default:
                    170:                panic( "[putleaf]" );
                    171:            case P2ICON:
                    172:                p2word( TOF77( P2ICON , name != NIL , type ) );
                    173:                p2word( lval );
                    174: #              ifdef DEBUG
                    175:                    if ( opt( 'k' ) ) {
                    176:                        fprintf( stdout , "P2ICON | %3d | %d    " 
                    177:                               , name != NIL , type );
                    178:                        fprintf( stdout , "%d\n" , lval );
                    179:                    }
                    180: #              endif
                    181:                if ( name )
                    182:                    p2name( name );
                    183:                break;
                    184:            case P2NAME:
                    185:                p2word( TOF77( P2NAME , lval != 0 , type ) );
                    186:                if ( lval ) 
                    187:                    p2word( lval );
                    188: #              ifdef DEBUG
                    189:                    if ( opt( 'k' ) ) {
                    190:                        fprintf( stdout , "P2NAME | %3d | %d    " 
                    191:                               , lval != 0 , type );
                    192:                        if ( lval )
                    193:                            fprintf( stdout , "%d       " , lval );
                    194:                    }
                    195: #              endif
                    196:                p2name( name );
                    197:                break;
                    198:            case P2REG:
                    199:                p2word( TOF77( P2REG , rval , type ) );
                    200: #              ifdef DEBUG
                    201:                    if ( opt( 'k' ) ) {
                    202:                        fprintf( stdout , "P2REG | %3d | %d\n" , rval , type );
                    203:                    }
                    204: #              endif
                    205:                break;
                    206:        }
                    207:     }
                    208: 
                    209:     /*
                    210:      * rvalues are just lvalues with indirection, except
                    211:      * special case for named globals, whose names are their rvalues
                    212:      */
                    213: putRV( name , level , offset , type )
                    214:     char       *name;
                    215:     int                level;
                    216:     int                offset;
                    217:     int                type;
                    218:     {
                    219:        char    extname[ BUFSIZ ];
                    220:        char    *printname;
                    221: 
                    222:        if ( cgenflg )
                    223:            return;
                    224:        if ( ( level <= 1 ) && ( name != 0 ) ) {
                    225:            if ( name[0] != '_' ) {
                    226:                    sprintf( extname , EXTFORMAT , name );
                    227:                    printname = extname;
                    228:            } else {
                    229:                    printname = name;
                    230:            }
                    231:            putleaf( P2NAME , offset , 0 , type , printname );
                    232:            return;
                    233:        }
                    234:        putLV( name , level , offset , type );
                    235:        putop( P2UNARY P2MUL , type );
                    236:     }
                    237: 
                    238:     /*
                    239:      * put out an lvalue 
                    240:      * given a level and offset
                    241:      * special case for
                    242:      *     named globals, whose lvalues are just their names as constants.
                    243:      *     negative offsets, that are offsets from the frame pointer.
                    244:      *     positive offsets, that are offsets from argument pointer.
                    245:      */
                    246: putLV( name , level , offset , type )
                    247:     char       *name;
                    248:     int                level;
                    249:     int                offset;
                    250:     int                type;
                    251:     {
                    252:        char            extname[ BUFSIZ ];
                    253:        char            *printname;
                    254: 
                    255:        if ( cgenflg )
                    256:            return;
                    257:        if ( ( level <= 1 ) && ( name != 0 ) ) {
                    258:            if ( name[0] != '_' ) {
                    259:                    sprintf( extname , EXTFORMAT , name );
                    260:                    printname = extname;
                    261:            } else {
                    262:                    printname = name;
                    263:            }
                    264:            putleaf( P2ICON , offset , 0 , ADDTYPE( type , P2PTR )
                    265:                    , printname );
                    266:            return;
                    267:        }
                    268:        if ( level == cbn ) {
                    269:                if ( offset < 0 ) {
                    270:                    putleaf( P2REG , 0 , P2FP , ADDTYPE( type , P2PTR ) , 0 );
                    271:                } else {
                    272:                    putleaf( P2REG , 0 , P2AP , ADDTYPE( type , P2PTR ) , 0 );
                    273:                }
                    274:        } else {
                    275:                if ( offset < 0 ) {
                    276:                        putleaf( P2NAME
                    277:                            , ( level * sizeof(struct dispsave) ) + FP_OFFSET
                    278:                            , 0 , P2PTR | P2CHAR , DISPLAYNAME );
                    279:                } else {
                    280:                        putleaf( P2NAME
                    281:                            , ( level * sizeof(struct dispsave) ) + AP_OFFSET
                    282:                            , 0 , P2PTR | P2CHAR , DISPLAYNAME );
                    283:                }
                    284:        }
                    285:        if ( offset < 0 ) {
                    286:                putleaf( P2ICON , -offset , 0 , P2INT , 0 );
                    287:                putop( P2MINUS , P2PTR | P2CHAR );
                    288:        } else {
                    289:                putleaf( P2ICON , offset , 0 , P2INT , 0 );
                    290:                putop( P2PLUS , P2PTR | P2CHAR );
                    291:        }
                    292:        return;
                    293:     }
                    294: 
                    295:     /*
                    296:      * put out a floating point constant leaf node
                    297:      * the constant is declared in aligned data space
                    298:      * and a P2NAME leaf put out for it
                    299:      */
                    300: putCON8( value )
                    301:     double     value;
                    302:     {
                    303:        int     label;
                    304:        char    name[ BUFSIZ ];
                    305: 
                    306:        if ( cgenflg )
                    307:            return;
                    308:        putprintf( "    .data" , 0 );
                    309:        putprintf( "    .align 2" , 0 );
                    310:        label = getlab();
                    311:        putlab( label );
                    312:        putprintf( "    .double 0d%.20e" , 0 , value );
                    313:        putprintf( "    .text" , 0 );
                    314:        sprintf( name , PREFIXFORMAT , LABELPREFIX , label );
                    315:        putleaf( P2NAME , 0 , 0 , P2DOUBLE , name );
                    316:     }
                    317: 
                    318:        /*
                    319:         * put out either an lvalue or an rvalue for a constant string.
                    320:         * an lvalue (for assignment rhs's) is the name as a constant, 
                    321:         * an rvalue (for parameters) is just the name.
                    322:         */
                    323: putCONG( string , length , required )
                    324:     char       *string;
                    325:     int                length;
                    326:     int                required;
                    327:     {
                    328:        char    name[ BUFSIZ ];
                    329:        int     label;
                    330:        char    *cp;
                    331:        int     pad;
                    332:        int     others;
                    333: 
                    334:        if ( cgenflg )
                    335:            return;
                    336:        putprintf( "    .data" , 0 );
                    337:        label = getlab();
                    338:        putlab( label );
                    339:        cp = string;
                    340:        while ( *cp ) {
                    341:            putprintf( "        .byte   0%o" , 1 , *cp ++ );
                    342:            for ( others = 2 ; ( others <= 8 ) && *cp ; others ++ ) {
                    343:                putprintf( ",0%o" , 1 , *cp++ );
                    344:            }
                    345:            putprintf( "" , 0 );
                    346:        }
                    347:        pad = length - strlen( string );
                    348:        while ( pad-- > 0 ) {
                    349:            putprintf( "        .byte   0%o" , 1 , ' ' );
                    350:            for ( others = 2 ; ( others <= 8 ) && ( pad-- > 0 ) ; others++ ) {
                    351:                putprintf( ",0%o" , 1 , ' ' );
                    352:            }
                    353:            putprintf( "" , 0 );
                    354:        }
                    355:        putprintf( "    .byte   0" , 0 );
                    356:        putprintf( "    .text"  , 0 );
                    357:        sprintf( name , PREFIXFORMAT , LABELPREFIX , label );
                    358:        if ( required == RREQ ) {
                    359:            putleaf( P2NAME , 0 , 0 , P2ARY | P2CHAR , name );
                    360:        } else {
                    361:            putleaf( P2ICON , 0 , 0 , P2PTR | P2CHAR , name );
                    362:        }
                    363:     }
                    364: 
                    365:     /*
                    366:      * map a pascal type to a c type
                    367:      * this would be tail recursive, but i unfolded it into a for (;;).
                    368:      * this is sort of like isa and lwidth
                    369:      * a note on the types used by the portable c compiler:
                    370:      *     they are divided into a basic type (char, short, int, long, etc.)
                    371:      *     and qualifications on those basic types (pointer, function, array).
                    372:      *     the basic type is kept in the low 4 bits of the type descriptor,
                    373:      *     and the qualifications are arranged in two bit chunks, with the
                    374:      *     most significant on the right,
                    375:      *     and the least significant on the left
                    376:      *         e.g. int *foo();
                    377:      *                 (a function returning a pointer to an integer)
                    378:      *         is stored as
                    379:      *             <ptr><ftn><int>
                    380:      * so, we build types recursively
                    381:      * also, we know that /lib/f1 can only deal with 6 qualifications
                    382:      * so we stop the recursion there.  this stops infinite type recursion
                    383:      * through mutually recursive pointer types.
                    384:      */
                    385: #define        MAXQUALS        6
                    386: int
                    387: p2type( np )
                    388: {
                    389: 
                    390:     return typerecur( np , 0 );
                    391: }
                    392: typerecur( np , quals )
                    393:     struct nl  *np;
                    394:     int                quals;
                    395:     {
                    396:        
                    397:        if ( np == NIL || quals > MAXQUALS ) {
                    398:            return P2UNDEF;
                    399:        }
                    400:        switch ( np -> class ) {
                    401:            case SCAL :
                    402:            case RANGE :
                    403:                if ( np -> type == ( nl + TDOUBLE ) ) {
                    404:                    return P2DOUBLE;
                    405:                }
                    406:                switch ( bytes( np -> range[0] , np -> range[1] ) ) {
                    407:                    case 1:
                    408:                        return P2CHAR;
                    409:                    case 2:
                    410:                        return P2SHORT;
                    411:                    case 4:
                    412:                        return P2INT;
                    413:                    default:
                    414:                        panic( "p2type int" );
                    415:                }
                    416:            case STR :
                    417:                return ( P2ARY | P2CHAR );
                    418:            case RECORD :
                    419:            case SET :
                    420:                return P2STRTY;
                    421:            case FILET :
                    422:                return ( P2PTR | P2STRTY );
                    423:            case CONST :
                    424:            case VAR :
                    425:            case FIELD :
                    426:                return p2type( np -> type );
                    427:            case TYPE :
                    428:                switch ( nloff( np ) ) {
                    429:                    case TNIL :
                    430:                        return ( P2PTR | P2UNDEF );
                    431:                    case TSTR :
                    432:                        return ( P2ARY | P2CHAR );
                    433:                    case TSET :
                    434:                        return P2STRTY;
                    435:                    default :
                    436:                        return ( p2type( np -> type ) );
                    437:                }
                    438:            case REF:
                    439:            case WITHPTR:
                    440:            case PTR :
                    441:                return ADDTYPE( typerecur( np -> type , quals + 1 ) , P2PTR );
                    442:            case ARRAY :
                    443:                return ADDTYPE( typerecur( np -> type , quals + 1 ) , P2ARY );
                    444:            case FUNC :
                    445:                    /*
                    446:                     * functions are really pointers to functions
                    447:                     * which return their underlying type.
                    448:                     */
                    449:                return ADDTYPE( ADDTYPE( typerecur( np -> type , quals + 2 ) ,
                    450:                                        P2FTN ) , P2PTR );
                    451:            case PROC :
                    452:                    /*
                    453:                     * procedures are pointers to functions 
                    454:                     * which return integers (whether you look at them or not)
                    455:                     */
                    456:                return ADDTYPE( ADDTYPE( P2INT , P2FTN ) , P2PTR );
                    457:            case FFUNC :
                    458:            case FPROC :
                    459:                    /*
                    460:                     *  formal procedures and functions are pointers
                    461:                     *  to structures which describe their environment.
                    462:                     */
                    463:                return ADDTYPE( P2PTR , P2STRTY );
                    464:            default :
                    465:                panic( "p2type" );
                    466:        }
                    467:     }
                    468: 
                    469:     /*
                    470:      * add a most significant type modifier to a type
                    471:      */
                    472: long
                    473: addtype( underlying , mtype )
                    474:     long       underlying;
                    475:     long       mtype;
                    476:     {
                    477:        return ( ( ( underlying & ~P2BASETYPE ) << P2TYPESHIFT )
                    478:               | mtype
                    479:               | ( underlying & P2BASETYPE ) );
                    480:     }
                    481: 
                    482:     /*
                    483:      * put a typed operator to the pcstream
                    484:      */
                    485: putop( op , type )
                    486:     int                op;
                    487:     int                type;
                    488:     {
                    489:        extern char     *p2opnames[];
                    490:        
                    491:        if ( cgenflg )
                    492:            return;
                    493:        p2word( TOF77( op , 0 , type ) );
                    494: #      ifdef DEBUG
                    495:            if ( opt( 'k' ) ) {
                    496:                fprintf( stdout , "%s (%d) |   0 | %d\n"
                    497:                        , p2opnames[ op ] , op , type );
                    498:            }
                    499: #      endif
                    500:     }
                    501: 
                    502:     /*
                    503:      * put out a structure operator (STASG, STARG, STCALL, UNARY STCALL )
                    504:      * which looks just like a regular operator, only the size and
                    505:      * alignment go in the next consecutive words
                    506:      */
                    507: putstrop( op , type , size , alignment )
                    508:     int        op;
                    509:     int        type;
                    510:     int        size;
                    511:     int        alignment;
                    512:     {
                    513:        extern char     *p2opnames[];
                    514:        
                    515:        if ( cgenflg )
                    516:            return;
                    517:        p2word( TOF77( op , 0 , type ) );
                    518:        p2word( size );
                    519:        p2word( alignment );
                    520: #      ifdef DEBUG
                    521:            if ( opt( 'k' ) ) {
                    522:                fprintf( stdout , "%s (%d) |   0 | %d   %d %d\n"
                    523:                        , p2opnames[ op ] , op , type , size , alignment );
                    524:            }
                    525: #      endif
                    526:     }
                    527: 
                    528:     /*
                    529:      * the string names of p2ops
                    530:      */
                    531: char   *p2opnames[] = {
                    532:        "",
                    533:        "P2UNDEFINED",          /* 1 */
                    534:        "P2NAME",               /* 2 */
                    535:        "P2STRING",             /* 3 */
                    536:        "P2ICON",               /* 4 */
                    537:        "P2FCON",               /* 5 */
                    538:        "P2PLUS",               /* 6 */
                    539:        "",
                    540:        "P2MINUS",              /* 8            also unary == P2NEG */
                    541:        "",
                    542:        "P2NEG",
                    543:        "P2MUL",                /* 11           also unary == P2INDIRECT */
                    544:        "",
                    545:        "P2INDIRECT",
                    546:        "P2AND",                /* 14           also unary == P2ADDROF */
                    547:        "",
                    548:        "P2ADDROF",
                    549:        "P2OR",                 /* 17 */
                    550:        "",
                    551:        "P2ER",                 /* 19 */
                    552:        "",
                    553:        "P2QUEST",              /* 21 */
                    554:        "P2COLON",              /* 22 */
                    555:        "P2ANDAND",             /* 23 */
                    556:        "P2OROR",               /* 24 */
                    557:        "",                     /* 25 */
                    558:        "",                     /* 26 */
                    559:        "",                     /* 27 */
                    560:        "",                     /* 28 */
                    561:        "",                     /* 29 */
                    562:        "",                     /* 30 */
                    563:        "",                     /* 31 */
                    564:        "",                     /* 32 */
                    565:        "",                     /* 33 */
                    566:        "",                     /* 34 */
                    567:        "",                     /* 35 */
                    568:        "",                     /* 36 */
                    569:        "",                     /* 37 */
                    570:        "",                     /* 38 */
                    571:        "",                     /* 39 */
                    572:        "",                     /* 40 */
                    573:        "",                     /* 41 */
                    574:        "",                     /* 42 */
                    575:        "",                     /* 43 */
                    576:        "",                     /* 44 */
                    577:        "",                     /* 45 */
                    578:        "",                     /* 46 */
                    579:        "",                     /* 47 */
                    580:        "",                     /* 48 */
                    581:        "",                     /* 49 */
                    582:        "",                     /* 50 */
                    583:        "",                     /* 51 */
                    584:        "",                     /* 52 */
                    585:        "",                     /* 53 */
                    586:        "",                     /* 54 */
                    587:        "",                     /* 55 */
                    588:        "P2LISTOP",             /* 56 */
                    589:        "",
                    590:        "P2ASSIGN",             /* 58 */
                    591:        "P2COMOP",              /* 59 */
                    592:        "P2DIV",                /* 60 */
                    593:        "",
                    594:        "P2MOD",                /* 62 */
                    595:        "",
                    596:        "P2LS",                 /* 64 */
                    597:        "",
                    598:        "P2RS",                 /* 66 */
                    599:        "",
                    600:        "P2DOT",                /* 68 */
                    601:        "P2STREF",              /* 69 */
                    602:        "P2CALL",               /* 70           also unary */
                    603:        "",
                    604:        "P2UNARYCALL",
                    605:        "P2FORTCALL",           /* 73           also unary */
                    606:        "",
                    607:        "P2UNARYFORTCALL",
                    608:        "P2NOT",                /* 76 */
                    609:        "P2COMPL",              /* 77 */
                    610:        "P2INCR",               /* 78 */
                    611:        "P2DECR",               /* 79 */
                    612:        "P2EQ",                 /* 80 */
                    613:        "P2NE",                 /* 81 */
                    614:        "P2LE",                 /* 82 */
                    615:        "P2LT",                 /* 83 */
                    616:        "P2GE",                 /* 84 */
                    617:        "P2GT",                 /* 85 */
                    618:        "P2ULE",                /* 86 */
                    619:        "P2ULT",                /* 87 */
                    620:        "P2UGE",                /* 88 */
                    621:        "P2UGT",                /* 89 */
                    622:        "P2SETBIT",             /* 90 */
                    623:        "P2TESTBIT",            /* 91 */
                    624:        "P2RESETBIT",           /* 92 */
                    625:        "P2ARS",                /* 93 */
                    626:        "P2REG",                /* 94 */
                    627:        "P2OREG",               /* 95 */
                    628:        "P2CCODES",             /* 96 */
                    629:        "P2FREE",               /* 97 */
                    630:        "P2STASG",              /* 98 */
                    631:        "P2STARG",              /* 99 */
                    632:        "P2STCALL",             /* 100          also unary */
                    633:        "",
                    634:        "P2UNARYSTCALL",
                    635:        "P2FLD",                /* 103 */
                    636:        "P2SCONV",              /* 104 */
                    637:        "P2PCONV",              /* 105 */
                    638:        "P2PMCONV",             /* 106 */
                    639:        "P2PVCONV",             /* 107 */
                    640:        "P2FORCE",              /* 108 */
                    641:        "P2CBRANCH",            /* 109 */
                    642:        "P2INIT",               /* 110 */
                    643:        "P2CAST",               /* 111 */
                    644:     };
                    645: 
                    646:     /*
                    647:      * low level routines
                    648:      */
                    649: 
                    650:     /*
                    651:      * puts a long word on the pcstream
                    652:      */
                    653: p2word( word )
                    654:     long       word;
                    655:     {
                    656: 
                    657:        putw( word , pcstream );
                    658:     }
                    659: 
                    660:     /*
                    661:      * put a length 0 mod 4 null padded string onto the pcstream
                    662:      */
                    663: p2string( string )
                    664:     char       *string;
                    665:     {
                    666:        int     slen = strlen( string );
                    667:        int     wlen = ( slen + 3 ) / 4;
                    668:        int     plen = ( wlen * 4 ) - slen;
                    669:        char    *cp;
                    670:        int     p;
                    671: 
                    672:        for ( cp = string ; *cp ; cp++ )
                    673:            putc( *cp , pcstream );
                    674:        for ( p = 1 ; p <= plen ; p++ )
                    675:            putc( '\0' , pcstream );
                    676: #      ifdef DEBUG
                    677:            if ( opt( 'k' ) ) {
                    678:                fprintf( stdout , "\"%s" , string );
                    679:                for ( p = 1 ; p <= plen ; p++ )
                    680:                    fprintf( stdout , "\\0" );
                    681:                fprintf( stdout , "\"\n" );
                    682:            }
                    683: #      endif
                    684:     }
                    685: 
                    686:     /*
                    687:      * puts a name on the pcstream
                    688:      */
                    689: p2name( name )
                    690:     char       *name;
                    691:     {
                    692:        int     pad;
                    693: 
                    694:        fprintf( pcstream , NAMEFORMAT , name );
                    695:        pad = strlen( name ) % sizeof (long);
                    696:        for ( ; pad < sizeof (long) ; pad++ ) {
                    697:            putc( '\0' , pcstream );
                    698:        }
                    699: #      ifdef DEBUG
                    700:            if ( opt( 'k' ) ) {
                    701:                fprintf( stdout , NAMEFORMAT , name );
                    702:                pad = strlen( name ) % sizeof (long);
                    703:                for ( ; pad < sizeof (long) ; pad++ ) {
                    704:                    fprintf( stdout , "\\0" );
                    705:                }
                    706:                fprintf( stdout , "\n" );
                    707:            }
                    708: #      endif
                    709:     }
                    710:     
                    711:     /*
                    712:      * put out a jump to a label
                    713:      */
                    714: putjbr( label )
                    715:     long       label;
                    716:     {
                    717: 
                    718:        printjbr( LABELPREFIX , label );
                    719:     }
                    720: 
                    721:     /*
                    722:      * put out a jump to any kind of label
                    723:      */
                    724: printjbr( prefix , label )
                    725:     char       *prefix;
                    726:     long       label;
                    727:     {
                    728: 
                    729:        putprintf( "    jbr     " , 1 );
                    730:        putprintf( PREFIXFORMAT , 0 , prefix , label );
                    731:     }
                    732: 
                    733:     /*
                    734:      * another version of put to catch calls to put
                    735:      */
                    736: put( arg1 , arg2 )
                    737:     {
                    738: 
                    739:        putprintf( "#   PUT CALLED!: arg1 = %d arg2 = 0%o" , 0 , arg1 , arg2 );
                    740:     }
                    741: 
                    742: #endif PC

unix.superglobalmegacorp.com

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