xref: /plan9/sys/src/cmd/8c/list.c (revision d732d567c38c130b701a05ab49fb3e82d13c92b6)
17dd7cddfSDavid du Colombier #define EXTERN
23e12c5d1SDavid du Colombier #include "gc.h"
33e12c5d1SDavid du Colombier 
43e12c5d1SDavid du Colombier void
listinit(void)53e12c5d1SDavid du Colombier listinit(void)
63e12c5d1SDavid du Colombier {
73e12c5d1SDavid du Colombier 
83e12c5d1SDavid du Colombier 	fmtinstall('A', Aconv);
97dd7cddfSDavid du Colombier 	fmtinstall('B', Bconv);
103e12c5d1SDavid du Colombier 	fmtinstall('P', Pconv);
113e12c5d1SDavid du Colombier 	fmtinstall('S', Sconv);
123e12c5d1SDavid du Colombier 	fmtinstall('D', Dconv);
133e12c5d1SDavid du Colombier 	fmtinstall('R', Rconv);
143e12c5d1SDavid du Colombier }
153e12c5d1SDavid du Colombier 
163e12c5d1SDavid du Colombier int
Bconv(Fmt * fp)179a747e4fSDavid du Colombier Bconv(Fmt *fp)
187dd7cddfSDavid du Colombier {
197dd7cddfSDavid du Colombier 	char str[STRINGSZ], ss[STRINGSZ], *s;
207dd7cddfSDavid du Colombier 	Bits bits;
217dd7cddfSDavid du Colombier 	int i;
227dd7cddfSDavid du Colombier 
237dd7cddfSDavid du Colombier 	str[0] = 0;
249a747e4fSDavid du Colombier 	bits = va_arg(fp->args, Bits);
257dd7cddfSDavid du Colombier 	while(bany(&bits)) {
267dd7cddfSDavid du Colombier 		i = bnum(bits);
277dd7cddfSDavid du Colombier 		if(str[0])
287dd7cddfSDavid du Colombier 			strcat(str, " ");
297dd7cddfSDavid du Colombier 		if(var[i].sym == S) {
30*d732d567SDavid du Colombier 			snprint(ss, sizeof(ss), "$%ld", var[i].offset);
317dd7cddfSDavid du Colombier 			s = ss;
327dd7cddfSDavid du Colombier 		} else
337dd7cddfSDavid du Colombier 			s = var[i].sym->name;
347dd7cddfSDavid du Colombier 		if(strlen(str) + strlen(s) + 1 >= STRINGSZ)
357dd7cddfSDavid du Colombier 			break;
367dd7cddfSDavid du Colombier 		strcat(str, s);
377dd7cddfSDavid du Colombier 		bits.b[i/32] &= ~(1L << (i%32));
387dd7cddfSDavid du Colombier 	}
399a747e4fSDavid du Colombier 	return fmtstrcpy(fp, str);
407dd7cddfSDavid du Colombier }
417dd7cddfSDavid du Colombier 
427dd7cddfSDavid du Colombier int
Pconv(Fmt * fp)439a747e4fSDavid du Colombier Pconv(Fmt *fp)
443e12c5d1SDavid du Colombier {
453e12c5d1SDavid du Colombier 	char str[STRINGSZ];
463e12c5d1SDavid du Colombier 	Prog *p;
473e12c5d1SDavid du Colombier 
489a747e4fSDavid du Colombier 	p = va_arg(fp->args, Prog*);
493e12c5d1SDavid du Colombier 	if(p->as == ADATA)
50*d732d567SDavid du Colombier 		snprint(str, sizeof(str), "	%A	%D/%d,%D",
51219b2ee8SDavid du Colombier 			p->as, &p->from, p->from.scale, &p->to);
52e288d156SDavid du Colombier 	else if(p->as == ATEXT)
53*d732d567SDavid du Colombier 		snprint(str, sizeof(str), "	%A	%D,%d,%D",
54e288d156SDavid du Colombier 			p->as, &p->from, p->from.scale, &p->to);
553e12c5d1SDavid du Colombier 	else
56*d732d567SDavid du Colombier 		snprint(str, sizeof(str), "	%A	%D,%D",
57219b2ee8SDavid du Colombier 			p->as, &p->from, &p->to);
589a747e4fSDavid du Colombier 	return fmtstrcpy(fp, str);
593e12c5d1SDavid du Colombier }
603e12c5d1SDavid du Colombier 
613e12c5d1SDavid du Colombier int
Aconv(Fmt * fp)629a747e4fSDavid du Colombier Aconv(Fmt *fp)
633e12c5d1SDavid du Colombier {
643e12c5d1SDavid du Colombier 	int i;
653e12c5d1SDavid du Colombier 
669a747e4fSDavid du Colombier 	i = va_arg(fp->args, int);
679a747e4fSDavid du Colombier 	return fmtstrcpy(fp, anames[i]);
683e12c5d1SDavid du Colombier }
693e12c5d1SDavid du Colombier 
703e12c5d1SDavid du Colombier int
Dconv(Fmt * fp)719a747e4fSDavid du Colombier Dconv(Fmt *fp)
723e12c5d1SDavid du Colombier {
733e12c5d1SDavid du Colombier 	char str[40], s[20];
743e12c5d1SDavid du Colombier 	Adr *a;
753e12c5d1SDavid du Colombier 	int i;
763e12c5d1SDavid du Colombier 
779a747e4fSDavid du Colombier 	a = va_arg(fp->args, Adr*);
783e12c5d1SDavid du Colombier 	i = a->type;
793e12c5d1SDavid du Colombier 	if(i >= D_INDIR) {
803e12c5d1SDavid du Colombier 		if(a->offset)
81*d732d567SDavid du Colombier 			snprint(str, sizeof(str), "%ld(%R)", a->offset, i-D_INDIR);
823e12c5d1SDavid du Colombier 		else
83*d732d567SDavid du Colombier 			snprint(str, sizeof(str), "(%R)", i-D_INDIR);
843e12c5d1SDavid du Colombier 		goto brk;
853e12c5d1SDavid du Colombier 	}
863e12c5d1SDavid du Colombier 	switch(i) {
873e12c5d1SDavid du Colombier 
883e12c5d1SDavid du Colombier 	default:
893e12c5d1SDavid du Colombier 		if(a->offset)
90*d732d567SDavid du Colombier 			snprint(str, sizeof(str), "$%ld,%R", a->offset, i);
913e12c5d1SDavid du Colombier 		else
92*d732d567SDavid du Colombier 			snprint(str, sizeof(str), "%R", i);
933e12c5d1SDavid du Colombier 		break;
943e12c5d1SDavid du Colombier 
953e12c5d1SDavid du Colombier 	case D_NONE:
963e12c5d1SDavid du Colombier 		str[0] = 0;
973e12c5d1SDavid du Colombier 		break;
983e12c5d1SDavid du Colombier 
993e12c5d1SDavid du Colombier 	case D_BRANCH:
100*d732d567SDavid du Colombier 		snprint(str, sizeof(str), "%ld(PC)", a->offset-pc);
1013e12c5d1SDavid du Colombier 		break;
1023e12c5d1SDavid du Colombier 
1033e12c5d1SDavid du Colombier 	case D_EXTERN:
104*d732d567SDavid du Colombier 		snprint(str, sizeof(str), "%s+%ld(SB)", a->sym->name, a->offset);
1053e12c5d1SDavid du Colombier 		break;
1063e12c5d1SDavid du Colombier 
1073e12c5d1SDavid du Colombier 	case D_STATIC:
108*d732d567SDavid du Colombier 		snprint(str, sizeof(str), "%s<>+%ld(SB)", a->sym->name,
1093e12c5d1SDavid du Colombier 			a->offset);
1103e12c5d1SDavid du Colombier 		break;
1113e12c5d1SDavid du Colombier 
1123e12c5d1SDavid du Colombier 	case D_AUTO:
113*d732d567SDavid du Colombier 		snprint(str, sizeof(str), "%s+%ld(SP)", a->sym->name, a->offset);
1143e12c5d1SDavid du Colombier 		break;
1153e12c5d1SDavid du Colombier 
1163e12c5d1SDavid du Colombier 	case D_PARAM:
1173e12c5d1SDavid du Colombier 		if(a->sym)
118*d732d567SDavid du Colombier 			snprint(str, sizeof(str), "%s+%ld(FP)", a->sym->name, a->offset);
1193e12c5d1SDavid du Colombier 		else
120*d732d567SDavid du Colombier 			snprint(str, sizeof(str), "%ld(FP)", a->offset);
1213e12c5d1SDavid du Colombier 		break;
1223e12c5d1SDavid du Colombier 
1233e12c5d1SDavid du Colombier 	case D_CONST:
124*d732d567SDavid du Colombier 		snprint(str, sizeof(str), "$%ld", a->offset);
1253e12c5d1SDavid du Colombier 		break;
1263e12c5d1SDavid du Colombier 
1273e12c5d1SDavid du Colombier 	case D_FCONST:
128*d732d567SDavid du Colombier 		snprint(str, sizeof(str), "$(%.17e)", a->dval);
1293e12c5d1SDavid du Colombier 		break;
1303e12c5d1SDavid du Colombier 
1313e12c5d1SDavid du Colombier 	case D_SCONST:
132*d732d567SDavid du Colombier 		snprint(str, sizeof(str), "$\"%S\"", a->sval);
1333e12c5d1SDavid du Colombier 		break;
1343e12c5d1SDavid du Colombier 
1353e12c5d1SDavid du Colombier 	case D_ADDR:
1363e12c5d1SDavid du Colombier 		a->type = a->index;
1373e12c5d1SDavid du Colombier 		a->index = D_NONE;
138*d732d567SDavid du Colombier 		snprint(str, sizeof(str), "$%D", a);
1393e12c5d1SDavid du Colombier 		a->index = a->type;
1403e12c5d1SDavid du Colombier 		a->type = D_ADDR;
1413e12c5d1SDavid du Colombier 		goto conv;
1423e12c5d1SDavid du Colombier 	}
1433e12c5d1SDavid du Colombier brk:
1443e12c5d1SDavid du Colombier 	if(a->index != D_NONE) {
145*d732d567SDavid du Colombier 		fmtstrcpy(fp, str);
146*d732d567SDavid du Colombier 		snprint(s, sizeof(s), "(%R*%d)", (int)a->index, (int)a->scale);
147*d732d567SDavid du Colombier 		return fmtstrcpy(fp, s);
1483e12c5d1SDavid du Colombier 	}
1493e12c5d1SDavid du Colombier conv:
1509a747e4fSDavid du Colombier 	return fmtstrcpy(fp, str);
1513e12c5d1SDavid du Colombier }
1523e12c5d1SDavid du Colombier 
1533e12c5d1SDavid du Colombier char*	regstr[] =
1543e12c5d1SDavid du Colombier {
1557dd7cddfSDavid du Colombier 	"AL",	/*[D_AL]*/
1563e12c5d1SDavid du Colombier 	"CL",
1573e12c5d1SDavid du Colombier 	"DL",
1583e12c5d1SDavid du Colombier 	"BL",
1593e12c5d1SDavid du Colombier 	"AH",
1603e12c5d1SDavid du Colombier 	"CH",
1613e12c5d1SDavid du Colombier 	"DH",
1623e12c5d1SDavid du Colombier 	"BH",
1633e12c5d1SDavid du Colombier 
1647dd7cddfSDavid du Colombier 	"AX",	/*[D_AX]*/
1653e12c5d1SDavid du Colombier 	"CX",
1663e12c5d1SDavid du Colombier 	"DX",
1673e12c5d1SDavid du Colombier 	"BX",
1683e12c5d1SDavid du Colombier 	"SP",
1693e12c5d1SDavid du Colombier 	"BP",
1703e12c5d1SDavid du Colombier 	"SI",
1713e12c5d1SDavid du Colombier 	"DI",
1723e12c5d1SDavid du Colombier 
1737dd7cddfSDavid du Colombier 	"F0",	/*[D_F0]*/
1743e12c5d1SDavid du Colombier 	"F1",
1753e12c5d1SDavid du Colombier 	"F2",
1763e12c5d1SDavid du Colombier 	"F3",
1773e12c5d1SDavid du Colombier 	"F4",
1783e12c5d1SDavid du Colombier 	"F5",
1793e12c5d1SDavid du Colombier 	"F6",
1803e12c5d1SDavid du Colombier 	"F7",
1813e12c5d1SDavid du Colombier 
1827dd7cddfSDavid du Colombier 	"CS",	/*[D_CS]*/
1833e12c5d1SDavid du Colombier 	"SS",
1843e12c5d1SDavid du Colombier 	"DS",
1853e12c5d1SDavid du Colombier 	"ES",
1863e12c5d1SDavid du Colombier 	"FS",
1873e12c5d1SDavid du Colombier 	"GS",
1883e12c5d1SDavid du Colombier 
1897dd7cddfSDavid du Colombier 	"GDTR",	/*[D_GDTR]*/
1907dd7cddfSDavid du Colombier 	"IDTR",	/*[D_IDTR]*/
1917dd7cddfSDavid du Colombier 	"LDTR",	/*[D_LDTR]*/
1927dd7cddfSDavid du Colombier 	"MSW",	/*[D_MSW] */
1937dd7cddfSDavid du Colombier 	"TASK",	/*[D_TASK]*/
1943e12c5d1SDavid du Colombier 
1957dd7cddfSDavid du Colombier 	"CR0",	/*[D_CR]*/
1963e12c5d1SDavid du Colombier 	"CR1",
1973e12c5d1SDavid du Colombier 	"CR2",
1983e12c5d1SDavid du Colombier 	"CR3",
1993e12c5d1SDavid du Colombier 	"CR4",
2003e12c5d1SDavid du Colombier 	"CR5",
2013e12c5d1SDavid du Colombier 	"CR6",
2023e12c5d1SDavid du Colombier 	"CR7",
2033e12c5d1SDavid du Colombier 
2047dd7cddfSDavid du Colombier 	"DR0",	/*[D_DR]*/
2053e12c5d1SDavid du Colombier 	"DR1",
2063e12c5d1SDavid du Colombier 	"DR2",
2073e12c5d1SDavid du Colombier 	"DR3",
2083e12c5d1SDavid du Colombier 	"DR4",
2093e12c5d1SDavid du Colombier 	"DR5",
2103e12c5d1SDavid du Colombier 	"DR6",
2113e12c5d1SDavid du Colombier 	"DR7",
2123e12c5d1SDavid du Colombier 
2137dd7cddfSDavid du Colombier 	"TR0",	/*[D_TR]*/
2143e12c5d1SDavid du Colombier 	"TR1",
2153e12c5d1SDavid du Colombier 	"TR2",
2163e12c5d1SDavid du Colombier 	"TR3",
2173e12c5d1SDavid du Colombier 	"TR4",
2183e12c5d1SDavid du Colombier 	"TR5",
2193e12c5d1SDavid du Colombier 	"TR6",
2203e12c5d1SDavid du Colombier 	"TR7",
2213e12c5d1SDavid du Colombier 
2227dd7cddfSDavid du Colombier 	"NONE",	/*[D_NONE]*/
2233e12c5d1SDavid du Colombier };
2243e12c5d1SDavid du Colombier 
2253e12c5d1SDavid du Colombier int
Rconv(Fmt * fp)2269a747e4fSDavid du Colombier Rconv(Fmt *fp)
2273e12c5d1SDavid du Colombier {
2283e12c5d1SDavid du Colombier 	char str[20];
2293e12c5d1SDavid du Colombier 	int r;
2303e12c5d1SDavid du Colombier 
2319a747e4fSDavid du Colombier 	r = va_arg(fp->args, int);
2323e12c5d1SDavid du Colombier 	if(r >= D_AL && r <= D_NONE)
233*d732d567SDavid du Colombier 		snprint(str, sizeof(str), "%s", regstr[r-D_AL]);
2343e12c5d1SDavid du Colombier 	else
235*d732d567SDavid du Colombier 		snprint(str, sizeof(str), "gok(%d)", r);
2363e12c5d1SDavid du Colombier 
2379a747e4fSDavid du Colombier 	return fmtstrcpy(fp, str);
2383e12c5d1SDavid du Colombier }
2393e12c5d1SDavid du Colombier 
2403e12c5d1SDavid du Colombier int
Sconv(Fmt * fp)2419a747e4fSDavid du Colombier Sconv(Fmt *fp)
2423e12c5d1SDavid du Colombier {
2433e12c5d1SDavid du Colombier 	int i, c;
2443e12c5d1SDavid du Colombier 	char str[30], *p, *a;
2453e12c5d1SDavid du Colombier 
2469a747e4fSDavid du Colombier 	a = va_arg(fp->args, char*);
2473e12c5d1SDavid du Colombier 	p = str;
2483e12c5d1SDavid du Colombier 	for(i=0; i<sizeof(double); i++) {
2493e12c5d1SDavid du Colombier 		c = a[i] & 0xff;
2503e12c5d1SDavid du Colombier 		if(c >= 'a' && c <= 'z' ||
2513e12c5d1SDavid du Colombier 		   c >= 'A' && c <= 'Z' ||
2523e12c5d1SDavid du Colombier 		   c >= '0' && c <= '9') {
2533e12c5d1SDavid du Colombier 			*p++ = c;
2543e12c5d1SDavid du Colombier 			continue;
2553e12c5d1SDavid du Colombier 		}
2563e12c5d1SDavid du Colombier 		*p++ = '\\';
2573e12c5d1SDavid du Colombier 		switch(c) {
2583e12c5d1SDavid du Colombier 		default:
2593e12c5d1SDavid du Colombier 			if(c < 040 || c >= 0177)
2603e12c5d1SDavid du Colombier 				break;	/* not portable */
2613e12c5d1SDavid du Colombier 			p[-1] = c;
2623e12c5d1SDavid du Colombier 			continue;
2633e12c5d1SDavid du Colombier 		case 0:
2643e12c5d1SDavid du Colombier 			*p++ = 'z';
2653e12c5d1SDavid du Colombier 			continue;
2663e12c5d1SDavid du Colombier 		case '\\':
2673e12c5d1SDavid du Colombier 		case '"':
2683e12c5d1SDavid du Colombier 			*p++ = c;
2693e12c5d1SDavid du Colombier 			continue;
2703e12c5d1SDavid du Colombier 		case '\n':
2713e12c5d1SDavid du Colombier 			*p++ = 'n';
2723e12c5d1SDavid du Colombier 			continue;
2733e12c5d1SDavid du Colombier 		case '\t':
2743e12c5d1SDavid du Colombier 			*p++ = 't';
2753e12c5d1SDavid du Colombier 			continue;
2763e12c5d1SDavid du Colombier 		}
2773e12c5d1SDavid du Colombier 		*p++ = (c>>6) + '0';
2783e12c5d1SDavid du Colombier 		*p++ = ((c>>3) & 7) + '0';
2793e12c5d1SDavid du Colombier 		*p++ = (c & 7) + '0';
2803e12c5d1SDavid du Colombier 	}
2813e12c5d1SDavid du Colombier 	*p = 0;
2829a747e4fSDavid du Colombier 	return fmtstrcpy(fp, str);
2833e12c5d1SDavid du Colombier }
284