xref: /plan9/sys/src/cmd/ka/lex.c (revision 375daca8932d0755549a5f8e4d068a24a49927d4)
13e12c5d1SDavid du Colombier #include <ctype.h>
27dd7cddfSDavid du Colombier #define	EXTERN
33e12c5d1SDavid du Colombier #include "a.h"
43e12c5d1SDavid du Colombier #include "y.tab.h"
53e12c5d1SDavid du Colombier 
63e12c5d1SDavid du Colombier void
main(int argc,char * argv[])73e12c5d1SDavid du Colombier main(int argc, char *argv[])
83e12c5d1SDavid du Colombier {
97dd7cddfSDavid du Colombier 	char *p;
107dd7cddfSDavid du Colombier 	int nout, nproc, status, i, c;
113e12c5d1SDavid du Colombier 
123e12c5d1SDavid du Colombier 	thechar = 'k';
133e12c5d1SDavid du Colombier 	thestring = "sparc";
143e12c5d1SDavid du Colombier 	memset(debug, 0, sizeof(debug));
153e12c5d1SDavid du Colombier 	cinit();
163e12c5d1SDavid du Colombier 	outfile = 0;
173e12c5d1SDavid du Colombier 	include[ninclude++] = ".";
183e12c5d1SDavid du Colombier 	ARGBEGIN {
193e12c5d1SDavid du Colombier 	default:
203e12c5d1SDavid du Colombier 		c = ARGC();
213e12c5d1SDavid du Colombier 		if(c >= 0 || c < sizeof(debug))
223e12c5d1SDavid du Colombier 			debug[c] = 1;
233e12c5d1SDavid du Colombier 		break;
243e12c5d1SDavid du Colombier 
253e12c5d1SDavid du Colombier 	case 'o':
263e12c5d1SDavid du Colombier 		outfile = ARGF();
273e12c5d1SDavid du Colombier 		break;
283e12c5d1SDavid du Colombier 
293e12c5d1SDavid du Colombier 	case 'D':
303e12c5d1SDavid du Colombier 		p = ARGF();
313e12c5d1SDavid du Colombier 		if(p)
32219b2ee8SDavid du Colombier 			Dlist[nDlist++] = p;
333e12c5d1SDavid du Colombier 		break;
343e12c5d1SDavid du Colombier 
353e12c5d1SDavid du Colombier 	case 'I':
363e12c5d1SDavid du Colombier 		p = ARGF();
377dd7cddfSDavid du Colombier 		setinclude(p);
383e12c5d1SDavid du Colombier 		break;
393e12c5d1SDavid du Colombier 	} ARGEND
403e12c5d1SDavid du Colombier 	if(*argv == 0) {
413e12c5d1SDavid du Colombier 		print("usage: %ca [-options] file.s\n", thechar);
423e12c5d1SDavid du Colombier 		errorexit();
433e12c5d1SDavid du Colombier 	}
447dd7cddfSDavid du Colombier 	if(argc > 1 && systemtype(Windows)){
457dd7cddfSDavid du Colombier 		print("can't assemble multiple files on windows\n");
467dd7cddfSDavid du Colombier 		errorexit();
477dd7cddfSDavid du Colombier 	}
487dd7cddfSDavid du Colombier 	if(argc > 1 && !systemtype(Windows)) {
497dd7cddfSDavid du Colombier 		nproc = 1;
503e12c5d1SDavid du Colombier 		if(p = getenv("NPROC"))
517dd7cddfSDavid du Colombier 			nproc = atol(p);	/* */
523e12c5d1SDavid du Colombier 		c = 0;
533e12c5d1SDavid du Colombier 		nout = 0;
543e12c5d1SDavid du Colombier 		for(;;) {
553e12c5d1SDavid du Colombier 			while(nout < nproc && argc > 0) {
567dd7cddfSDavid du Colombier 				i = myfork();
573e12c5d1SDavid du Colombier 				if(i < 0) {
583e12c5d1SDavid du Colombier 					i = mywait(&status);
593e12c5d1SDavid du Colombier 					if(i < 0)
603e12c5d1SDavid du Colombier 						errorexit();
613e12c5d1SDavid du Colombier 					if(status)
623e12c5d1SDavid du Colombier 						c++;
633e12c5d1SDavid du Colombier 					nout--;
643e12c5d1SDavid du Colombier 					continue;
653e12c5d1SDavid du Colombier 				}
663e12c5d1SDavid du Colombier 				if(i == 0) {
673e12c5d1SDavid du Colombier 					print("%s:\n", *argv);
687dd7cddfSDavid du Colombier 					if(assemble(*argv))
697dd7cddfSDavid du Colombier 						errorexit();
707dd7cddfSDavid du Colombier 					exits(0);
713e12c5d1SDavid du Colombier 				}
723e12c5d1SDavid du Colombier 				nout++;
733e12c5d1SDavid du Colombier 				argc--;
743e12c5d1SDavid du Colombier 				argv++;
753e12c5d1SDavid du Colombier 			}
763e12c5d1SDavid du Colombier 			i = mywait(&status);
773e12c5d1SDavid du Colombier 			if(i < 0) {
783e12c5d1SDavid du Colombier 				if(c)
793e12c5d1SDavid du Colombier 					errorexit();
803e12c5d1SDavid du Colombier 				exits(0);
813e12c5d1SDavid du Colombier 			}
823e12c5d1SDavid du Colombier 			if(status)
833e12c5d1SDavid du Colombier 				c++;
843e12c5d1SDavid du Colombier 			nout--;
853e12c5d1SDavid du Colombier 		}
863e12c5d1SDavid du Colombier 	}
877dd7cddfSDavid du Colombier 	if(assemble(argv[0]))
887dd7cddfSDavid du Colombier 		errorexit();
897dd7cddfSDavid du Colombier 	exits(0);
907dd7cddfSDavid du Colombier }
913e12c5d1SDavid du Colombier 
927dd7cddfSDavid du Colombier int
assemble(char * file)937dd7cddfSDavid du Colombier assemble(char *file)
947dd7cddfSDavid du Colombier {
957dd7cddfSDavid du Colombier 	char ofile[100], incfile[20], *p;
967dd7cddfSDavid du Colombier 	int i, of;
977dd7cddfSDavid du Colombier 
987dd7cddfSDavid du Colombier 	strcpy(ofile, file);
997dd7cddfSDavid du Colombier 	p = utfrrune(ofile, pathchar());
1007dd7cddfSDavid du Colombier 	if(p) {
1013e12c5d1SDavid du Colombier 		include[0] = ofile;
1023e12c5d1SDavid du Colombier 		*p++ = 0;
1033e12c5d1SDavid du Colombier 	} else
1043e12c5d1SDavid du Colombier 		p = ofile;
1053e12c5d1SDavid du Colombier 	if(outfile == 0) {
1063e12c5d1SDavid du Colombier 		outfile = p;
1077dd7cddfSDavid du Colombier 		if(outfile){
1087dd7cddfSDavid du Colombier 			p = utfrrune(outfile, '.');
1097dd7cddfSDavid du Colombier 			if(p)
1103e12c5d1SDavid du Colombier 				if(p[1] == 's' && p[2] == 0)
1113e12c5d1SDavid du Colombier 					p[0] = 0;
1127dd7cddfSDavid du Colombier 			p = utfrune(outfile, 0);
1133e12c5d1SDavid du Colombier 			p[0] = '.';
1143e12c5d1SDavid du Colombier 			p[1] = thechar;
1153e12c5d1SDavid du Colombier 			p[2] = 0;
1167dd7cddfSDavid du Colombier 		} else
1177dd7cddfSDavid du Colombier 			outfile = "/dev/null";
1183e12c5d1SDavid du Colombier 	}
1197dd7cddfSDavid du Colombier 	p = getenv("INCLUDE");
1207dd7cddfSDavid du Colombier 	if(p) {
1217dd7cddfSDavid du Colombier 		setinclude(p);
1223e12c5d1SDavid du Colombier 	} else {
1237dd7cddfSDavid du Colombier 		if(systemtype(Plan9)) {
1247dd7cddfSDavid du Colombier 			sprint(incfile,"/%s/include", thestring);
1257dd7cddfSDavid du Colombier 			setinclude(strdup(incfile));
1263e12c5d1SDavid du Colombier 		}
1277dd7cddfSDavid du Colombier 	}
1287dd7cddfSDavid du Colombier 
1293e12c5d1SDavid du Colombier 	of = mycreat(outfile, 0664);
1303e12c5d1SDavid du Colombier 	if(of < 0) {
1313e12c5d1SDavid du Colombier 		yyerror("%ca: cannot create %s", thechar, outfile);
1323e12c5d1SDavid du Colombier 		errorexit();
1333e12c5d1SDavid du Colombier 	}
1343e12c5d1SDavid du Colombier 	Binit(&obuf, of, OWRITE);
1353e12c5d1SDavid du Colombier 
1363e12c5d1SDavid du Colombier 	pass = 1;
1377dd7cddfSDavid du Colombier 	pinit(file);
138219b2ee8SDavid du Colombier 	for(i=0; i<nDlist; i++)
139219b2ee8SDavid du Colombier 		dodefine(Dlist[i]);
1403e12c5d1SDavid du Colombier 	yyparse();
1413e12c5d1SDavid du Colombier 	if(nerrors) {
1423e12c5d1SDavid du Colombier 		cclean();
1437dd7cddfSDavid du Colombier 		return nerrors;
1443e12c5d1SDavid du Colombier 	}
1453e12c5d1SDavid du Colombier 
1463e12c5d1SDavid du Colombier 	pass = 2;
1473e12c5d1SDavid du Colombier 	outhist();
1487dd7cddfSDavid du Colombier 	pinit(file);
149219b2ee8SDavid du Colombier 	for(i=0; i<nDlist; i++)
150219b2ee8SDavid du Colombier 		dodefine(Dlist[i]);
1513e12c5d1SDavid du Colombier 	yyparse();
1523e12c5d1SDavid du Colombier 	cclean();
1537dd7cddfSDavid du Colombier 	return nerrors;
1543e12c5d1SDavid du Colombier }
1553e12c5d1SDavid du Colombier 
1563e12c5d1SDavid du Colombier struct
1573e12c5d1SDavid du Colombier {
1583e12c5d1SDavid du Colombier 	char	*name;
1593e12c5d1SDavid du Colombier 	ushort	type;
1603e12c5d1SDavid du Colombier 	ushort	value;
1613e12c5d1SDavid du Colombier } itab[] =
1623e12c5d1SDavid du Colombier {
1633e12c5d1SDavid du Colombier 	"SP",		LSP,	D_AUTO,
1643e12c5d1SDavid du Colombier 	"SB",		LSB,	D_EXTERN,
1653e12c5d1SDavid du Colombier 	"FP",		LFP,	D_PARAM,
1663e12c5d1SDavid du Colombier 	"PC",		LPC,	D_BRANCH,
1673e12c5d1SDavid du Colombier 
1683e12c5d1SDavid du Colombier 	"FSR",		LFSR,	D_FSR,
1693e12c5d1SDavid du Colombier 	"CSR",		LFSR,	D_CSR,
1703e12c5d1SDavid du Colombier 
1713e12c5d1SDavid du Colombier 	"FQ",		LFPQ,	D_FPQ,
1723e12c5d1SDavid du Colombier 	"CQ",		LFPQ,	D_CPQ,
1733e12c5d1SDavid du Colombier 
1743e12c5d1SDavid du Colombier 	"Y",		LPSR,	D_Y,
1753e12c5d1SDavid du Colombier 	"PSR",		LPSR,	D_PSR,
1763e12c5d1SDavid du Colombier 	"WIM",		LPSR,	D_WIM,
1773e12c5d1SDavid du Colombier 	"TBR",		LPSR,	D_TBR,
1783e12c5d1SDavid du Colombier 
1793e12c5d1SDavid du Colombier 	"R",		LR,	0,
1803e12c5d1SDavid du Colombier 	"R0",		LREG,	0,
1813e12c5d1SDavid du Colombier 	"R1",		LREG,	1,
1823e12c5d1SDavid du Colombier 	"R2",		LREG,	2,
1833e12c5d1SDavid du Colombier 	"R3",		LREG,	3,
1843e12c5d1SDavid du Colombier 	"R4",		LREG,	4,
1853e12c5d1SDavid du Colombier 	"R5",		LREG,	5,
1863e12c5d1SDavid du Colombier 	"R6",		LREG,	6,
1873e12c5d1SDavid du Colombier 	"R7",		LREG,	7,
1883e12c5d1SDavid du Colombier 	"R8",		LREG,	8,
1893e12c5d1SDavid du Colombier 	"R9",		LREG,	9,
1903e12c5d1SDavid du Colombier 	"R10",		LREG,	10,
1913e12c5d1SDavid du Colombier 	"R11",		LREG,	11,
1923e12c5d1SDavid du Colombier 	"R12",		LREG,	12,
1933e12c5d1SDavid du Colombier 	"R13",		LREG,	13,
1943e12c5d1SDavid du Colombier 	"R14",		LREG,	14,
1953e12c5d1SDavid du Colombier 	"R15",		LREG,	15,
1963e12c5d1SDavid du Colombier 	"R16",		LREG,	16,
1973e12c5d1SDavid du Colombier 	"R17",		LREG,	17,
1983e12c5d1SDavid du Colombier 	"R18",		LREG,	18,
1993e12c5d1SDavid du Colombier 	"R19",		LREG,	19,
2003e12c5d1SDavid du Colombier 	"R20",		LREG,	20,
2013e12c5d1SDavid du Colombier 	"R21",		LREG,	21,
2023e12c5d1SDavid du Colombier 	"R22",		LREG,	22,
2033e12c5d1SDavid du Colombier 	"R23",		LREG,	23,
2043e12c5d1SDavid du Colombier 	"R24",		LREG,	24,
2053e12c5d1SDavid du Colombier 	"R25",		LREG,	25,
2063e12c5d1SDavid du Colombier 	"R26",		LREG,	26,
2073e12c5d1SDavid du Colombier 	"R27",		LREG,	27,
2083e12c5d1SDavid du Colombier 	"R28",		LREG,	28,
2093e12c5d1SDavid du Colombier 	"R29",		LREG,	29,
2103e12c5d1SDavid du Colombier 	"R30",		LREG,	30,
2113e12c5d1SDavid du Colombier 	"R31",		LREG,	31,
2123e12c5d1SDavid du Colombier 
2133e12c5d1SDavid du Colombier 	"C",		LC,	0,
2143e12c5d1SDavid du Colombier 	"C0",		LCREG,	0,
2153e12c5d1SDavid du Colombier 	"C1",		LCREG,	1,
2163e12c5d1SDavid du Colombier 	"C2",		LCREG,	2,
2173e12c5d1SDavid du Colombier 	"C3",		LCREG,	3,
2183e12c5d1SDavid du Colombier 	"C4",		LCREG,	4,
2193e12c5d1SDavid du Colombier 	"C5",		LCREG,	5,
2203e12c5d1SDavid du Colombier 	"C6",		LCREG,	6,
2213e12c5d1SDavid du Colombier 	"C7",		LCREG,	7,
2223e12c5d1SDavid du Colombier 	"C8",		LCREG,	8,
2233e12c5d1SDavid du Colombier 	"C9",		LCREG,	9,
2243e12c5d1SDavid du Colombier 	"C10",		LCREG,	10,
2253e12c5d1SDavid du Colombier 	"C11",		LCREG,	11,
2263e12c5d1SDavid du Colombier 	"C12",		LCREG,	12,
2273e12c5d1SDavid du Colombier 	"C13",		LCREG,	13,
2283e12c5d1SDavid du Colombier 	"C14",		LCREG,	14,
2293e12c5d1SDavid du Colombier 	"C15",		LCREG,	15,
2303e12c5d1SDavid du Colombier 	"C16",		LCREG,	16,
2313e12c5d1SDavid du Colombier 	"C17",		LCREG,	17,
2323e12c5d1SDavid du Colombier 	"C18",		LCREG,	18,
2333e12c5d1SDavid du Colombier 	"C19",		LCREG,	19,
2343e12c5d1SDavid du Colombier 	"C20",		LCREG,	20,
2353e12c5d1SDavid du Colombier 	"C21",		LCREG,	21,
2363e12c5d1SDavid du Colombier 	"C22",		LCREG,	22,
2373e12c5d1SDavid du Colombier 	"C23",		LCREG,	23,
2383e12c5d1SDavid du Colombier 	"C24",		LCREG,	24,
2393e12c5d1SDavid du Colombier 	"C25",		LCREG,	25,
2403e12c5d1SDavid du Colombier 	"C26",		LCREG,	26,
2413e12c5d1SDavid du Colombier 	"C27",		LCREG,	27,
2423e12c5d1SDavid du Colombier 	"C28",		LCREG,	28,
2433e12c5d1SDavid du Colombier 	"C29",		LCREG,	29,
2443e12c5d1SDavid du Colombier 	"C30",		LCREG,	30,
2453e12c5d1SDavid du Colombier 	"C31",		LCREG,	31,
2463e12c5d1SDavid du Colombier 
2473e12c5d1SDavid du Colombier 	"F",		LF,	0,
2483e12c5d1SDavid du Colombier 	"F0",		LFREG,	0,
2493e12c5d1SDavid du Colombier 	"F2",		LFREG,	2,
2503e12c5d1SDavid du Colombier 	"F4",		LFREG,	4,
2513e12c5d1SDavid du Colombier 	"F6",		LFREG,	6,
2523e12c5d1SDavid du Colombier 	"F8",		LFREG,	8,
2533e12c5d1SDavid du Colombier 	"F10",		LFREG,	10,
2543e12c5d1SDavid du Colombier 	"F12",		LFREG,	12,
2553e12c5d1SDavid du Colombier 	"F14",		LFREG,	14,
2563e12c5d1SDavid du Colombier 	"F16",		LFREG,	16,
2573e12c5d1SDavid du Colombier 	"F18",		LFREG,	18,
2583e12c5d1SDavid du Colombier 	"F20",		LFREG,	20,
2593e12c5d1SDavid du Colombier 	"F22",		LFREG,	22,
2603e12c5d1SDavid du Colombier 	"F24",		LFREG,	24,
2613e12c5d1SDavid du Colombier 	"F26",		LFREG,	26,
2623e12c5d1SDavid du Colombier 	"F28",		LFREG,	28,
2633e12c5d1SDavid du Colombier 	"F30",		LFREG,	30,
2643e12c5d1SDavid du Colombier 	"F1",		LFREG,	1,
2653e12c5d1SDavid du Colombier 	"F3",		LFREG,	3,
2663e12c5d1SDavid du Colombier 	"F5",		LFREG,	5,
2673e12c5d1SDavid du Colombier 	"F7",		LFREG,	7,
2683e12c5d1SDavid du Colombier 	"F9",		LFREG,	9,
2693e12c5d1SDavid du Colombier 	"F11",		LFREG,	11,
2703e12c5d1SDavid du Colombier 	"F13",		LFREG,	13,
2713e12c5d1SDavid du Colombier 	"F15",		LFREG,	15,
2723e12c5d1SDavid du Colombier 	"F17",		LFREG,	17,
2733e12c5d1SDavid du Colombier 	"F19",		LFREG,	19,
2743e12c5d1SDavid du Colombier 	"F21",		LFREG,	21,
2753e12c5d1SDavid du Colombier 	"F23",		LFREG,	23,
2763e12c5d1SDavid du Colombier 	"F25",		LFREG,	25,
2773e12c5d1SDavid du Colombier 	"F27",		LFREG,	27,
2783e12c5d1SDavid du Colombier 	"F29",		LFREG,	29,
2793e12c5d1SDavid du Colombier 	"F31",		LFREG,	31,
2803e12c5d1SDavid du Colombier 
2813e12c5d1SDavid du Colombier 	"ADD",		LADDW, AADD,
2823e12c5d1SDavid du Colombier 	"ADDCC",	LADDW, AADDCC,
2833e12c5d1SDavid du Colombier 	"ADDX",		LADDW, AADDX,
2843e12c5d1SDavid du Colombier 	"ADDXCC",	LADDW, AADDXCC,
2853e12c5d1SDavid du Colombier 	"AND",		LADDW, AAND,
2863e12c5d1SDavid du Colombier 	"ANDCC",	LADDW, AANDCC,
2873e12c5d1SDavid du Colombier 	"ANDN",		LADDW, AANDN,
2883e12c5d1SDavid du Colombier 	"ANDNCC",	LADDW, AANDNCC,
2893e12c5d1SDavid du Colombier 	"BA",		LBRA, ABA,
2903e12c5d1SDavid du Colombier 	"BCC",		LBRA, ABCC,
2913e12c5d1SDavid du Colombier 	"BCS",		LBRA, ABCS,
2923e12c5d1SDavid du Colombier 	"BE",		LBRA, ABE,
2933e12c5d1SDavid du Colombier 	"BG",		LBRA, ABG,
2943e12c5d1SDavid du Colombier 	"BGE",		LBRA, ABGE,
2953e12c5d1SDavid du Colombier 	"BGU",		LBRA, ABGU,
2963e12c5d1SDavid du Colombier 	"BL",		LBRA, ABL,
2973e12c5d1SDavid du Colombier 	"BLE",		LBRA, ABLE,
2983e12c5d1SDavid du Colombier 	"BLEU",		LBRA, ABLEU,
2993e12c5d1SDavid du Colombier 	"BN",		LBRA, ABN,
3003e12c5d1SDavid du Colombier 	"BNE",		LBRA, ABNE,
3013e12c5d1SDavid du Colombier 	"BNEG",		LBRA, ABNEG,
3023e12c5d1SDavid du Colombier 	"BPOS",		LBRA, ABPOS,
3033e12c5d1SDavid du Colombier 	"BVC",		LBRA, ABVC,
3043e12c5d1SDavid du Colombier 	"BVS",		LBRA, ABVS,
3053e12c5d1SDavid du Colombier 	"CB0",		LBRA, ACB0,
3063e12c5d1SDavid du Colombier 	"CB01",		LBRA, ACB01,
3073e12c5d1SDavid du Colombier 	"CB012",	LBRA, ACB012,
3083e12c5d1SDavid du Colombier 	"CB013",	LBRA, ACB013,
3093e12c5d1SDavid du Colombier 	"CB02",		LBRA, ACB02,
3103e12c5d1SDavid du Colombier 	"CB023",	LBRA, ACB023,
3113e12c5d1SDavid du Colombier 	"CB03",		LBRA, ACB03,
3123e12c5d1SDavid du Colombier 	"CB1",		LBRA, ACB1,
3133e12c5d1SDavid du Colombier 	"CB12",		LBRA, ACB12,
3143e12c5d1SDavid du Colombier 	"CB123",	LBRA, ACB123,
3153e12c5d1SDavid du Colombier 	"CB13",		LBRA, ACB13,
3163e12c5d1SDavid du Colombier 	"CB2",		LBRA, ACB2,
3173e12c5d1SDavid du Colombier 	"CB23",		LBRA, ACB23,
3183e12c5d1SDavid du Colombier 	"CB3",		LBRA, ACB3,
3193e12c5d1SDavid du Colombier 	"CBA",		LBRA, ACBA,
3203e12c5d1SDavid du Colombier 	"CBN",		LBRA, ACBN,
3213e12c5d1SDavid du Colombier 	"CMP",		LCMP, ACMP,
3223e12c5d1SDavid du Colombier 	"CPOP1",	LCPOP, ACPOP1,
3233e12c5d1SDavid du Colombier 	"CPOP2",	LCPOP, ACPOP2,
3243e12c5d1SDavid du Colombier 	"DATA",		LDATA, ADATA,
3253e12c5d1SDavid du Colombier 	"DIV",		LADDW, ADIV,
3263e12c5d1SDavid du Colombier 	"DIVL",		LADDW, ADIVL,
3273e12c5d1SDavid du Colombier 	"END",		LEND, AEND,
3283e12c5d1SDavid du Colombier 	"FABSD",	LFCONV, AFABSD,
3293e12c5d1SDavid du Colombier 	"FABSF",	LFCONV, AFABSF,
3303e12c5d1SDavid du Colombier 	"FABSX",	LFCONV, AFABSX,
3313e12c5d1SDavid du Colombier 	"FADDD",	LFADD, AFADDD,
3323e12c5d1SDavid du Colombier 	"FADDF",	LFADD, AFADDF,
3333e12c5d1SDavid du Colombier 	"FADDX",	LFADD, AFADDX,
3343e12c5d1SDavid du Colombier 	"FBA",		LBRA, AFBA,
3353e12c5d1SDavid du Colombier 	"FBE",		LBRA, AFBE,
3363e12c5d1SDavid du Colombier 	"FBG",		LBRA, AFBG,
3373e12c5d1SDavid du Colombier 	"FBGE",		LBRA, AFBGE,
3383e12c5d1SDavid du Colombier 	"FBL",		LBRA, AFBL,
3393e12c5d1SDavid du Colombier 	"FBLE",		LBRA, AFBLE,
3403e12c5d1SDavid du Colombier 	"FBLG",		LBRA, AFBLG,
3413e12c5d1SDavid du Colombier 	"FBN",		LBRA, AFBN,
3423e12c5d1SDavid du Colombier 	"FBNE",		LBRA, AFBNE,
3433e12c5d1SDavid du Colombier 	"FBO",		LBRA, AFBO,
3443e12c5d1SDavid du Colombier 	"FBU",		LBRA, AFBU,
3453e12c5d1SDavid du Colombier 	"FBUE",		LBRA, AFBUE,
3463e12c5d1SDavid du Colombier 	"FBUG",		LBRA, AFBUG,
3473e12c5d1SDavid du Colombier 	"FBUGE",	LBRA, AFBUGE,
3483e12c5d1SDavid du Colombier 	"FBUL",		LBRA, AFBUL,
3493e12c5d1SDavid du Colombier 	"FBULE",	LBRA, AFBULE,
3503e12c5d1SDavid du Colombier 	"FCMPD",	LFADD, AFCMPD,
3513e12c5d1SDavid du Colombier 	"FCMPED",	LFADD, AFCMPED,
3523e12c5d1SDavid du Colombier 	"FCMPEF",	LFADD, AFCMPEF,
3533e12c5d1SDavid du Colombier 	"FCMPEX",	LFADD, AFCMPEX,
3543e12c5d1SDavid du Colombier 	"FCMPF",	LFADD, AFCMPF,
3553e12c5d1SDavid du Colombier 	"FCMPX",	LFADD, AFCMPX,
3563e12c5d1SDavid du Colombier 	"FDIVD",	LFADD, AFDIVD,
3573e12c5d1SDavid du Colombier 	"FDIVF",	LFADD, AFDIVF,
3583e12c5d1SDavid du Colombier 	"FDIVX",	LFADD, AFDIVX,
3593e12c5d1SDavid du Colombier 	"FMOVD",	LFMOV, AFMOVD,
3603e12c5d1SDavid du Colombier 	"FMOVDF",	LFCONV, AFMOVDF,
3613e12c5d1SDavid du Colombier 	"FMOVDW",	LFCONV, AFMOVDW,
3623e12c5d1SDavid du Colombier 	"FMOVDX",	LFCONV, AFMOVDX,
3633e12c5d1SDavid du Colombier 	"FMOVF",	LFMOV, AFMOVF,
3643e12c5d1SDavid du Colombier 	"FMOVFD",	LFCONV, AFMOVFD,
3653e12c5d1SDavid du Colombier 	"FMOVFW",	LFCONV, AFMOVFW,
3663e12c5d1SDavid du Colombier 	"FMOVFX",	LFCONV, AFMOVFX,
3673e12c5d1SDavid du Colombier 	"FMOVWD",	LFCONV, AFMOVWD,
3683e12c5d1SDavid du Colombier 	"FMOVWF",	LFCONV, AFMOVWF,
3693e12c5d1SDavid du Colombier 	"FMOVWX",	LFCONV, AFMOVWX,
3703e12c5d1SDavid du Colombier 	"FMOVX",	LFCONV, AFMOVX,
3713e12c5d1SDavid du Colombier 	"FMOVXD",	LFCONV, AFMOVXD,
3723e12c5d1SDavid du Colombier 	"FMOVXF",	LFCONV, AFMOVXF,
3733e12c5d1SDavid du Colombier 	"FMOVXW",	LFCONV, AFMOVXW,
3743e12c5d1SDavid du Colombier 	"FMULD",	LFADD, AFMULD,
3753e12c5d1SDavid du Colombier 	"FMULF",	LFADD, AFMULF,
3763e12c5d1SDavid du Colombier 	"FMULX",	LFADD, AFMULX,
3773e12c5d1SDavid du Colombier 	"FNEGD",	LFCONV, AFNEGD,
3783e12c5d1SDavid du Colombier 	"FNEGF",	LFCONV, AFNEGF,
3793e12c5d1SDavid du Colombier 	"FNEGX",	LFCONV, AFNEGX,
3803e12c5d1SDavid du Colombier 	"FSQRTD",	LFCONV, AFSQRTD,
3813e12c5d1SDavid du Colombier 	"FSQRTF",	LFCONV, AFSQRTF,
3823e12c5d1SDavid du Colombier 	"FSQRTX",	LFCONV, AFSQRTX,
3833e12c5d1SDavid du Colombier 	"FSUBD",	LFADD, AFSUBD,
3843e12c5d1SDavid du Colombier 	"FSUBF",	LFADD, AFSUBF,
3853e12c5d1SDavid du Colombier 	"FSUBX",	LFADD, AFSUBX,
3863e12c5d1SDavid du Colombier 	"GLOBL",	LTEXT, AGLOBL,
3873e12c5d1SDavid du Colombier 	"IFLUSH",	LFLUSH, AIFLUSH,
3883e12c5d1SDavid du Colombier 	"JMPL",		LJMPL, AJMPL,
3893e12c5d1SDavid du Colombier 	"JMP",		LJMPL, AJMP,
3903e12c5d1SDavid du Colombier 	"MOD",		LADDW, AMOD,
3913e12c5d1SDavid du Colombier 	"MODL",		LADDW, AMODL,
3923e12c5d1SDavid du Colombier 	"MOVB",		LMOVB, AMOVB,
3933e12c5d1SDavid du Colombier 	"MOVBU",	LMOVB, AMOVBU,
3943e12c5d1SDavid du Colombier 	"MOVD",		LMOVD, AMOVD,
3953e12c5d1SDavid du Colombier 	"MOVH",		LMOVB, AMOVH,
3963e12c5d1SDavid du Colombier 	"MOVHU",	LMOVB, AMOVHU,
3973e12c5d1SDavid du Colombier 	"MOVW",		LMOVW, AMOVW,
3983e12c5d1SDavid du Colombier 	"MUL",		LADDW, AMUL,
3993e12c5d1SDavid du Colombier 	"MULSCC",	LADDW, AMULSCC,
4003e12c5d1SDavid du Colombier 	"NOP",		LNOP, ANOP,
4013e12c5d1SDavid du Colombier 	"OR",		LADDW, AOR,
4023e12c5d1SDavid du Colombier 	"ORCC",		LADDW, AORCC,
4033e12c5d1SDavid du Colombier 	"ORN",		LADDW, AORN,
4043e12c5d1SDavid du Colombier 	"ORNCC",	LADDW, AORNCC,
4053e12c5d1SDavid du Colombier 	"RESTORE",	LADDW, ARESTORE,
4063e12c5d1SDavid du Colombier 	"RETT",		LRETT, ARETT,
4073e12c5d1SDavid du Colombier 	"RETURN",	LRETRN, ARETURN,
4083e12c5d1SDavid du Colombier 	"SAVE",		LADDW, ASAVE,
4093e12c5d1SDavid du Colombier 	"SLL",		LADDW, ASLL,
4103e12c5d1SDavid du Colombier 	"SRA",		LADDW, ASRA,
4113e12c5d1SDavid du Colombier 	"SRL",		LADDW, ASRL,
4123e12c5d1SDavid du Colombier 	"SUB",		LADDW, ASUB,
4133e12c5d1SDavid du Colombier 	"SUBCC",	LADDW, ASUBCC,
4143e12c5d1SDavid du Colombier 	"SUBX",		LADDW, ASUBX,
4153e12c5d1SDavid du Colombier 	"SUBXCC",	LADDW, ASUBXCC,
4163e12c5d1SDavid du Colombier 	"SWAP",		LSWAP, ASWAP,
4173e12c5d1SDavid du Colombier 	"TA",		LTRAP, ATA,
4183e12c5d1SDavid du Colombier 	"TADDCC",	LADDW, ATADDCC,
4193e12c5d1SDavid du Colombier 	"TADDCCTV",	LADDW, ATADDCCTV,
4203e12c5d1SDavid du Colombier 	"TAS",		LSWAP, ATAS,
4213e12c5d1SDavid du Colombier 	"TCC",		LTRAP, ATCC,
4223e12c5d1SDavid du Colombier 	"TCS",		LTRAP, ATCS,
4233e12c5d1SDavid du Colombier 	"TE",		LTRAP, ATE,
4243e12c5d1SDavid du Colombier 	"TEXT",		LTEXT, ATEXT,
4253e12c5d1SDavid du Colombier 	"TG",		LTRAP, ATG,
4263e12c5d1SDavid du Colombier 	"TGE",		LTRAP, ATGE,
4273e12c5d1SDavid du Colombier 	"TGU",		LTRAP, ATGU,
4283e12c5d1SDavid du Colombier 	"TL",		LTRAP, ATL,
4293e12c5d1SDavid du Colombier 	"TLE",		LTRAP, ATLE,
4303e12c5d1SDavid du Colombier 	"TLEU",		LTRAP, ATLEU,
4313e12c5d1SDavid du Colombier 	"TN",		LTRAP, ATN,
4323e12c5d1SDavid du Colombier 	"TNE",		LTRAP, ATNE,
4333e12c5d1SDavid du Colombier 	"TNEG",		LTRAP, ATNEG,
4343e12c5d1SDavid du Colombier 	"TPOS",		LTRAP, ATPOS,
4353e12c5d1SDavid du Colombier 	"TSUBCC",	LADDW, ATSUBCC,
4363e12c5d1SDavid du Colombier 	"TSUBCCTV",	LADDW, ATSUBCCTV,
4373e12c5d1SDavid du Colombier 	"TVC",		LTRAP, ATVC,
4383e12c5d1SDavid du Colombier 	"TVS",		LTRAP, ATVS,
4393e12c5d1SDavid du Colombier 	"UNIMP",	LUNIMP, AUNIMP,
4403e12c5d1SDavid du Colombier 	"WORD",		LUNIMP, AWORD,
4413e12c5d1SDavid du Colombier 	"XNOR",		LADDW, AXNOR,
4423e12c5d1SDavid du Colombier 	"XNORCC",	LADDW, AXNORCC,
4433e12c5d1SDavid du Colombier 	"XOR",		LXORW, AXOR,
4443e12c5d1SDavid du Colombier 	"XORCC",	LADDW, AXORCC,
4453e12c5d1SDavid du Colombier 
446219b2ee8SDavid du Colombier 	"SCHED",	LSCHED, 0,
447219b2ee8SDavid du Colombier 	"NOSCHED",	LSCHED, 0x80,
448219b2ee8SDavid du Colombier 
4493e12c5d1SDavid du Colombier 	0
4503e12c5d1SDavid du Colombier };
4513e12c5d1SDavid du Colombier 
4523e12c5d1SDavid du Colombier void
cinit(void)4533e12c5d1SDavid du Colombier cinit(void)
4543e12c5d1SDavid du Colombier {
4553e12c5d1SDavid du Colombier 	Sym *s;
4563e12c5d1SDavid du Colombier 	int i;
4573e12c5d1SDavid du Colombier 
4583e12c5d1SDavid du Colombier 	nullgen.sym = S;
4593e12c5d1SDavid du Colombier 	nullgen.offset = 0;
4603e12c5d1SDavid du Colombier 	nullgen.type = D_NONE;
4613e12c5d1SDavid du Colombier 	nullgen.name = D_NONE;
4623e12c5d1SDavid du Colombier 	nullgen.reg = NREG;
4633e12c5d1SDavid du Colombier 	nullgen.xreg = NREG;
4643e12c5d1SDavid du Colombier 	if(FPCHIP)
4653e12c5d1SDavid du Colombier 		nullgen.dval = 0;
4663e12c5d1SDavid du Colombier 	for(i=0; i<sizeof(nullgen.sval); i++)
4673e12c5d1SDavid du Colombier 		nullgen.sval[i] = 0;
4683e12c5d1SDavid du Colombier 
4693e12c5d1SDavid du Colombier 	nerrors = 0;
4703e12c5d1SDavid du Colombier 	iostack = I;
4713e12c5d1SDavid du Colombier 	iofree = I;
4723e12c5d1SDavid du Colombier 	peekc = IGN;
4733e12c5d1SDavid du Colombier 	nhunk = 0;
4743e12c5d1SDavid du Colombier 	for(i=0; i<NHASH; i++)
4753e12c5d1SDavid du Colombier 		hash[i] = S;
4763e12c5d1SDavid du Colombier 	for(i=0; itab[i].name; i++) {
4773e12c5d1SDavid du Colombier 		s = slookup(itab[i].name);
4783e12c5d1SDavid du Colombier 		s->type = itab[i].type;
4793e12c5d1SDavid du Colombier 		s->value = itab[i].value;
4803e12c5d1SDavid du Colombier 	}
481219b2ee8SDavid du Colombier 
4827dd7cddfSDavid du Colombier 	pathname = allocn(pathname, 0, 100);
4837dd7cddfSDavid du Colombier 	if(mygetwd(pathname, 99) == 0) {
4847dd7cddfSDavid du Colombier 		pathname = allocn(pathname, 100, 900);
4857dd7cddfSDavid du Colombier 		if(mygetwd(pathname, 999) == 0)
486219b2ee8SDavid du Colombier 			strcpy(pathname, "/???");
487219b2ee8SDavid du Colombier 	}
4883e12c5d1SDavid du Colombier }
4893e12c5d1SDavid du Colombier 
4903e12c5d1SDavid du Colombier void
syminit(Sym * s)4913e12c5d1SDavid du Colombier syminit(Sym *s)
4923e12c5d1SDavid du Colombier {
4933e12c5d1SDavid du Colombier 
4943e12c5d1SDavid du Colombier 	s->type = LNAME;
4953e12c5d1SDavid du Colombier 	s->value = 0;
4963e12c5d1SDavid du Colombier }
4973e12c5d1SDavid du Colombier 
4983e12c5d1SDavid du Colombier void
cclean(void)4993e12c5d1SDavid du Colombier cclean(void)
5003e12c5d1SDavid du Colombier {
5013e12c5d1SDavid du Colombier 
5023e12c5d1SDavid du Colombier 	outcode(AEND, &nullgen, NREG, &nullgen);
5033e12c5d1SDavid du Colombier 	Bflush(&obuf);
5043e12c5d1SDavid du Colombier }
5053e12c5d1SDavid du Colombier 
5063e12c5d1SDavid du Colombier void
zname(char * n,int t,int s)5073e12c5d1SDavid du Colombier zname(char *n, int t, int s)
5083e12c5d1SDavid du Colombier {
5093e12c5d1SDavid du Colombier 
5103e12c5d1SDavid du Colombier 	Bputc(&obuf, ANAME);
5113e12c5d1SDavid du Colombier 	Bputc(&obuf, t);	/* type */
5123e12c5d1SDavid du Colombier 	Bputc(&obuf, s);	/* sym */
5133e12c5d1SDavid du Colombier 	while(*n) {
5143e12c5d1SDavid du Colombier 		Bputc(&obuf, *n);
5153e12c5d1SDavid du Colombier 		n++;
5163e12c5d1SDavid du Colombier 	}
5173e12c5d1SDavid du Colombier 	Bputc(&obuf, 0);
5183e12c5d1SDavid du Colombier }
5193e12c5d1SDavid du Colombier 
5203e12c5d1SDavid du Colombier void
zaddr(Gen * a,int s)5213e12c5d1SDavid du Colombier zaddr(Gen *a, int s)
5223e12c5d1SDavid du Colombier {
5233e12c5d1SDavid du Colombier 	long l;
5243e12c5d1SDavid du Colombier 	int i;
5253e12c5d1SDavid du Colombier 	char *n;
5263e12c5d1SDavid du Colombier 	Ieee e;
5273e12c5d1SDavid du Colombier 
5283e12c5d1SDavid du Colombier 	Bputc(&obuf, a->type);
5293e12c5d1SDavid du Colombier 	Bputc(&obuf, a->reg);
5303e12c5d1SDavid du Colombier 	Bputc(&obuf, s);
5313e12c5d1SDavid du Colombier 	Bputc(&obuf, a->name);
5323e12c5d1SDavid du Colombier 	switch(a->type) {
5333e12c5d1SDavid du Colombier 	default:
5343e12c5d1SDavid du Colombier 		print("unknown type %d\n", a->type);
5353e12c5d1SDavid du Colombier 		exits("arg");
5363e12c5d1SDavid du Colombier 
5373e12c5d1SDavid du Colombier 	case D_NONE:
5383e12c5d1SDavid du Colombier 	case D_REG:
5393e12c5d1SDavid du Colombier 	case D_FREG:
5403e12c5d1SDavid du Colombier 	case D_CREG:
5413e12c5d1SDavid du Colombier 	case D_PREG:
5423e12c5d1SDavid du Colombier 		break;
5433e12c5d1SDavid du Colombier 
5443e12c5d1SDavid du Colombier 	case D_OREG:
5453e12c5d1SDavid du Colombier 	case D_ASI:
5463e12c5d1SDavid du Colombier 	case D_CONST:
5473e12c5d1SDavid du Colombier 	case D_BRANCH:
5483e12c5d1SDavid du Colombier 		l = a->offset;
5493e12c5d1SDavid du Colombier 		Bputc(&obuf, l);
5503e12c5d1SDavid du Colombier 		Bputc(&obuf, l>>8);
5513e12c5d1SDavid du Colombier 		Bputc(&obuf, l>>16);
5523e12c5d1SDavid du Colombier 		Bputc(&obuf, l>>24);
5533e12c5d1SDavid du Colombier 		break;
5543e12c5d1SDavid du Colombier 
5553e12c5d1SDavid du Colombier 	case D_SCONST:
5563e12c5d1SDavid du Colombier 		n = a->sval;
5573e12c5d1SDavid du Colombier 		for(i=0; i<NSNAME; i++) {
5583e12c5d1SDavid du Colombier 			Bputc(&obuf, *n);
5593e12c5d1SDavid du Colombier 			n++;
5603e12c5d1SDavid du Colombier 		}
5613e12c5d1SDavid du Colombier 		break;
5623e12c5d1SDavid du Colombier 
5633e12c5d1SDavid du Colombier 	case D_FCONST:
5643e12c5d1SDavid du Colombier 		ieeedtod(&e, a->dval);
5653e12c5d1SDavid du Colombier 		Bputc(&obuf, e.l);
5663e12c5d1SDavid du Colombier 		Bputc(&obuf, e.l>>8);
5673e12c5d1SDavid du Colombier 		Bputc(&obuf, e.l>>16);
5683e12c5d1SDavid du Colombier 		Bputc(&obuf, e.l>>24);
5693e12c5d1SDavid du Colombier 		Bputc(&obuf, e.h);
5703e12c5d1SDavid du Colombier 		Bputc(&obuf, e.h>>8);
5713e12c5d1SDavid du Colombier 		Bputc(&obuf, e.h>>16);
5723e12c5d1SDavid du Colombier 		Bputc(&obuf, e.h>>24);
5733e12c5d1SDavid du Colombier 		break;
5743e12c5d1SDavid du Colombier 	}
5753e12c5d1SDavid du Colombier }
5763e12c5d1SDavid du Colombier 
5773e12c5d1SDavid du Colombier void
outcode(int a,Gen * g1,int reg,Gen * g2)5783e12c5d1SDavid du Colombier outcode(int a, Gen *g1, int reg, Gen *g2)
5793e12c5d1SDavid du Colombier {
5803e12c5d1SDavid du Colombier 	int sf, st, t;
5813e12c5d1SDavid du Colombier 	Sym *s;
5823e12c5d1SDavid du Colombier 
5833e12c5d1SDavid du Colombier 	if(pass == 1)
5843e12c5d1SDavid du Colombier 		goto out;
5853e12c5d1SDavid du Colombier 	if(g1->xreg != NREG) {
5863e12c5d1SDavid du Colombier 		if(reg != NREG || g2->xreg != NREG)
5873e12c5d1SDavid du Colombier 			yyerror("bad addressing modes");
5883e12c5d1SDavid du Colombier 		reg = g1->xreg;
5893e12c5d1SDavid du Colombier 	} else
5903e12c5d1SDavid du Colombier 	if(g2->xreg != NREG) {
5913e12c5d1SDavid du Colombier 		if(reg != NREG)
5923e12c5d1SDavid du Colombier 			yyerror("bad addressing modes");
5933e12c5d1SDavid du Colombier 		reg = g2->xreg;
5943e12c5d1SDavid du Colombier 	}
5953e12c5d1SDavid du Colombier jackpot:
5963e12c5d1SDavid du Colombier 	sf = 0;
5973e12c5d1SDavid du Colombier 	s = g1->sym;
5983e12c5d1SDavid du Colombier 	while(s != S) {
5993e12c5d1SDavid du Colombier 		sf = s->sym;
6003e12c5d1SDavid du Colombier 		if(sf < 0 || sf >= NSYM)
6013e12c5d1SDavid du Colombier 			sf = 0;
6023e12c5d1SDavid du Colombier 		t = g1->name;
6033e12c5d1SDavid du Colombier 		if(h[sf].type == t)
6043e12c5d1SDavid du Colombier 		if(h[sf].sym == s)
6053e12c5d1SDavid du Colombier 			break;
6063e12c5d1SDavid du Colombier 		zname(s->name, t, sym);
6073e12c5d1SDavid du Colombier 		s->sym = sym;
6083e12c5d1SDavid du Colombier 		h[sym].sym = s;
6093e12c5d1SDavid du Colombier 		h[sym].type = t;
6103e12c5d1SDavid du Colombier 		sf = sym;
6113e12c5d1SDavid du Colombier 		sym++;
6123e12c5d1SDavid du Colombier 		if(sym >= NSYM)
6133e12c5d1SDavid du Colombier 			sym = 1;
6143e12c5d1SDavid du Colombier 		break;
6153e12c5d1SDavid du Colombier 	}
6163e12c5d1SDavid du Colombier 	st = 0;
6173e12c5d1SDavid du Colombier 	s = g2->sym;
6183e12c5d1SDavid du Colombier 	while(s != S) {
6193e12c5d1SDavid du Colombier 		st = s->sym;
6203e12c5d1SDavid du Colombier 		if(st < 0 || st >= NSYM)
6213e12c5d1SDavid du Colombier 			st = 0;
6223e12c5d1SDavid du Colombier 		t = g2->name;
6233e12c5d1SDavid du Colombier 		if(h[st].type == t)
6243e12c5d1SDavid du Colombier 		if(h[st].sym == s)
6253e12c5d1SDavid du Colombier 			break;
6263e12c5d1SDavid du Colombier 		zname(s->name, t, sym);
6273e12c5d1SDavid du Colombier 		s->sym = sym;
6283e12c5d1SDavid du Colombier 		h[sym].sym = s;
6293e12c5d1SDavid du Colombier 		h[sym].type = t;
6303e12c5d1SDavid du Colombier 		st = sym;
6313e12c5d1SDavid du Colombier 		sym++;
6323e12c5d1SDavid du Colombier 		if(sym >= NSYM)
6333e12c5d1SDavid du Colombier 			sym = 1;
6343e12c5d1SDavid du Colombier 		if(st == sf)
6353e12c5d1SDavid du Colombier 			goto jackpot;
6363e12c5d1SDavid du Colombier 		break;
6373e12c5d1SDavid du Colombier 	}
6383e12c5d1SDavid du Colombier 	Bputc(&obuf, a);
639219b2ee8SDavid du Colombier 	Bputc(&obuf, reg|nosched);
6403e12c5d1SDavid du Colombier 	Bputc(&obuf, lineno);
6413e12c5d1SDavid du Colombier 	Bputc(&obuf, lineno>>8);
6423e12c5d1SDavid du Colombier 	Bputc(&obuf, lineno>>16);
6433e12c5d1SDavid du Colombier 	Bputc(&obuf, lineno>>24);
6443e12c5d1SDavid du Colombier 	zaddr(g1, sf);
6453e12c5d1SDavid du Colombier 	zaddr(g2, st);
6463e12c5d1SDavid du Colombier 
6473e12c5d1SDavid du Colombier out:
6483e12c5d1SDavid du Colombier 	if(a != AGLOBL && a != ADATA)
6493e12c5d1SDavid du Colombier 		pc++;
6503e12c5d1SDavid du Colombier }
6513e12c5d1SDavid du Colombier 
6523e12c5d1SDavid du Colombier void
outhist(void)6533e12c5d1SDavid du Colombier outhist(void)
6543e12c5d1SDavid du Colombier {
6553e12c5d1SDavid du Colombier 	Gen g;
6563e12c5d1SDavid du Colombier 	Hist *h;
6577dd7cddfSDavid du Colombier 	char *p, *q, *op, c;
6583e12c5d1SDavid du Colombier 	int n;
6593e12c5d1SDavid du Colombier 
6603e12c5d1SDavid du Colombier 	g = nullgen;
6617dd7cddfSDavid du Colombier 	c = pathchar();
6623e12c5d1SDavid du Colombier 	for(h = hist; h != H; h = h->link) {
6633e12c5d1SDavid du Colombier 		p = h->name;
664219b2ee8SDavid du Colombier 		op = 0;
665*375daca8SDavid du Colombier 		/* on windows skip drive specifier in pathname */
666*375daca8SDavid du Colombier 		if(systemtype(Windows) && p && p[1] == ':'){
667*375daca8SDavid du Colombier 			p += 2;
668*375daca8SDavid du Colombier 			c = *p;
669*375daca8SDavid du Colombier 		}
6707dd7cddfSDavid du Colombier 		if(p && p[0] != c && h->offset == 0 && pathname){
6717dd7cddfSDavid du Colombier 			/* on windows skip drive specifier in pathname */
672*375daca8SDavid du Colombier 			if(systemtype(Windows) && pathname[1] == ':') {
6737dd7cddfSDavid du Colombier 				op = p;
6747dd7cddfSDavid du Colombier 				p = pathname+2;
675*375daca8SDavid du Colombier 				c = *p;
6767dd7cddfSDavid du Colombier 			} else if(pathname[0] == c){
677219b2ee8SDavid du Colombier 				op = p;
678219b2ee8SDavid du Colombier 				p = pathname;
679219b2ee8SDavid du Colombier 			}
6807dd7cddfSDavid du Colombier 		}
6813e12c5d1SDavid du Colombier 		while(p) {
6827dd7cddfSDavid du Colombier 			q = strchr(p, c);
6833e12c5d1SDavid du Colombier 			if(q) {
6843e12c5d1SDavid du Colombier 				n = q-p;
685*375daca8SDavid du Colombier 				if(n == 0){
6863e12c5d1SDavid du Colombier 					n = 1;	/* leading "/" */
687*375daca8SDavid du Colombier 					*p = '/';	/* don't emit "\" on windows */
688*375daca8SDavid du Colombier 				}
6893e12c5d1SDavid du Colombier 				q++;
6903e12c5d1SDavid du Colombier 			} else {
6913e12c5d1SDavid du Colombier 				n = strlen(p);
6923e12c5d1SDavid du Colombier 				q = 0;
6933e12c5d1SDavid du Colombier 			}
6943e12c5d1SDavid du Colombier 			if(n) {
695219b2ee8SDavid du Colombier 				Bputc(&obuf, ANAME);
696219b2ee8SDavid du Colombier 				Bputc(&obuf, D_FILE);	/* type */
697219b2ee8SDavid du Colombier 				Bputc(&obuf, 1);	/* sym */
698219b2ee8SDavid du Colombier 				Bputc(&obuf, '<');
699219b2ee8SDavid du Colombier 				Bwrite(&obuf, p, n);
700219b2ee8SDavid du Colombier 				Bputc(&obuf, 0);
7013e12c5d1SDavid du Colombier 			}
7023e12c5d1SDavid du Colombier 			p = q;
703219b2ee8SDavid du Colombier 			if(p == 0 && op) {
704219b2ee8SDavid du Colombier 				p = op;
705219b2ee8SDavid du Colombier 				op = 0;
706219b2ee8SDavid du Colombier 			}
7073e12c5d1SDavid du Colombier 		}
7083e12c5d1SDavid du Colombier 		g.offset = h->offset;
7093e12c5d1SDavid du Colombier 
7103e12c5d1SDavid du Colombier 		Bputc(&obuf, AHISTORY);
7113e12c5d1SDavid du Colombier 		Bputc(&obuf, 0);
7123e12c5d1SDavid du Colombier 		Bputc(&obuf, h->line);
7133e12c5d1SDavid du Colombier 		Bputc(&obuf, h->line>>8);
7143e12c5d1SDavid du Colombier 		Bputc(&obuf, h->line>>16);
7153e12c5d1SDavid du Colombier 		Bputc(&obuf, h->line>>24);
7163e12c5d1SDavid du Colombier 		zaddr(&nullgen, 0);
7173e12c5d1SDavid du Colombier 		zaddr(&g, 0);
7183e12c5d1SDavid du Colombier 	}
7193e12c5d1SDavid du Colombier }
7203e12c5d1SDavid du Colombier 
7213e12c5d1SDavid du Colombier #include "../cc/lexbody"
7223e12c5d1SDavid du Colombier #include "../cc/macbody"
7237dd7cddfSDavid du Colombier #include "../cc/compat"
724