Annotation of 3BSD/cmd/mip/common, revision 1.1.1.1

1.1       root        1: # ifndef EXIT
                      2: # define EXIT exit
                      3: # endif
                      4: 
                      5: int nerrors = 0;  /* number of errors */
                      6: 
                      7: NODE *NIL;  /* pointer which always has 0 in it */
                      8: 
                      9: NODE *lastfree;  /* pointer to last free node; (for allocator) */
                     10: 
                     11:        /* VARARGS1 */
                     12: uerror( s, a ) char *s; { /* nonfatal error message */
                     13:        /* the routine where is different for pass 1 and pass 2;
                     14:        /*  it tells where the error took place */
                     15: 
                     16:        ++nerrors;
                     17:        where('u');
                     18:        fprintf( stderr, s, a );
                     19:        fprintf( stderr, "\n" );
                     20:        if( nerrors > 30 ) cerror( "too many errors");
                     21:        }
                     22: 
                     23:        /* VARARGS1 */
                     24: cerror( s, a, b, c ) char *s; { /* compiler error: die */
                     25:        where('c');
                     26:        if( nerrors && nerrors <= 30 ){ /* give the compiler the benefit of the doubt */
                     27:                fprintf( stderr, "cannot recover from earlier errors: goodbye!\n" );
                     28:                }
                     29:        else {
                     30:                fprintf( stderr, "compiler error: " );
                     31:                fprintf( stderr, s, a, b, c );
                     32:                fprintf( stderr, "\n" );
                     33:                }
                     34:        EXIT(1);
                     35:        }
                     36: 
                     37:        /* VARARGS1 */
                     38: int  Wflag = 0;
                     39: werror( s, a, b ) char *s; {  /* warning */
                     40:        if(Wflag) return;
                     41:        where('w');
                     42:        fprintf( stderr, "warning: " );
                     43:        fprintf( stderr, s, a, b );
                     44:        fprintf( stderr, "\n" );
                     45:        }
                     46: 
                     47: tinit(){ /* initialize expression tree search */
                     48: 
                     49:        NODE *p;
                     50: 
                     51:        for( p=node; p<= &node[TREESZ-1]; ++p ) p->op = FREE;
                     52:        lastfree = node;
                     53: 
                     54:        }
                     55: 
                     56: # define TNEXT(p) (p== &node[TREESZ-1]?node:p+1)
                     57: 
                     58: NODE *
                     59: talloc(){
                     60:        NODE *p, *q;
                     61: 
                     62:        q = lastfree;
                     63:        for( p = TNEXT(q); p!=q; p= TNEXT(p))
                     64:                if( p->op ==FREE ) return(lastfree=p);
                     65: 
                     66:        cerror( "out of tree space; simplify expression");
                     67:        /* NOTREACHED */
                     68:        }
                     69: 
                     70: tcheck(){ /* ensure that all nodes have been freed */
                     71: 
                     72:        NODE *p;
                     73: 
                     74:        if( !nerrors )
                     75:                for( p=node; p<= &node[TREESZ-1]; ++p )
                     76:                        if( p->op != FREE ) cerror( "wasted space: %o", p );
                     77:        tinit();
                     78:        }
                     79: tfree( p )  NODE *p; {
                     80:        /* free the tree p */
                     81:        extern tfree1();
                     82: 
                     83:        if( p->op != FREE ) walkf( p, tfree1 );
                     84: 
                     85:        }
                     86: 
                     87: tfree1(p)  NODE *p; {
                     88:        if( p == 0 ) cerror( "freeing blank tree!");
                     89:        else p->op = FREE;
                     90:        }
                     91: 
                     92: fwalk( t, f, down ) register NODE *t; int (*f)(); {
                     93: 
                     94:        int down1, down2;
                     95: 
                     96:        more:
                     97:        down1 = down2 = 0;
                     98: 
                     99:        (*f)( t, down, &down1, &down2 );
                    100: 
                    101:        switch( optype( t->op ) ){
                    102: 
                    103:        case BITYPE:
                    104:                fwalk( t->left, f, down1 );
                    105:                t = t->right;
                    106:                down = down2;
                    107:                goto more;
                    108: 
                    109:        case UTYPE:
                    110:                t = t->left;
                    111:                down = down1;
                    112:                goto more;
                    113: 
                    114:                }
                    115:        }
                    116: 
                    117: walkf( t, f ) register NODE *t;  int (*f)(); {
                    118:        register opty;
                    119: 
                    120:        opty = optype(t->op);
                    121: 
                    122:        if( opty != LTYPE ) walkf( t->left, f );
                    123:        if( opty == BITYPE ) walkf( t->right, f );
                    124:        (*f)( t );
                    125:        }
                    126: 
                    127: 
                    128: 
                    129: int dope[ DSIZE ];
                    130: char *opst[DSIZE];
                    131: 
                    132: struct dopest { int dopeop; char opst[8]; int dopeval; } indope[] = {
                    133: 
                    134:        NAME, "NAME", LTYPE,
                    135:        STRING, "STRING", LTYPE,
                    136:        REG, "REG", LTYPE,
                    137:        OREG, "OREG", LTYPE,
                    138:        ICON, "ICON", LTYPE,
                    139:        FCON, "FCON", LTYPE,
                    140:        CCODES, "CCODES", LTYPE,
                    141:        UNARY MINUS, "U-", UTYPE,
                    142:        UNARY MUL, "U*", UTYPE,
                    143:        UNARY AND, "U&", UTYPE,
                    144:        UNARY CALL, "UCALL", UTYPE|CALLFLG,
                    145:        UNARY FORTCALL, "UFCALL", UTYPE|CALLFLG,
                    146:        NOT, "!", UTYPE|LOGFLG,
                    147:        COMPL, "~", UTYPE,
                    148:        FORCE, "FORCE", UTYPE,
                    149:        INIT, "INIT", UTYPE,
                    150:        SCONV, "SCONV", UTYPE,
                    151:        PCONV, "PCONV", UTYPE,
                    152:        PLUS, "+", BITYPE|FLOFLG|SIMPFLG|COMMFLG,
                    153:        ASG PLUS, "+=", BITYPE|ASGFLG|ASGOPFLG|FLOFLG|SIMPFLG|COMMFLG,
                    154:        MINUS, "-", BITYPE|FLOFLG|SIMPFLG,
                    155:        ASG MINUS, "-=", BITYPE|FLOFLG|SIMPFLG|ASGFLG|ASGOPFLG,
                    156:        MUL, "*", BITYPE|FLOFLG|MULFLG,
                    157:        ASG MUL, "*=", BITYPE|FLOFLG|MULFLG|ASGFLG|ASGOPFLG,
                    158:        AND, "&", BITYPE|SIMPFLG|COMMFLG,
                    159:        ASG AND, "&=", BITYPE|SIMPFLG|COMMFLG|ASGFLG|ASGOPFLG,
                    160:        QUEST, "?", BITYPE,
                    161:        COLON, ":", BITYPE,
                    162:        ANDAND, "&&", BITYPE|LOGFLG,
                    163:        OROR, "||", BITYPE|LOGFLG,
                    164:        CM, ",", BITYPE,
                    165:        COMOP, ",OP", BITYPE,
                    166:        ASSIGN, "=", BITYPE|ASGFLG,
                    167:        DIV, "/", BITYPE|FLOFLG|MULFLG|DIVFLG,
                    168:        ASG DIV, "/=", BITYPE|FLOFLG|MULFLG|DIVFLG|ASGFLG|ASGOPFLG,
                    169:        MOD, "%", BITYPE|DIVFLG,
                    170:        ASG MOD, "%=", BITYPE|DIVFLG|ASGFLG|ASGOPFLG,
                    171:        LS, "<<", BITYPE|SHFFLG,
                    172:        ASG LS, "<<=", BITYPE|SHFFLG|ASGFLG|ASGOPFLG,
                    173:        RS, ">>", BITYPE|SHFFLG,
                    174:        ASG RS, ">>=", BITYPE|SHFFLG|ASGFLG|ASGOPFLG,
                    175:        OR, "|", BITYPE|COMMFLG|SIMPFLG,
                    176:        ASG OR, "|=", BITYPE|COMMFLG|SIMPFLG|ASGFLG|ASGOPFLG,
                    177:        ER, "^", BITYPE|COMMFLG|SIMPFLG,
                    178:        ASG ER, "^=", BITYPE|COMMFLG|SIMPFLG|ASGFLG|ASGOPFLG,
                    179:        INCR, "++", BITYPE|ASGFLG,
                    180:        DECR, "--", BITYPE|ASGFLG,
                    181:        STREF, "->", BITYPE,
                    182:        CALL, "CALL", BITYPE|CALLFLG,
                    183:        FORTCALL, "FCALL", BITYPE|CALLFLG,
                    184:        EQ, "==", BITYPE|LOGFLG,
                    185:        NE, "!=", BITYPE|LOGFLG,
                    186:        LE, "<=", BITYPE|LOGFLG,
                    187:        LT, "<", BITYPE|LOGFLG,
                    188:        GE, ">", BITYPE|LOGFLG,
                    189:        GT, ">", BITYPE|LOGFLG,
                    190:        UGT, "UGT", BITYPE|LOGFLG,
                    191:        UGE, "UGE", BITYPE|LOGFLG,
                    192:        ULT, "ULT", BITYPE|LOGFLG,
                    193:        ULE, "ULE", BITYPE|LOGFLG,
                    194:        ARS, "A>>", BITYPE,
                    195:        TYPE, "TYPE", LTYPE,
                    196:        LB, "[", BITYPE,
                    197:        CBRANCH, "CBRANCH", BITYPE,
                    198:        FLD, "FLD", UTYPE,
                    199:        PMCONV, "PMCONV", BITYPE,
                    200:        PVCONV, "PVCONV", BITYPE,
                    201:        RETURN, "RETURN", BITYPE|ASGFLG|ASGOPFLG,
                    202:        CAST, "CAST", BITYPE|ASGFLG|ASGOPFLG,
                    203:        GOTO, "GOTO", UTYPE,
                    204:        STASG, "STASG", BITYPE|ASGFLG,
                    205:        STARG, "STARG", UTYPE,
                    206:        STCALL, "STCALL", BITYPE|CALLFLG,
                    207:        UNARY STCALL, "USTCALL", UTYPE|CALLFLG,
                    208: 
                    209: -1,    0
                    210: };
                    211: 
                    212: mkdope(){
                    213:        register struct dopest *q;
                    214: 
                    215:        for( q = indope; q->dopeop >= 0; ++q ){
                    216:                dope[q->dopeop] = q->dopeval;
                    217:                opst[q->dopeop] = q->opst;
                    218:                }
                    219:        }
                    220: tprint( t )  TWORD t; { /* output a nice description of the type of t */
                    221: 
                    222:        static char * tnames[] = {
                    223:                "undef",
                    224:                "farg",
                    225:                "char",
                    226:                "short",
                    227:                "int",
                    228:                "long",
                    229:                "float",
                    230:                "double",
                    231:                "strty",
                    232:                "unionty",
                    233:                "enumty",
                    234:                "moety",
                    235:                "uchar",
                    236:                "ushort",
                    237:                "unsigned",
                    238:                "ulong",
                    239:                "?", "?"
                    240:                };
                    241: 
                    242:        for(;; t = DECREF(t) ){
                    243: 
                    244:                if( ISPTR(t) ) printf( "PTR " );
                    245:                else if( ISFTN(t) ) printf( "FTN " );
                    246:                else if( ISARY(t) ) printf( "ARY " );
                    247:                else {
                    248:                        printf( "%s", tnames[t] );
                    249:                        return;
                    250:                        }
                    251:                }
                    252:        }

unix.superglobalmegacorp.com

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