xref: /plan9/sys/src/cmd/qa/a.h (revision 375daca8932d0755549a5f8e4d068a24a49927d4)
1*375daca8SDavid du Colombier #include <u.h>
2*375daca8SDavid du Colombier #include <libc.h>
3*375daca8SDavid du Colombier #include <bio.h>
4*375daca8SDavid du Colombier #include "../qc/q.out.h"
5*375daca8SDavid du Colombier 
6*375daca8SDavid du Colombier #ifndef	EXTERN
7*375daca8SDavid du Colombier #define	EXTERN	extern
8*375daca8SDavid du Colombier #endif
97dd7cddfSDavid du Colombier 
107dd7cddfSDavid du Colombier typedef	struct	Sym	Sym;
117dd7cddfSDavid du Colombier typedef	struct	Gen	Gen;
127dd7cddfSDavid du Colombier typedef	struct	Io	Io;
137dd7cddfSDavid du Colombier typedef	struct	Hist	Hist;
147dd7cddfSDavid du Colombier 
157dd7cddfSDavid du Colombier #define	MAXALIGN	7
167dd7cddfSDavid du Colombier #define	FPCHIP		1
177dd7cddfSDavid du Colombier #define	NSYMB		8192
187dd7cddfSDavid du Colombier #define	BUFSIZ		8192
197dd7cddfSDavid du Colombier #define	HISTSZ		20
207dd7cddfSDavid du Colombier #define	NINCLUDE	10
217dd7cddfSDavid du Colombier #define	NHUNK		10000
227dd7cddfSDavid du Colombier #define	EOF		(-1)
237dd7cddfSDavid du Colombier #define	IGN		(-2)
247dd7cddfSDavid du Colombier #define	GETC()		((--fi.c < 0)? filbuf(): *fi.p++ & 0xff)
257dd7cddfSDavid du Colombier #define	NHASH		503
267dd7cddfSDavid du Colombier #define	STRINGSZ	200
277dd7cddfSDavid du Colombier #define	NMACRO		10
287dd7cddfSDavid du Colombier 
297dd7cddfSDavid du Colombier #define	ALLOC(lhs, type)\
307dd7cddfSDavid du Colombier 	while(nhunk < sizeof(type))\
317dd7cddfSDavid du Colombier 		gethunk();\
327dd7cddfSDavid du Colombier 	lhs = (type*)hunk;\
337dd7cddfSDavid du Colombier 	nhunk -= sizeof(type);\
347dd7cddfSDavid du Colombier 	hunk += sizeof(type);
357dd7cddfSDavid du Colombier 
367dd7cddfSDavid du Colombier #define	ALLOCN(lhs, len, n)\
377dd7cddfSDavid du Colombier 	if(lhs+len != hunk || nhunk < n) {\
387dd7cddfSDavid du Colombier 		while(nhunk <= len)\
397dd7cddfSDavid du Colombier 			gethunk();\
407dd7cddfSDavid du Colombier 		memmove(hunk, lhs, len);\
417dd7cddfSDavid du Colombier 		lhs = hunk;\
427dd7cddfSDavid du Colombier 		hunk += len;\
437dd7cddfSDavid du Colombier 		nhunk -= len;\
447dd7cddfSDavid du Colombier 	}\
457dd7cddfSDavid du Colombier 	hunk += n;\
467dd7cddfSDavid du Colombier 	nhunk -= n;
477dd7cddfSDavid du Colombier 
487dd7cddfSDavid du Colombier struct	Sym
497dd7cddfSDavid du Colombier {
507dd7cddfSDavid du Colombier 	Sym*	link;
517dd7cddfSDavid du Colombier 	char*	macro;
527dd7cddfSDavid du Colombier 	long	value;
537dd7cddfSDavid du Colombier 	ushort	type;
547dd7cddfSDavid du Colombier 	char	*name;
557dd7cddfSDavid du Colombier 	char	sym;
567dd7cddfSDavid du Colombier };
577dd7cddfSDavid du Colombier #define	S	((Sym*)0)
587dd7cddfSDavid du Colombier 
597dd7cddfSDavid du Colombier struct
607dd7cddfSDavid du Colombier {
617dd7cddfSDavid du Colombier 	char*	p;
627dd7cddfSDavid du Colombier 	int	c;
637dd7cddfSDavid du Colombier } fi;
647dd7cddfSDavid du Colombier 
657dd7cddfSDavid du Colombier struct	Io
667dd7cddfSDavid du Colombier {
677dd7cddfSDavid du Colombier 	Io*	link;
687dd7cddfSDavid du Colombier 	char	b[BUFSIZ];
697dd7cddfSDavid du Colombier 	char*	p;
707dd7cddfSDavid du Colombier 	short	c;
717dd7cddfSDavid du Colombier 	short	f;
727dd7cddfSDavid du Colombier };
737dd7cddfSDavid du Colombier #define	I	((Io*)0)
747dd7cddfSDavid du Colombier 
757dd7cddfSDavid du Colombier struct
767dd7cddfSDavid du Colombier {
777dd7cddfSDavid du Colombier 	Sym*	sym;
787dd7cddfSDavid du Colombier 	short	type;
797dd7cddfSDavid du Colombier } h[NSYM];
807dd7cddfSDavid du Colombier 
817dd7cddfSDavid du Colombier struct	Gen
827dd7cddfSDavid du Colombier {
837dd7cddfSDavid du Colombier 	Sym*	sym;
847dd7cddfSDavid du Colombier 	long	offset;
857dd7cddfSDavid du Colombier 	short	type;
867dd7cddfSDavid du Colombier 	short	reg;
877dd7cddfSDavid du Colombier 	short	xreg;
887dd7cddfSDavid du Colombier 	short	name;
897dd7cddfSDavid du Colombier 	ushort	mask;
907dd7cddfSDavid du Colombier 	double	dval;
917dd7cddfSDavid du Colombier 	char	sval[8];
927dd7cddfSDavid du Colombier };
937dd7cddfSDavid du Colombier 
947dd7cddfSDavid du Colombier struct	Hist
957dd7cddfSDavid du Colombier {
967dd7cddfSDavid du Colombier 	Hist*	link;
977dd7cddfSDavid du Colombier 	char*	name;
987dd7cddfSDavid du Colombier 	long	line;
997dd7cddfSDavid du Colombier 	long	offset;
1007dd7cddfSDavid du Colombier };
1017dd7cddfSDavid du Colombier #define	H	((Hist*)0)
1027dd7cddfSDavid du Colombier 
1037dd7cddfSDavid du Colombier enum
1047dd7cddfSDavid du Colombier {
1057dd7cddfSDavid du Colombier 	CLAST,
1067dd7cddfSDavid du Colombier 	CMACARG,
1077dd7cddfSDavid du Colombier 	CMACRO,
108*375daca8SDavid du Colombier 	CPREPROC
1097dd7cddfSDavid du Colombier };
1107dd7cddfSDavid du Colombier 
111*375daca8SDavid du Colombier EXTERN	char	debug[256];
112*375daca8SDavid du Colombier EXTERN	Sym*	hash[NHASH];
113*375daca8SDavid du Colombier EXTERN	char*	Dlist[30];
114*375daca8SDavid du Colombier EXTERN	int	nDlist;
115*375daca8SDavid du Colombier EXTERN	Hist*	ehist;
116*375daca8SDavid du Colombier EXTERN	int	newflag;
117*375daca8SDavid du Colombier EXTERN	Hist*	hist;
118*375daca8SDavid du Colombier EXTERN	char*	hunk;
119*375daca8SDavid du Colombier EXTERN	char*	include[NINCLUDE];
120*375daca8SDavid du Colombier EXTERN	Io*	iofree;
121*375daca8SDavid du Colombier EXTERN	Io*	ionext;
122*375daca8SDavid du Colombier EXTERN	Io*	iostack;
123*375daca8SDavid du Colombier EXTERN	long	lineno;
124*375daca8SDavid du Colombier EXTERN	int	nerrors;
125*375daca8SDavid du Colombier EXTERN	long	nhunk;
126*375daca8SDavid du Colombier EXTERN	int	nosched;
127*375daca8SDavid du Colombier EXTERN	int	ninclude;
128*375daca8SDavid du Colombier EXTERN	Gen	nullgen;
129*375daca8SDavid du Colombier EXTERN	char*	outfile;
130*375daca8SDavid du Colombier EXTERN	int	pass;
131*375daca8SDavid du Colombier EXTERN	char*	pathname;
132*375daca8SDavid du Colombier EXTERN	long	pc;
133*375daca8SDavid du Colombier EXTERN	int	peekc;
134*375daca8SDavid du Colombier EXTERN	int	sym;
135*375daca8SDavid du Colombier EXTERN	char	symb[NSYMB];
136*375daca8SDavid du Colombier EXTERN	int	thechar;
137*375daca8SDavid du Colombier EXTERN	char*	thestring;
138*375daca8SDavid du Colombier EXTERN	long	thunk;
139*375daca8SDavid du Colombier EXTERN	Biobuf	obuf;
1407dd7cddfSDavid du Colombier 
1417dd7cddfSDavid du Colombier void	errorexit(void);
1427dd7cddfSDavid du Colombier void	pushio(void);
1437dd7cddfSDavid du Colombier void	newio(void);
1447dd7cddfSDavid du Colombier void	newfile(char*, int);
1457dd7cddfSDavid du Colombier Sym*	slookup(char*);
1467dd7cddfSDavid du Colombier Sym*	lookup(void);
1477dd7cddfSDavid du Colombier void	syminit(Sym*);
1487dd7cddfSDavid du Colombier long	yylex(void);
1497dd7cddfSDavid du Colombier int	getc(void);
1507dd7cddfSDavid du Colombier int	getnsc(void);
1517dd7cddfSDavid du Colombier void	unget(int);
1527dd7cddfSDavid du Colombier int	escchar(int);
1537dd7cddfSDavid du Colombier void	cinit(void);
1547dd7cddfSDavid du Colombier void	pinit(char*);
1557dd7cddfSDavid du Colombier void	cclean(void);
1567dd7cddfSDavid du Colombier void	outcode(int, Gen*, int, Gen*);
1577dd7cddfSDavid du Colombier void	outgcode(int, Gen*, int, Gen*, Gen*);
1587dd7cddfSDavid du Colombier void	zname(char*, int, int);
1597dd7cddfSDavid du Colombier void	zaddr(Gen*, int);
1607dd7cddfSDavid du Colombier void	ieeedtod(Ieee*, double);
1617dd7cddfSDavid du Colombier int	filbuf(void);
1627dd7cddfSDavid du Colombier Sym*	getsym(void);
1637dd7cddfSDavid du Colombier void	domacro(void);
1647dd7cddfSDavid du Colombier void	macund(void);
1657dd7cddfSDavid du Colombier void	macdef(void);
1667dd7cddfSDavid du Colombier void	macexpand(Sym*, char*);
1677dd7cddfSDavid du Colombier void	macinc(void);
1687dd7cddfSDavid du Colombier void	macprag(void);
1697dd7cddfSDavid du Colombier void	maclin(void);
1707dd7cddfSDavid du Colombier void	macif(int);
1717dd7cddfSDavid du Colombier void	macend(void);
1727dd7cddfSDavid du Colombier void	dodefine(char*);
1737dd7cddfSDavid du Colombier void	prfile(long);
1747dd7cddfSDavid du Colombier void	outhist(void);
1757dd7cddfSDavid du Colombier void	linehist(char*, int);
1767dd7cddfSDavid du Colombier void	gethunk(void);
1777dd7cddfSDavid du Colombier void	yyerror(char*, ...);
1787dd7cddfSDavid du Colombier int	yyparse(void);
1797dd7cddfSDavid du Colombier void	setinclude(char*);
1807dd7cddfSDavid du Colombier int	assemble(char*);
1817dd7cddfSDavid du Colombier 
1827dd7cddfSDavid du Colombier /*
1837dd7cddfSDavid du Colombier  *	system-dependent stuff from ../cc/compat.c
1847dd7cddfSDavid du Colombier  */
1857dd7cddfSDavid du Colombier enum				/* keep in synch with ../cc/cc.h */
1867dd7cddfSDavid du Colombier {
1877dd7cddfSDavid du Colombier 	Plan9	= 1<<0,
1887dd7cddfSDavid du Colombier 	Unix	= 1<<1,
189*375daca8SDavid du Colombier 	Windows	= 1<<2
1907dd7cddfSDavid du Colombier };
1917dd7cddfSDavid du Colombier int	mywait(int*);
1927dd7cddfSDavid du Colombier int	mycreat(char*, int);
1937dd7cddfSDavid du Colombier int	systemtype(int);
1947dd7cddfSDavid du Colombier int	pathchar(void);
1957dd7cddfSDavid du Colombier char*	mygetwd(char*, int);
1967dd7cddfSDavid du Colombier int	myexec(char*, char*[]);
1977dd7cddfSDavid du Colombier int	mydup(int, int);
1987dd7cddfSDavid du Colombier int	myfork(void);
1997dd7cddfSDavid du Colombier int	mypipe(int*);
2007dd7cddfSDavid du Colombier void*	mysbrk(ulong);
201