|
|
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.