xref: /plan9/sys/src/cmd/cpp/cpp.h (revision 39e9a3f16a02917facc249a68c87044e5601acab)
1 #define	INS	32768		/* input buffer */
2 #define	OBS	4096		/* outbut buffer */
3 #define	NARG	128		/* Max number arguments to a macro */
4 #define	NINCLUDE 64		/* Max number of include directories (-I) */
5 #define	NIF	32		/* depth of nesting of #if */
6 #ifndef EOF
7 #define	EOF	(-1)
8 #endif
9 #ifndef NULL
10 #define NULL	0
11 #endif
12 
13 enum toktype { END, UNCLASS, NAME, NUMBER, STRING, CCON, NL, WS, DSHARP,
14 		EQ, NEQ, LEQ, GEQ, LSH, RSH, LAND, LOR, PPLUS, MMINUS,
15 		ARROW, SBRA, SKET, LP, RP, DOT, AND, STAR, PLUS, MINUS,
16 		TILDE, NOT, SLASH, PCT, LT, GT, CIRC, OR, QUEST,
17 		COLON, ASGN, COMMA, SHARP, SEMIC, CBRA, CKET,
18 		ASPLUS, ASMINUS, ASSTAR, ASSLASH, ASPCT, ASCIRC, ASLSH,
19 		ASRSH, ASOR, ASAND, ELLIPS,
20 		DSHARP1, NAME1, DEFINED, UMINUS };
21 
22 enum kwtype { KIF, KIFDEF, KIFNDEF, KELIF, KELSE, KENDIF, KINCLUDE, KDEFINE,
23 		KUNDEF, KLINE, KERROR, KWARNING, KPRAGMA, KDEFINED,
24 		KLINENO, KFILE, KDATE, KTIME, KSTDC, KEVAL };
25 
26 #define	ISDEFINED	01	/* has #defined value */
27 #define	ISKW		02	/* is PP keyword */
28 #define	ISUNCHANGE	04	/* can't be #defined in PP */
29 #define	ISMAC		010	/* builtin macro, e.g. __LINE__ */
30 #define	ISVARMAC	020	/* variadic macro */
31 
32 #define	EOB	0xFE		/* sentinel for end of input buffer */
33 #define	EOFC	0xFD		/* sentinel for end of input file */
34 #define	XPWS	1		/* token flag: white space to assure token sep. */
35 
36 enum { Notinmacro, Inmacro };
37 
38 typedef struct token {
39 	unsigned char	type;
40 	unsigned char 	flag;
41 	unsigned short	hideset;
42 	unsigned int	wslen;
43 	unsigned int	len;
44 	uchar	*t;
45 } Token;
46 
47 typedef struct tokenrow {
48 	Token	*tp;		/* current one to scan */
49 	Token	*bp;		/* base (allocated value) */
50 	Token	*lp;		/* last+1 token used */
51 	int	max;		/* number allocated */
52 } Tokenrow;
53 
54 typedef struct source {
55 	char	*filename;	/* name of file of the source */
56 	int	line;		/* current line number */
57 	int	lineinc;	/* adjustment for \\n lines */
58 	uchar	*inb;		/* input buffer */
59 	uchar	*inp;		/* input pointer */
60 	uchar	*inl;		/* end of input */
61 	int 	ins;		/* input buffer size */
62 	int	fd;		/* input source */
63 	int	ifdepth;	/* conditional nesting in include */
64 	struct	source *next;	/* stack for #include */
65 } Source;
66 
67 typedef struct nlist {
68 	struct nlist *next;
69 	uchar	*name;
70 	int	len;
71 	Tokenrow *vp;		/* value as macro */
72 	Tokenrow *ap;		/* list of argument names, if any */
73 	char	val;		/* value as preprocessor name */
74 	char	flag;		/* is defined, is pp name */
75 } Nlist;
76 
77 typedef	struct	includelist {
78 	char	deleted;
79 	char	always;
80 	char	*file;
81 } Includelist;
82 
83 #define	new(t)	(t *)domalloc(sizeof(t))
84 #define	quicklook(a,b)	(namebit[(a)&077] & (1<<((b)&037)))
85 #define	quickset(a,b)	namebit[(a)&077] |= (1<<((b)&037))
86 extern	unsigned long namebit[077+1];
87 
88 enum errtype { WARNING, ERROR, FATAL };
89 
90 void	expandlex(void);
91 void	fixlex(void);
92 void	setup(int, char **);
93 #define gettokens cpp_gettokens
94 int	gettokens(Tokenrow *, int);
95 int	comparetokens(Tokenrow *, Tokenrow *);
96 Source	*setsource(char *, int, char *);
97 void	unsetsource(void);
98 void	puttokens(Tokenrow *);
99 void	process(Tokenrow *);
100 void	*dorealloc(void *, int);
101 void	*domalloc(int);
102 void	dofree(void *);
103 void	error(enum errtype, char *, ...);
104 void	flushout(void);
105 int	fillbuf(Source *);
106 int	trigraph(Source *);
107 int	foldline(Source *);
108 Nlist	*lookup(Token *, int);
109 void	control(Tokenrow *);
110 void	dodefine(Tokenrow *);
111 void	doadefine(Tokenrow *, int);
112 void	doinclude(Tokenrow *);
113 void	doif(Tokenrow *, enum kwtype);
114 void	expand(Tokenrow *, Nlist *, int);
115 void	builtin(Tokenrow *, int);
116 int	gatherargs(Tokenrow *, Tokenrow **, int, int *);
117 void	substargs(Nlist *, Tokenrow *, Tokenrow **);
118 void	expandrow(Tokenrow *, char *, int);
119 void	maketokenrow(int, Tokenrow *);
120 Tokenrow *copytokenrow(Tokenrow *, Tokenrow *);
121 Token	*growtokenrow(Tokenrow *);
122 Tokenrow *normtokenrow(Tokenrow *);
123 void	adjustrow(Tokenrow *, int);
124 void	movetokenrow(Tokenrow *, Tokenrow *);
125 void	insertrow(Tokenrow *, int, Tokenrow *);
126 void	peektokens(Tokenrow *, char *);
127 void	doconcat(Tokenrow *);
128 Tokenrow *stringify(Tokenrow *);
129 int	lookuparg(Nlist *, Token *);
130 long	eval(Tokenrow *, int);
131 void	genline(void);
132 void	setempty(Tokenrow *);
133 void	makespace(Tokenrow *);
134 char	*outnum(char *, int);
135 int	digit(int);
136 uchar	*newstring(uchar *, int, int);
137 int	checkhideset(int, Nlist *);
138 void	prhideset(int);
139 int	newhideset(int, Nlist *);
140 int	unionhideset(int, int);
141 void	iniths(void);
142 void	setobjname(char *);
143 void	clearwstab(void);
144 #define	rowlen(tokrow)	((tokrow)->lp - (tokrow)->bp)
145 
146 extern	char *outp;
147 extern	Token	nltoken;
148 extern	Source *cursource;
149 extern	char *curtime;
150 extern	int incdepth;
151 extern	int ifdepth;
152 extern	int ifsatisfied[NIF];
153 extern	int Mflag;
154 extern	int nolineinfo;
155 extern	int skipping;
156 extern	int verbose;
157 extern	int Cplusplus;
158 extern	Nlist *kwdefined;
159 extern	Includelist includelist[NINCLUDE];
160 extern	char wd[];
161