xref: /inferno-os/utils/va/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 = 'v';
1374a4d8c2SCharles.Forsyth 	thestring = "mips";
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;
39d67b7dadSforsyth 	case  'L':			/* for little-endian mips */
40d67b7dadSforsyth 		thechar = '0';
41d67b7dadSforsyth 		thestring = "spim";
42d67b7dadSforsyth 		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 	"HI",		LHI,	D_HI,
17274a4d8c2SCharles.Forsyth 	"LO",		LLO,	D_LO,
17374a4d8c2SCharles.Forsyth 
17474a4d8c2SCharles.Forsyth 	"R",		LR,	0,
17574a4d8c2SCharles.Forsyth 	"R0",		LREG,	0,
17674a4d8c2SCharles.Forsyth 	"R1",		LREG,	1,
17774a4d8c2SCharles.Forsyth 	"R2",		LREG,	2,
17874a4d8c2SCharles.Forsyth 	"R3",		LREG,	3,
17974a4d8c2SCharles.Forsyth 	"R4",		LREG,	4,
18074a4d8c2SCharles.Forsyth 	"R5",		LREG,	5,
18174a4d8c2SCharles.Forsyth 	"R6",		LREG,	6,
18274a4d8c2SCharles.Forsyth 	"R7",		LREG,	7,
18374a4d8c2SCharles.Forsyth 	"R8",		LREG,	8,
18474a4d8c2SCharles.Forsyth 	"R9",		LREG,	9,
18574a4d8c2SCharles.Forsyth 	"R10",		LREG,	10,
18674a4d8c2SCharles.Forsyth 	"R11",		LREG,	11,
18774a4d8c2SCharles.Forsyth 	"R12",		LREG,	12,
18874a4d8c2SCharles.Forsyth 	"R13",		LREG,	13,
18974a4d8c2SCharles.Forsyth 	"R14",		LREG,	14,
19074a4d8c2SCharles.Forsyth 	"R15",		LREG,	15,
19174a4d8c2SCharles.Forsyth 	"R16",		LREG,	16,
19274a4d8c2SCharles.Forsyth 	"R17",		LREG,	17,
19374a4d8c2SCharles.Forsyth 	"R18",		LREG,	18,
19474a4d8c2SCharles.Forsyth 	"R19",		LREG,	19,
19574a4d8c2SCharles.Forsyth 	"R20",		LREG,	20,
19674a4d8c2SCharles.Forsyth 	"R21",		LREG,	21,
19774a4d8c2SCharles.Forsyth 	"R22",		LREG,	22,
19874a4d8c2SCharles.Forsyth 	"R23",		LREG,	23,
19974a4d8c2SCharles.Forsyth 	"R24",		LREG,	24,
20074a4d8c2SCharles.Forsyth 	"R25",		LREG,	25,
20174a4d8c2SCharles.Forsyth 	"R26",		LREG,	26,
20274a4d8c2SCharles.Forsyth 	"R27",		LREG,	27,
20374a4d8c2SCharles.Forsyth 	"R28",		LREG,	28,
20474a4d8c2SCharles.Forsyth 	"R29",		LREG,	29,
20574a4d8c2SCharles.Forsyth 	"R30",		LREG,	30,
20674a4d8c2SCharles.Forsyth 	"R31",		LREG,	31,
20774a4d8c2SCharles.Forsyth 
20874a4d8c2SCharles.Forsyth 	"M",		LM,	0,
20974a4d8c2SCharles.Forsyth 	"M0",		LMREG,	0,
21074a4d8c2SCharles.Forsyth 	"M1",		LMREG,	1,
21174a4d8c2SCharles.Forsyth 	"M2",		LMREG,	2,
21274a4d8c2SCharles.Forsyth 	"M3",		LMREG,	3,
21374a4d8c2SCharles.Forsyth 	"M4",		LMREG,	4,
21474a4d8c2SCharles.Forsyth 	"M5",		LMREG,	5,
21574a4d8c2SCharles.Forsyth 	"M6",		LMREG,	6,
21674a4d8c2SCharles.Forsyth 	"M7",		LMREG,	7,
21774a4d8c2SCharles.Forsyth 	"M8",		LMREG,	8,
21874a4d8c2SCharles.Forsyth 	"M9",		LMREG,	9,
21974a4d8c2SCharles.Forsyth 	"M10",		LMREG,	10,
22074a4d8c2SCharles.Forsyth 	"M11",		LMREG,	11,
22174a4d8c2SCharles.Forsyth 	"M12",		LMREG,	12,
22274a4d8c2SCharles.Forsyth 	"M13",		LMREG,	13,
22374a4d8c2SCharles.Forsyth 	"M14",		LMREG,	14,
22474a4d8c2SCharles.Forsyth 	"M15",		LMREG,	15,
22574a4d8c2SCharles.Forsyth 	"M16",		LMREG,	16,
22674a4d8c2SCharles.Forsyth 	"M17",		LMREG,	17,
22774a4d8c2SCharles.Forsyth 	"M18",		LMREG,	18,
22874a4d8c2SCharles.Forsyth 	"M19",		LMREG,	19,
22974a4d8c2SCharles.Forsyth 	"M20",		LMREG,	20,
23074a4d8c2SCharles.Forsyth 	"M21",		LMREG,	21,
23174a4d8c2SCharles.Forsyth 	"M22",		LMREG,	22,
23274a4d8c2SCharles.Forsyth 	"M23",		LMREG,	23,
23374a4d8c2SCharles.Forsyth 	"M24",		LMREG,	24,
23474a4d8c2SCharles.Forsyth 	"M25",		LMREG,	25,
23574a4d8c2SCharles.Forsyth 	"M26",		LMREG,	26,
23674a4d8c2SCharles.Forsyth 	"M27",		LMREG,	27,
23774a4d8c2SCharles.Forsyth 	"M28",		LMREG,	28,
23874a4d8c2SCharles.Forsyth 	"M29",		LMREG,	29,
23974a4d8c2SCharles.Forsyth 	"M30",		LMREG,	30,
24074a4d8c2SCharles.Forsyth 	"M31",		LMREG,	31,
24174a4d8c2SCharles.Forsyth 
24274a4d8c2SCharles.Forsyth 	"F",		LF,	0,
24374a4d8c2SCharles.Forsyth 
24474a4d8c2SCharles.Forsyth 	"F0",		LFREG,	0,
24574a4d8c2SCharles.Forsyth 	"F1",		LFREG,	1,
24674a4d8c2SCharles.Forsyth 	"F2",		LFREG,	2,
24774a4d8c2SCharles.Forsyth 	"F3",		LFREG,	3,
24874a4d8c2SCharles.Forsyth 	"F4",		LFREG,	4,
24974a4d8c2SCharles.Forsyth 	"F5",		LFREG,	5,
25074a4d8c2SCharles.Forsyth 	"F6",		LFREG,	6,
25174a4d8c2SCharles.Forsyth 	"F7",		LFREG,	7,
25274a4d8c2SCharles.Forsyth 	"F8",		LFREG,	8,
25374a4d8c2SCharles.Forsyth 	"F9",		LFREG,	9,
25474a4d8c2SCharles.Forsyth 	"F10",		LFREG,	10,
25574a4d8c2SCharles.Forsyth 	"F11",		LFREG,	11,
25674a4d8c2SCharles.Forsyth 	"F12",		LFREG,	12,
25774a4d8c2SCharles.Forsyth 	"F13",		LFREG,	13,
25874a4d8c2SCharles.Forsyth 	"F14",		LFREG,	14,
25974a4d8c2SCharles.Forsyth 	"F15",		LFREG,	15,
26074a4d8c2SCharles.Forsyth 	"F16",		LFREG,	16,
26174a4d8c2SCharles.Forsyth 	"F17",		LFREG,	17,
26274a4d8c2SCharles.Forsyth 	"F18",		LFREG,	18,
26374a4d8c2SCharles.Forsyth 	"F19",		LFREG,	19,
26474a4d8c2SCharles.Forsyth 	"F20",		LFREG,	20,
26574a4d8c2SCharles.Forsyth 	"F21",		LFREG,	21,
26674a4d8c2SCharles.Forsyth 	"F22",		LFREG,	22,
26774a4d8c2SCharles.Forsyth 	"F23",		LFREG,	23,
26874a4d8c2SCharles.Forsyth 	"F24",		LFREG,	24,
26974a4d8c2SCharles.Forsyth 	"F25",		LFREG,	25,
27074a4d8c2SCharles.Forsyth 	"F26",		LFREG,	26,
27174a4d8c2SCharles.Forsyth 	"F27",		LFREG,	27,
27274a4d8c2SCharles.Forsyth 	"F28",		LFREG,	28,
27374a4d8c2SCharles.Forsyth 	"F29",		LFREG,	29,
27474a4d8c2SCharles.Forsyth 	"F30",		LFREG,	30,
27574a4d8c2SCharles.Forsyth 	"F31",		LFREG,	31,
27674a4d8c2SCharles.Forsyth 
27774a4d8c2SCharles.Forsyth 	"FCR",		LFCR,	0,
27874a4d8c2SCharles.Forsyth 	"FCR0",		LFCREG,	0,
27974a4d8c2SCharles.Forsyth 	"FCR1",		LFCREG,	1,
28074a4d8c2SCharles.Forsyth 	"FCR2",		LFCREG,	2,
28174a4d8c2SCharles.Forsyth 	"FCR3",		LFCREG,	3,
28274a4d8c2SCharles.Forsyth 	"FCR4",		LFCREG,	4,
28374a4d8c2SCharles.Forsyth 	"FCR5",		LFCREG,	5,
28474a4d8c2SCharles.Forsyth 	"FCR6",		LFCREG,	6,
28574a4d8c2SCharles.Forsyth 	"FCR7",		LFCREG,	7,
28674a4d8c2SCharles.Forsyth 	"FCR8",		LFCREG,	8,
28774a4d8c2SCharles.Forsyth 	"FCR9",		LFCREG,	9,
28874a4d8c2SCharles.Forsyth 	"FCR10",	LFCREG,	10,
28974a4d8c2SCharles.Forsyth 	"FCR11",	LFCREG,	11,
29074a4d8c2SCharles.Forsyth 	"FCR12",	LFCREG,	12,
29174a4d8c2SCharles.Forsyth 	"FCR13",	LFCREG,	13,
29274a4d8c2SCharles.Forsyth 	"FCR14",	LFCREG,	14,
29374a4d8c2SCharles.Forsyth 	"FCR15",	LFCREG,	15,
29474a4d8c2SCharles.Forsyth 	"FCR16",	LFCREG,	16,
29574a4d8c2SCharles.Forsyth 	"FCR17",	LFCREG,	17,
29674a4d8c2SCharles.Forsyth 	"FCR18",	LFCREG,	18,
29774a4d8c2SCharles.Forsyth 	"FCR19",	LFCREG,	19,
29874a4d8c2SCharles.Forsyth 	"FCR20",	LFCREG,	20,
29974a4d8c2SCharles.Forsyth 	"FCR21",	LFCREG,	21,
30074a4d8c2SCharles.Forsyth 	"FCR22",	LFCREG,	22,
30174a4d8c2SCharles.Forsyth 	"FCR23",	LFCREG,	23,
30274a4d8c2SCharles.Forsyth 	"FCR24",	LFCREG,	24,
30374a4d8c2SCharles.Forsyth 	"FCR25",	LFCREG,	25,
30474a4d8c2SCharles.Forsyth 	"FCR26",	LFCREG,	26,
30574a4d8c2SCharles.Forsyth 	"FCR27",	LFCREG,	27,
30674a4d8c2SCharles.Forsyth 	"FCR28",	LFCREG,	28,
30774a4d8c2SCharles.Forsyth 	"FCR29",	LFCREG,	29,
30874a4d8c2SCharles.Forsyth 	"FCR30",	LFCREG,	30,
30974a4d8c2SCharles.Forsyth 	"FCR31",	LFCREG,	31,
31074a4d8c2SCharles.Forsyth 
31174a4d8c2SCharles.Forsyth 	"ADD",		LTYPE1, AADD,
31274a4d8c2SCharles.Forsyth 	"ADDU",		LTYPE1, AADDU,
31374a4d8c2SCharles.Forsyth 	"SUB",		LTYPE1, ASUB,	/* converted to ADD(-) in loader */
31474a4d8c2SCharles.Forsyth 	"SUBU",		LTYPE1, ASUBU,
31574a4d8c2SCharles.Forsyth 	"SGT",		LTYPE1, ASGT,
31674a4d8c2SCharles.Forsyth 	"SGTU",		LTYPE1, ASGTU,
31774a4d8c2SCharles.Forsyth 	"AND",		LTYPE1, AAND,
31874a4d8c2SCharles.Forsyth 	"OR",		LTYPE1, AOR,
31974a4d8c2SCharles.Forsyth 	"XOR",		LTYPE1, AXOR,
32074a4d8c2SCharles.Forsyth 	"SLL",		LTYPE1, ASLL,
32174a4d8c2SCharles.Forsyth 	"SRL",		LTYPE1, ASRL,
32274a4d8c2SCharles.Forsyth 	"SRA",		LTYPE1, ASRA,
32374a4d8c2SCharles.Forsyth 
32474a4d8c2SCharles.Forsyth 	"ADDV",		LTYPE1, AADDV,
32574a4d8c2SCharles.Forsyth 	"ADDVU",		LTYPE1, AADDVU,
32674a4d8c2SCharles.Forsyth 	"SUBV",		LTYPE1, ASUBV,	/* converted to ADD(-) in loader */
32774a4d8c2SCharles.Forsyth 	"SUBVU",		LTYPE1, ASUBVU,
32874a4d8c2SCharles.Forsyth 	"SLLV",		LTYPE1, ASLLV,
32974a4d8c2SCharles.Forsyth 	"SRLV",		LTYPE1, ASRLV,
33074a4d8c2SCharles.Forsyth 	"SRAV",		LTYPE1, ASRAV,
33174a4d8c2SCharles.Forsyth 
33274a4d8c2SCharles.Forsyth 	"NOR",		LTYPE2, ANOR,
33374a4d8c2SCharles.Forsyth 
33474a4d8c2SCharles.Forsyth 	"MOVB",		LTYPE3, AMOVB,
33574a4d8c2SCharles.Forsyth 	"MOVBU",	LTYPE3, AMOVBU,
33674a4d8c2SCharles.Forsyth 	"MOVH",		LTYPE3, AMOVH,
33774a4d8c2SCharles.Forsyth 	"MOVHU",	LTYPE3, AMOVHU,
33874a4d8c2SCharles.Forsyth 	"MOVWL",	LTYPE3, AMOVWL,
33974a4d8c2SCharles.Forsyth 	"MOVWR",	LTYPE3, AMOVWR,
34074a4d8c2SCharles.Forsyth 	"MOVVL",	LTYPE3, AMOVVL,
34174a4d8c2SCharles.Forsyth 	"MOVVR",	LTYPE3, AMOVVR,
34274a4d8c2SCharles.Forsyth 
34374a4d8c2SCharles.Forsyth 	"BREAK",	LTYPEJ, ABREAK,		/* overloaded CACHE opcode */
34474a4d8c2SCharles.Forsyth 	"END",		LTYPE4, AEND,
34574a4d8c2SCharles.Forsyth 	"REM",		LTYPE6, AREM,
34674a4d8c2SCharles.Forsyth 	"REMU",		LTYPE6, AREMU,
34774a4d8c2SCharles.Forsyth 	"RET",		LTYPE4, ARET,
34874a4d8c2SCharles.Forsyth 	"SYSCALL",	LTYPE4, ASYSCALL,
34974a4d8c2SCharles.Forsyth 	"TLBP",		LTYPE4, ATLBP,
35074a4d8c2SCharles.Forsyth 	"TLBR",		LTYPE4, ATLBR,
35174a4d8c2SCharles.Forsyth 	"TLBWI",	LTYPE4, ATLBWI,
35274a4d8c2SCharles.Forsyth 	"TLBWR",	LTYPE4, ATLBWR,
35374a4d8c2SCharles.Forsyth 
35474a4d8c2SCharles.Forsyth 	"MOVW",		LTYPE5, AMOVW,
35574a4d8c2SCharles.Forsyth 	"MOVV",		LTYPE5, AMOVV,
35674a4d8c2SCharles.Forsyth 	"MOVD",		LTYPE5, AMOVD,
35774a4d8c2SCharles.Forsyth 	"MOVF",		LTYPE5, AMOVF,
35874a4d8c2SCharles.Forsyth 
35974a4d8c2SCharles.Forsyth 	"DIV",		LTYPE6, ADIV,
36074a4d8c2SCharles.Forsyth 	"DIVU",		LTYPE6, ADIVU,
36174a4d8c2SCharles.Forsyth 	"MUL",		LTYPE6, AMUL,
36274a4d8c2SCharles.Forsyth 	"MULU",		LTYPE6, AMULU,
36374a4d8c2SCharles.Forsyth 	"DIVV",		LTYPE6, ADIVV,
36474a4d8c2SCharles.Forsyth 	"DIVVU",		LTYPE6, ADIVVU,
36574a4d8c2SCharles.Forsyth 	"MULV",		LTYPE6, AMULV,
36674a4d8c2SCharles.Forsyth 	"MULVU",		LTYPE6, AMULVU,
36774a4d8c2SCharles.Forsyth 
36874a4d8c2SCharles.Forsyth 	"RFE",		LTYPE7, ARFE,
36974a4d8c2SCharles.Forsyth 	"JMP",		LTYPE7, AJMP,
37074a4d8c2SCharles.Forsyth 
37174a4d8c2SCharles.Forsyth 	"JAL",		LTYPE8, AJAL,
37274a4d8c2SCharles.Forsyth 
37374a4d8c2SCharles.Forsyth 	"BEQ",		LTYPE9, ABEQ,
37474a4d8c2SCharles.Forsyth 	"BNE",		LTYPE9, ABNE,
37574a4d8c2SCharles.Forsyth 
37674a4d8c2SCharles.Forsyth 	"BGEZ",		LTYPEA, ABGEZ,
37774a4d8c2SCharles.Forsyth 	"BGEZAL",	LTYPEA, ABGEZAL,
37874a4d8c2SCharles.Forsyth 	"BGTZ",		LTYPEA, ABGTZ,
37974a4d8c2SCharles.Forsyth 	"BLEZ",		LTYPEA, ABLEZ,
38074a4d8c2SCharles.Forsyth 	"BLTZ",		LTYPEA, ABLTZ,
38174a4d8c2SCharles.Forsyth 	"BLTZAL",	LTYPEA, ABLTZAL,
38274a4d8c2SCharles.Forsyth 
38374a4d8c2SCharles.Forsyth 	"TEXT",		LTYPEB, ATEXT,
38474a4d8c2SCharles.Forsyth 	"GLOBL",	LTYPEB, AGLOBL,
38574a4d8c2SCharles.Forsyth 
38674a4d8c2SCharles.Forsyth 	"DATA",		LTYPEC, ADATA,
38774a4d8c2SCharles.Forsyth 
38874a4d8c2SCharles.Forsyth 	"MOVDF",	LTYPE5, AMOVDF,
38974a4d8c2SCharles.Forsyth 	"MOVDW",	LTYPE5, AMOVDW,
39074a4d8c2SCharles.Forsyth 	"MOVFD",	LTYPE5, AMOVFD,
39174a4d8c2SCharles.Forsyth 	"MOVFW",	LTYPE5, AMOVFW,
39274a4d8c2SCharles.Forsyth 	"MOVWD",	LTYPE5, AMOVWD,
39374a4d8c2SCharles.Forsyth 	"MOVWF",	LTYPE5, AMOVWF,
39474a4d8c2SCharles.Forsyth 
39574a4d8c2SCharles.Forsyth 	"ABSD",		LTYPED, AABSD,
39674a4d8c2SCharles.Forsyth 	"ABSF",		LTYPED, AABSF,
39774a4d8c2SCharles.Forsyth 	"ABSW",		LTYPED, AABSW,
39874a4d8c2SCharles.Forsyth 	"NEGD",		LTYPED, ANEGD,
39974a4d8c2SCharles.Forsyth 	"NEGF",		LTYPED, ANEGF,
40074a4d8c2SCharles.Forsyth 	"NEGW",		LTYPED, ANEGW,
40174a4d8c2SCharles.Forsyth 
40274a4d8c2SCharles.Forsyth 	"CMPEQD",	LTYPEF, ACMPEQD,
40374a4d8c2SCharles.Forsyth 	"CMPEQF",	LTYPEF, ACMPEQF,
40474a4d8c2SCharles.Forsyth 	"CMPGED",	LTYPEF, ACMPGED,
40574a4d8c2SCharles.Forsyth 	"CMPGEF",	LTYPEF, ACMPGEF,
40674a4d8c2SCharles.Forsyth 	"CMPGTD",	LTYPEF, ACMPGTD,
40774a4d8c2SCharles.Forsyth 	"CMPGTF",	LTYPEF, ACMPGTF,
40874a4d8c2SCharles.Forsyth 
40974a4d8c2SCharles.Forsyth 	"ADDD",		LTYPEE, AADDD,
41074a4d8c2SCharles.Forsyth 	"ADDF",		LTYPEE, AADDF,
41174a4d8c2SCharles.Forsyth 	"ADDW",		LTYPEE, AADDW,
41274a4d8c2SCharles.Forsyth 	"DIVD",		LTYPEE, ADIVD,
41374a4d8c2SCharles.Forsyth 	"DIVF",		LTYPEE, ADIVF,
41474a4d8c2SCharles.Forsyth 	"DIVW",		LTYPEE, ADIVW,
41574a4d8c2SCharles.Forsyth 	"MULD",		LTYPEE, AMULD,
41674a4d8c2SCharles.Forsyth 	"MULF",		LTYPEE, AMULF,
41774a4d8c2SCharles.Forsyth 	"MULW",		LTYPEE, AMULW,
41874a4d8c2SCharles.Forsyth 	"SUBD",		LTYPEE, ASUBD,
41974a4d8c2SCharles.Forsyth 	"SUBF",		LTYPEE, ASUBF,
42074a4d8c2SCharles.Forsyth 	"SUBW",		LTYPEE, ASUBW,
42174a4d8c2SCharles.Forsyth 
42274a4d8c2SCharles.Forsyth 	"BFPT",		LTYPEG, ABFPT,
42374a4d8c2SCharles.Forsyth 	"BFPF",		LTYPEG, ABFPF,
42474a4d8c2SCharles.Forsyth 
42574a4d8c2SCharles.Forsyth 	"WORD",		LTYPEH, AWORD,
42674a4d8c2SCharles.Forsyth 	"NOP",		LTYPEI, ANOP,
42774a4d8c2SCharles.Forsyth 	"SCHED",	LSCHED, 0,
42874a4d8c2SCharles.Forsyth 	"NOSCHED",	LSCHED, 0x80,
42974a4d8c2SCharles.Forsyth 	0
43074a4d8c2SCharles.Forsyth };
43174a4d8c2SCharles.Forsyth 
43274a4d8c2SCharles.Forsyth void
cinit(void)43374a4d8c2SCharles.Forsyth cinit(void)
43474a4d8c2SCharles.Forsyth {
43574a4d8c2SCharles.Forsyth 	Sym *s;
43674a4d8c2SCharles.Forsyth 	int i;
43774a4d8c2SCharles.Forsyth 
43874a4d8c2SCharles.Forsyth 	nullgen.sym = S;
43974a4d8c2SCharles.Forsyth 	nullgen.offset = 0;
44074a4d8c2SCharles.Forsyth 	nullgen.type = D_NONE;
44174a4d8c2SCharles.Forsyth 	nullgen.name = D_NONE;
44274a4d8c2SCharles.Forsyth 	nullgen.reg = NREG;
44374a4d8c2SCharles.Forsyth 	if(FPCHIP)
44474a4d8c2SCharles.Forsyth 		nullgen.dval = 0;
44574a4d8c2SCharles.Forsyth 	for(i=0; i<sizeof(nullgen.sval); i++)
44674a4d8c2SCharles.Forsyth 		nullgen.sval[i] = 0;
44774a4d8c2SCharles.Forsyth 
44874a4d8c2SCharles.Forsyth 	nerrors = 0;
44974a4d8c2SCharles.Forsyth 	iostack = I;
45074a4d8c2SCharles.Forsyth 	iofree = I;
45174a4d8c2SCharles.Forsyth 	peekc = IGN;
45274a4d8c2SCharles.Forsyth 	nhunk = 0;
45374a4d8c2SCharles.Forsyth 	for(i=0; i<NHASH; i++)
45474a4d8c2SCharles.Forsyth 		hash[i] = S;
45574a4d8c2SCharles.Forsyth 	for(i=0; itab[i].name; i++) {
45674a4d8c2SCharles.Forsyth 		s = slookup(itab[i].name);
45774a4d8c2SCharles.Forsyth 		s->type = itab[i].type;
45874a4d8c2SCharles.Forsyth 		s->value = itab[i].value;
45974a4d8c2SCharles.Forsyth 	}
46074a4d8c2SCharles.Forsyth 
46174a4d8c2SCharles.Forsyth 	pathname = allocn(pathname, 0, 100);
46274a4d8c2SCharles.Forsyth 	if(mygetwd(pathname, 99) == 0) {
46374a4d8c2SCharles.Forsyth 		pathname = allocn(pathname, 100, 900);
46474a4d8c2SCharles.Forsyth 		if(mygetwd(pathname, 999) == 0)
465*45a20ab7Sforsyth 			strcpy(pathname, "/?");
46674a4d8c2SCharles.Forsyth 	}
46774a4d8c2SCharles.Forsyth }
46874a4d8c2SCharles.Forsyth 
46974a4d8c2SCharles.Forsyth void
syminit(Sym * s)47074a4d8c2SCharles.Forsyth syminit(Sym *s)
47174a4d8c2SCharles.Forsyth {
47274a4d8c2SCharles.Forsyth 
47374a4d8c2SCharles.Forsyth 	s->type = LNAME;
47474a4d8c2SCharles.Forsyth 	s->value = 0;
47574a4d8c2SCharles.Forsyth }
47674a4d8c2SCharles.Forsyth 
47774a4d8c2SCharles.Forsyth int
isreg(Gen * g)47874a4d8c2SCharles.Forsyth isreg(Gen *g)
47974a4d8c2SCharles.Forsyth {
48074a4d8c2SCharles.Forsyth 
48174a4d8c2SCharles.Forsyth 	USED(g);
48274a4d8c2SCharles.Forsyth 	return 1;
48374a4d8c2SCharles.Forsyth }
48474a4d8c2SCharles.Forsyth 
48574a4d8c2SCharles.Forsyth void
cclean(void)48674a4d8c2SCharles.Forsyth cclean(void)
48774a4d8c2SCharles.Forsyth {
48874a4d8c2SCharles.Forsyth 
48974a4d8c2SCharles.Forsyth 	outcode(AEND, &nullgen, NREG, &nullgen);
49074a4d8c2SCharles.Forsyth 	Bflush(&obuf);
49174a4d8c2SCharles.Forsyth }
49274a4d8c2SCharles.Forsyth 
49374a4d8c2SCharles.Forsyth void
zname(char * n,int t,int s)49474a4d8c2SCharles.Forsyth zname(char *n, int t, int s)
49574a4d8c2SCharles.Forsyth {
49674a4d8c2SCharles.Forsyth 
49774a4d8c2SCharles.Forsyth 	Bputc(&obuf, ANAME);
49874a4d8c2SCharles.Forsyth 	Bputc(&obuf, t);	/* type */
49974a4d8c2SCharles.Forsyth 	Bputc(&obuf, s);	/* sym */
50074a4d8c2SCharles.Forsyth 	while(*n) {
50174a4d8c2SCharles.Forsyth 		Bputc(&obuf, *n);
50274a4d8c2SCharles.Forsyth 		n++;
50374a4d8c2SCharles.Forsyth 	}
50474a4d8c2SCharles.Forsyth 	Bputc(&obuf, 0);
50574a4d8c2SCharles.Forsyth }
50674a4d8c2SCharles.Forsyth 
50774a4d8c2SCharles.Forsyth void
zaddr(Gen * a,int s)50874a4d8c2SCharles.Forsyth zaddr(Gen *a, int s)
50974a4d8c2SCharles.Forsyth {
51074a4d8c2SCharles.Forsyth 	long l;
51174a4d8c2SCharles.Forsyth 	int i;
51274a4d8c2SCharles.Forsyth 	char *n;
51374a4d8c2SCharles.Forsyth 	Ieee e;
51474a4d8c2SCharles.Forsyth 
51574a4d8c2SCharles.Forsyth 	Bputc(&obuf, a->type);
51674a4d8c2SCharles.Forsyth 	Bputc(&obuf, a->reg);
51774a4d8c2SCharles.Forsyth 	Bputc(&obuf, s);
51874a4d8c2SCharles.Forsyth 	Bputc(&obuf, a->name);
51974a4d8c2SCharles.Forsyth 	switch(a->type) {
52074a4d8c2SCharles.Forsyth 	default:
52174a4d8c2SCharles.Forsyth 		print("unknown type %d\n", a->type);
52274a4d8c2SCharles.Forsyth 		exits("arg");
52374a4d8c2SCharles.Forsyth 
52474a4d8c2SCharles.Forsyth 	case D_NONE:
52574a4d8c2SCharles.Forsyth 	case D_REG:
52674a4d8c2SCharles.Forsyth 	case D_FREG:
52774a4d8c2SCharles.Forsyth 	case D_MREG:
52874a4d8c2SCharles.Forsyth 	case D_FCREG:
52974a4d8c2SCharles.Forsyth 	case D_LO:
53074a4d8c2SCharles.Forsyth 	case D_HI:
53174a4d8c2SCharles.Forsyth 		break;
53274a4d8c2SCharles.Forsyth 
53374a4d8c2SCharles.Forsyth 	case D_OREG:
53474a4d8c2SCharles.Forsyth 	case D_CONST:
53574a4d8c2SCharles.Forsyth 	case D_OCONST:
53674a4d8c2SCharles.Forsyth 	case D_BRANCH:
53774a4d8c2SCharles.Forsyth 		l = a->offset;
53874a4d8c2SCharles.Forsyth 		Bputc(&obuf, l);
53974a4d8c2SCharles.Forsyth 		Bputc(&obuf, l>>8);
54074a4d8c2SCharles.Forsyth 		Bputc(&obuf, l>>16);
54174a4d8c2SCharles.Forsyth 		Bputc(&obuf, l>>24);
54274a4d8c2SCharles.Forsyth 		break;
54374a4d8c2SCharles.Forsyth 
54474a4d8c2SCharles.Forsyth 	case D_SCONST:
54574a4d8c2SCharles.Forsyth 		n = a->sval;
54674a4d8c2SCharles.Forsyth 		for(i=0; i<NSNAME; i++) {
54774a4d8c2SCharles.Forsyth 			Bputc(&obuf, *n);
54874a4d8c2SCharles.Forsyth 			n++;
54974a4d8c2SCharles.Forsyth 		}
55074a4d8c2SCharles.Forsyth 		break;
55174a4d8c2SCharles.Forsyth 
55274a4d8c2SCharles.Forsyth 	case D_FCONST:
55374a4d8c2SCharles.Forsyth 		ieeedtod(&e, a->dval);
55474a4d8c2SCharles.Forsyth 		Bputc(&obuf, e.l);
55574a4d8c2SCharles.Forsyth 		Bputc(&obuf, e.l>>8);
55674a4d8c2SCharles.Forsyth 		Bputc(&obuf, e.l>>16);
55774a4d8c2SCharles.Forsyth 		Bputc(&obuf, e.l>>24);
55874a4d8c2SCharles.Forsyth 		Bputc(&obuf, e.h);
55974a4d8c2SCharles.Forsyth 		Bputc(&obuf, e.h>>8);
56074a4d8c2SCharles.Forsyth 		Bputc(&obuf, e.h>>16);
56174a4d8c2SCharles.Forsyth 		Bputc(&obuf, e.h>>24);
56274a4d8c2SCharles.Forsyth 		break;
56374a4d8c2SCharles.Forsyth 	}
56474a4d8c2SCharles.Forsyth }
56574a4d8c2SCharles.Forsyth 
56674a4d8c2SCharles.Forsyth void
outcode(int a,Gen * g1,int reg,Gen * g2)56774a4d8c2SCharles.Forsyth outcode(int a, Gen *g1, int reg, Gen *g2)
56874a4d8c2SCharles.Forsyth {
56974a4d8c2SCharles.Forsyth 	int sf, st, t;
57074a4d8c2SCharles.Forsyth 	Sym *s;
57174a4d8c2SCharles.Forsyth 
57274a4d8c2SCharles.Forsyth 	if(pass == 1)
57374a4d8c2SCharles.Forsyth 		goto out;
57474a4d8c2SCharles.Forsyth jackpot:
57574a4d8c2SCharles.Forsyth 	sf = 0;
57674a4d8c2SCharles.Forsyth 	s = g1->sym;
57774a4d8c2SCharles.Forsyth 	while(s != S) {
57874a4d8c2SCharles.Forsyth 		sf = s->sym;
57974a4d8c2SCharles.Forsyth 		if(sf < 0 || sf >= NSYM)
58074a4d8c2SCharles.Forsyth 			sf = 0;
58174a4d8c2SCharles.Forsyth 		t = g1->name;
58274a4d8c2SCharles.Forsyth 		if(h[sf].type == t)
58374a4d8c2SCharles.Forsyth 		if(h[sf].sym == s)
58474a4d8c2SCharles.Forsyth 			break;
58574a4d8c2SCharles.Forsyth 		zname(s->name, t, sym);
58674a4d8c2SCharles.Forsyth 		s->sym = sym;
58774a4d8c2SCharles.Forsyth 		h[sym].sym = s;
58874a4d8c2SCharles.Forsyth 		h[sym].type = t;
58974a4d8c2SCharles.Forsyth 		sf = sym;
59074a4d8c2SCharles.Forsyth 		sym++;
59174a4d8c2SCharles.Forsyth 		if(sym >= NSYM)
59274a4d8c2SCharles.Forsyth 			sym = 1;
59374a4d8c2SCharles.Forsyth 		break;
59474a4d8c2SCharles.Forsyth 	}
59574a4d8c2SCharles.Forsyth 	st = 0;
59674a4d8c2SCharles.Forsyth 	s = g2->sym;
59774a4d8c2SCharles.Forsyth 	while(s != S) {
59874a4d8c2SCharles.Forsyth 		st = s->sym;
59974a4d8c2SCharles.Forsyth 		if(st < 0 || st >= NSYM)
60074a4d8c2SCharles.Forsyth 			st = 0;
60174a4d8c2SCharles.Forsyth 		t = g2->name;
60274a4d8c2SCharles.Forsyth 		if(h[st].type == t)
60374a4d8c2SCharles.Forsyth 		if(h[st].sym == s)
60474a4d8c2SCharles.Forsyth 			break;
60574a4d8c2SCharles.Forsyth 		zname(s->name, t, sym);
60674a4d8c2SCharles.Forsyth 		s->sym = sym;
60774a4d8c2SCharles.Forsyth 		h[sym].sym = s;
60874a4d8c2SCharles.Forsyth 		h[sym].type = t;
60974a4d8c2SCharles.Forsyth 		st = sym;
61074a4d8c2SCharles.Forsyth 		sym++;
61174a4d8c2SCharles.Forsyth 		if(sym >= NSYM)
61274a4d8c2SCharles.Forsyth 			sym = 1;
61374a4d8c2SCharles.Forsyth 		if(st == sf)
61474a4d8c2SCharles.Forsyth 			goto jackpot;
61574a4d8c2SCharles.Forsyth 		break;
61674a4d8c2SCharles.Forsyth 	}
61774a4d8c2SCharles.Forsyth 	Bputc(&obuf, a);
61874a4d8c2SCharles.Forsyth 	Bputc(&obuf, reg|nosched);
61974a4d8c2SCharles.Forsyth 	Bputc(&obuf, lineno);
62074a4d8c2SCharles.Forsyth 	Bputc(&obuf, lineno>>8);
62174a4d8c2SCharles.Forsyth 	Bputc(&obuf, lineno>>16);
62274a4d8c2SCharles.Forsyth 	Bputc(&obuf, lineno>>24);
62374a4d8c2SCharles.Forsyth 	zaddr(g1, sf);
62474a4d8c2SCharles.Forsyth 	zaddr(g2, st);
62574a4d8c2SCharles.Forsyth 
62674a4d8c2SCharles.Forsyth out:
62774a4d8c2SCharles.Forsyth 	if(a != AGLOBL && a != ADATA)
62874a4d8c2SCharles.Forsyth 		pc++;
62974a4d8c2SCharles.Forsyth }
63074a4d8c2SCharles.Forsyth 
63174a4d8c2SCharles.Forsyth void
outhist(void)63274a4d8c2SCharles.Forsyth outhist(void)
63374a4d8c2SCharles.Forsyth {
63474a4d8c2SCharles.Forsyth 	Gen g;
63574a4d8c2SCharles.Forsyth 	Hist *h;
63674a4d8c2SCharles.Forsyth 	char *p, *q, *op, c;
63774a4d8c2SCharles.Forsyth 	int n;
63874a4d8c2SCharles.Forsyth 
63974a4d8c2SCharles.Forsyth 	g = nullgen;
64074a4d8c2SCharles.Forsyth 	c = pathchar();
64174a4d8c2SCharles.Forsyth 	for(h = hist; h != H; h = h->link) {
64274a4d8c2SCharles.Forsyth 		p = h->name;
64374a4d8c2SCharles.Forsyth 		op = 0;
64474a4d8c2SCharles.Forsyth 		/* on windows skip drive specifier in pathname */
64574a4d8c2SCharles.Forsyth 		if(systemtype(Windows) && p && p[1] == ':'){
64674a4d8c2SCharles.Forsyth 			p += 2;
64774a4d8c2SCharles.Forsyth 			c = *p;
64874a4d8c2SCharles.Forsyth 		}
64974a4d8c2SCharles.Forsyth 		if(p && p[0] != c && h->offset == 0 && pathname){
65074a4d8c2SCharles.Forsyth 			/* on windows skip drive specifier in pathname */
65174a4d8c2SCharles.Forsyth 			if(systemtype(Windows) && pathname[1] == ':') {
65274a4d8c2SCharles.Forsyth 				op = p;
65374a4d8c2SCharles.Forsyth 				p = pathname+2;
65474a4d8c2SCharles.Forsyth 				c = *p;
65574a4d8c2SCharles.Forsyth 			} else if(pathname[0] == c){
65674a4d8c2SCharles.Forsyth 				op = p;
65774a4d8c2SCharles.Forsyth 				p = pathname;
65874a4d8c2SCharles.Forsyth 			}
65974a4d8c2SCharles.Forsyth 		}
66074a4d8c2SCharles.Forsyth 		while(p) {
66174a4d8c2SCharles.Forsyth 			q = strchr(p, c);
66274a4d8c2SCharles.Forsyth 			if(q) {
66374a4d8c2SCharles.Forsyth 				n = q-p;
66474a4d8c2SCharles.Forsyth 				if(n == 0){
66574a4d8c2SCharles.Forsyth 					n = 1;	/* leading "/" */
66674a4d8c2SCharles.Forsyth 					*p = '/';	/* don't emit "\" on windows */
66774a4d8c2SCharles.Forsyth 				}
66874a4d8c2SCharles.Forsyth 				q++;
66974a4d8c2SCharles.Forsyth 			} else {
67074a4d8c2SCharles.Forsyth 				n = strlen(p);
67174a4d8c2SCharles.Forsyth 				q = 0;
67274a4d8c2SCharles.Forsyth 			}
67374a4d8c2SCharles.Forsyth 			if(n) {
67474a4d8c2SCharles.Forsyth 				Bputc(&obuf, ANAME);
67574a4d8c2SCharles.Forsyth 				Bputc(&obuf, D_FILE);	/* type */
67674a4d8c2SCharles.Forsyth 				Bputc(&obuf, 1);	/* sym */
67774a4d8c2SCharles.Forsyth 				Bputc(&obuf, '<');
67874a4d8c2SCharles.Forsyth 				Bwrite(&obuf, p, n);
67974a4d8c2SCharles.Forsyth 				Bputc(&obuf, 0);
68074a4d8c2SCharles.Forsyth 			}
68174a4d8c2SCharles.Forsyth 			p = q;
68274a4d8c2SCharles.Forsyth 			if(p == 0 && op) {
68374a4d8c2SCharles.Forsyth 				p = op;
68474a4d8c2SCharles.Forsyth 				op = 0;
68574a4d8c2SCharles.Forsyth 			}
68674a4d8c2SCharles.Forsyth 		}
68774a4d8c2SCharles.Forsyth 		g.offset = h->offset;
68874a4d8c2SCharles.Forsyth 
68974a4d8c2SCharles.Forsyth 		Bputc(&obuf, AHISTORY);
69074a4d8c2SCharles.Forsyth 		Bputc(&obuf, 0);
69174a4d8c2SCharles.Forsyth 		Bputc(&obuf, h->line);
69274a4d8c2SCharles.Forsyth 		Bputc(&obuf, h->line>>8);
69374a4d8c2SCharles.Forsyth 		Bputc(&obuf, h->line>>16);
69474a4d8c2SCharles.Forsyth 		Bputc(&obuf, h->line>>24);
69574a4d8c2SCharles.Forsyth 		zaddr(&nullgen, 0);
69674a4d8c2SCharles.Forsyth 		zaddr(&g, 0);
69774a4d8c2SCharles.Forsyth 	}
69874a4d8c2SCharles.Forsyth }
69974a4d8c2SCharles.Forsyth 
70074a4d8c2SCharles.Forsyth #include "../cc/lexbody"
70174a4d8c2SCharles.Forsyth #include "../cc/macbody"
702