Commit | Line | Data |
---|---|---|
d731b8e1 | 1 | /* Copyright (c) 1980 Regents of the University of California */ |
31cef89c | 2 | /* "@(#)asscan.h 4.3 8/15/80" */ |
d731b8e1 BJ |
3 | /* |
4 | * The character scanner is called to fill up one token buffer | |
5 | * | |
6 | * However, once the tokens are filled up by the | |
7 | * character scanner, they are used in both the first and the second | |
8 | * pass. Holes created by .stab removal are replaced | |
9 | * with 'skip' tokens that direct the second pass to ignore the | |
10 | * following tokens. | |
11 | */ | |
12 | ||
13 | #define TOKBUFLG BUFSIZ | |
14 | #define MAXVAX 32 | |
15 | #define SAFETY 16 | |
16 | ||
17 | #define AVAILTOKS TOKBUFLG -\ | |
18 | sizeof(int) -\ | |
19 | sizeof (struct tokbufdesc *) -\ | |
20 | MAXVAX - SAFETY | |
21 | ||
22 | struct tokbufdesc{ | |
23 | int tok_count; /*absolute byte length*/ | |
24 | struct tokbufdesc *tok_next; | |
25 | char toks[AVAILTOKS]; | |
26 | char bufovf[MAXVAX + SAFETY]; | |
27 | }; | |
28 | /* | |
29 | * Definitions for handling tokens in the intermediate file | |
30 | * buffers. | |
31 | * | |
32 | * We want to have the compiler produce the efficient auto increment | |
33 | * instruction for stepping through the buffer of tokens. We must | |
34 | * fool the type checker into thinking that a pointer can point | |
35 | * to various size things. | |
36 | */ | |
37 | ||
38 | typedef char toktype; | |
39 | ||
40 | typedef char *ptrall; /*all uses will be type cast*/ | |
41 | typedef short lgtype; /*for storing length of strings or skiping*/ | |
42 | /* | |
43 | * defintions for putting various typed values | |
44 | * into the intermediate buffers | |
45 | * ptr will ALWAYS be of type ptrall | |
46 | */ | |
47 | ||
48 | #define pchar(ptr,val) *ptr++ = val | |
49 | #define puchar(ptr,val) *ptr++ = val | |
50 | ||
51 | #define pshort(ptr,val) *(short *)ptr=val, ptr += sizeof(short) | |
d68880c9 | 52 | #define pushort(ptr,val) *(unsigned short *)ptr=val, ptr += sizeof(short) |
d731b8e1 | 53 | #define pint(ptr,val) *(int *)ptr = val, ptr += sizeof(int) |
d68880c9 | 54 | #define puint(ptr,val) *(unsigned int *)ptr=val, ptr += sizeof(int) |
d731b8e1 | 55 | #define plong(ptr,val) *(long *)ptr = val, ptr += sizeof(long) |
d68880c9 | 56 | #define pulong(ptr,val) *(unsigned long *)ptr=val, ptr += sizeof(long) |
d731b8e1 BJ |
57 | #define pfloat(ptr,val) *(float *)ptr = val, ptr += sizeof (float) |
58 | #define pdouble(ptr,val) *(double *)ptr = val, ptr += sizeof (double) | |
59 | #define pptr(ptr,val) *(int *)ptr = (val), ptr += sizeof(ptrall) | |
60 | #define ptoken(ptr,val) *ptr++ = val | |
61 | #define pstrlg(ptr,val) *(lgtype *)ptr = val, ptr += sizeof(short) | |
62 | #define pskiplg(ptr,val) *(lgtype *)ptr = val, ptr += sizeof(short) | |
63 | ||
64 | #define gchar(val, ptr) val = *ptr++ | |
65 | #define guchar(val, ptr) val = *ptr++ | |
66 | ||
67 | #define gshort(val, ptr) val = *(short *)ptr , ptr += sizeof (short) | |
68 | #define gushort(val, ptr) val = *(unsigned short *)ptr , ptr += sizeof (short) | |
69 | #define gint(val, ptr) val = *(int *)ptr, ptr += sizeof (int) | |
70 | #define guint(val, ptr) val = *(unsigend int *)ptr, ptr += sizeof (int) | |
71 | #define glong(val, ptr) val = *(long *)ptr, ptr += sizeof (long) | |
72 | #define gulong(val, ptr) val = *(unsigned long *)ptr, ptr += sizeof (long) | |
73 | #define gfloat(val, ptr) val = *(float *)ptr, ptr += sizeof (float) | |
74 | #define gdouble(val, ptr) val = *(double *)ptr, ptr += sizeof (double) | |
75 | #define gptr(val, ptr) val = *(int *)ptr, ptr += sizeof (ptrall) | |
76 | #define gtoken(val, ptr) val = *ptr++ | |
77 | #define gstrlg(val, ptr) val = *(lgtype *)ptr, ptr += sizeof (short) | |
78 | #define gskiplg(val, ptr) val = *(lgtype *)ptr, ptr += sizeof (short) | |
79 | ||
80 | ||
81 | extern ptrall tokptr; /*the next token to consume, call by copy*/ | |
82 | extern ptrall tokub; /*current upper bound in the current buffer*/ | |
83 | ||
84 | /* | |
85 | * Strings are known for their characters and for their length. | |
86 | * We cannot use a normal zero termination byte, because strings | |
87 | * can contain anything. | |
88 | * | |
89 | * We have two "strings", so that an input string that is too long can be | |
90 | * split across two string buffers, and not confuse the yacc grammar. | |
91 | * (This is probably superflous) | |
92 | * | |
93 | * We have a third string of nulls so that the .skip can be | |
94 | * handled in the same way as strings. | |
95 | */ | |
96 | #define MAXSTRLG 127 | |
97 | ||
98 | struct strdesc{ | |
99 | char str_lg; | |
100 | char str[MAXSTRLG]; | |
101 | }; | |
102 | ||
103 | extern struct strdesc strbuf[3]; | |
104 | extern struct strdesc *strptr; /*points to the current string*/ | |
105 | extern int strno; /*the current string being filled*/ | |
106 | char *savestr(); |