Annotation of 43BSD/ucb/pascal/src/p2put.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[] = "@(#)p2put.c    5.3 (Berkeley) 6/21/85";
        !             9: #endif not lint
        !            10: 
        !            11:     /*
        !            12:      * functions to help pi put out
        !            13:      * polish postfix binary portable c compiler intermediate code
        !            14:      * thereby becoming the portable pascal compiler
        !            15:      */
        !            16: 
        !            17: #include       "whoami.h"
        !            18: #ifdef PC
        !            19: #include       "0.h"
        !            20: #include       "objfmt.h"
        !            21: #include       <pcc.h>
        !            22: #include       "pc.h"
        !            23: #include       "align.h"
        !            24: #include       "tmps.h"
        !            25: 
        !            26:     /*
        !            27:      * emits an ftext operator and a string to the pcstream
        !            28:      */
        !            29: puttext( string )
        !            30:     char       *string;
        !            31:     {
        !            32:        int     length = str4len( string );
        !            33: 
        !            34:        if ( !CGENNING )
        !            35:            return;
        !            36:        p2word( PCCM_TRIPLE( PCCF_FTEXT , length , 0 ) );
        !            37: #      ifdef DEBUG
        !            38:            if ( opt( 'k' ) ) {
        !            39:                fprintf( stdout , "PCCF_FTEXT | %3d | 0 " , length );
        !            40:            }
        !            41: #      endif
        !            42:        p2string( string );
        !            43:     }
        !            44: 
        !            45: int
        !            46: str4len( string )
        !            47:     char       *string;
        !            48:     {
        !            49:        
        !            50:        return ( ( strlen( string ) + 3 ) / 4 );
        !            51:     }
        !            52: 
        !            53:     /*
        !            54:      * put formatted text into a buffer for printing to the pcstream.
        !            55:      * a call to putpflush actually puts out the text.
        !            56:      * none of arg1 .. arg5 need be present.
        !            57:      * and you can add more if you need them.
        !            58:      */
        !            59: /* VARARGS */
        !            60: putprintf( format , incomplete , arg1 , arg2 , arg3 , arg4 , arg5 )
        !            61:     char       *format;
        !            62:     int                incomplete;
        !            63:     {
        !            64:        static char     ppbuffer[ BUFSIZ ];
        !            65:        static char     *ppbufp = ppbuffer;
        !            66: 
        !            67:        if ( !CGENNING )
        !            68:            return;
        !            69:        sprintf( ppbufp , format , arg1 , arg2 , arg3 , arg4 , arg5 );
        !            70:        ppbufp = &( ppbuffer[ strlen( ppbuffer ) ] );
        !            71:        if ( ppbufp >= &( ppbuffer[ BUFSIZ ] ) )
        !            72:            panic( "putprintf" );
        !            73:        if ( ! incomplete ) {
        !            74:            puttext( ppbuffer );
        !            75:            ppbufp = ppbuffer;
        !            76:        }
        !            77:     }
        !            78: 
        !            79:     /*
        !            80:      * emit a left bracket operator to pcstream
        !            81:      * with function number, the maximum temp register, and total local bytes
        !            82:      */
        !            83: putlbracket(ftnno, sizesp)
        !            84:     int                ftnno;
        !            85:     struct om  *sizesp;
        !            86: {
        !            87:     int        maxtempreg;     
        !            88:     int        alignedframesize;
        !            89: 
        !            90: #   ifdef vax
        !            91:        maxtempreg = sizesp->curtmps.next_avail[REG_GENERAL];
        !            92: #   endif vax
        !            93: #   ifdef mc68000
        !            94:            /*
        !            95:             *  this is how /lib/f1 wants it.
        !            96:             */
        !            97:        maxtempreg =    (sizesp->curtmps.next_avail[REG_ADDR] << 4)
        !            98:                      | (sizesp->curtmps.next_avail[REG_DATA]);
        !            99: #   endif mc68000
        !           100:     alignedframesize = roundup((int)(BITSPERBYTE * -sizesp->curtmps.om_off),
        !           101:        (long)(BITSPERBYTE * A_STACK));
        !           102:     p2word( PCCM_TRIPLE( PCCF_FLBRAC , maxtempreg , ftnno ) );
        !           103:     p2word(alignedframesize);
        !           104: #   ifdef DEBUG
        !           105:        if ( opt( 'k' ) ) {
        !           106:            fprintf(stdout, "PCCF_FLBRAC | %3d | %d     %d\n",
        !           107:                maxtempreg, ftnno, alignedframesize);
        !           108:        }
        !           109: #   endif
        !           110: }
        !           111: 
        !           112:     /*
        !           113:      * emit a right bracket operator
        !           114:      * which for the binary interface
        !           115:      * forces the stack allocate and register mask
        !           116:      */
        !           117: putrbracket( ftnno )
        !           118:     int        ftnno;
        !           119:     {
        !           120: 
        !           121:        p2word( PCCM_TRIPLE( PCCF_FRBRAC , 0 , ftnno ) );
        !           122: #      ifdef DEBUG
        !           123:            if ( opt( 'k' ) ) {
        !           124:                fprintf( stdout , "PCCF_FRBRAC |   0 | %d\n" , ftnno );
        !           125:            }
        !           126: #      endif
        !           127:     }
        !           128: 
        !           129:     /*
        !           130:      * emit an eof operator
        !           131:      */
        !           132: puteof()
        !           133:     {
        !           134:        
        !           135:        p2word( PCCF_FEOF );
        !           136: #      ifdef DEBUG
        !           137:            if ( opt( 'k' ) ) {
        !           138:                fprintf( stdout , "PCCF_FEOF\n" );
        !           139:            }
        !           140: #      endif
        !           141:     }
        !           142: 
        !           143:     /*
        !           144:      * emit a dot operator,
        !           145:      * with a source file line number and name
        !           146:      * if line is negative, there was an error on that line, but who cares?
        !           147:      */
        !           148: putdot( filename , line )
        !           149:     char       *filename;
        !           150:     int                line;
        !           151:     {
        !           152:        int     length = str4len( filename );
        !           153: 
        !           154:        if ( line < 0 ) {
        !           155:            line = -line;
        !           156:        }
        !           157:        p2word( PCCM_TRIPLE( PCCF_FEXPR , length , line ) );
        !           158: #      ifdef DEBUG
        !           159:            if ( opt( 'k' ) ) {
        !           160:                fprintf( stdout , "PCCF_FEXPR | %3d | %d        " , length , line );
        !           161:            }
        !           162: #      endif
        !           163:        p2string( filename );
        !           164:     }
        !           165: 
        !           166:     /*
        !           167:      * put out a leaf node
        !           168:      */
        !           169: putleaf( op , lval , rval , type , name )
        !           170:     int                op;
        !           171:     int                lval;
        !           172:     int                rval;
        !           173:     int                type;
        !           174:     char       *name;
        !           175:     {
        !           176:        if ( !CGENNING )
        !           177:            return;
        !           178:        switch ( op ) {
        !           179:            default:
        !           180:                panic( "[putleaf]" );
        !           181:            case PCC_ICON:
        !           182:                p2word( PCCM_TRIPLE( PCC_ICON , name != NIL , type ) );
        !           183:                p2word( lval );
        !           184: #              ifdef DEBUG
        !           185:                    if ( opt( 'k' ) ) {
        !           186:                        fprintf( stdout , "PCC_ICON | %3d | 0x%x        " 
        !           187:                               , name != NIL , type );
        !           188:                        fprintf( stdout , "%d\n" , lval );
        !           189:                    }
        !           190: #              endif
        !           191:                if ( name )
        !           192:                    p2name( name );
        !           193:                break;
        !           194:            case PCC_NAME:
        !           195:                p2word( PCCM_TRIPLE( PCC_NAME , lval != 0 , type ) );
        !           196:                if ( lval ) 
        !           197:                    p2word( lval );
        !           198: #              ifdef DEBUG
        !           199:                    if ( opt( 'k' ) ) {
        !           200:                        fprintf( stdout , "PCC_NAME | %3d | 0x%x        " 
        !           201:                               , lval != 0 , type );
        !           202:                        if ( lval )
        !           203:                            fprintf( stdout , "%d       " , lval );
        !           204:                    }
        !           205: #              endif
        !           206:                p2name( name );
        !           207:                break;
        !           208:            case PCC_REG:
        !           209:                p2word( PCCM_TRIPLE( PCC_REG , rval , type ) );
        !           210: #              ifdef DEBUG
        !           211:                    if ( opt( 'k' ) ) {
        !           212:                        fprintf( stdout , "PCC_REG | %3d | 0x%x\n" ,
        !           213:                                rval , type );
        !           214:                    }
        !           215: #              endif
        !           216:                break;
        !           217:        }
        !           218:     }
        !           219: 
        !           220:     /*
        !           221:      * rvalues are just lvalues with indirection, except
        !           222:      * special cases for registers and for named globals,
        !           223:      * whose names are their rvalues.
        !           224:      */
        !           225: putRV( name , level , offset , other_flags , type )
        !           226:     char       *name;
        !           227:     int                level;
        !           228:     int                offset;
        !           229:     char       other_flags;
        !           230:     int                type;
        !           231:     {
        !           232:        char    extname[ BUFSIZ ];
        !           233:        char    *printname;
        !           234: 
        !           235:        if ( !CGENNING )
        !           236:            return;
        !           237:        if ( other_flags & NREGVAR ) {
        !           238:            if ( ( offset < 0 ) || ( offset > P2FP ) ) {
        !           239:                panic( "putRV regvar" );
        !           240:            }
        !           241:            putleaf( PCC_REG , 0 , offset , type , (char *) 0 );
        !           242:            return;
        !           243:        }
        !           244:        if ( whereis( offset , other_flags ) == GLOBALVAR ) {
        !           245:            if ( name != 0 ) {
        !           246:                if ( name[0] != '_' ) {
        !           247:                        sprintf( extname , EXTFORMAT , name );
        !           248:                        printname = extname;
        !           249:                } else {
        !           250:                        printname = name;
        !           251:                }
        !           252:                putleaf( PCC_NAME , offset , 0 , type , printname );
        !           253:                return;
        !           254:            } else {
        !           255:                panic( "putRV no name" );
        !           256:            }
        !           257:        }
        !           258:        putLV( name , level , offset , other_flags , type );
        !           259:        putop( PCCOM_UNARY PCC_MUL , type );
        !           260:     }
        !           261: 
        !           262:     /*
        !           263:      * put out an lvalue 
        !           264:      * given a level and offset
        !           265:      * special case for
        !           266:      *     named globals, whose lvalues are just their names as constants.
        !           267:      */
        !           268: putLV( name , level , offset , other_flags , type )
        !           269:     char       *name;
        !           270:     int                level;
        !           271:     int                offset;
        !           272:     char       other_flags;
        !           273:     int                type;
        !           274: {
        !           275:     char               extname[ BUFSIZ ];
        !           276:     char               *printname;
        !           277: 
        !           278:     if ( !CGENNING )
        !           279:        return;
        !           280:     if ( other_flags & NREGVAR ) {
        !           281:        panic( "putLV regvar" );
        !           282:     }
        !           283:     switch ( whereis( offset , other_flags ) ) {
        !           284:        case GLOBALVAR:
        !           285:            if ( ( name != 0 ) ) {
        !           286:                if ( name[0] != '_' ) {
        !           287:                        sprintf( extname , EXTFORMAT , name );
        !           288:                        printname = extname;
        !           289:                } else {
        !           290:                        printname = name;
        !           291:                }
        !           292:                putleaf( PCC_ICON , offset , 0 , PCCM_ADDTYPE( type , PCCTM_PTR )
        !           293:                        , printname );
        !           294:                return;
        !           295:            } else {
        !           296:                panic( "putLV no name" );
        !           297:            }
        !           298:        case PARAMVAR:
        !           299:            if ( level == cbn ) {
        !           300:                putleaf( PCC_REG, 0, P2AP, PCCM_ADDTYPE( type , PCCTM_PTR ), (char *) 0 );
        !           301:            } else {
        !           302:                putleaf( PCC_NAME , (level * sizeof(struct dispsave)) + AP_OFFSET
        !           303:                    , 0 , PCCTM_PTR | PCCT_CHAR , DISPLAYNAME );
        !           304:                parts[ level ] |= NONLOCALVAR;
        !           305:            }
        !           306:            putleaf( PCC_ICON , offset , 0 , PCCT_INT , (char *) 0 );
        !           307:            putop( PCC_PLUS , PCCTM_PTR | PCCT_CHAR );
        !           308:            break;
        !           309:        case LOCALVAR:
        !           310:            if ( level == cbn ) {
        !           311:                putleaf( PCC_REG, 0, P2FP, PCCM_ADDTYPE( type , PCCTM_PTR ), (char *) 0 );
        !           312:            } else {
        !           313:                putleaf( PCC_NAME , (level * sizeof(struct dispsave)) + FP_OFFSET
        !           314:                    , 0 , PCCTM_PTR | PCCT_CHAR , DISPLAYNAME );
        !           315:                parts[ level ] |= NONLOCALVAR;
        !           316:            }
        !           317:            putleaf( PCC_ICON , -offset , 0 , PCCT_INT , (char *) 0 );
        !           318:            putop( PCC_MINUS , PCCTM_PTR | PCCT_CHAR );
        !           319:            break;
        !           320:        case NAMEDLOCALVAR:
        !           321:            if ( level == cbn ) {
        !           322:                putleaf( PCC_REG, 0, P2FP, PCCM_ADDTYPE( type , PCCTM_PTR ), (char *) 0 );
        !           323:            } else {
        !           324:                putleaf( PCC_NAME , (level * sizeof(struct dispsave)) + FP_OFFSET
        !           325:                    , 0 , PCCTM_PTR | PCCT_CHAR , DISPLAYNAME );
        !           326:                parts[ level ] |= NONLOCALVAR;
        !           327:            }
        !           328:            putleaf( PCC_ICON , 0 , 0 , PCCT_INT , name );
        !           329:            putop( PCC_MINUS , PCCTM_PTR | PCCT_CHAR );
        !           330:            break;
        !           331:     }
        !           332:     return;
        !           333: }
        !           334: 
        !           335:     /*
        !           336:      * put out a floating point constant leaf node
        !           337:      * the constant is declared in aligned data space
        !           338:      * and a PCC_NAME leaf put out for it
        !           339:      */
        !           340: putCON8( val )
        !           341:     double     val;
        !           342:     {
        !           343:        char    *label;
        !           344:        char    name[ BUFSIZ ];
        !           345: 
        !           346:        if ( !CGENNING )
        !           347:            return;
        !           348:        label = getlab();
        !           349:        putprintf( "    .data" , 0 );
        !           350:        aligndot(A_DOUBLE);
        !           351:        (void) putlab( label );
        !           352: #      ifdef vax
        !           353:            putprintf( "        .double 0d%.20e" , 0 , val );
        !           354: #      endif vax
        !           355: #      ifdef mc68000
        !           356:            putprintf( "        .long   0x%x,0x%x", 0, val);
        !           357: #      endif mc68000
        !           358:        putprintf( "    .text" , 0 );
        !           359:        sprintf( name , PREFIXFORMAT , LABELPREFIX , label );
        !           360:        putleaf( PCC_NAME , 0 , 0 , PCCT_DOUBLE , name );
        !           361:     }
        !           362: 
        !           363:        /*
        !           364:         * put out either an lvalue or an rvalue for a constant string.
        !           365:         * an lvalue (for assignment rhs's) is the name as a constant, 
        !           366:         * an rvalue (for parameters) is just the name.
        !           367:         */
        !           368: putCONG( string , length , required )
        !           369:     char       *string;
        !           370:     int                length;
        !           371:     int                required;
        !           372:     {
        !           373:        char    name[ BUFSIZ ];
        !           374:        char    *label;
        !           375:        char    *cp;
        !           376:        int     pad;
        !           377:        int     others;
        !           378: 
        !           379:        if ( !CGENNING )
        !           380:            return;
        !           381:        putprintf( "    .data" , 0 );
        !           382:        aligndot(A_STRUCT);
        !           383:        label = getlab();
        !           384:        (void) putlab( label );
        !           385:        cp = string;
        !           386:        while ( *cp ) {
        !           387:            putprintf( "        .byte   0%o" , 1 , *cp ++ );
        !           388:            for ( others = 2 ; ( others <= 8 ) && *cp ; others ++ ) {
        !           389:                putprintf( ",0%o" , 1 , *cp++ );
        !           390:            }
        !           391:            putprintf( "" , 0 );
        !           392:        }
        !           393:        pad = length - strlen( string );
        !           394:        while ( pad-- > 0 ) {
        !           395:            putprintf( "        .byte   0%o" , 1 , ' ' );
        !           396:            for ( others = 2 ; ( others <= 8 ) && ( pad-- > 0 ) ; others++ ) {
        !           397:                putprintf( ",0%o" , 1 , ' ' );
        !           398:            }
        !           399:            putprintf( "" , 0 );
        !           400:        }
        !           401:        putprintf( "    .byte   0" , 0 );
        !           402:        putprintf( "    .text"  , 0 );
        !           403:        sprintf( name , PREFIXFORMAT , LABELPREFIX , label );
        !           404:        if ( required == RREQ ) {
        !           405:            putleaf( PCC_NAME , 0 , 0 , PCCTM_ARY | PCCT_CHAR , name );
        !           406:        } else {
        !           407:            putleaf( PCC_ICON , 0 , 0 , PCCTM_PTR | PCCT_CHAR , name );
        !           408:        }
        !           409:     }
        !           410: 
        !           411:     /*
        !           412:      * map a pascal type to a c type
        !           413:      * this would be tail recursive, but i unfolded it into a for (;;).
        !           414:      * this is sort of like isa and lwidth
        !           415:      * a note on the types used by the portable c compiler:
        !           416:      *     they are divided into a basic type (char, short, int, long, etc.)
        !           417:      *     and qualifications on those basic types (pointer, function, array).
        !           418:      *     the basic type is kept in the low 4 bits of the type descriptor,
        !           419:      *     and the qualifications are arranged in two bit chunks, with the
        !           420:      *     most significant on the right,
        !           421:      *     and the least significant on the left
        !           422:      *         e.g. int *foo();
        !           423:      *                 (a function returning a pointer to an integer)
        !           424:      *         is stored as
        !           425:      *             <ptr><ftn><int>
        !           426:      * so, we build types recursively
        !           427:      * also, we know that /lib/f1 can only deal with 6 qualifications
        !           428:      * so we stop the recursion there.  this stops infinite type recursion
        !           429:      * through mutually recursive pointer types.
        !           430:      */
        !           431: #define        MAXQUALS        6
        !           432: int
        !           433: p2type( np )
        !           434:     struct nl  *np;
        !           435: {
        !           436: 
        !           437:     return typerecur( np , 0 );
        !           438: }
        !           439: typerecur( np , quals )
        !           440:     struct nl  *np;
        !           441:     int                quals;
        !           442:     {
        !           443:        
        !           444:        if ( np == NIL || quals > MAXQUALS ) {
        !           445:            return PCCT_UNDEF;
        !           446:        }
        !           447:        switch ( np -> class ) {
        !           448:            case SCAL :
        !           449:            case RANGE :
        !           450:            case CRANGE :
        !           451:                if ( np -> type == ( nl + TDOUBLE ) ) {
        !           452:                    return PCCT_DOUBLE;
        !           453:                }
        !           454:                switch ( bytes( np -> range[0] , np -> range[1] ) ) {
        !           455:                    case 1:
        !           456:                        return PCCT_CHAR;
        !           457:                    case 2:
        !           458:                        return PCCT_SHORT;
        !           459:                    case 4:
        !           460:                        return PCCT_INT;
        !           461:                    default:
        !           462:                        panic( "p2type int" );
        !           463:                        /* NOTREACHED */
        !           464:                }
        !           465:            case STR :
        !           466:                return ( PCCTM_ARY | PCCT_CHAR );
        !           467:            case RECORD :
        !           468:            case SET :
        !           469:                return PCCT_STRTY;
        !           470:            case FILET :
        !           471:                return ( PCCTM_PTR | PCCT_STRTY );
        !           472:            case CONST :
        !           473:            case VAR :
        !           474:            case FIELD :
        !           475:                return p2type( np -> type );
        !           476:            case TYPE :
        !           477:                switch ( nloff( np ) ) {
        !           478:                    case TNIL :
        !           479:                        return ( PCCTM_PTR | PCCT_UNDEF );
        !           480:                    case TSTR :
        !           481:                        return ( PCCTM_ARY | PCCT_CHAR );
        !           482:                    case TSET :
        !           483:                        return PCCT_STRTY;
        !           484:                    default :
        !           485:                        return ( p2type( np -> type ) );
        !           486:                }
        !           487:            case REF:
        !           488:            case WITHPTR:
        !           489:            case PTR :
        !           490:                return PCCM_ADDTYPE( typerecur( np -> type , quals + 1 ) , PCCTM_PTR );
        !           491:            case ARRAY :
        !           492:                return PCCM_ADDTYPE( typerecur( np -> type , quals + 1 ) , PCCTM_ARY );
        !           493:            case FUNC :
        !           494:                    /*
        !           495:                     * functions are really pointers to functions
        !           496:                     * which return their underlying type.
        !           497:                     */
        !           498:                return PCCM_ADDTYPE( PCCM_ADDTYPE( typerecur( np -> type , quals + 2 ) ,
        !           499:                                        PCCTM_FTN ) , PCCTM_PTR );
        !           500:            case PROC :
        !           501:                    /*
        !           502:                     * procedures are pointers to functions 
        !           503:                     * which return integers (whether you look at them or not)
        !           504:                     */
        !           505:                return PCCM_ADDTYPE( PCCM_ADDTYPE( PCCT_INT , PCCTM_FTN ) , PCCTM_PTR );
        !           506:            case FFUNC :
        !           507:            case FPROC :
        !           508:                    /*
        !           509:                     *  formal procedures and functions are pointers
        !           510:                     *  to structures which describe their environment.
        !           511:                     */
        !           512:                return ( PCCTM_PTR | PCCT_STRTY );
        !           513:            default :
        !           514:                panic( "p2type" );
        !           515:                /* NOTREACHED */
        !           516:        }
        !           517:     }
        !           518: 
        !           519:     /*
        !           520:      * put a typed operator to the pcstream
        !           521:      */
        !           522: putop( op , type )
        !           523:     int                op;
        !           524:     int                type;
        !           525:     {
        !           526:        extern char     *p2opname();
        !           527:        
        !           528:        if ( !CGENNING )
        !           529:            return;
        !           530:        p2word( PCCM_TRIPLE( op , 0 , type ) );
        !           531: #      ifdef DEBUG
        !           532:            if ( opt( 'k' ) ) {
        !           533:                fprintf( stdout , "%s (%d) |   0 | 0x%x\n"
        !           534:                        , p2opname( op ) , op , type );
        !           535:            }
        !           536: #      endif
        !           537:     }
        !           538: 
        !           539:     /*
        !           540:      * put out a structure operator (STASG, STARG, STCALL, UNARY STCALL )
        !           541:      * which looks just like a regular operator, only the size and
        !           542:      * alignment go in the next consecutive words
        !           543:      */
        !           544: putstrop( op , type , size , alignment )
        !           545:     int        op;
        !           546:     int        type;
        !           547:     int        size;
        !           548:     int        alignment;
        !           549:     {
        !           550:        extern char     *p2opname();
        !           551:        
        !           552:        if ( !CGENNING )
        !           553:            return;
        !           554:        p2word( PCCM_TRIPLE( op , 0 , type ) );
        !           555:        p2word( size );
        !           556:        p2word( alignment );
        !           557: #      ifdef DEBUG
        !           558:            if ( opt( 'k' ) ) {
        !           559:                fprintf( stdout , "%s (%d) |   0 | 0x%x %d %d\n"
        !           560:                        , p2opname( op ) , op , type , size , alignment );
        !           561:            }
        !           562: #      endif
        !           563:     }
        !           564: 
        !           565:     /*
        !           566:      * the string names of p2ops
        !           567:      */
        !           568: 
        !           569: struct p2op {
        !           570:     int op;
        !           571:     char *name;
        !           572: };
        !           573: 
        !           574: static struct p2op     p2opnames[] = {
        !           575:        PCC_ERROR, "PCC_ERROR",
        !           576:        PCC_NAME, "PCC_NAME",
        !           577:        PCC_STRING, "PCC_STRING",
        !           578:        PCC_ICON, "PCC_ICON",
        !           579:        PCC_FCON, "PCC_FCON",
        !           580:        PCC_PLUS, "PCC_PLUS",
        !           581:        PCC_MINUS, "PCC_MINUS",
        !           582:        PCC_UMINUS, "PCC_UMINUS",
        !           583:        PCC_MUL, "PCC_MUL",
        !           584:        PCC_DEREF, "PCC_DEREF",
        !           585:        PCC_AND, "PCC_AND",
        !           586:        PCC_ADDROF, "PCC_ADDROF",
        !           587:        PCC_OR, "PCC_OR",
        !           588:        PCC_ER, "PCC_ER",
        !           589:        PCC_QUEST, "PCC_QUEST",
        !           590:        PCC_COLON, "PCC_COLON",
        !           591:        PCC_ANDAND, "PCC_ANDAND",
        !           592:        PCC_OROR, "PCC_OROR",
        !           593:        PCC_CM, "PCC_CM",
        !           594:        PCC_ASSIGN, "PCC_ASSIGN",
        !           595:        PCC_COMOP, "PCC_COMOP",
        !           596:        PCC_DIV, "PCC_DIV",
        !           597:        PCC_MOD, "PCC_MOD",
        !           598:        PCC_LS, "PCC_LS",
        !           599:        PCC_RS, "PCC_RS",
        !           600:        PCC_DOT, "PCC_DOT",
        !           601:        PCC_STREF, "PCC_STREF",
        !           602:        PCC_CALL, "PCC_CALL",
        !           603:        PCC_UCALL, "PCC_UCALL",
        !           604:        PCC_FORTCALL, "PCC_FORTCALL",
        !           605:        PCC_UFORTCALL, "PCC_UFORTCALL",
        !           606:        PCC_NOT, "PCC_NOT",
        !           607:        PCC_COMPL, "PCC_COMPL",
        !           608:        PCC_INCR, "PCC_INCR",
        !           609:        PCC_DECR, "PCC_DECR",
        !           610:        PCC_EQ, "PCC_EQ",
        !           611:        PCC_NE, "PCC_NE",
        !           612:        PCC_LE, "PCC_LE",
        !           613:        PCC_LT, "PCC_LT",
        !           614:        PCC_GE, "PCC_GE",
        !           615:        PCC_GT, "PCC_GT",
        !           616:        PCC_ULE, "PCC_ULE",
        !           617:        PCC_ULT, "PCC_ULT",
        !           618:        PCC_UGE, "PCC_UGE",
        !           619:        PCC_UGT, "PCC_UGT",
        !           620:        PCC_REG, "PCC_REG",
        !           621:        PCC_OREG, "PCC_OREG",
        !           622:        PCC_CCODES, "PCC_CCODES",
        !           623:        PCC_FREE, "PCC_FREE",
        !           624:        PCC_STASG, "PCC_STASG",
        !           625:        PCC_STARG, "PCC_STARG",
        !           626:        PCC_STCALL, "PCC_STCALL",
        !           627:        PCC_USTCALL, "PCC_USTCALL",
        !           628:        PCC_FLD, "PCC_FLD",
        !           629:        PCC_SCONV, "PCC_SCONV",
        !           630:        PCC_PCONV, "PCC_PCONV",
        !           631:        PCC_PMCONV, "PCC_PMCONV",
        !           632:        PCC_PVCONV, "PCC_PVCONV",
        !           633:        PCC_FORCE, "PCC_FORCE",
        !           634:        PCC_CBRANCH, "PCC_CBRANCH",
        !           635:        PCC_INIT, "PCC_INIT",
        !           636:        PCC_CAST, "PCC_CAST",
        !           637:        -1, ""
        !           638:     };
        !           639: 
        !           640: char *
        !           641: p2opname( op )
        !           642:     register int       op;
        !           643:     {
        !           644:        static char             *p2map[PCC_MAXOP+1];
        !           645:        static bool             mapready = FALSE;
        !           646:        register struct p2op    *pp;
        !           647: 
        !           648:        if ( mapready == FALSE ) {
        !           649:            for ( pp = p2opnames; pp->op >= 0; pp++ )
        !           650:                p2map[ pp->op ] = pp->name;
        !           651:            mapready = TRUE;
        !           652:        }
        !           653:        return ( p2map[ op ] ? p2map[ op ] : "unknown" );
        !           654:     }
        !           655: 
        !           656:     /*
        !           657:      * low level routines
        !           658:      */
        !           659: 
        !           660:     /*
        !           661:      * puts a long word on the pcstream
        !           662:      */
        !           663: p2word( word )
        !           664:     int                word;
        !           665:     {
        !           666: 
        !           667:        putw( word , pcstream );
        !           668:     }
        !           669: 
        !           670:     /*
        !           671:      * put a length 0 mod 4 null padded string onto the pcstream
        !           672:      */
        !           673: p2string( string )
        !           674:     char       *string;
        !           675:     {
        !           676:        int     slen = strlen( string );
        !           677:        int     wlen = ( slen + 3 ) / 4;
        !           678:        int     plen = ( wlen * 4 ) - slen;
        !           679:        char    *cp;
        !           680:        int     p;
        !           681: 
        !           682:        for ( cp = string ; *cp ; cp++ )
        !           683:            putc( *cp , pcstream );
        !           684:        for ( p = 1 ; p <= plen ; p++ )
        !           685:            putc( '\0' , pcstream );
        !           686: #      ifdef DEBUG
        !           687:            if ( opt( 'k' ) ) {
        !           688:                fprintf( stdout , "\"%s" , string );
        !           689:                for ( p = 1 ; p <= plen ; p++ )
        !           690:                    fprintf( stdout , "\\0" );
        !           691:                fprintf( stdout , "\"\n" );
        !           692:            }
        !           693: #      endif
        !           694:     }
        !           695: 
        !           696:     /*
        !           697:      * puts a name on the pcstream
        !           698:      */
        !           699: p2name( name )
        !           700:     char       *name;
        !           701:     {
        !           702:        int     pad;
        !           703: 
        !           704:        fprintf( pcstream , NAMEFORMAT , name );
        !           705:        pad = strlen( name ) % sizeof (long);
        !           706:        for ( ; pad < sizeof (long) ; pad++ ) {
        !           707:            putc( '\0' , pcstream );
        !           708:        }
        !           709: #      ifdef DEBUG
        !           710:            if ( opt( 'k' ) ) {
        !           711:                fprintf( stdout , NAMEFORMAT , name );
        !           712:                pad = strlen( name ) % sizeof (long);
        !           713:                for ( ; pad < sizeof (long) ; pad++ ) {
        !           714:                    fprintf( stdout , "\\0" );
        !           715:                }
        !           716:                fprintf( stdout , "\n" );
        !           717:            }
        !           718: #      endif
        !           719:     }
        !           720:     
        !           721:     /*
        !           722:      * put out a jump to a label
        !           723:      */
        !           724: putjbr( label )
        !           725:     long       label;
        !           726:     {
        !           727: 
        !           728:        printjbr( LABELPREFIX , label );
        !           729:     }
        !           730: 
        !           731:     /*
        !           732:      * put out a jump to any kind of label
        !           733:      */
        !           734: printjbr( prefix , label )
        !           735:     char       *prefix;
        !           736:     long       label;
        !           737:     {
        !           738: 
        !           739: #      ifdef vax
        !           740:            putprintf( "        jbr     " , 1 );
        !           741:            putprintf( PREFIXFORMAT , 0 , prefix , label );
        !           742: #      endif vax
        !           743: #      ifdef mc68000
        !           744:            putprintf( "        jra     " , 1 );
        !           745:            putprintf( PREFIXFORMAT , 0 , prefix , label );
        !           746: #      endif mc68000
        !           747:     }
        !           748: 
        !           749:     /*
        !           750:      * another version of put to catch calls to put
        !           751:      */
        !           752: /* VARARGS */
        !           753: put()
        !           754:     {
        !           755: 
        !           756:        panic("put()");
        !           757:     }
        !           758: 
        !           759: #endif PC

unix.superglobalmegacorp.com

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