|
|
1.1 ! root 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: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.