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

Defined functions

mkdope defined in line 210; used 2 times
tcheck defined in line 68; used 3 times
tfree1 defined in line 85; used 2 times
tinit defined in line 45; used 4 times
tprint defined in line 218; used 5 times
walkf defined in line 115; used 9 times

Defined variables

dope defined in line 127; used 8 times
indope defined in line 130; used 1 times
nerrors defined in line 5; used 11 times
opst defined in line 128; used 14 times

Defined struct's

dopest defined in line 130; used 2 times
  • in line 211(2)

Defined macros

EXIT defined in line 2; used 2 times
  • in line 1, 34
TNEXT defined in line 54; used 2 times
  • in line 61(2)

Usage of this include

Last modified: 1979-01-10
Generated: 2016-12-26
Generated by src2html V0.67
page hit count: 756
Valid CSS Valid XHTML 1.0 Strict