1: /* 2: * Copyright (c) 1982 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[] = "@(#)asscan1.c 5.1 (Berkeley) 4/30/85"; 9: #endif not lint 10: 11: #include "asscanl.h" 12: 13: inittokfile() 14: { 15: if (passno == 1){ 16: if (useVM){ 17: bufstart = &tokbuf[0]; 18: buftail = &tokbuf[1]; 19: bufstart->tok_next = buftail; 20: buftail->tok_next = 0; 21: } 22: tokbuf[0].tok_count = -1; 23: tokbuf[1].tok_count = -1; 24: } 25: tok_temp = 0; 26: tok_free = 0; 27: bufno = 0; 28: emptybuf = &tokbuf[bufno]; 29: tokptr = 0; 30: tokub = 0; 31: } 32: 33: closetokfile() 34: { 35: if (passno == 1){ 36: if (useVM){ 37: emptybuf->toks[emptybuf->tok_count++] = PARSEEOF; 38: } else { 39: /* 40: * Clean up the buffers that haven't been 41: * written out yet 42: */ 43: if (tokbuf[bufno ^ 1].tok_count >= 0){ 44: if (writeTEST((char *)&tokbuf[bufno ^ 1], sizeof *emptybuf, 1, tokfile)){ 45: badwrite: 46: yyerror("Unexpected end of file writing the interpass tmp file"); 47: exit(2); 48: } 49: } 50: /* 51: * Ensure that we will read an End of file, 52: * if there are more than one file names 53: * in the argument list 54: */ 55: tokbuf[bufno].toks[tokbuf[bufno].tok_count++] = PARSEEOF; 56: if (writeTEST((char *)&tokbuf[bufno], sizeof *emptybuf, 1, tokfile)) 57: goto badwrite; 58: } 59: } /*end of being pass 1*/ 60: } 61: 62: inttoktype yylex() 63: { 64: register ptrall bufptr; 65: register inttoktype val; 66: register struct exp *locxp; 67: /* 68: * No local variables to be allocated; this saves 69: * one piddling instruction.. 70: */ 71: static int Lastjxxx; 72: 73: bufptr = tokptr; /*copy in the global value*/ 74: top: 75: if (bufptr < tokub){ 76: gtoken(val, bufptr); 77: switch(yylval = val){ 78: case PARSEEOF: 79: yylval = val = PARSEEOF; 80: break; 81: case BFINT: 82: case INT: 83: if (xp >= &explist[NEXP]) 84: yyerror("Too many expressions; try simplyfing"); 85: else 86: locxp = xp++; 87: locxp->e_number = Znumber; 88: locxp->e_number.num_tag = TYPL; 89: glong(locxp->e_xvalue, bufptr); 90: makevalue: 91: locxp->e_xtype = XABS; 92: locxp->e_xloc = 0; 93: locxp->e_xname = NULL; 94: yylval = (int)locxp; 95: break; 96: case BIGNUM: 97: if (xp >= &explist[NEXP]) 98: yyerror("Too many expressions; try simplyfing"); 99: else 100: locxp = xp++; 101: gnumber(locxp->e_number, bufptr); 102: goto makevalue; 103: case NAME: 104: gptr(yylval, bufptr); 105: lastnam = (struct symtab *)yylval; 106: break; 107: case SIZESPEC: 108: case REG: 109: gchar(yylval, bufptr); 110: break; 111: case INSTn: 112: case INST0: 113: gopcode(yyopcode, bufptr); 114: break; 115: case IJXXX: 116: gopcode(yyopcode, bufptr); 117: /* We can't cast Lastjxxx into (int *) here.. */ 118: gptr(Lastjxxx, bufptr); 119: lastjxxx = (struct symtab *)Lastjxxx; 120: break; 121: case ILINESKIP: 122: gint(yylval, bufptr); 123: lineno += yylval; 124: goto top; 125: case SKIP: 126: eatskiplg(bufptr); 127: goto top; 128: case VOID: 129: goto top; 130: case STRING: 131: case ISTAB: 132: case ISTABSTR: 133: case ISTABNONE: 134: case ISTABDOT: 135: case IALIGN: 136: gptr(yylval, bufptr); 137: break; 138: } 139: #ifdef DEBUG 140: if (toktrace){ 141: char *tok_to_name(); 142: printf("P: %d T#: %4d, %s ", 143: passno, bufptr - firsttoken, tok_to_name(val)); 144: switch(val){ 145: case INT: printf("val %d", 146: ((struct exp *)yylval)->e_xvalue); 147: break; 148: case BFINT: printf("val %d", 149: ((struct exp *)yylval)->e_xvalue); 150: break; 151: case BIGNUM: bignumprint(((struct exp*)yylval)->e_number); 152: break; 153: case NAME: printf("\"%.8s\"", 154: FETCHNAME((struct symtab *)yylval)); 155: break; 156: case REG: printf(" r%d", 157: yylval); 158: break; 159: case IJXXX: 160: case INST0: 161: case INSTn: if (ITABCHECK(yyopcode)) 162: printf("%.8s", 163: FETCHNAME(ITABFETCH(yyopcode))); 164: else 165: printf("IJXXX or INST0 or INSTn can't get into the itab\n"); 166: break; 167: case STRING: 168: printf("length %d, seekoffset %d, place 0%o ", 169: ((struct strdesc *)yylval)->sd_strlen, 170: ((struct strdesc *)yylval)->sd_stroff, 171: ((struct strdesc *)yylval)->sd_place 172: ); 173: if (((struct strdesc *)yylval)->sd_place & STR_CORE) 174: printf("value\"%*s\"", 175: ((struct strdesc *)yylval)->sd_strlen, 176: ((struct strdesc *)yylval)->sd_string); 177: break; 178: } /*end of the debug switch*/ 179: printf("\n"); 180: } 181: #endif DEBUG 182: 183: } else { /* start a new buffer */ 184: if (useVM){ 185: if (passno == 2){ 186: tok_temp = emptybuf->tok_next; 187: emptybuf->tok_next = tok_free; 188: tok_free = emptybuf; 189: emptybuf = tok_temp; 190: } else { 191: emptybuf = emptybuf->tok_next; 192: } 193: bufno += 1; 194: if (emptybuf == 0){ 195: struct tokbufdesc *newdallop; 196: int i; 197: if (passno == 2) 198: goto badread; 199: emptybuf = newdallop = (struct tokbufdesc *) 200: Calloc(TOKDALLOP, sizeof (struct tokbufdesc)); 201: for (i=0; i < TOKDALLOP; i++){ 202: buftail->tok_next = newdallop; 203: buftail = newdallop; 204: newdallop += 1; 205: } 206: buftail->tok_next = 0; 207: } /*end of need to get more buffers*/ 208: (bytetoktype *)bufptr = &(emptybuf->toks[0]); 209: if (passno == 1) 210: scan_dot_s(emptybuf); 211: } else { /*don't use VM*/ 212: bufno ^= 1; 213: emptybuf = &tokbuf[bufno]; 214: ((bytetoktype *)bufptr) = &(emptybuf->toks[0]); 215: if (passno == 1){ 216: /* 217: * First check if there are things to write 218: * out at all 219: */ 220: if (emptybuf->tok_count >= 0){ 221: if (writeTEST((char *)emptybuf, sizeof *emptybuf, 1, tokfile)){ 222: yyerror("Unexpected end of file writing the interpass tmp file"); 223: exit(2); 224: } 225: } 226: scan_dot_s(emptybuf); 227: } else { /*pass 2*/ 228: if (readTEST((char *)emptybuf, sizeof *emptybuf, 1, tokfile)){ 229: badread: 230: yyerror("Unexpected end of file while reading the interpass tmp file"); 231: exit(1); 232: } 233: } 234: } /*end of using a real live file*/ 235: (char *)tokub = (char *)bufptr + emptybuf->tok_count; 236: #ifdef DEBUG 237: firsttoken = bufptr; 238: if (debug) 239: printf("created buffernumber %d with %d tokens\n", 240: bufno, emptybuf->tok_count); 241: #endif DEBUG 242: goto top; 243: } /*end of reading/creating a new buffer*/ 244: tokptr = bufptr; /*copy back the global value*/ 245: return(val); 246: } /*end of yylex*/ 247: 248: 249: buildskip(from, to) 250: register ptrall from, to; 251: { 252: int diff; 253: register struct tokbufdesc *middlebuf; 254: /* 255: * check if from and to are in the same buffer 256: * from and to DIFFER BY AT MOST 1 buffer and to is 257: * always ahead of from, with to being in the buffer emptybuf 258: * points to. 259: * The hard part here is accounting for the case where the 260: * skip is to cross a buffer boundary; we must construct 261: * two skips. 262: * 263: * Figure out where the buffer boundary between from and to is 264: * It's easy in VM, as buffers increase to high memory, but 265: * w/o VM, we alternate between two buffers, and want 266: * to look at the exact middle of the contiguous buffer region. 267: */ 268: middlebuf = useVM ? emptybuf : &tokbuf[1]; 269: if ( ( (bytetoktype *)from > (bytetoktype *)middlebuf) 270: ^ ( (bytetoktype *)to > (bytetoktype *)middlebuf) 271: ){ /*split across a buffer boundary*/ 272: ptoken(from, SKIP); 273: /* 274: * Set the skip so it lands someplace beyond 275: * the end of this buffer. 276: * When we pull this skip out in the second pass, 277: * we will temporarily move the current pointer 278: * out beyond the end of the buffer, but immediately 279: * do a compare and fail the compare, and then reset 280: * all the pointers correctly to point into the next buffer. 281: */ 282: bskiplg(from, TOKBUFLG + 1); 283: /* 284: * Now, force from to be in the same buffer as to 285: */ 286: (bytetoktype *)from = (bytetoktype *)&(emptybuf->toks[0]); 287: } 288: /* 289: * Now, to and from are in the same buffer 290: */ 291: if (from > to) 292: yyerror("Internal error: bad skip construction"); 293: else { 294: if ( (diff = (bytetoktype *)to - (bytetoktype *)from) >= 295: (sizeof(bytetoktype) + sizeof(lgtype) + 1)) { 296: ptoken(from, SKIP); 297: bskipfromto(from, to); 298: } else { 299: for ( ; diff > 0; --diff) 300: ptoken(from, VOID); 301: } 302: } 303: } 304: 305: movestr(to, from, lg) 306: char *to; /* 4(ap) */ 307: char *from; /* 8(ap) */ 308: int lg; /* 12(ap) */ 309: { 310: if (lg <= 0) 311: return; 312: ; 313: asm("movc3 12(ap),*8(ap),*4(ap)"); 314: ; 315: } 316: 317: new_dot_s(namep) 318: char *namep; 319: { 320: newfflag = 1; 321: newfname = namep; 322: dotsname = namep; 323: lineno = 1; 324: scanlineno = 1; 325: } 326: 327: min(a, b) 328: { 329: return(a < b ? a : b); 330: }