xref: /plan9/sys/src/cmd/cpp/cpp.h (revision 9a747e4fd48b9f4522c70c07e8f882a15030f964)
13e12c5d1SDavid du Colombier #define	INS	32768		/* input buffer */
23e12c5d1SDavid du Colombier #define	OBS	4096		/* outbut buffer */
33e12c5d1SDavid du Colombier #define	NARG	32		/* 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,
233e12c5d1SDavid du Colombier 		KUNDEF, KLINE, KERROR, 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__ */
303e12c5d1SDavid du Colombier 
313e12c5d1SDavid du Colombier #define	EOB	0xFE		/* sentinel for end of input buffer */
32bd389b36SDavid du Colombier #define	EOFC	0xFD		/* sentinel for end of input file */
333e12c5d1SDavid du Colombier #define	XPWS	1		/* token flag: white space to assure token sep. */
343e12c5d1SDavid du Colombier 
353e12c5d1SDavid du Colombier typedef struct token {
363e12c5d1SDavid du Colombier 	unsigned char	type;
373e12c5d1SDavid du Colombier 	unsigned char 	flag;
383e12c5d1SDavid du Colombier 	unsigned short	hideset;
39219b2ee8SDavid du Colombier 	unsigned int	wslen;
40219b2ee8SDavid du Colombier 	unsigned int	len;
413e12c5d1SDavid du Colombier 	uchar	*t;
423e12c5d1SDavid du Colombier } Token;
433e12c5d1SDavid du Colombier 
443e12c5d1SDavid du Colombier typedef struct tokenrow {
453e12c5d1SDavid du Colombier 	Token	*tp;		/* current one to scan */
463e12c5d1SDavid du Colombier 	Token	*bp;		/* base (allocated value) */
473e12c5d1SDavid du Colombier 	Token	*lp;		/* last+1 token used */
483e12c5d1SDavid du Colombier 	int	max;		/* number allocated */
493e12c5d1SDavid du Colombier } Tokenrow;
503e12c5d1SDavid du Colombier 
513e12c5d1SDavid du Colombier typedef struct source {
523e12c5d1SDavid du Colombier 	char	*filename;	/* name of file of the source */
533e12c5d1SDavid du Colombier 	int	line;		/* current line number */
543e12c5d1SDavid du Colombier 	int	lineinc;	/* adjustment for \\n lines */
553e12c5d1SDavid du Colombier 	uchar	*inb;		/* input buffer */
563e12c5d1SDavid du Colombier 	uchar	*inp;		/* input pointer */
573e12c5d1SDavid du Colombier 	uchar	*inl;		/* end of input */
583e12c5d1SDavid du Colombier 	int	fd;		/* input source */
593e12c5d1SDavid du Colombier 	int	ifdepth;	/* conditional nesting in include */
603e12c5d1SDavid du Colombier 	struct	source *next;	/* stack for #include */
613e12c5d1SDavid du Colombier } Source;
623e12c5d1SDavid du Colombier 
633e12c5d1SDavid du Colombier typedef struct nlist {
643e12c5d1SDavid du Colombier 	struct nlist *next;
653e12c5d1SDavid du Colombier 	uchar	*name;
663e12c5d1SDavid du Colombier 	int	len;
673e12c5d1SDavid du Colombier 	Tokenrow *vp;		/* value as macro */
683e12c5d1SDavid du Colombier 	Tokenrow *ap;		/* list of argument names, if any */
693e12c5d1SDavid du Colombier 	char	val;		/* value as preprocessor name */
703e12c5d1SDavid du Colombier 	char	flag;		/* is defined, is pp name */
713e12c5d1SDavid du Colombier } Nlist;
723e12c5d1SDavid du Colombier 
733e12c5d1SDavid du Colombier typedef	struct	includelist {
743e12c5d1SDavid du Colombier 	char	deleted;
753e12c5d1SDavid du Colombier 	char	always;
763e12c5d1SDavid du Colombier 	char	*file;
773e12c5d1SDavid du Colombier } Includelist;
783e12c5d1SDavid du Colombier 
793e12c5d1SDavid du Colombier #define	new(t)	(t *)domalloc(sizeof(t))
803e12c5d1SDavid du Colombier #define	quicklook(a,b)	(namebit[(a)&077] & (1<<((b)&037)))
813e12c5d1SDavid du Colombier #define	quickset(a,b)	namebit[(a)&077] |= (1<<((b)&037))
823e12c5d1SDavid du Colombier extern	unsigned long namebit[077+1];
833e12c5d1SDavid du Colombier 
843e12c5d1SDavid du Colombier enum errtype { WARNING, ERROR, FATAL };
853e12c5d1SDavid du Colombier 
863e12c5d1SDavid du Colombier void	expandlex(void);
873e12c5d1SDavid du Colombier void	fixlex(void);
883e12c5d1SDavid du Colombier void	setup(int, char **);
89*9a747e4fSDavid du Colombier #define gettokens cpp_gettokens
903e12c5d1SDavid du Colombier int	gettokens(Tokenrow *, int);
913e12c5d1SDavid du Colombier int	comparetokens(Tokenrow *, Tokenrow *);
923e12c5d1SDavid du Colombier Source	*setsource(char *, int, char *);
933e12c5d1SDavid du Colombier void	unsetsource(void);
943e12c5d1SDavid du Colombier void	puttokens(Tokenrow *);
953e12c5d1SDavid du Colombier void	process(Tokenrow *);
963e12c5d1SDavid du Colombier void	*domalloc(int);
973e12c5d1SDavid du Colombier void	dofree(void *);
983e12c5d1SDavid du Colombier void	error(enum errtype, char *, ...);
993e12c5d1SDavid du Colombier void	flushout(void);
1003e12c5d1SDavid du Colombier int	fillbuf(Source *);
1013e12c5d1SDavid du Colombier int	trigraph(Source *);
1023e12c5d1SDavid du Colombier int	foldline(Source *);
1033e12c5d1SDavid du Colombier Nlist	*lookup(Token *, int);
1043e12c5d1SDavid du Colombier void	control(Tokenrow *);
1053e12c5d1SDavid du Colombier void	dodefine(Tokenrow *);
1063e12c5d1SDavid du Colombier void	doadefine(Tokenrow *, int);
1073e12c5d1SDavid du Colombier void	doinclude(Tokenrow *);
1083e12c5d1SDavid du Colombier void	doif(Tokenrow *, enum kwtype);
1093e12c5d1SDavid du Colombier void	expand(Tokenrow *, Nlist *);
1103e12c5d1SDavid du Colombier void	builtin(Tokenrow *, int);
1113e12c5d1SDavid du Colombier int	gatherargs(Tokenrow *, Tokenrow **, int *);
1123e12c5d1SDavid du Colombier void	substargs(Nlist *, Tokenrow *, Tokenrow **);
1133e12c5d1SDavid du Colombier void	expandrow(Tokenrow *, char *);
1143e12c5d1SDavid du Colombier void	maketokenrow(int, Tokenrow *);
1153e12c5d1SDavid du Colombier Tokenrow *copytokenrow(Tokenrow *, Tokenrow *);
1163e12c5d1SDavid du Colombier Token	*growtokenrow(Tokenrow *);
1173e12c5d1SDavid du Colombier Tokenrow *normtokenrow(Tokenrow *);
1183e12c5d1SDavid du Colombier void	adjustrow(Tokenrow *, int);
1193e12c5d1SDavid du Colombier void	movetokenrow(Tokenrow *, Tokenrow *);
1203e12c5d1SDavid du Colombier void	insertrow(Tokenrow *, int, Tokenrow *);
1213e12c5d1SDavid du Colombier void	peektokens(Tokenrow *, char *);
1223e12c5d1SDavid du Colombier void	doconcat(Tokenrow *);
1233e12c5d1SDavid du Colombier Tokenrow *stringify(Tokenrow *);
1243e12c5d1SDavid du Colombier int	lookuparg(Nlist *, Token *);
1253e12c5d1SDavid du Colombier long	eval(Tokenrow *, int);
1263e12c5d1SDavid du Colombier void	genline(void);
1273e12c5d1SDavid du Colombier void	setempty(Tokenrow *);
1283e12c5d1SDavid du Colombier void	makespace(Tokenrow *);
1293e12c5d1SDavid du Colombier char	*outnum(char *, int);
1303e12c5d1SDavid du Colombier int	digit(int);
1313e12c5d1SDavid du Colombier uchar	*newstring(uchar *, int, int);
1323e12c5d1SDavid du Colombier int	checkhideset(int, Nlist *);
1333e12c5d1SDavid du Colombier void	prhideset(int);
1343e12c5d1SDavid du Colombier int	newhideset(int, Nlist *);
1353e12c5d1SDavid du Colombier int	unionhideset(int, int);
1363e12c5d1SDavid du Colombier void	iniths(void);
137bd389b36SDavid du Colombier void	setobjname(char *);
138219b2ee8SDavid du Colombier void	clearwstab(void);
1393e12c5d1SDavid du Colombier #define	rowlen(tokrow)	((tokrow)->lp - (tokrow)->bp)
1403e12c5d1SDavid du Colombier 
1413e12c5d1SDavid du Colombier extern	char *outp;
1423e12c5d1SDavid du Colombier extern	Token	nltoken;
1433e12c5d1SDavid du Colombier extern	Source *cursource;
1443e12c5d1SDavid du Colombier extern	char *curtime;
1453e12c5d1SDavid du Colombier extern	int incdepth;
1463e12c5d1SDavid du Colombier extern	int ifdepth;
1473e12c5d1SDavid du Colombier extern	int ifsatisfied[NIF];
148bd389b36SDavid du Colombier extern	int Mflag;
1497dd7cddfSDavid du Colombier extern	int nolineinfo;
1503e12c5d1SDavid du Colombier extern	int skipping;
1513e12c5d1SDavid du Colombier extern	int verbose;
1523e12c5d1SDavid du Colombier extern	int Cplusplus;
153bd389b36SDavid du Colombier extern	Nlist *kwdefined;
1543e12c5d1SDavid du Colombier extern	Includelist includelist[NINCLUDE];
155219b2ee8SDavid du Colombier extern	char wd[];
156