|
|
1.1 root 1: /* Copyright (c) 1979 Regents of the University of California */
2:
3: /*
4: * The character scanner is called to fill up one token buffer
5: *
6: * In the first pass, the tokens in this buffer may be overwriten
7: * to eliminate .stabs, and to change fully assemblable instructions
8: * into ascii strings. However, once the tokens are filled up by the
9: * character scanner, they are used in both the first and the second
10: * pass. Holes created by .stab removal and preassembly are replaced
11: * with 'skip' tokens that direct the second pass to ignore the
12: * following tokens.
13: *
14: * While the first pass could write a second version of the intermediate
15: * file and really purge the .stabs and such, the buffering required
16: * to do this seems to be too complex and too slow.
17: */
18:
19: #define TOKBUFLG 2*BUFSIZ
20: #define MAXVAX 32
21: #define SAFETY 2*NCPS
22:
23: #define AVAILTOKS TOKBUFLG -\
24: sizeof(short) -\
25: sizeof (struct tokbufdesc *) -\
26: MAXVAX - SAFETY
27:
28: struct tokbufdesc{
29: short tok_count; /*absolute byte length*/
30: struct tokbufdesc *tok_next;
31: char toks[AVAILTOKS];
32: char bufovf[MAXVAX + SAFETY];
33: };
34:
35: /*
36: * All variables handling these resources are local to astmpfil.c;
37: * we must have the structure defnitions here so that
38: * asscan.c can touch the stuff in a token buffer
39: */
40:
41: /*
42: * Definitions for handling tokens in the intermediate file
43: * buffers.
44: *
45: * We want to have the compiler produce the efficient auto increment
46: * instruction for stepping through the buffer of tokens. We must
47: * fool the type checker into thinking that a pointer can point
48: * to various size things.
49: */
50:
51: typedef char toktype;
52:
53: typedef char *ptrall; /*all uses will be type cast*/
54: typedef short lgtype; /*for storing length of strings or skiping*/
55: /*
56: * defintions for putting various typed values
57: * into the intermediate buffers
58: * ptr will ALWAYS be of type ptrall
59: */
60:
61: #define pchar(ptr,val) *ptr++ = val
62: #define puchar(ptr,val) *ptr++ = val
63:
64: #define pshort(ptr,val) *(short *)ptr=val, ptr += sizeof(short)
65: #define pushort(ptr,val) *(unsigned short *)ptr=val, ptr += sizeof(short)
66: #define pint(ptr,val) *(int *)ptr = val, ptr += sizeof(int)
67: #define puint(ptr,val) *(unsigned int *)ptr=val, ptr += sizeof(int)
68: #define plong(ptr,val) *(long *)ptr = val, ptr += sizeof(long)
69: #define pulong(ptr,val) *(unsigned long *)ptr=val,ptr += sizeof(long)
70: #define pfloat(ptr,val) *(float *)ptr = val, ptr += sizeof (float)
71: #define pdouble(ptr,val) *(double *)ptr = val, ptr += sizeof (double)
72: #define pptr(ptr,val) *(int *)ptr = (val), ptr += sizeof(ptrall)
73: #define ptoken(ptr,val) *ptr++ = val
74: #define pstrlg(ptr,val) *(lgtype *)ptr = val, ptr += sizeof(short)
75: #define pskiplg(ptr,val) *(lgtype *)ptr = val, ptr += sizeof(short)
76:
77: #define gchar(val, ptr) val = *ptr++
78: #define guchar(val, ptr) val = *ptr++
79:
80: #define gshort(val, ptr) val = *(short *)ptr , ptr += sizeof (short)
81: #define gushort(val, ptr) val = *(unsigned short *)ptr , ptr += sizeof (short)
82: #define gint(val, ptr) val = *(int *)ptr, ptr += sizeof (int)
83: #define guint(val, ptr) val = *(unsigend int *)ptr, ptr += sizeof (int)
84: #define glong(val, ptr) val = *(long *)ptr, ptr += sizeof (long)
85: #define gulong(val, ptr) val = *(unsigned long *)ptr, ptr += sizeof (long)
86: #define gfloat(val, ptr) val = *(float *)ptr, ptr += sizeof (float)
87: #define gdouble(val, ptr) val = *(double *)ptr, ptr += sizeof (double)
88: #define gptr(val, ptr) val = *(int *)ptr, ptr += sizeof (ptrall)
89: #define gtoken(val, ptr) val = *ptr++
90: #define gstrlg(val, ptr) val = *(lgtype *)ptr, ptr += sizeof (short)
91: #define gskiplg(val, ptr) val = *(lgtype *)ptr, ptr += sizeof (short)
92:
93:
94: ptrall tokptr; /*the next token to consume, call by copy*/
95: ptrall tokub; /*current upper bound in the current buffer*/
96:
97: /*
98: * Strings are known for their characters and for their length.
99: * We cannot use a normal zero termination byte, because strings
100: * can contain anything.
101: *
102: * We have two "strings", so that an input string that is too long can be
103: * split across two string buffers, and not confuse the yacc grammar.
104: * (This is probably superflous)
105: *
106: * We have a third string of nulls so that the .skip can be
107: * handled in the same way as strings.
108: */
109: #define MAXSTRLG 127
110:
111: struct strdesc{
112: char str_lg;
113: char str[MAXSTRLG];
114: };
115:
116: struct strdesc strbuf[3];
117: struct strdesc *strptr; /*points to the current string*/
118: int strno; /*the current string being filled*/
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.