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