xref: /original-bsd/old/as.vax/asscanl.h (revision 2301fdfb)
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  *	@(#)asscanl.h	5.1 (Berkeley) 04/30/85
7  */
8 
9 /*
10  *	This file contains definitions local to the files implementing
11  *	the character scanner and the token buffer managers.
12  *	It is not intended to be shared with any other parts of the
13  *	assembler.
14  *	The file ``asscan.h'' is shared with other parts of the assembler
15  */
16 #include <stdio.h>
17 #include "as.h"
18 #include "asscan.h"
19 
20 #define EOFCHAR	(-1)
21 /*
22  *	The table of possible uses for each character to test set inclusion.
23  */
24 #define	HEXFLAG		01		/* 'x' or 'X' */
25 #define	HEXLDIGIT	02		/* 'a' .. 'f' */
26 #define	HEXUDIGIT	04		/* 'A' .. 'F' */
27 #define	ALPHA		010		/* 'A' .. 'Z', 'a' .. 'z', '_'*/
28 #define	DIGIT		020		/* '0' .. '9' */
29 #define	FLOATEXP	040		/* 'd' 'e' 'D' 'E' 'g' 'h' 'G' 'H' */
30 #define	SIGN		0100		/* '+' .. '-'*/
31 #define	REGDIGIT	0200		/* '0' .. '5' */
32 #define	SZSPECBEGIN	0400		/* 'b', 'B', 'l', 'L', 'w', 'W' */
33 #define	POINT		01000		/* '.' */
34 #define	SPACE		02000		/* '\t' or ' ' */
35 #define	BSESCAPE	04000		/* bnrtf */
36 #define	STRESCAPE	010000		/* '"', '\\', '\n' */
37 #define	OCTDIGIT	020000		/* '0' .. '7' */
38 #define	FLOATFLAG	040000		/* 'd', 'D', 'f', 'F' */
39 
40 #define	INCHARSET(val, kind) (charsets[val] & (kind) )
41 /*
42  *	We use our own version of getchar/ungetc to get
43  *	some speed improvement
44  */
45 extern	char	*Ginbufptr;
46 extern	int	Ginbufcnt;
47 #define	REGTOMEMBUF	Ginbufptr = inbufptr, Ginbufcnt = inbufcnt
48 #define	MEMTOREGBUF	inbufptr = Ginbufptr, inbufcnt = Ginbufcnt
49 #undef getchar
50 #define	getchar() \
51 	(inbufcnt-- > 0 ? (*inbufptr++) : \
52 		(fillinbuffer(), \
53 		MEMTOREGBUF, \
54 		inbufptr[-1]))
55 #undef ungetc
56 #define ungetc(ch) \
57 	(++inbufcnt, *--inbufptr = ch)
58 
59 /*
60  *	Variables and definitions to manage the token buffering.
61  *	We scan (lexically analyze) a large number of tokens, and
62  *	then parse all of the tokens in the scan buffer.
63  *	This reduces procedure call overhead when the parser
64  *	demands a token, allows for an efficient reread during
65  *	the second pass, and confuses the line number reporting
66  *	for errors encountered in the scanner and in the parser.
67  */
68 #define TOKDALLOP	8
69 struct	tokbufdesc *bufstart;	/*where the buffer list begins*/
70 struct	tokbufdesc *buftail;	/*last one on the list*/
71 struct	tokbufdesc *emptybuf;	/*the one being filled*/
72 /*
73  *	If we are using VM, during the second pass we reclaim the used
74  *	token buffers for saving the relocation information
75  */
76 struct	tokbufdesc *tok_free;	/* free pool */
77 struct	tokbufdesc *tok_temp;	/* temporary for doing list manipulation */
78 /*
79  *	Other token buffer managers
80  */
81 int	bufno;			/*which buffer number: 0,1 for tmp file*/
82 struct 	tokbufdesc tokbuf[2];	/*our initial increment of buffers*/
83 ptrall	tokptr;			/*where the current token comes from*/
84 ptrall	tokub;			/*the last token in the current token buffer*/
85 /*
86  *	as does not use fread and fwrite for the token buffering.
87  *	The token buffers are integrals of BUFSIZ
88  *	at all times, so we use direct read and write.
89  *	fread and fwrite in stdio are HORRENDOUSLY inefficient,
90  *	as they use putchar for each character, nested two deep in loops.
91  */
92 #define writeTEST(pointer, size, nelements, ioptr) \
93 	write(ioptr->_file, pointer, nelements * size) != nelements * size
94 
95 #define readTEST(pointer, size, nelements, ioptr) \
96 	read(ioptr->_file, pointer, nelements * size) != nelements * size
97 
98 #define bskiplg(from, length) \
99 	*(lgtype *)from = length; \
100 	(bytetoktype *)from += sizeof(lgtype) + length
101 
102 #define bskipfromto(from, to) \
103 	*(lgtype *)from = (bytetoktype *)to - (bytetoktype *)from - sizeof(lgtype); \
104 	(bytetoktype *)from += sizeof (lgtype) + (bytetoktype *)to - (bytetoktype *)from
105 
106 #define eatskiplg(from) \
107 	(bytetoktype *)from += sizeof(lgtype) + *(lgtype *)from
108 
109 #ifdef DEBUG
110 	ptrall	firsttoken;
111 #endif DEBUG
112 
113 /*
114  *	The following three variables are the slots for global
115  *	communication with the parser.
116  *	They are the semantic values associated with a particular token.
117  *	The token itself is the return value from yylex()
118  */
119 int	yylval;			/* normal semantic value */
120 Bignum	yybignum;		/* a big number */
121 struct	Opcode	yyopcode;	/* a structure opcode */
122 
123 int	newfflag;
124 char	*newfname;
125 int	scanlineno;		/*the scanner's linenumber*/
126 
127 /*
128  *	Definitions for sets of characters
129  */
130 readonly short charsets[];
131 readonly short type[];
132