xref: /inferno-os/utils/5a/lex.c (revision 45a20ab721a513710138340faff3d59a31c3e01e)
174a4d8c2SCharles.Forsyth #define	EXTERN
274a4d8c2SCharles.Forsyth #include "a.h"
374a4d8c2SCharles.Forsyth #include "y.tab.h"
474a4d8c2SCharles.Forsyth #include <ctype.h>
574a4d8c2SCharles.Forsyth 
674a4d8c2SCharles.Forsyth void
main(int argc,char * argv[])774a4d8c2SCharles.Forsyth main(int argc, char *argv[])
874a4d8c2SCharles.Forsyth {
974a4d8c2SCharles.Forsyth 	char *p;
1074a4d8c2SCharles.Forsyth 	int nout, nproc, status, i, c;
1174a4d8c2SCharles.Forsyth 
1274a4d8c2SCharles.Forsyth 	thechar = '5';
1374a4d8c2SCharles.Forsyth 	thestring = "arm";
1474a4d8c2SCharles.Forsyth 	memset(debug, 0, sizeof(debug));
1574a4d8c2SCharles.Forsyth 	cinit();
1674a4d8c2SCharles.Forsyth 	outfile = 0;
1774a4d8c2SCharles.Forsyth 	include[ninclude++] = ".";
1874a4d8c2SCharles.Forsyth 	ARGBEGIN {
1974a4d8c2SCharles.Forsyth 	default:
2074a4d8c2SCharles.Forsyth 		c = ARGC();
2174a4d8c2SCharles.Forsyth 		if(c >= 0 || c < sizeof(debug))
2274a4d8c2SCharles.Forsyth 			debug[c] = 1;
2374a4d8c2SCharles.Forsyth 		break;
2474a4d8c2SCharles.Forsyth 
2574a4d8c2SCharles.Forsyth 	case 'o':
2674a4d8c2SCharles.Forsyth 		outfile = ARGF();
2774a4d8c2SCharles.Forsyth 		break;
2874a4d8c2SCharles.Forsyth 
2974a4d8c2SCharles.Forsyth 	case 'D':
3074a4d8c2SCharles.Forsyth 		p = ARGF();
3174a4d8c2SCharles.Forsyth 		if(p)
3274a4d8c2SCharles.Forsyth 			Dlist[nDlist++] = p;
3374a4d8c2SCharles.Forsyth 		break;
3474a4d8c2SCharles.Forsyth 
3574a4d8c2SCharles.Forsyth 	case 'I':
3674a4d8c2SCharles.Forsyth 		p = ARGF();
3774a4d8c2SCharles.Forsyth 		setinclude(p);
3874a4d8c2SCharles.Forsyth 		break;
3974a4d8c2SCharles.Forsyth 	case 't':
4074a4d8c2SCharles.Forsyth 		thechar = 't';
4174a4d8c2SCharles.Forsyth 		thestring = "thumb";
4274a4d8c2SCharles.Forsyth 		break;
4374a4d8c2SCharles.Forsyth 	} ARGEND
4474a4d8c2SCharles.Forsyth 	if(*argv == 0) {
4574a4d8c2SCharles.Forsyth 		print("usage: %ca [-options] file.s\n", thechar);
4674a4d8c2SCharles.Forsyth 		errorexit();
4774a4d8c2SCharles.Forsyth 	}
4874a4d8c2SCharles.Forsyth 	if(argc > 1 && systemtype(Windows)){
4974a4d8c2SCharles.Forsyth 		print("can't assemble multiple files on windows\n");
5074a4d8c2SCharles.Forsyth 		errorexit();
5174a4d8c2SCharles.Forsyth 	}
5274a4d8c2SCharles.Forsyth 	if(argc > 1 && !systemtype(Windows)) {
5374a4d8c2SCharles.Forsyth 		nproc = 1;
5474a4d8c2SCharles.Forsyth 		if(p = getenv("NPROC"))
5574a4d8c2SCharles.Forsyth 			nproc = atol(p);	/* */
5674a4d8c2SCharles.Forsyth 		c = 0;
5774a4d8c2SCharles.Forsyth 		nout = 0;
5874a4d8c2SCharles.Forsyth 		for(;;) {
5974a4d8c2SCharles.Forsyth 			while(nout < nproc && argc > 0) {
6074a4d8c2SCharles.Forsyth 				i = myfork();
6174a4d8c2SCharles.Forsyth 				if(i < 0) {
6274a4d8c2SCharles.Forsyth 					i = mywait(&status);
6374a4d8c2SCharles.Forsyth 					if(i < 0)
6474a4d8c2SCharles.Forsyth 						errorexit();
6574a4d8c2SCharles.Forsyth 					if(status)
6674a4d8c2SCharles.Forsyth 						c++;
6774a4d8c2SCharles.Forsyth 					nout--;
6874a4d8c2SCharles.Forsyth 					continue;
6974a4d8c2SCharles.Forsyth 				}
7074a4d8c2SCharles.Forsyth 				if(i == 0) {
7174a4d8c2SCharles.Forsyth 					print("%s:\n", *argv);
7274a4d8c2SCharles.Forsyth 					if(assemble(*argv))
7374a4d8c2SCharles.Forsyth 						errorexit();
7474a4d8c2SCharles.Forsyth 					exits(0);
7574a4d8c2SCharles.Forsyth 				}
7674a4d8c2SCharles.Forsyth 				nout++;
7774a4d8c2SCharles.Forsyth 				argc--;
7874a4d8c2SCharles.Forsyth 				argv++;
7974a4d8c2SCharles.Forsyth 			}
8074a4d8c2SCharles.Forsyth 			i = mywait(&status);
8174a4d8c2SCharles.Forsyth 			if(i < 0) {
8274a4d8c2SCharles.Forsyth 				if(c)
8374a4d8c2SCharles.Forsyth 					errorexit();
8474a4d8c2SCharles.Forsyth 				exits(0);
8574a4d8c2SCharles.Forsyth 			}
8674a4d8c2SCharles.Forsyth 			if(status)
8774a4d8c2SCharles.Forsyth 				c++;
8874a4d8c2SCharles.Forsyth 			nout--;
8974a4d8c2SCharles.Forsyth 		}
9074a4d8c2SCharles.Forsyth 	}
9174a4d8c2SCharles.Forsyth 	if(assemble(argv[0]))
9274a4d8c2SCharles.Forsyth 		errorexit();
9374a4d8c2SCharles.Forsyth 	exits(0);
9474a4d8c2SCharles.Forsyth }
9574a4d8c2SCharles.Forsyth 
9674a4d8c2SCharles.Forsyth int
assemble(char * file)9774a4d8c2SCharles.Forsyth assemble(char *file)
9874a4d8c2SCharles.Forsyth {
9974a4d8c2SCharles.Forsyth 	char ofile[100], incfile[20], *p;
10074a4d8c2SCharles.Forsyth 	int i, of;
10174a4d8c2SCharles.Forsyth 
10274a4d8c2SCharles.Forsyth 	strcpy(ofile, file);
10374a4d8c2SCharles.Forsyth 	p = utfrrune(ofile, pathchar());
10474a4d8c2SCharles.Forsyth 	if(p) {
10574a4d8c2SCharles.Forsyth 		include[0] = ofile;
10674a4d8c2SCharles.Forsyth 		*p++ = 0;
10774a4d8c2SCharles.Forsyth 	} else
10874a4d8c2SCharles.Forsyth 		p = ofile;
10974a4d8c2SCharles.Forsyth 	if(outfile == 0) {
11074a4d8c2SCharles.Forsyth 		outfile = p;
11174a4d8c2SCharles.Forsyth 		if(outfile){
11274a4d8c2SCharles.Forsyth 			p = utfrrune(outfile, '.');
11374a4d8c2SCharles.Forsyth 			if(p)
11474a4d8c2SCharles.Forsyth 				if(p[1] == 's' && p[2] == 0)
11574a4d8c2SCharles.Forsyth 					p[0] = 0;
11674a4d8c2SCharles.Forsyth 			p = utfrune(outfile, 0);
11774a4d8c2SCharles.Forsyth 			p[0] = '.';
11874a4d8c2SCharles.Forsyth 			p[1] = thechar;
11974a4d8c2SCharles.Forsyth 			p[2] = 0;
12074a4d8c2SCharles.Forsyth 		} else
12174a4d8c2SCharles.Forsyth 			outfile = "/dev/null";
12274a4d8c2SCharles.Forsyth 	}
12374a4d8c2SCharles.Forsyth 	p = getenv("INCLUDE");
12474a4d8c2SCharles.Forsyth 	if(p) {
12574a4d8c2SCharles.Forsyth 		setinclude(p);
12674a4d8c2SCharles.Forsyth 	} else {
12774a4d8c2SCharles.Forsyth 		if(systemtype(Plan9)) {
12874a4d8c2SCharles.Forsyth 			sprint(incfile,"/%s/include", thestring);
12974a4d8c2SCharles.Forsyth 			setinclude(strdup(incfile));
13074a4d8c2SCharles.Forsyth 		}
13174a4d8c2SCharles.Forsyth 	}
13274a4d8c2SCharles.Forsyth 
13374a4d8c2SCharles.Forsyth 	of = mycreat(outfile, 0664);
13474a4d8c2SCharles.Forsyth 	if(of < 0) {
13574a4d8c2SCharles.Forsyth 		yyerror("%ca: cannot create %s", thechar, outfile);
13674a4d8c2SCharles.Forsyth 		errorexit();
13774a4d8c2SCharles.Forsyth 	}
13874a4d8c2SCharles.Forsyth 	Binit(&obuf, of, OWRITE);
13974a4d8c2SCharles.Forsyth 
14074a4d8c2SCharles.Forsyth 	pass = 1;
14174a4d8c2SCharles.Forsyth 	pinit(file);
14274a4d8c2SCharles.Forsyth 	for(i=0; i<nDlist; i++)
14374a4d8c2SCharles.Forsyth 		dodefine(Dlist[i]);
14474a4d8c2SCharles.Forsyth 	yyparse();
14574a4d8c2SCharles.Forsyth 	if(nerrors) {
14674a4d8c2SCharles.Forsyth 		cclean();
14774a4d8c2SCharles.Forsyth 		return nerrors;
14874a4d8c2SCharles.Forsyth 	}
14974a4d8c2SCharles.Forsyth 
15074a4d8c2SCharles.Forsyth 	pass = 2;
15174a4d8c2SCharles.Forsyth 	outhist();
15274a4d8c2SCharles.Forsyth 	pinit(file);
15374a4d8c2SCharles.Forsyth 	for(i=0; i<nDlist; i++)
15474a4d8c2SCharles.Forsyth 		dodefine(Dlist[i]);
15574a4d8c2SCharles.Forsyth 	yyparse();
15674a4d8c2SCharles.Forsyth 	cclean();
15774a4d8c2SCharles.Forsyth 	return nerrors;
15874a4d8c2SCharles.Forsyth }
15974a4d8c2SCharles.Forsyth 
16074a4d8c2SCharles.Forsyth struct
16174a4d8c2SCharles.Forsyth {
16274a4d8c2SCharles.Forsyth 	char	*name;
16374a4d8c2SCharles.Forsyth 	ushort	type;
16474a4d8c2SCharles.Forsyth 	ushort	value;
16574a4d8c2SCharles.Forsyth } itab[] =
16674a4d8c2SCharles.Forsyth {
16774a4d8c2SCharles.Forsyth 	"SP",		LSP,	D_AUTO,
16874a4d8c2SCharles.Forsyth 	"SB",		LSB,	D_EXTERN,
16974a4d8c2SCharles.Forsyth 	"FP",		LFP,	D_PARAM,
17074a4d8c2SCharles.Forsyth 	"PC",		LPC,	D_BRANCH,
17174a4d8c2SCharles.Forsyth 
17274a4d8c2SCharles.Forsyth 	"R",		LR,	0,
17374a4d8c2SCharles.Forsyth 	"R0",		LREG,	0,
17474a4d8c2SCharles.Forsyth 	"R1",		LREG,	1,
17574a4d8c2SCharles.Forsyth 	"R2",		LREG,	2,
17674a4d8c2SCharles.Forsyth 	"R3",		LREG,	3,
17774a4d8c2SCharles.Forsyth 	"R4",		LREG,	4,
17874a4d8c2SCharles.Forsyth 	"R5",		LREG,	5,
17974a4d8c2SCharles.Forsyth 	"R6",		LREG,	6,
18074a4d8c2SCharles.Forsyth 	"R7",		LREG,	7,
18174a4d8c2SCharles.Forsyth 	"R8",		LREG,	8,
18274a4d8c2SCharles.Forsyth 	"R9",		LREG,	9,
18374a4d8c2SCharles.Forsyth 	"R10",		LREG,	10,
18474a4d8c2SCharles.Forsyth 	"R11",		LREG,	11,
18574a4d8c2SCharles.Forsyth 	"R12",		LREG,	12,
18674a4d8c2SCharles.Forsyth 	"R13",		LREG,	13,
18774a4d8c2SCharles.Forsyth 	"R14",		LREG,	14,
18874a4d8c2SCharles.Forsyth 	"R15",		LREG,	15,
18974a4d8c2SCharles.Forsyth 
19074a4d8c2SCharles.Forsyth 	"F",		LF,	0,
19174a4d8c2SCharles.Forsyth 
19274a4d8c2SCharles.Forsyth 	"F0",		LFREG,	0,
19374a4d8c2SCharles.Forsyth 	"F1",		LFREG,	1,
19474a4d8c2SCharles.Forsyth 	"F2",		LFREG,	2,
19574a4d8c2SCharles.Forsyth 	"F3",		LFREG,	3,
19674a4d8c2SCharles.Forsyth 	"F4",		LFREG,	4,
19774a4d8c2SCharles.Forsyth 	"F5",		LFREG,	5,
19874a4d8c2SCharles.Forsyth 	"F6",		LFREG,	6,
19974a4d8c2SCharles.Forsyth 	"F7",		LFREG,	7,
20074a4d8c2SCharles.Forsyth 	"F8",		LFREG,	8,
20174a4d8c2SCharles.Forsyth 	"F9",		LFREG,	9,
20274a4d8c2SCharles.Forsyth 	"F10",		LFREG,	10,
20374a4d8c2SCharles.Forsyth 	"F11",		LFREG,	11,
20474a4d8c2SCharles.Forsyth 	"F12",		LFREG,	12,
20574a4d8c2SCharles.Forsyth 	"F13",		LFREG,	13,
20674a4d8c2SCharles.Forsyth 	"F14",		LFREG,	14,
20774a4d8c2SCharles.Forsyth 	"F15",		LFREG,	15,
20874a4d8c2SCharles.Forsyth 
20974a4d8c2SCharles.Forsyth 	"C",		LC,	0,
21074a4d8c2SCharles.Forsyth 
21174a4d8c2SCharles.Forsyth 	"C0",		LCREG,	0,
21274a4d8c2SCharles.Forsyth 	"C1",		LCREG,	1,
21374a4d8c2SCharles.Forsyth 	"C2",		LCREG,	2,
21474a4d8c2SCharles.Forsyth 	"C3",		LCREG,	3,
21574a4d8c2SCharles.Forsyth 	"C4",		LCREG,	4,
21674a4d8c2SCharles.Forsyth 	"C5",		LCREG,	5,
21774a4d8c2SCharles.Forsyth 	"C6",		LCREG,	6,
21874a4d8c2SCharles.Forsyth 	"C7",		LCREG,	7,
21974a4d8c2SCharles.Forsyth 	"C8",		LCREG,	8,
22074a4d8c2SCharles.Forsyth 	"C9",		LCREG,	9,
22174a4d8c2SCharles.Forsyth 	"C10",		LCREG,	10,
22274a4d8c2SCharles.Forsyth 	"C11",		LCREG,	11,
22374a4d8c2SCharles.Forsyth 	"C12",		LCREG,	12,
22474a4d8c2SCharles.Forsyth 	"C13",		LCREG,	13,
22574a4d8c2SCharles.Forsyth 	"C14",		LCREG,	14,
22674a4d8c2SCharles.Forsyth 	"C15",		LCREG,	15,
22774a4d8c2SCharles.Forsyth 
22874a4d8c2SCharles.Forsyth 	"CPSR",		LPSR,	0,
22974a4d8c2SCharles.Forsyth 	"SPSR",		LPSR,	1,
23074a4d8c2SCharles.Forsyth 
23174a4d8c2SCharles.Forsyth 	"FPSR",		LFCR,	0,
23274a4d8c2SCharles.Forsyth 	"FPCR",		LFCR,	1,
23374a4d8c2SCharles.Forsyth 
23474a4d8c2SCharles.Forsyth 	".EQ",		LCOND,	0,
23574a4d8c2SCharles.Forsyth 	".NE",		LCOND,	1,
23674a4d8c2SCharles.Forsyth 	".CS",		LCOND,	2,
23774a4d8c2SCharles.Forsyth 	".HS",		LCOND,	2,
23874a4d8c2SCharles.Forsyth 	".CC",		LCOND,	3,
23974a4d8c2SCharles.Forsyth 	".LO",		LCOND,	3,
24074a4d8c2SCharles.Forsyth 	".MI",		LCOND,	4,
24174a4d8c2SCharles.Forsyth 	".PL",		LCOND,	5,
24274a4d8c2SCharles.Forsyth 	".VS",		LCOND,	6,
24374a4d8c2SCharles.Forsyth 	".VC",		LCOND,	7,
24474a4d8c2SCharles.Forsyth 	".HI",		LCOND,	8,
24574a4d8c2SCharles.Forsyth 	".LS",		LCOND,	9,
24674a4d8c2SCharles.Forsyth 	".GE",		LCOND,	10,
24774a4d8c2SCharles.Forsyth 	".LT",		LCOND,	11,
24874a4d8c2SCharles.Forsyth 	".GT",		LCOND,	12,
24974a4d8c2SCharles.Forsyth 	".LE",		LCOND,	13,
25074a4d8c2SCharles.Forsyth 	".AL",		LCOND,	Always,
25174a4d8c2SCharles.Forsyth 
25274a4d8c2SCharles.Forsyth 	".U",		LS,	C_UBIT,
25374a4d8c2SCharles.Forsyth 	".S",		LS,	C_SBIT,
25474a4d8c2SCharles.Forsyth 	".W",		LS,	C_WBIT,
25574a4d8c2SCharles.Forsyth 	".P",		LS,	C_PBIT,
25674a4d8c2SCharles.Forsyth 	".PW",		LS,	C_WBIT|C_PBIT,
25774a4d8c2SCharles.Forsyth 	".WP",		LS,	C_WBIT|C_PBIT,
25874a4d8c2SCharles.Forsyth 
25974a4d8c2SCharles.Forsyth 	".F",		LS,	C_FBIT,
26074a4d8c2SCharles.Forsyth 
26174a4d8c2SCharles.Forsyth 	".IBW",		LS,	C_WBIT|C_PBIT|C_UBIT,
26274a4d8c2SCharles.Forsyth 	".IAW",		LS,	C_WBIT|C_UBIT,
26374a4d8c2SCharles.Forsyth 	".DBW",		LS,	C_WBIT|C_PBIT,
26474a4d8c2SCharles.Forsyth 	".DAW",		LS,	C_WBIT,
26574a4d8c2SCharles.Forsyth 	".IB",		LS,	C_PBIT|C_UBIT,
26674a4d8c2SCharles.Forsyth 	".IA",		LS,	C_UBIT,
26774a4d8c2SCharles.Forsyth 	".DB",		LS,	C_PBIT,
26874a4d8c2SCharles.Forsyth 	".DA",		LS,	0,
26974a4d8c2SCharles.Forsyth 
27074a4d8c2SCharles.Forsyth 	"@",		LAT,	0,
27174a4d8c2SCharles.Forsyth 
27274a4d8c2SCharles.Forsyth 	"AND",		LTYPE1,	AAND,
27374a4d8c2SCharles.Forsyth 	"EOR",		LTYPE1,	AEOR,
27474a4d8c2SCharles.Forsyth 	"SUB",		LTYPE1,	ASUB,
27574a4d8c2SCharles.Forsyth 	"RSB",		LTYPE1,	ARSB,
27674a4d8c2SCharles.Forsyth 	"ADD",		LTYPE1,	AADD,
27774a4d8c2SCharles.Forsyth 	"ADC",		LTYPE1,	AADC,
27874a4d8c2SCharles.Forsyth 	"SBC",		LTYPE1,	ASBC,
27974a4d8c2SCharles.Forsyth 	"RSC",		LTYPE1,	ARSC,
28074a4d8c2SCharles.Forsyth 	"ORR",		LTYPE1,	AORR,
28174a4d8c2SCharles.Forsyth 	"BIC",		LTYPE1,	ABIC,
28274a4d8c2SCharles.Forsyth 
28374a4d8c2SCharles.Forsyth 	"SLL",		LTYPE1,	ASLL,
28474a4d8c2SCharles.Forsyth 	"SRL",		LTYPE1,	ASRL,
28574a4d8c2SCharles.Forsyth 	"SRA",		LTYPE1,	ASRA,
28674a4d8c2SCharles.Forsyth 
28774a4d8c2SCharles.Forsyth 	"MUL",		LTYPE1, AMUL,
28874a4d8c2SCharles.Forsyth 	"MULA",		LTYPEN, AMULA,
28974a4d8c2SCharles.Forsyth 	"DIV",		LTYPE1,	ADIV,
29074a4d8c2SCharles.Forsyth 	"MOD",		LTYPE1,	AMOD,
29174a4d8c2SCharles.Forsyth 
29274a4d8c2SCharles.Forsyth 	"MULL",		LTYPEM, AMULL,
29374a4d8c2SCharles.Forsyth 	"MULAL",	LTYPEM, AMULAL,
29474a4d8c2SCharles.Forsyth 	"MULLU",	LTYPEM, AMULLU,
29574a4d8c2SCharles.Forsyth 	"MULALU",	LTYPEM, AMULALU,
29674a4d8c2SCharles.Forsyth 
29774a4d8c2SCharles.Forsyth 	"MVN",		LTYPE2, AMVN,	/* op2 ignored */
29874a4d8c2SCharles.Forsyth 
29974a4d8c2SCharles.Forsyth 	"MOVB",		LTYPE3, AMOVB,
30074a4d8c2SCharles.Forsyth 	"MOVBU",	LTYPE3, AMOVBU,
30174a4d8c2SCharles.Forsyth 	"MOVH",		LTYPE3, AMOVH,
30274a4d8c2SCharles.Forsyth 	"MOVHU",	LTYPE3, AMOVHU,
30374a4d8c2SCharles.Forsyth 	"MOVW",		LTYPE3, AMOVW,
30474a4d8c2SCharles.Forsyth 
30574a4d8c2SCharles.Forsyth 	"MOVD",		LTYPE3, AMOVD,
30674a4d8c2SCharles.Forsyth 	"MOVDF",		LTYPE3, AMOVDF,
30774a4d8c2SCharles.Forsyth 	"MOVDW",	LTYPE3, AMOVDW,
30874a4d8c2SCharles.Forsyth 	"MOVF",		LTYPE3, AMOVF,
30974a4d8c2SCharles.Forsyth 	"MOVFD",		LTYPE3, AMOVFD,
31074a4d8c2SCharles.Forsyth 	"MOVFW",		LTYPE3, AMOVFW,
31174a4d8c2SCharles.Forsyth 	"MOVWD",	LTYPE3, AMOVWD,
31274a4d8c2SCharles.Forsyth 	"MOVWF",		LTYPE3, AMOVWF,
31374a4d8c2SCharles.Forsyth 
314*45a20ab7Sforsyth 	"LDREX",		LTYPE3, ALDREX,
315*45a20ab7Sforsyth 	"LDREXD",		LTYPE3, ALDREXD,
316*45a20ab7Sforsyth 	"STREX",		LTYPE9, ASTREX,
317*45a20ab7Sforsyth 	"STREXD",		LTYPE9, ASTREXD,
318*45a20ab7Sforsyth 
31974a4d8c2SCharles.Forsyth /*
32074a4d8c2SCharles.Forsyth 	"ABSF",		LTYPEI, AABSF,
32174a4d8c2SCharles.Forsyth 	"ABSD",		LTYPEI, AABSD,
32274a4d8c2SCharles.Forsyth 	"NEGF",		LTYPEI, ANEGF,
32374a4d8c2SCharles.Forsyth 	"NEGD",		LTYPEI, ANEGD,
32474a4d8c2SCharles.Forsyth 	"SQTF",		LTYPEI,	ASQTF,
32574a4d8c2SCharles.Forsyth 	"SQTD",		LTYPEI,	ASQTD,
32674a4d8c2SCharles.Forsyth 	"RNDF",		LTYPEI,	ARNDF,
32774a4d8c2SCharles.Forsyth 	"RNDD",		LTYPEI,	ARNDD,
32874a4d8c2SCharles.Forsyth 	"URDF",		LTYPEI,	AURDF,
32974a4d8c2SCharles.Forsyth 	"URDD",		LTYPEI,	AURDD,
33074a4d8c2SCharles.Forsyth 	"NRMF",		LTYPEI,	ANRMF,
33174a4d8c2SCharles.Forsyth 	"NRMD",		LTYPEI,	ANRMD,
33274a4d8c2SCharles.Forsyth */
33374a4d8c2SCharles.Forsyth 
334*45a20ab7Sforsyth 	"SQRTF",	LTYPEI, ASQRTF,
335*45a20ab7Sforsyth 	"SQRTD",	LTYPEI, ASQRTD,
33674a4d8c2SCharles.Forsyth 	"CMPF",		LTYPEL, ACMPF,
33774a4d8c2SCharles.Forsyth 	"CMPD",		LTYPEL, ACMPD,
33874a4d8c2SCharles.Forsyth 	"ADDF",		LTYPEK,	AADDF,
33974a4d8c2SCharles.Forsyth 	"ADDD",		LTYPEK,	AADDD,
34074a4d8c2SCharles.Forsyth 	"SUBF",		LTYPEK,	ASUBF,
34174a4d8c2SCharles.Forsyth 	"SUBD",		LTYPEK,	ASUBD,
34274a4d8c2SCharles.Forsyth 	"MULF",		LTYPEK,	AMULF,
34374a4d8c2SCharles.Forsyth 	"MULD",		LTYPEK,	AMULD,
34474a4d8c2SCharles.Forsyth 	"DIVF",		LTYPEK,	ADIVF,
34574a4d8c2SCharles.Forsyth 	"DIVD",		LTYPEK,	ADIVD,
34674a4d8c2SCharles.Forsyth 
34774a4d8c2SCharles.Forsyth 	"B",		LTYPE4, AB,
34874a4d8c2SCharles.Forsyth 	"BL",		LTYPE4, ABL,
34974a4d8c2SCharles.Forsyth 	"BX",		LTYPEBX,	ABX,
35074a4d8c2SCharles.Forsyth 
35174a4d8c2SCharles.Forsyth 	"BEQ",		LTYPE5,	ABEQ,
35274a4d8c2SCharles.Forsyth 	"BNE",		LTYPE5,	ABNE,
35374a4d8c2SCharles.Forsyth 	"BCS",		LTYPE5,	ABCS,
35474a4d8c2SCharles.Forsyth 	"BHS",		LTYPE5,	ABHS,
35574a4d8c2SCharles.Forsyth 	"BCC",		LTYPE5,	ABCC,
35674a4d8c2SCharles.Forsyth 	"BLO",		LTYPE5,	ABLO,
35774a4d8c2SCharles.Forsyth 	"BMI",		LTYPE5,	ABMI,
35874a4d8c2SCharles.Forsyth 	"BPL",		LTYPE5,	ABPL,
35974a4d8c2SCharles.Forsyth 	"BVS",		LTYPE5,	ABVS,
36074a4d8c2SCharles.Forsyth 	"BVC",		LTYPE5,	ABVC,
36174a4d8c2SCharles.Forsyth 	"BHI",		LTYPE5,	ABHI,
36274a4d8c2SCharles.Forsyth 	"BLS",		LTYPE5,	ABLS,
36374a4d8c2SCharles.Forsyth 	"BGE",		LTYPE5,	ABGE,
36474a4d8c2SCharles.Forsyth 	"BLT",		LTYPE5,	ABLT,
36574a4d8c2SCharles.Forsyth 	"BGT",		LTYPE5,	ABGT,
36674a4d8c2SCharles.Forsyth 	"BLE",		LTYPE5,	ABLE,
36774a4d8c2SCharles.Forsyth 	"BCASE",	LTYPE5,	ABCASE,
36874a4d8c2SCharles.Forsyth 
36974a4d8c2SCharles.Forsyth 	"SWI",		LTYPE6, ASWI,
37074a4d8c2SCharles.Forsyth 
37174a4d8c2SCharles.Forsyth 	"CMP",		LTYPE7,	ACMP,
37274a4d8c2SCharles.Forsyth 	"TST",		LTYPE7,	ATST,
37374a4d8c2SCharles.Forsyth 	"TEQ",		LTYPE7,	ATEQ,
37474a4d8c2SCharles.Forsyth 	"CMN",		LTYPE7,	ACMN,
37574a4d8c2SCharles.Forsyth 
37674a4d8c2SCharles.Forsyth 	"MOVM",		LTYPE8, AMOVM,
37774a4d8c2SCharles.Forsyth 
37874a4d8c2SCharles.Forsyth 	"SWPBU",	LTYPE9, ASWPBU,
37974a4d8c2SCharles.Forsyth 	"SWPW",		LTYPE9, ASWPW,
38074a4d8c2SCharles.Forsyth 
38174a4d8c2SCharles.Forsyth 	"RET",		LTYPEA, ARET,
38274a4d8c2SCharles.Forsyth 	"RFE",		LTYPEA, ARFE,
38374a4d8c2SCharles.Forsyth 
38474a4d8c2SCharles.Forsyth 	"TEXT",		LTYPEB, ATEXT,
38574a4d8c2SCharles.Forsyth 	"GLOBL",	LTYPEB, AGLOBL,
38674a4d8c2SCharles.Forsyth 	"DATA",		LTYPEC, ADATA,
38774a4d8c2SCharles.Forsyth 	"CASE",		LTYPED, ACASE,
38874a4d8c2SCharles.Forsyth 	"END",		LTYPEE, AEND,
38974a4d8c2SCharles.Forsyth 	"WORD",		LTYPEH, AWORD,
39074a4d8c2SCharles.Forsyth 	"NOP",		LTYPEI, ANOP,
39174a4d8c2SCharles.Forsyth 
39274a4d8c2SCharles.Forsyth 	"MCR",		LTYPEJ, 0,
39374a4d8c2SCharles.Forsyth 	"MRC",		LTYPEJ, 1,
39474a4d8c2SCharles.Forsyth 	0
39574a4d8c2SCharles.Forsyth };
39674a4d8c2SCharles.Forsyth 
39774a4d8c2SCharles.Forsyth void
cinit(void)39874a4d8c2SCharles.Forsyth cinit(void)
39974a4d8c2SCharles.Forsyth {
40074a4d8c2SCharles.Forsyth 	Sym *s;
40174a4d8c2SCharles.Forsyth 	int i;
40274a4d8c2SCharles.Forsyth 
40374a4d8c2SCharles.Forsyth 	nullgen.sym = S;
40474a4d8c2SCharles.Forsyth 	nullgen.offset = 0;
40574a4d8c2SCharles.Forsyth 	nullgen.type = D_NONE;
40674a4d8c2SCharles.Forsyth 	nullgen.name = D_NONE;
40774a4d8c2SCharles.Forsyth 	nullgen.reg = NREG;
40874a4d8c2SCharles.Forsyth 	if(FPCHIP)
40974a4d8c2SCharles.Forsyth 		nullgen.dval = 0;
41074a4d8c2SCharles.Forsyth 	for(i=0; i<sizeof(nullgen.sval); i++)
41174a4d8c2SCharles.Forsyth 		nullgen.sval[i] = 0;
41274a4d8c2SCharles.Forsyth 
41374a4d8c2SCharles.Forsyth 	nerrors = 0;
41474a4d8c2SCharles.Forsyth 	iostack = I;
41574a4d8c2SCharles.Forsyth 	iofree = I;
41674a4d8c2SCharles.Forsyth 	peekc = IGN;
41774a4d8c2SCharles.Forsyth 	nhunk = 0;
41874a4d8c2SCharles.Forsyth 	for(i=0; i<NHASH; i++)
41974a4d8c2SCharles.Forsyth 		hash[i] = S;
42074a4d8c2SCharles.Forsyth 	for(i=0; itab[i].name; i++) {
42174a4d8c2SCharles.Forsyth 		s = slookup(itab[i].name);
42274a4d8c2SCharles.Forsyth 		s->type = itab[i].type;
42374a4d8c2SCharles.Forsyth 		s->value = itab[i].value;
42474a4d8c2SCharles.Forsyth 	}
42574a4d8c2SCharles.Forsyth 
42674a4d8c2SCharles.Forsyth 	pathname = allocn(pathname, 0, 100);
427*45a20ab7Sforsyth 	if(getwd(pathname, 99) == 0) {
42874a4d8c2SCharles.Forsyth 		pathname = allocn(pathname, 100, 900);
429*45a20ab7Sforsyth 		if(getwd(pathname, 999) == 0)
430*45a20ab7Sforsyth 			strcpy(pathname, "/?");
43174a4d8c2SCharles.Forsyth 	}
43274a4d8c2SCharles.Forsyth }
43374a4d8c2SCharles.Forsyth 
43474a4d8c2SCharles.Forsyth void
syminit(Sym * s)43574a4d8c2SCharles.Forsyth syminit(Sym *s)
43674a4d8c2SCharles.Forsyth {
43774a4d8c2SCharles.Forsyth 
43874a4d8c2SCharles.Forsyth 	s->type = LNAME;
43974a4d8c2SCharles.Forsyth 	s->value = 0;
44074a4d8c2SCharles.Forsyth }
44174a4d8c2SCharles.Forsyth 
44274a4d8c2SCharles.Forsyth int
isreg(Gen * g)44374a4d8c2SCharles.Forsyth isreg(Gen *g)
44474a4d8c2SCharles.Forsyth {
44574a4d8c2SCharles.Forsyth 
44674a4d8c2SCharles.Forsyth 	USED(g);
44774a4d8c2SCharles.Forsyth 	return 1;
44874a4d8c2SCharles.Forsyth }
44974a4d8c2SCharles.Forsyth 
45074a4d8c2SCharles.Forsyth void
cclean(void)45174a4d8c2SCharles.Forsyth cclean(void)
45274a4d8c2SCharles.Forsyth {
45374a4d8c2SCharles.Forsyth 
45474a4d8c2SCharles.Forsyth 	outcode(AEND, Always, &nullgen, NREG, &nullgen);
45574a4d8c2SCharles.Forsyth 	Bflush(&obuf);
45674a4d8c2SCharles.Forsyth }
45774a4d8c2SCharles.Forsyth 
45874a4d8c2SCharles.Forsyth void
zname(char * n,int t,int s)45974a4d8c2SCharles.Forsyth zname(char *n, int t, int s)
46074a4d8c2SCharles.Forsyth {
46174a4d8c2SCharles.Forsyth 
46274a4d8c2SCharles.Forsyth 	Bputc(&obuf, ANAME);
46374a4d8c2SCharles.Forsyth 	Bputc(&obuf, t);	/* type */
46474a4d8c2SCharles.Forsyth 	Bputc(&obuf, s);	/* sym */
46574a4d8c2SCharles.Forsyth 	while(*n) {
46674a4d8c2SCharles.Forsyth 		Bputc(&obuf, *n);
46774a4d8c2SCharles.Forsyth 		n++;
46874a4d8c2SCharles.Forsyth 	}
46974a4d8c2SCharles.Forsyth 	Bputc(&obuf, 0);
47074a4d8c2SCharles.Forsyth }
47174a4d8c2SCharles.Forsyth 
47274a4d8c2SCharles.Forsyth void
zaddr(Gen * a,int s)47374a4d8c2SCharles.Forsyth zaddr(Gen *a, int s)
47474a4d8c2SCharles.Forsyth {
47574a4d8c2SCharles.Forsyth 	long l;
47674a4d8c2SCharles.Forsyth 	int i;
47774a4d8c2SCharles.Forsyth 	char *n;
47874a4d8c2SCharles.Forsyth 	Ieee e;
47974a4d8c2SCharles.Forsyth 
48074a4d8c2SCharles.Forsyth 	Bputc(&obuf, a->type);
48174a4d8c2SCharles.Forsyth 	Bputc(&obuf, a->reg);
48274a4d8c2SCharles.Forsyth 	Bputc(&obuf, s);
48374a4d8c2SCharles.Forsyth 	Bputc(&obuf, a->name);
48474a4d8c2SCharles.Forsyth 	switch(a->type) {
48574a4d8c2SCharles.Forsyth 	default:
48674a4d8c2SCharles.Forsyth 		print("unknown type %d\n", a->type);
48774a4d8c2SCharles.Forsyth 		exits("arg");
48874a4d8c2SCharles.Forsyth 
48974a4d8c2SCharles.Forsyth 	case D_NONE:
49074a4d8c2SCharles.Forsyth 	case D_REG:
49174a4d8c2SCharles.Forsyth 	case D_FREG:
49274a4d8c2SCharles.Forsyth 	case D_PSR:
49374a4d8c2SCharles.Forsyth 	case D_FPCR:
49474a4d8c2SCharles.Forsyth 		break;
49574a4d8c2SCharles.Forsyth 
49674a4d8c2SCharles.Forsyth 	case D_REGREG:
49774a4d8c2SCharles.Forsyth 		Bputc(&obuf, a->offset);
49874a4d8c2SCharles.Forsyth 		break;
49974a4d8c2SCharles.Forsyth 
50074a4d8c2SCharles.Forsyth 	case D_OREG:
50174a4d8c2SCharles.Forsyth 	case D_CONST:
50274a4d8c2SCharles.Forsyth 	case D_BRANCH:
50374a4d8c2SCharles.Forsyth 	case D_SHIFT:
50474a4d8c2SCharles.Forsyth 		l = a->offset;
50574a4d8c2SCharles.Forsyth 		Bputc(&obuf, l);
50674a4d8c2SCharles.Forsyth 		Bputc(&obuf, l>>8);
50774a4d8c2SCharles.Forsyth 		Bputc(&obuf, l>>16);
50874a4d8c2SCharles.Forsyth 		Bputc(&obuf, l>>24);
50974a4d8c2SCharles.Forsyth 		break;
51074a4d8c2SCharles.Forsyth 
51174a4d8c2SCharles.Forsyth 	case D_SCONST:
51274a4d8c2SCharles.Forsyth 		n = a->sval;
51374a4d8c2SCharles.Forsyth 		for(i=0; i<NSNAME; i++) {
51474a4d8c2SCharles.Forsyth 			Bputc(&obuf, *n);
51574a4d8c2SCharles.Forsyth 			n++;
51674a4d8c2SCharles.Forsyth 		}
51774a4d8c2SCharles.Forsyth 		break;
51874a4d8c2SCharles.Forsyth 
51974a4d8c2SCharles.Forsyth 	case D_FCONST:
52074a4d8c2SCharles.Forsyth 		ieeedtod(&e, a->dval);
52174a4d8c2SCharles.Forsyth 		Bputc(&obuf, e.l);
52274a4d8c2SCharles.Forsyth 		Bputc(&obuf, e.l>>8);
52374a4d8c2SCharles.Forsyth 		Bputc(&obuf, e.l>>16);
52474a4d8c2SCharles.Forsyth 		Bputc(&obuf, e.l>>24);
52574a4d8c2SCharles.Forsyth 		Bputc(&obuf, e.h);
52674a4d8c2SCharles.Forsyth 		Bputc(&obuf, e.h>>8);
52774a4d8c2SCharles.Forsyth 		Bputc(&obuf, e.h>>16);
52874a4d8c2SCharles.Forsyth 		Bputc(&obuf, e.h>>24);
52974a4d8c2SCharles.Forsyth 		break;
53074a4d8c2SCharles.Forsyth 	}
53174a4d8c2SCharles.Forsyth }
53274a4d8c2SCharles.Forsyth 
53374a4d8c2SCharles.Forsyth static int bcode[] =
53474a4d8c2SCharles.Forsyth {
53574a4d8c2SCharles.Forsyth 	ABEQ,
53674a4d8c2SCharles.Forsyth 	ABNE,
53774a4d8c2SCharles.Forsyth 	ABCS,
53874a4d8c2SCharles.Forsyth 	ABCC,
53974a4d8c2SCharles.Forsyth 	ABMI,
54074a4d8c2SCharles.Forsyth 	ABPL,
54174a4d8c2SCharles.Forsyth 	ABVS,
54274a4d8c2SCharles.Forsyth 	ABVC,
54374a4d8c2SCharles.Forsyth 	ABHI,
54474a4d8c2SCharles.Forsyth 	ABLS,
54574a4d8c2SCharles.Forsyth 	ABGE,
54674a4d8c2SCharles.Forsyth 	ABLT,
54774a4d8c2SCharles.Forsyth 	ABGT,
54874a4d8c2SCharles.Forsyth 	ABLE,
54974a4d8c2SCharles.Forsyth 	AB,
55074a4d8c2SCharles.Forsyth 	ANOP,
55174a4d8c2SCharles.Forsyth };
55274a4d8c2SCharles.Forsyth 
55374a4d8c2SCharles.Forsyth void
outcode(int a,int scond,Gen * g1,int reg,Gen * g2)55474a4d8c2SCharles.Forsyth outcode(int a, int scond, Gen *g1, int reg, Gen *g2)
55574a4d8c2SCharles.Forsyth {
55674a4d8c2SCharles.Forsyth 	int sf, st, t;
55774a4d8c2SCharles.Forsyth 	Sym *s;
55874a4d8c2SCharles.Forsyth 
55974a4d8c2SCharles.Forsyth 	/* hack to make B.NE etc. work: turn it into the corresponding conditional */
56074a4d8c2SCharles.Forsyth 	if(a == AB){
56174a4d8c2SCharles.Forsyth 		a = bcode[scond&0xf];
56274a4d8c2SCharles.Forsyth 		scond = (scond & ~0xf) | Always;
56374a4d8c2SCharles.Forsyth 	}
56474a4d8c2SCharles.Forsyth 
56574a4d8c2SCharles.Forsyth 	if(pass == 1)
56674a4d8c2SCharles.Forsyth 		goto out;
56774a4d8c2SCharles.Forsyth jackpot:
56874a4d8c2SCharles.Forsyth 	sf = 0;
56974a4d8c2SCharles.Forsyth 	s = g1->sym;
57074a4d8c2SCharles.Forsyth 	while(s != S) {
57174a4d8c2SCharles.Forsyth 		sf = s->sym;
57274a4d8c2SCharles.Forsyth 		if(sf < 0 || sf >= NSYM)
57374a4d8c2SCharles.Forsyth 			sf = 0;
57474a4d8c2SCharles.Forsyth 		t = g1->name;
57574a4d8c2SCharles.Forsyth 		if(h[sf].type == t)
57674a4d8c2SCharles.Forsyth 		if(h[sf].sym == s)
57774a4d8c2SCharles.Forsyth 			break;
57874a4d8c2SCharles.Forsyth 		zname(s->name, t, sym);
57974a4d8c2SCharles.Forsyth 		s->sym = sym;
58074a4d8c2SCharles.Forsyth 		h[sym].sym = s;
58174a4d8c2SCharles.Forsyth 		h[sym].type = t;
58274a4d8c2SCharles.Forsyth 		sf = sym;
58374a4d8c2SCharles.Forsyth 		sym++;
58474a4d8c2SCharles.Forsyth 		if(sym >= NSYM)
58574a4d8c2SCharles.Forsyth 			sym = 1;
58674a4d8c2SCharles.Forsyth 		break;
58774a4d8c2SCharles.Forsyth 	}
58874a4d8c2SCharles.Forsyth 	st = 0;
58974a4d8c2SCharles.Forsyth 	s = g2->sym;
59074a4d8c2SCharles.Forsyth 	while(s != S) {
59174a4d8c2SCharles.Forsyth 		st = s->sym;
59274a4d8c2SCharles.Forsyth 		if(st < 0 || st >= NSYM)
59374a4d8c2SCharles.Forsyth 			st = 0;
59474a4d8c2SCharles.Forsyth 		t = g2->name;
59574a4d8c2SCharles.Forsyth 		if(h[st].type == t)
59674a4d8c2SCharles.Forsyth 		if(h[st].sym == s)
59774a4d8c2SCharles.Forsyth 			break;
59874a4d8c2SCharles.Forsyth 		zname(s->name, t, sym);
59974a4d8c2SCharles.Forsyth 		s->sym = sym;
60074a4d8c2SCharles.Forsyth 		h[sym].sym = s;
60174a4d8c2SCharles.Forsyth 		h[sym].type = t;
60274a4d8c2SCharles.Forsyth 		st = sym;
60374a4d8c2SCharles.Forsyth 		sym++;
60474a4d8c2SCharles.Forsyth 		if(sym >= NSYM)
60574a4d8c2SCharles.Forsyth 			sym = 1;
60674a4d8c2SCharles.Forsyth 		if(st == sf)
60774a4d8c2SCharles.Forsyth 			goto jackpot;
60874a4d8c2SCharles.Forsyth 		break;
60974a4d8c2SCharles.Forsyth 	}
61074a4d8c2SCharles.Forsyth 	Bputc(&obuf, a);
61174a4d8c2SCharles.Forsyth 	Bputc(&obuf, scond);
61274a4d8c2SCharles.Forsyth 	Bputc(&obuf, reg);
61374a4d8c2SCharles.Forsyth 	Bputc(&obuf, lineno);
61474a4d8c2SCharles.Forsyth 	Bputc(&obuf, lineno>>8);
61574a4d8c2SCharles.Forsyth 	Bputc(&obuf, lineno>>16);
61674a4d8c2SCharles.Forsyth 	Bputc(&obuf, lineno>>24);
61774a4d8c2SCharles.Forsyth 	zaddr(g1, sf);
61874a4d8c2SCharles.Forsyth 	zaddr(g2, st);
61974a4d8c2SCharles.Forsyth 
62074a4d8c2SCharles.Forsyth out:
62174a4d8c2SCharles.Forsyth 	if(a != AGLOBL && a != ADATA)
62274a4d8c2SCharles.Forsyth 		pc++;
62374a4d8c2SCharles.Forsyth }
62474a4d8c2SCharles.Forsyth 
62574a4d8c2SCharles.Forsyth void
outhist(void)62674a4d8c2SCharles.Forsyth outhist(void)
62774a4d8c2SCharles.Forsyth {
62874a4d8c2SCharles.Forsyth 	Gen g;
62974a4d8c2SCharles.Forsyth 	Hist *h;
63074a4d8c2SCharles.Forsyth 	char *p, *q, *op, c;
63174a4d8c2SCharles.Forsyth 	int n;
63274a4d8c2SCharles.Forsyth 
63374a4d8c2SCharles.Forsyth 	g = nullgen;
63474a4d8c2SCharles.Forsyth 	c = pathchar();
63574a4d8c2SCharles.Forsyth 	for(h = hist; h != H; h = h->link) {
63674a4d8c2SCharles.Forsyth 		p = h->name;
63774a4d8c2SCharles.Forsyth 		op = 0;
63874a4d8c2SCharles.Forsyth 		/* on windows skip drive specifier in pathname */
63974a4d8c2SCharles.Forsyth 		if(systemtype(Windows) && p && p[1] == ':'){
64074a4d8c2SCharles.Forsyth 			p += 2;
64174a4d8c2SCharles.Forsyth 			c = *p;
64274a4d8c2SCharles.Forsyth 		}
64374a4d8c2SCharles.Forsyth 		if(p && p[0] != c && h->offset == 0 && pathname){
64474a4d8c2SCharles.Forsyth 			/* on windows skip drive specifier in pathname */
64574a4d8c2SCharles.Forsyth 			if(systemtype(Windows) && pathname[1] == ':') {
64674a4d8c2SCharles.Forsyth 				op = p;
64774a4d8c2SCharles.Forsyth 				p = pathname+2;
64874a4d8c2SCharles.Forsyth 				c = *p;
64974a4d8c2SCharles.Forsyth 			} else if(pathname[0] == c){
65074a4d8c2SCharles.Forsyth 				op = p;
65174a4d8c2SCharles.Forsyth 				p = pathname;
65274a4d8c2SCharles.Forsyth 			}
65374a4d8c2SCharles.Forsyth 		}
65474a4d8c2SCharles.Forsyth 		while(p) {
65574a4d8c2SCharles.Forsyth 			q = strchr(p, c);
65674a4d8c2SCharles.Forsyth 			if(q) {
65774a4d8c2SCharles.Forsyth 				n = q-p;
65874a4d8c2SCharles.Forsyth 				if(n == 0){
65974a4d8c2SCharles.Forsyth 					n = 1;	/* leading "/" */
66074a4d8c2SCharles.Forsyth 					*p = '/';	/* don't emit "\" on windows */
66174a4d8c2SCharles.Forsyth 				}
66274a4d8c2SCharles.Forsyth 				q++;
66374a4d8c2SCharles.Forsyth 			} else {
66474a4d8c2SCharles.Forsyth 				n = strlen(p);
66574a4d8c2SCharles.Forsyth 				q = 0;
66674a4d8c2SCharles.Forsyth 			}
66774a4d8c2SCharles.Forsyth 			if(n) {
66874a4d8c2SCharles.Forsyth 				Bputc(&obuf, ANAME);
66974a4d8c2SCharles.Forsyth 				Bputc(&obuf, D_FILE);	/* type */
67074a4d8c2SCharles.Forsyth 				Bputc(&obuf, 1);	/* sym */
67174a4d8c2SCharles.Forsyth 				Bputc(&obuf, '<');
67274a4d8c2SCharles.Forsyth 				Bwrite(&obuf, p, n);
67374a4d8c2SCharles.Forsyth 				Bputc(&obuf, 0);
67474a4d8c2SCharles.Forsyth 			}
67574a4d8c2SCharles.Forsyth 			p = q;
67674a4d8c2SCharles.Forsyth 			if(p == 0 && op) {
67774a4d8c2SCharles.Forsyth 				p = op;
67874a4d8c2SCharles.Forsyth 				op = 0;
67974a4d8c2SCharles.Forsyth 			}
68074a4d8c2SCharles.Forsyth 		}
68174a4d8c2SCharles.Forsyth 		g.offset = h->offset;
68274a4d8c2SCharles.Forsyth 
68374a4d8c2SCharles.Forsyth 		Bputc(&obuf, AHISTORY);
68474a4d8c2SCharles.Forsyth 		Bputc(&obuf, Always);
68574a4d8c2SCharles.Forsyth 		Bputc(&obuf, 0);
68674a4d8c2SCharles.Forsyth 		Bputc(&obuf, h->line);
68774a4d8c2SCharles.Forsyth 		Bputc(&obuf, h->line>>8);
68874a4d8c2SCharles.Forsyth 		Bputc(&obuf, h->line>>16);
68974a4d8c2SCharles.Forsyth 		Bputc(&obuf, h->line>>24);
69074a4d8c2SCharles.Forsyth 		zaddr(&nullgen, 0);
69174a4d8c2SCharles.Forsyth 		zaddr(&g, 0);
69274a4d8c2SCharles.Forsyth 	}
69374a4d8c2SCharles.Forsyth }
69474a4d8c2SCharles.Forsyth 
69574a4d8c2SCharles.Forsyth #include "../cc/lexbody"
69674a4d8c2SCharles.Forsyth #include "../cc/macbody"
697