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