xref: /plan9/sys/src/cmd/cpp/cpp.h (revision 39e9a3f16a02917facc249a68c87044e5601acab)
13e12c5d1SDavid du Colombier #define	INS	32768		/* input buffer */
23e12c5d1SDavid du Colombier #define	OBS	4096		/* outbut buffer */
3*39e9a3f1SDavid du Colombier #define	NARG	128		/* Max number arguments to a macro */
47dd7cddfSDavid du Colombier #define	NINCLUDE 64		/* Max number of include directories (-I) */
53e12c5d1SDavid du Colombier #define	NIF	32		/* depth of nesting of #if */
63e12c5d1SDavid du Colombier #ifndef EOF
73e12c5d1SDavid du Colombier #define	EOF	(-1)
83e12c5d1SDavid du Colombier #endif
93e12c5d1SDavid du Colombier #ifndef NULL
103e12c5d1SDavid du Colombier #define NULL	0
113e12c5d1SDavid du Colombier #endif
123e12c5d1SDavid du Colombier 
133e12c5d1SDavid du Colombier enum toktype { END, UNCLASS, NAME, NUMBER, STRING, CCON, NL, WS, DSHARP,
143e12c5d1SDavid du Colombier 		EQ, NEQ, LEQ, GEQ, LSH, RSH, LAND, LOR, PPLUS, MMINUS,
153e12c5d1SDavid du Colombier 		ARROW, SBRA, SKET, LP, RP, DOT, AND, STAR, PLUS, MINUS,
163e12c5d1SDavid du Colombier 		TILDE, NOT, SLASH, PCT, LT, GT, CIRC, OR, QUEST,
173e12c5d1SDavid du Colombier 		COLON, ASGN, COMMA, SHARP, SEMIC, CBRA, CKET,
183e12c5d1SDavid du Colombier 		ASPLUS, ASMINUS, ASSTAR, ASSLASH, ASPCT, ASCIRC, ASLSH,
193e12c5d1SDavid du Colombier 		ASRSH, ASOR, ASAND, ELLIPS,
203e12c5d1SDavid du Colombier 		DSHARP1, NAME1, DEFINED, UMINUS };
213e12c5d1SDavid du Colombier 
223e12c5d1SDavid du Colombier enum kwtype { KIF, KIFDEF, KIFNDEF, KELIF, KELSE, KENDIF, KINCLUDE, KDEFINE,
23ad1af469SDavid du Colombier 		KUNDEF, KLINE, KERROR, KWARNING, KPRAGMA, KDEFINED,
243e12c5d1SDavid du Colombier 		KLINENO, KFILE, KDATE, KTIME, KSTDC, KEVAL };
253e12c5d1SDavid du Colombier 
263e12c5d1SDavid du Colombier #define	ISDEFINED	01	/* has #defined value */
273e12c5d1SDavid du Colombier #define	ISKW		02	/* is PP keyword */
283e12c5d1SDavid du Colombier #define	ISUNCHANGE	04	/* can't be #defined in PP */
293e12c5d1SDavid du Colombier #define	ISMAC		010	/* builtin macro, e.g. __LINE__ */
303b56890dSDavid du Colombier #define	ISVARMAC	020	/* variadic macro */
313e12c5d1SDavid du Colombier 
323e12c5d1SDavid du Colombier #define	EOB	0xFE		/* sentinel for end of input buffer */
33bd389b36SDavid du Colombier #define	EOFC	0xFD		/* sentinel for end of input file */
343e12c5d1SDavid du Colombier #define	XPWS	1		/* token flag: white space to assure token sep. */
353e12c5d1SDavid du Colombier 
3605dd1647SDavid du Colombier enum { Notinmacro, Inmacro };
3705dd1647SDavid du Colombier 
383e12c5d1SDavid du Colombier typedef struct token {
393e12c5d1SDavid du Colombier 	unsigned char	type;
403e12c5d1SDavid du Colombier 	unsigned char 	flag;
413e12c5d1SDavid du Colombier 	unsigned short	hideset;
42219b2ee8SDavid du Colombier 	unsigned int	wslen;
43219b2ee8SDavid du Colombier 	unsigned int	len;
443e12c5d1SDavid du Colombier 	uchar	*t;
453e12c5d1SDavid du Colombier } Token;
463e12c5d1SDavid du Colombier 
473e12c5d1SDavid du Colombier typedef struct tokenrow {
483e12c5d1SDavid du Colombier 	Token	*tp;		/* current one to scan */
493e12c5d1SDavid du Colombier 	Token	*bp;		/* base (allocated value) */
503e12c5d1SDavid du Colombier 	Token	*lp;		/* last+1 token used */
513e12c5d1SDavid du Colombier 	int	max;		/* number allocated */
523e12c5d1SDavid du Colombier } Tokenrow;
533e12c5d1SDavid du Colombier 
543e12c5d1SDavid du Colombier typedef struct source {
553e12c5d1SDavid du Colombier 	char	*filename;	/* name of file of the source */
563e12c5d1SDavid du Colombier 	int	line;		/* current line number */
573e12c5d1SDavid du Colombier 	int	lineinc;	/* adjustment for \\n lines */
583e12c5d1SDavid du Colombier 	uchar	*inb;		/* input buffer */
593e12c5d1SDavid du Colombier 	uchar	*inp;		/* input pointer */
603e12c5d1SDavid du Colombier 	uchar	*inl;		/* end of input */
61a8453668SDavid du Colombier 	int 	ins;		/* input buffer size */
623e12c5d1SDavid du Colombier 	int	fd;		/* input source */
633e12c5d1SDavid du Colombier 	int	ifdepth;	/* conditional nesting in include */
643e12c5d1SDavid du Colombier 	struct	source *next;	/* stack for #include */
653e12c5d1SDavid du Colombier } Source;
663e12c5d1SDavid du Colombier 
673e12c5d1SDavid du Colombier typedef struct nlist {
683e12c5d1SDavid du Colombier 	struct nlist *next;
693e12c5d1SDavid du Colombier 	uchar	*name;
703e12c5d1SDavid du Colombier 	int	len;
713e12c5d1SDavid du Colombier 	Tokenrow *vp;		/* value as macro */
723e12c5d1SDavid du Colombier 	Tokenrow *ap;		/* list of argument names, if any */
733e12c5d1SDavid du Colombier 	char	val;		/* value as preprocessor name */
743e12c5d1SDavid du Colombier 	char	flag;		/* is defined, is pp name */
753e12c5d1SDavid du Colombier } Nlist;
763e12c5d1SDavid du Colombier 
773e12c5d1SDavid du Colombier typedef	struct	includelist {
783e12c5d1SDavid du Colombier 	char	deleted;
793e12c5d1SDavid du Colombier 	char	always;
803e12c5d1SDavid du Colombier 	char	*file;
813e12c5d1SDavid du Colombier } Includelist;
823e12c5d1SDavid du Colombier 
833e12c5d1SDavid du Colombier #define	new(t)	(t *)domalloc(sizeof(t))
843e12c5d1SDavid du Colombier #define	quicklook(a,b)	(namebit[(a)&077] & (1<<((b)&037)))
853e12c5d1SDavid du Colombier #define	quickset(a,b)	namebit[(a)&077] |= (1<<((b)&037))
863e12c5d1SDavid du Colombier extern	unsigned long namebit[077+1];
873e12c5d1SDavid du Colombier 
883e12c5d1SDavid du Colombier enum errtype { WARNING, ERROR, FATAL };
893e12c5d1SDavid du Colombier 
903e12c5d1SDavid du Colombier void	expandlex(void);
913e12c5d1SDavid du Colombier void	fixlex(void);
923e12c5d1SDavid du Colombier void	setup(int, char **);
939a747e4fSDavid du Colombier #define gettokens cpp_gettokens
943e12c5d1SDavid du Colombier int	gettokens(Tokenrow *, int);
953e12c5d1SDavid du Colombier int	comparetokens(Tokenrow *, Tokenrow *);
963e12c5d1SDavid du Colombier Source	*setsource(char *, int, char *);
973e12c5d1SDavid du Colombier void	unsetsource(void);
983e12c5d1SDavid du Colombier void	puttokens(Tokenrow *);
993e12c5d1SDavid du Colombier void	process(Tokenrow *);
100a8453668SDavid du Colombier void	*dorealloc(void *, int);
1013e12c5d1SDavid du Colombier void	*domalloc(int);
1023e12c5d1SDavid du Colombier void	dofree(void *);
1033e12c5d1SDavid du Colombier void	error(enum errtype, char *, ...);
1043e12c5d1SDavid du Colombier void	flushout(void);
1053e12c5d1SDavid du Colombier int	fillbuf(Source *);
1063e12c5d1SDavid du Colombier int	trigraph(Source *);
1073e12c5d1SDavid du Colombier int	foldline(Source *);
1083e12c5d1SDavid du Colombier Nlist	*lookup(Token *, int);
1093e12c5d1SDavid du Colombier void	control(Tokenrow *);
1103e12c5d1SDavid du Colombier void	dodefine(Tokenrow *);
1113e12c5d1SDavid du Colombier void	doadefine(Tokenrow *, int);
1123e12c5d1SDavid du Colombier void	doinclude(Tokenrow *);
1133e12c5d1SDavid du Colombier void	doif(Tokenrow *, enum kwtype);
11405dd1647SDavid du Colombier void	expand(Tokenrow *, Nlist *, int);
1153e12c5d1SDavid du Colombier void	builtin(Tokenrow *, int);
1163b56890dSDavid du Colombier int	gatherargs(Tokenrow *, Tokenrow **, int, int *);
1173e12c5d1SDavid du Colombier void	substargs(Nlist *, Tokenrow *, Tokenrow **);
11805dd1647SDavid du Colombier void	expandrow(Tokenrow *, char *, int);
1193e12c5d1SDavid du Colombier void	maketokenrow(int, Tokenrow *);
1203e12c5d1SDavid du Colombier Tokenrow *copytokenrow(Tokenrow *, Tokenrow *);
1213e12c5d1SDavid du Colombier Token	*growtokenrow(Tokenrow *);
1223e12c5d1SDavid du Colombier Tokenrow *normtokenrow(Tokenrow *);
1233e12c5d1SDavid du Colombier void	adjustrow(Tokenrow *, int);
1243e12c5d1SDavid du Colombier void	movetokenrow(Tokenrow *, Tokenrow *);
1253e12c5d1SDavid du Colombier void	insertrow(Tokenrow *, int, Tokenrow *);
1263e12c5d1SDavid du Colombier void	peektokens(Tokenrow *, char *);
1273e12c5d1SDavid du Colombier void	doconcat(Tokenrow *);
1283e12c5d1SDavid du Colombier Tokenrow *stringify(Tokenrow *);
1293e12c5d1SDavid du Colombier int	lookuparg(Nlist *, Token *);
1303e12c5d1SDavid du Colombier long	eval(Tokenrow *, int);
1313e12c5d1SDavid du Colombier void	genline(void);
1323e12c5d1SDavid du Colombier void	setempty(Tokenrow *);
1333e12c5d1SDavid du Colombier void	makespace(Tokenrow *);
1343e12c5d1SDavid du Colombier char	*outnum(char *, int);
1353e12c5d1SDavid du Colombier int	digit(int);
1363e12c5d1SDavid du Colombier uchar	*newstring(uchar *, int, int);
1373e12c5d1SDavid du Colombier int	checkhideset(int, Nlist *);
1383e12c5d1SDavid du Colombier void	prhideset(int);
1393e12c5d1SDavid du Colombier int	newhideset(int, Nlist *);
1403e12c5d1SDavid du Colombier int	unionhideset(int, int);
1413e12c5d1SDavid du Colombier void	iniths(void);
142bd389b36SDavid du Colombier void	setobjname(char *);
143219b2ee8SDavid du Colombier void	clearwstab(void);
1443e12c5d1SDavid du Colombier #define	rowlen(tokrow)	((tokrow)->lp - (tokrow)->bp)
1453e12c5d1SDavid du Colombier 
1463e12c5d1SDavid du Colombier extern	char *outp;
1473e12c5d1SDavid du Colombier extern	Token	nltoken;
1483e12c5d1SDavid du Colombier extern	Source *cursource;
1493e12c5d1SDavid du Colombier extern	char *curtime;
1503e12c5d1SDavid du Colombier extern	int incdepth;
1513e12c5d1SDavid du Colombier extern	int ifdepth;
1523e12c5d1SDavid du Colombier extern	int ifsatisfied[NIF];
153bd389b36SDavid du Colombier extern	int Mflag;
1547dd7cddfSDavid du Colombier extern	int nolineinfo;
1553e12c5d1SDavid du Colombier extern	int skipping;
1563e12c5d1SDavid du Colombier extern	int verbose;
1573e12c5d1SDavid du Colombier extern	int Cplusplus;
158bd389b36SDavid du Colombier extern	Nlist *kwdefined;
1593e12c5d1SDavid du Colombier extern	Includelist includelist[NINCLUDE];
160219b2ee8SDavid du Colombier extern	char wd[];
161