Annotation of researchv10no/cmd/ccom/vax/tests/g.i, revision 1.1

1.1     ! root        1: /* ../common/cgen.c */
        !             2: extern struct  _iobuf {
        !             3:        int     _cnt;
        !             4:        unsigned char   *_ptr;
        !             5:        unsigned char   *_base;
        !             6:        short   _flag;
        !             7:        char    _file;
        !             8: } _iob[20];
        !             9: struct _iobuf  *fopen();
        !            10: struct _iobuf  *fdopen();
        !            11: struct _iobuf  *freopen();
        !            12: long   ftell();
        !            13: char   *fgets();
        !            14:        char            *hash();
        !            15:        char            *savestr();
        !            16:        char            *tstr();
        !            17:        extern int      tstrused;
        !            18:        extern char     *tstrbuf[];
        !            19:        extern char     **curtstr;
        !            20: extern int nerrors;  
        !            21: typedef union ndu NODE;
        !            22: typedef unsigned int TWORD;
        !            23: typedef long CONSZ;  
        !            24: extern int dope[];  
        !            25: extern char *opst[];  
        !            26:        
        !            27: union ndu {
        !            28:        struct {
        !            29:                int op;
        !            30:                int goal;
        !            31:                TWORD type;
        !            32:                int cst[(6+4)];
        !            33:                char * name;
        !            34:                char pad[8  -sizeof(char *)];   
        !            35:                NODE *left;
        !            36:                NODE *right;
        !            37:        }in;    
        !            38:        
        !            39:        struct {
        !            40:                int op;
        !            41:                int goal;
        !            42:                TWORD type;
        !            43:                int cst[(6+4)];
        !            44:                char * name;
        !            45:                char pad[8  -sizeof(char *)];   
        !            46:                CONSZ lval;
        !            47:                int rval;
        !            48:        }tn;    
        !            49:        
        !            50:        struct {
        !            51:                int op;
        !            52:                int goal;
        !            53:                TWORD type;
        !            54:                int cst[(6+4)];
        !            55:                int label;  
        !            56:                int lop;  
        !            57:        }bn;    
        !            58:        struct {
        !            59:                int op;
        !            60:                int goal;
        !            61:                TWORD type;
        !            62:                int cst[(6+4)];
        !            63:                int stsize;  
        !            64:                short stalign;  
        !            65:                short argsize;  
        !            66:        }stn;   
        !            67:        struct {
        !            68:                int op;
        !            69:                int goal;
        !            70:                TWORD type;
        !            71:                int cdim;
        !            72:                int csiz;
        !            73:        }fn;    
        !            74:        
        !            75:        struct {
        !            76:                
        !            77:                int op;
        !            78:                int goal;
        !            79:                TWORD type;
        !            80:                int cdim;
        !            81:                int csiz;
        !            82:                double dval;
        !            83:        }fpn;   
        !            84: };
        !            85:        
        !            86:        
        !            87:                
        !            88:        
        !            89:        
        !            90:        
        !            91:  
        !            92:        
        !            93: extern int busy[];
        !            94: extern NODE node[];
        !            95: typedef struct shape SHAPE;
        !            96:        
        !            97: extern struct shape {
        !            98:        int     op;     
        !            99:        SHAPE   *sl;    
        !           100:        SHAPE   *sr;
        !           101:        int     sh;     
        !           102:        int     sc;     
        !           103: } shapes[];
        !           104: extern SHAPE   *pshape[];
        !           105: typedef struct optab OPTAB;
        !           106: struct optab {
        !           107:        int     op;     
        !           108:        int     tyop;   
        !           109:        OPTAB   *nextop;
        !           110:        SHAPE   **lshape;       
        !           111:        int     ltype;          
        !           112:        SHAPE   **rshape;       
        !           113:        int     rtype;
        !           114:        int     needs;
        !           115:        int     rewrite;
        !           116:        char    *cstring;
        !           117:        int     cost;
        !           118:        int     lcount;         
        !           119:        int     rcount;         
        !           120:        int     stinline;       
        !           121: };
        !           122: extern OPTAB
        !           123:        *match(),
        !           124:        *ophead[],
        !           125:        table[];
        !           126: extern NODE resc[];
        !           127: extern int tmpoff;
        !           128: extern int maxboff;
        !           129: extern int maxtemp;
        !           130: extern int maxarg;
        !           131: extern int ftnno;
        !           132: extern int sideff;
        !           133: extern NODE
        !           134:        *talloc(),
        !           135:        *ind2type(),
        !           136:        *tcopy(),
        !           137:        *getadr(),
        !           138:        *getlr();
        !           139: extern CONSZ rdin();
        !           140: extern char *rnames[];
        !           141: extern int lineno;
        !           142: extern char ftitle[];
        !           143: extern int fldshf, fldsz;
        !           144: extern int lflag, udebug, e2debug, odebug, rdebug, radebug, sdebug;
        !           145: extern int fast;  
        !           146:        
        !           147:        
        !           148:        
        !           149:        
        !           150: typedef struct inst INST;
        !           151: struct inst {
        !           152:        NODE    *p;
        !           153:        OPTAB   *q;
        !           154:        int     goal;
        !           155: };
        !           156: extern INST inst[300];
        !           157: extern nins;
        !           158:        
        !           159:        
        !           160: typedef SHAPE  *SHTABLE[2][20];
        !           161: extern SHTABLE sha;
        !           162: rewcom( p, goal )
        !           163: NODE *p; 
        !           164: {
        !           165:        
        !           166:        
        !           167:        
        !           168:        int o, ty, g1, g2;
        !           169:        NODE *l, *r, *ql, *qr;
        !           170:        o = p->tn.op;
        !           171:        g1 = g2 = 6;
        !           172:        p->tn.goal = goal;
        !           173:        
        !           174:        switch( o )
        !           175:        {
        !           176:        case 97:
        !           177:                cerror( "rewcom(%d) is FREE", p-node );
        !           178:        case 110:
        !           179:                g1 = (6+3);
        !           180:                break;
        !           181:        case 59:
        !           182:                g1 = (6+1);
        !           183:                g2 = goal;
        !           184:                break;
        !           185:        case 22:
        !           186:        case 112:
        !           187:        case 56:
        !           188:        case 108:
        !           189:                g1 = g2 = goal;
        !           190:                break;
        !           191:        case 70:
        !           192:        case 100:
        !           193:        case 73:
        !           194:                g2 = (6+1);
        !           195:                break;
        !           196:        }
        !           197:        switch( ty =  (dope[o]&016) )
        !           198:        {
        !           199:        case 010:
        !           200:                rewcom( r = p->in.right, g2 );
        !           201:        case 04:
        !           202:                rewcom( l = p->in.left, g1 );
        !           203:                break;
        !           204:        case 02:
        !           205:                return;
        !           206:        }
        !           207:        if( o==59 || o==22 || o==108 ) return;
        !           208:        
        !           209:        
        !           210:        
        !           211:        
        !           212:        if( l->tn.op == 59 && l->in.left->tn.op != 110 ) 
        !           213:        {
        !           214:                
        !           215:                
        !           216:                
        !           217:                ql = l->in.left;
        !           218:                qr = l->in.right;
        !           219:                *l = *p;  
        !           220:                l->in.left = qr;
        !           221:                p->in.right = l;
        !           222:                p->in.left = ql;
        !           223:                p->tn.op = 59;
        !           224:                rewcom( p, p->tn.goal );
        !           225:        }
        !           226:        if( ty == 04 ) return;
        !           227:        if( r->tn.op == 59 && r->in.right->tn.op != 110 ) 
        !           228:        {
        !           229:                
        !           230:                
        !           231:                
        !           232:                ql = r->in.left;
        !           233:                qr = r->in.right;
        !           234:                *r = *p;
        !           235:                p->tn.op = 59;
        !           236:                p->in.left = ql;
        !           237:                r->in.right = qr;
        !           238:                rewcom( p, p->tn.goal );
        !           239:        }
        !           240: }
        !           241: rewlhs(p)
        !           242: NODE *p; 
        !           243: {
        !           244:        
        !           245:        
        !           246:        NODE *q, *t;
        !           247:        q = talloc();
        !           248:        *q = *p;
        !           249:        t = tcopy( p->in.left, 0 );
        !           250:        p->in.left = q;
        !           251:        p->in.right = t;
        !           252:        p->tn.op = 59;
        !           253:        return;
        !           254: }
        !           255: rewsto(p)
        !           256: NODE *p; 
        !           257: {
        !           258:        
        !           259:        
        !           260:        int o, ao;
        !           261:        NODE *t, *q;
        !           262:        
        !           263:        while( (o=p->tn.op) == 59 ) p = p->in.right;
        !           264:        if( o == 95 ) return(0);  
        !           265:        if( o == 99 ) 
        !           266:        {
        !           267:                                
        !           268:                t = talloc();
        !           269:                *t = *p->in.left;  
        !           270:                q = talloc();
        !           271:                *q = *t;
        !           272:                t->tn.op = 95;
        !           273:                t->tn.lval = freetemp(argsize(p)/32 );
        !           274:                t->tn.lval =  ((t->tn.lval)/8);
        !           275:                t->tn.name = (char *) 0;
        !           276:                t->tn.type =      02000   ;
        !           277:                q->tn.op = 2+ 14;
        !           278:                q->in.left = t;
        !           279:                
        !           280:                t = talloc();
        !           281:                *t = *p;
        !           282:                t->in.left = q;
        !           283:                t->in.right = p->in.left;
        !           284:                t->tn.op = 98;
        !           285:                
        !           286:                p->in.left = talloc();
        !           287:                p->in.left->tn.op = 59;
        !           288:                p->in.left->in.left = t;
        !           289:                p->in.left->in.right = t = talloc(); 
        !           290:                *t = *q;
        !           291:                t->in.left = talloc();
        !           292:                *t->in.left = *q->in.left;
        !           293:                
        !           294:                
        !           295:                if( odebug>1 ) e2print( p );
        !           296:                return( 1 );
        !           297:        }
        !           298:        if( odebug>1 ) 
        !           299:        {
        !           300:                e2print( p );
        !           301:                printf( "\nrewritten by rewsto as:\n" );
        !           302:        }
        !           303:        if(  (dope[o]&01) && o!=78 && o!=79 && lhsok( p->in.left ) ) {
        !           304:                
        !           305:                rewlhs( p );
        !           306:                return( 1 );
        !           307:        }
        !           308:        ao = 1+ o;
        !           309:        if(  (dope[ao]&020000) ) 
        !           310:        {
        !           311:                if( p->in.left->tn.op == 95 ) 
        !           312:                {
        !           313:                        p->tn.op = ao;
        !           314:                        rewlhs( p );
        !           315:                        if( odebug>1 ) e2print( p );
        !           316:                        return( 1 );
        !           317:                }
        !           318:        }
        !           319:        
        !           320:        
        !           321:        t = talloc();
        !           322:        *t = *p;  
        !           323:        q = talloc();
        !           324:        *q = *p;
        !           325:        t->tn.op = 95;
        !           326:        t->tn.lval = freetemp(argsize(p)/32 );
        !           327:        t->tn.lval =  ((t->tn.lval)/8);
        !           328:        t->tn.name = (char *) 0;
        !           329:        q->tn.op = 58;
        !           330:        q->in.left = t;
        !           331:        q->in.right = talloc();
        !           332:        *(q->in.right) = *p;
        !           333:                
        !           334:        p->in.right = talloc();
        !           335:        *(p->in.right) = *t;
        !           336:        p->tn.op = 59;
        !           337:        p->in.left = q;
        !           338:        
        !           339:        if( odebug>1 ) e2print( p );
        !           340:        return( 1 );
        !           341: }
        !           342: iseff( p )
        !           343: NODE *p; 
        !           344: {
        !           345:        
        !           346:        int o;
        !           347:        o = p->tn.op;
        !           348:        if(  (dope[o]&02000) ||  (dope[o]&01) ) return( 1 );
        !           349:        switch(  (dope[ o ]&016) )
        !           350:        {
        !           351:        case 010:
        !           352:                if( iseff( p->in.right ) ) return( 1 );
        !           353:        case 04:
        !           354:                return( iseff( p->in.left ) );
        !           355:        }
        !           356:        return( 0 );
        !           357: }
        !           358: NODE *
        !           359: lhsto( p )
        !           360: NODE *p; 
        !           361: {
        !           362:        
        !           363:        
        !           364:        NODE *q;
        !           365:        int o;
        !           366:        for( q = p->in.left; (o=q->tn.op)!=(2+ 11); q=q->in.left )
        !           367:        {
        !           368:                if(  (dope[o]&016) == 02 ) return( (NODE *)0);
        !           369:        }
        !           370:        
        !           371:        q = q->in.left;
        !           372:        o = q->tn.op;
        !           373:        if(  (dope[o]&016) == 02 ) return( (NODE *)0 );
        !           374:        else return( q );
        !           375: }
        !           376: static int
        !           377: c2bigger( p ) NODE *p; {
        !           378:        
        !           379:        register TWORD t, tl;
        !           380:        t = p->tn.type;
        !           381:        tl = p->in.left->tn.type;
        !           382:        if( (t|tl)&      04000 ) return( 0 );  
        !           383:        if( t&040 ) return( 1 );
        !           384:        if( tl&040 ) return( 0 );
        !           385:        if( t&  020 ) return( 1 );
        !           386:        if( tl& 020 ) return( 0 );
        !           387:        if( t&( 010|    01000) ) return( 1 );
        !           388:        if( tl&(        010|    01000) ) return( 0 );
        !           389:        if( t&( (       04|     010)|(0400|     01000)) ) return( 1 );
        !           390:        if( tl&(        (       04|     010)|(0400|     01000)) ) return( 0 );
        !           391:        if( t &(        02|0200) ) return( 1 );
        !           392:        return( 0 );
        !           393:        }
        !           394: NODE *
        !           395: ind2type( p )
        !           396: register NODE *p; 
        !           397: {
        !           398:        
        !           399:        register TWORD t;
        !           400:        NODE *q;
        !           401:        t = p->tn.type;
        !           402:        if( t ==        01 || t ==      02 ) t =        (       04|     010);
        !           403:        else if( t ==   0100 || t == 0200 ) t = (0400|  01000);
        !           404:        else if( t ==   020 ) t = 040;
        !           405:        else return( p );
        !           406:        if( p->tn.op == 104 && c2bigger(p) ) 
        !           407:        {
        !           408:                p->tn.type = t;
        !           409:                return( p );
        !           410:        }
        !           411:        q = talloc();
        !           412:        q->tn.op = 104;
        !           413:        q->in.left = p;
        !           414:        q->in.right = 0;
        !           415:        q->tn.name = (char *) 0;
        !           416:        q->tn.type = t;
        !           417:        q->tn.goal = 6;
        !           418:        return( q );
        !           419: }
        !           420: NODE *
        !           421: reweop( p )
        !           422: register NODE *p; 
        !           423: {
        !           424:        
        !           425:        
        !           426:        
        !           427:        
        !           428:        
        !           429:        
        !           430:        register NODE *q, *t;
        !           431:        register TWORD ty;
        !           432:        if( odebug>1 ) 
        !           433:        {
        !           434:                e2print( p );
        !           435:                printf( "\nrewritten by reweop as:\n" );
        !           436:        }
        !           437:        q = tcopy( p, 0 );
        !           438:        if( p->in.left->tn.op == 104 ) 
        !           439:        {
        !           440:                
        !           441:                
        !           442:                
        !           443:                t = p->in.left;
        !           444:                ty = t->in.left->tn.type;
        !           445:                p->in.left = t->in.left;
        !           446:                tfree( p->in.right );
        !           447:                p->in.right = t;
        !           448:                t->in.left = q;
        !           449:                
        !           450:                t->tn.type = ty;
        !           451:        }
        !           452:        else 
        !           453:        {
        !           454:                tfree( p->in.right );
        !           455:                p->in.right = q;
        !           456:        }
        !           457:        
        !           458:        p->tn.op = 58;
        !           459:        q->tn.op = (-1)+ q->tn.op;
        !           460:        p->tn.type = p->in.left->tn.type;
        !           461:        q->tn.type = q->in.right->tn.type;
        !           462:        if( odebug>1 ) e2print( p );
        !           463: }
        !           464: rewass( p )
        !           465: NODE *p; 
        !           466: {
        !           467:        NODE *q;
        !           468:        int o;
        !           469:        
        !           470:        if( odebug ) 
        !           471:        {
        !           472:                printf( "rewass called with:\n" );
        !           473:                e2print( p );
        !           474:        }
        !           475:        o = p->tn.op;
        !           476:        if( o == 2+ 14 ) 
        !           477:        {
        !           478:                if( p->in.left->tn.op == 118 ) 
        !           479:                {
        !           480:                        
        !           481:                        q = p->in.left;
        !           482:                        q->tn.op = 4;
        !           483:                        *p = *q;
        !           484:                        q->tn.op = 97;
        !           485:                        return(0);  
        !           486:                }
        !           487:                
        !           488:                rewsto( p->in.left );
        !           489:                
        !           490:                if( odebug ) 
        !           491:                {
        !           492:                        printf( "\nrewritten by rewass as:\n" );
        !           493:                        e2print( p );
        !           494:                }
        !           495:                return(1);
        !           496:        }
        !           497:        if( ! (dope[o]&01) || o==58 ) 
        !           498:        {
        !           499:                if( o==58 ) 
        !           500:                {
        !           501:                        
        !           502:                        o = p->in.left->tn.op;
        !           503:                        if( o==118 || o==120 || o==119 ) 
        !           504:                        {
        !           505:                                
        !           506:                                p->in.left->tn.op = 94;
        !           507:                                p->in.left->tn.rval =  0;
        !           508:                                if( odebug ) 
        !           509:                                {
        !           510:                                        printf( "funny node redone\n" );
        !           511:                                        e2print(p);
        !           512:                                }
        !           513:                                return(0);
        !           514:                        }
        !           515:                }
        !           516:                else 
        !           517:                {
        !           518:                        TWORD t = p->in.left->tn.type;
        !           519:                        
        !           520:                        
        !           521:                        p->in.left = ind2type( p->in.left );
        !           522:                        p->in.right = ind2type( p->in.right );
        !           523:                        if( odebug ) {
        !           524:                                printf( "conversions inserted" );
        !           525:                                e2print(p);
        !           526:                        }
        !           527:                        
        !           528:                        if( t != p->in.left->tn.type ) {
        !           529:                                
        !           530:                                return( 0 );
        !           531:                        }
        !           532:                }
        !           533:                e2print(p);
        !           534:                cerror( "can't deal with op %s", opst[o] );
        !           535:        }
        !           536:        if( o == 78 || o == 79 ) 
        !           537:        {
        !           538:                
        !           539:                if( odebug>1 ) 
        !           540:                {
        !           541:                        e2print( p );
        !           542:                        printf( "\nrewritten by rewass as:\n" );
        !           543:                }
        !           544:                if( p->in.goal == (6+1) )
        !           545:                {
        !           546:                        p->in.op = ((o==78)?1+ 6:1+ 8);
        !           547:                }
        !           548:                else
        !           549:                {
        !           550:                        q = tcopy(p, 0);
        !           551:                        regrcl( p->in.left );
        !           552:                        tfree( p->in.left );
        !           553:                        p->in.left = q;
        !           554:                        q->tn.op = ((o==78)?1+ 6:1+ 8);
        !           555:                        p->tn.op = ((o==78)?8:6);
        !           556:                }
        !           557:                if( odebug ) 
        !           558:                {
        !           559:                        printf( "\nrewritten by rewass as:\n" );
        !           560:                        e2print( p );
        !           561:                }
        !           562:                return(1);
        !           563:        }
        !           564:        
        !           565:        if( q = lhsto(p) ) 
        !           566:        {
        !           567:                if( !rewsto( q ) ) cerror( "rewass0" );  
        !           568:                rewcom( p, p->tn.goal );  
        !           569:                if( p->tn.op != 59 ) cerror( "rewass1" );
        !           570:                if( ! (dope[ p->in.right->tn.op ]&01) ) cerror( "rewass2" );
        !           571:                (void)reweop( p->in.right );
        !           572:        }
        !           573:        else (void)reweop( p );  
        !           574:        return(1);
        !           575: }
        !           576: outshp( pp )
        !           577: SHAPE **pp; 
        !           578: {
        !           579:        SHAPE *p;
        !           580:        if (pp == 0)
        !           581:                return;
        !           582:        for( ; p = *pp; ++pp )
        !           583:        {
        !           584:                printf("\t\t");
        !           585:                shpr(p);
        !           586:                printf( " (%d)\n", p->sc );
        !           587:        }
        !           588: }
        !           589: tabpr()
        !           590: {
        !           591:        register        OPTAB   *p;
        !           592:        for (p =table; ;p++)
        !           593:        {
        !           594:                printf("Dump of table[%d] (stinline %d)\n", p-table, p->stinline );
        !           595:                printf("\top = %s\n", opst[p->op]);
        !           596:                printf("\tnextop = %d\n", p->nextop?p->nextop-table:-1 );
        !           597:                printf("\tlshape = %d\n", p->lshape-pshape);
        !           598:                printf("\tltype = 0%o\n", p->ltype);
        !           599:                printf("\trshape = %d\n", p->rshape-pshape);
        !           600:                printf("\trtype = 0%o\n", p->rtype);
        !           601:                printf("\tneeds = %d\n", p->needs);
        !           602:                printf("\trewrite = %d\n", p->rewrite);
        !           603:                printf("\tcstring = %s", p->cstring);
        !           604:                printf("\tcost = %d\n", p->cost);
        !           605:                printf("\tLeft:\n");
        !           606:                outshp(p->lshape);
        !           607:                printf("\tRight:\n");
        !           608:                outshp(p->rshape);
        !           609:                printf("\n");
        !           610:        }
        !           611: }
        !           612: codgen( p )
        !           613: NODE *p; 
        !           614: {
        !           615:        
        !           616:        int i, flag;
        !           617:        if (odebug > 5)
        !           618:        {
        !           619:                tabpr();
        !           620:                
        !           621:        }
        !           622:        
        !           623:        
        !           624:        
        !           625:        
        !           626: again:
        !           627:        
        !           628:        rewcom( p, (6+1) );
        !           629:        if( odebug ) 
        !           630:        {
        !           631:                printf( "After goals are computed:" );
        !           632:                e2print( p );
        !           633:        }
        !           634:        
        !           635:        if( costs( p ) ) goto again;  
        !           636:        if( odebug ) 
        !           637:        {
        !           638:                printf( "After costs are computed:" );
        !           639:                e2print( p );
        !           640:        }
        !           641:        
        !           642:        nins = 0;
        !           643:        insout( p, (6+1) );
        !           644:        
        !           645:        flag = 0;
        !           646:        for( i=0; i<nins; ++i ) 
        !           647:        {
        !           648:                if( inst[i].goal == (6+2) ) 
        !           649:                {
        !           650:                        if( odebug ) 
        !           651:                        {
        !           652:                                printf( "subtree is stored in temp:\n" );
        !           653:                                e2print( inst[i].p );
        !           654:                        }
        !           655:                        if( rewsto( inst[i].p ) ) {
        !           656:                                if( !fast ) goto again;
        !           657:                                
        !           658:                                flag = 1;
        !           659:                        }
        !           660:                }
        !           661:        }
        !           662:        if( flag ) goto again;
        !           663:        if( odebug ) e2print(p);
        !           664:        
        !           665:        insprt();
        !           666: }
        !           667: INST inst[300];
        !           668: int nins;
        !           669: insprt()
        !           670: {
        !           671:        int i;
        !           672:        register INST *pi;
        !           673:        register NODE *p;
        !           674:        register OPTAB *q;
        !           675:        register c, goal;
        !           676:        for( pi=inst,i=0; i<nins; ++i,++pi )
        !           677:        {
        !           678:                p = pi->p;
        !           679:                q = pi->q;
        !           680:                c = pi->goal;
        !           681:                if( c == (6+3) && (q->rewrite&040) ) goal = 04 ;
        !           682:                else if( c == (6+1) ) goal = 01 ;
        !           683:                else goal = 02 ;
        !           684:                if(odebug > 4)
        !           685:                {
        !           686:                        printf("INSOUT: %d c=",i);
        !           687:                        preff(c);
        !           688:                        printf(" goal=");
        !           689:                        prgoal(goal);
        !           690:                        printf("\n");
        !           691:                        e2print(p);
        !           692:                }
        !           693:                allo( p, q );
        !           694:                expand( p, goal, q->cstring, q );
        !           695:                reclaim( p, q->rewrite, goal );
        !           696:                
        !           697:                if( c == (6+3) && p->tn.op != 96 ) 
        !           698:                {
        !           699:                        cfix( p, (6+3) );
        !           700:                        if( p->tn.op != 96 ) cerror( "ctest fails" );
        !           701:                }
        !           702:                if( c>=0 && c<=6 && ! ( p ->in.op==94 &&  (( p ->tn.rval)<6)) )
        !           703:                {
        !           704:                        cfix( p, 6 );
        !           705:                }
        !           706:        }
        !           707: }
        !           708: SHTABLE sha;
        !           709: int odebug = 0;
        !           710: cfix( p, goal )
        !           711: NODE *p; 
        !           712: {
        !           713:        
        !           714:        OPTAB *q;
        !           715:        NODE *pp;
        !           716:        int r;
        !           717:        if(odebug > 4)
        !           718:        {
        !           719:                printf("CFIX: goal=");
        !           720:                prgoal(goal);
        !           721:                printf("\n");
        !           722:                e2print(p);
        !           723:        }
        !           724:        if( goal == (6+3) ) 
        !           725:        {
        !           726:                r = 040;
        !           727:                p->tn.goal = (6+3);
        !           728:        }
        !           729:        else 
        !           730:        {
        !           731:                r = (04|010|020);
        !           732:                pp =  ( ( (( (dope[ p ->tn.op]&016))==02? p : p ->in.left)));
        !           733:                if(  ( pp ->in.op==94 &&  (( pp ->tn.rval)<6)) ) r |= 01;
        !           734:                pp =  ( ( (( (dope[ p ->tn.op]&016))==010? p ->in.right: p )));
        !           735:                if(  ( pp ->in.op==94 &&  (( pp ->tn.rval)<6)) ) r |= 02;
        !           736:        }
        !           737:        if( goal == (6+3) ) goal = 04 ;
        !           738:        else goal = 02 ;
        !           739:        for( q=0; q = match( p, q ); )
        !           740:        {
        !           741:                
        !           742:                
        !           743:                if( q->rewrite & r ) 
        !           744:                {
        !           745:                        
        !           746:                        allo( p, q );
        !           747:                        expand( p, goal, q->cstring, q );
        !           748:                        reclaim( p, q->rewrite, goal );
        !           749:                        return;
        !           750:                }
        !           751:        }
        !           752:        e2print(p);
        !           753:        cerror( "cfix trouble" );
        !           754: }
        !           755: preff(c)
        !           756: {
        !           757:        char buf[20];
        !           758:        register char *p;
        !           759:        p = c==(6+3) ? "CCC" : c==(6+2) ? "CTEMP" : c==(6+1) ? "CEFF" : 0;
        !           760:        if(!p)
        !           761:        {
        !           762:                sprintf(buf,"0%o",c);
        !           763:                p = buf;
        !           764:        }
        !           765:        printf("%s",p);
        !           766: }

unix.superglobalmegacorp.com

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