xref: /plan9-contrib/sys/src/cmd/4c/list.c (revision f8bc6aaf8056e137bcdfb6117a990ac3eff62cc9)
17edc7532SDavid du Colombier #define EXTERN
27edc7532SDavid du Colombier #include "gc.h"
37edc7532SDavid du Colombier 
47edc7532SDavid du Colombier void
listinit(void)57edc7532SDavid du Colombier listinit(void)
67edc7532SDavid du Colombier {
77edc7532SDavid du Colombier 	fmtinstall('A', Aconv);
87edc7532SDavid du Colombier 	fmtinstall('P', Pconv);
97edc7532SDavid du Colombier 	fmtinstall('S', Sconv);
107edc7532SDavid du Colombier 	fmtinstall('N', Nconv);
117edc7532SDavid du Colombier 	fmtinstall('B', Bconv);
127edc7532SDavid du Colombier 	fmtinstall('D', Dconv);
137edc7532SDavid du Colombier }
147edc7532SDavid du Colombier 
157edc7532SDavid du Colombier int
Bconv(Fmt * fp)167edc7532SDavid du Colombier Bconv(Fmt *fp)
177edc7532SDavid du Colombier {
187edc7532SDavid du Colombier 	char str[STRINGSZ], ss[STRINGSZ], *s;
197edc7532SDavid du Colombier 	Bits bits;
207edc7532SDavid du Colombier 	int i;
217edc7532SDavid du Colombier 
227edc7532SDavid du Colombier 	str[0] = 0;
237edc7532SDavid du Colombier 	bits = va_arg(fp->args, Bits);
247edc7532SDavid du Colombier 	while(bany(&bits)) {
257edc7532SDavid du Colombier 		i = bnum(bits);
267edc7532SDavid du Colombier 		if(str[0])
277edc7532SDavid du Colombier 			strcat(str, " ");
287edc7532SDavid du Colombier 		if(var[i].sym == S) {
297edc7532SDavid du Colombier 			sprint(ss, "$%ld", var[i].offset);
307edc7532SDavid du Colombier 			s = ss;
317edc7532SDavid du Colombier 		} else
327edc7532SDavid du Colombier 			s = var[i].sym->name;
337edc7532SDavid du Colombier 		if(strlen(str) + strlen(s) + 1 >= STRINGSZ)
347edc7532SDavid du Colombier 			break;
357edc7532SDavid du Colombier 		strcat(str, s);
367edc7532SDavid du Colombier 		bits.b[i/32] &= ~(1L << (i%32));
377edc7532SDavid du Colombier 	}
387edc7532SDavid du Colombier 	return fmtstrcpy(fp, str);
397edc7532SDavid du Colombier }
407edc7532SDavid du Colombier 
417edc7532SDavid du Colombier int
Pconv(Fmt * fp)427edc7532SDavid du Colombier Pconv(Fmt *fp)
437edc7532SDavid du Colombier {
447edc7532SDavid du Colombier 	char str[STRINGSZ];
457edc7532SDavid du Colombier 	Prog *p;
467edc7532SDavid du Colombier 	int a;
477edc7532SDavid du Colombier 
487edc7532SDavid du Colombier 	p = va_arg(fp->args, Prog*);
497edc7532SDavid du Colombier 	a = p->as;
507edc7532SDavid du Colombier 	if(a == ADATA)
517edc7532SDavid du Colombier 		sprint(str, "	%A	%D/%d,%D", a, &p->from, p->reg, &p->to);
527edc7532SDavid du Colombier 	else
537edc7532SDavid du Colombier 	if(p->as == ATEXT)
547edc7532SDavid du Colombier 		sprint(str, "	%A	%D,%d,%D", a, &p->from, p->reg, &p->to);
557edc7532SDavid du Colombier 	else
567edc7532SDavid du Colombier 	if(p->reg == NREG)
577edc7532SDavid du Colombier 		sprint(str, "	%A	%D,%D", a, &p->from, &p->to);
587edc7532SDavid du Colombier 	else
597edc7532SDavid du Colombier 	if(p->from.type != D_FREG)
607edc7532SDavid du Colombier 		sprint(str, "	%A	%D,R%d,%D", a, &p->from, p->reg, &p->to);
617edc7532SDavid du Colombier 	else
627edc7532SDavid du Colombier 		sprint(str, "	%A	%D,F%d,%D", a, &p->from, p->reg, &p->to);
637edc7532SDavid du Colombier 	return fmtstrcpy(fp, str);
647edc7532SDavid du Colombier }
657edc7532SDavid du Colombier 
667edc7532SDavid du Colombier int
Aconv(Fmt * fp)677edc7532SDavid du Colombier Aconv(Fmt *fp)
687edc7532SDavid du Colombier {
697edc7532SDavid du Colombier 	char *s;
707edc7532SDavid du Colombier 	int a;
717edc7532SDavid du Colombier 
727edc7532SDavid du Colombier 	a = va_arg(fp->args, int);
737edc7532SDavid du Colombier 	s = "???";
747edc7532SDavid du Colombier 	if(a >= AXXX && a < ALAST)
757edc7532SDavid du Colombier 		s = anames[a];
767edc7532SDavid du Colombier 	return fmtstrcpy(fp, s);
777edc7532SDavid du Colombier }
787edc7532SDavid du Colombier 
797edc7532SDavid du Colombier int
Dconv(Fmt * fp)807edc7532SDavid du Colombier Dconv(Fmt *fp)
817edc7532SDavid du Colombier {
827edc7532SDavid du Colombier 	char str[STRINGSZ];
837edc7532SDavid du Colombier 	Adr *a;
847edc7532SDavid du Colombier 
857edc7532SDavid du Colombier 	a = va_arg(fp->args, Adr*);
867edc7532SDavid du Colombier 	switch(a->type) {
877edc7532SDavid du Colombier 
887edc7532SDavid du Colombier 	default:
897edc7532SDavid du Colombier 		sprint(str, "GOK-type(%d)", a->type);
907edc7532SDavid du Colombier 		break;
917edc7532SDavid du Colombier 
927edc7532SDavid du Colombier 	case D_NONE:
937edc7532SDavid du Colombier 		str[0] = 0;
947edc7532SDavid du Colombier 		if(a->name != D_NONE || a->reg != NREG || a->sym != S)
957edc7532SDavid du Colombier 			sprint(str, "%N(R%d)(NONE)", a, a->reg);
967edc7532SDavid du Colombier 		break;
977edc7532SDavid du Colombier 
987edc7532SDavid du Colombier 	case D_CONST:
997edc7532SDavid du Colombier 		if(a->reg != NREG)
1007edc7532SDavid du Colombier 			sprint(str, "$%N(R%d)", a, a->reg);
1017edc7532SDavid du Colombier 		else
1027edc7532SDavid du Colombier 			sprint(str, "$%N", a);
1037edc7532SDavid du Colombier 		break;
1047edc7532SDavid du Colombier 
1057edc7532SDavid du Colombier 	case D_OREG:
1067edc7532SDavid du Colombier 		if(a->reg != NREG)
1077edc7532SDavid du Colombier 			sprint(str, "%N(R%d)", a, a->reg);
1087edc7532SDavid du Colombier 		else
1097edc7532SDavid du Colombier 			sprint(str, "%N", a);
1107edc7532SDavid du Colombier 		break;
1117edc7532SDavid du Colombier 
1127edc7532SDavid du Colombier 	case D_REG:
1137edc7532SDavid du Colombier 		sprint(str, "R%d", a->reg);
1147edc7532SDavid du Colombier 		if(a->name != D_NONE || a->sym != S)
1157edc7532SDavid du Colombier 			sprint(str, "%N(R%d)(REG)", a, a->reg);
1167edc7532SDavid du Colombier 		break;
1177edc7532SDavid du Colombier 
1187edc7532SDavid du Colombier 	case D_FREG:
1197edc7532SDavid du Colombier 		sprint(str, "F%d", a->reg);
1207edc7532SDavid du Colombier 		if(a->name != D_NONE || a->sym != S)
1217edc7532SDavid du Colombier 			sprint(str, "%N(R%d)(REG)", a, a->reg);
1227edc7532SDavid du Colombier 		break;
1237edc7532SDavid du Colombier 
1247edc7532SDavid du Colombier 	case D_FCREG:
1257edc7532SDavid du Colombier 		sprint(str, "FCR%d", a->reg);
1267edc7532SDavid du Colombier 		if(a->name != D_NONE || a->sym != S)
1277edc7532SDavid du Colombier 			sprint(str, "%N(R%d)(REG)", a, a->reg);
1287edc7532SDavid du Colombier 		break;
1297edc7532SDavid du Colombier 
1307edc7532SDavid du Colombier 	case D_LO:
1317edc7532SDavid du Colombier 		sprint(str, "LO");
1327edc7532SDavid du Colombier 		if(a->name != D_NONE || a->sym != S)
1337edc7532SDavid du Colombier 			sprint(str, "%N(LO)(REG)", a);
1347edc7532SDavid du Colombier 		break;
1357edc7532SDavid du Colombier 
1367edc7532SDavid du Colombier 	case D_HI:
1377edc7532SDavid du Colombier 		sprint(str, "HI");
1387edc7532SDavid du Colombier 		if(a->name != D_NONE || a->sym != S)
1397edc7532SDavid du Colombier 			sprint(str, "%N(HI)(REG)", a);
1407edc7532SDavid du Colombier 		break;
1417edc7532SDavid du Colombier 
1427edc7532SDavid du Colombier 	case D_BRANCH:
1437edc7532SDavid du Colombier 		sprint(str, "%lld(PC)", a->offset-pc);
1447edc7532SDavid du Colombier 		break;
1457edc7532SDavid du Colombier 
1467edc7532SDavid du Colombier 	case D_FCONST:
1477edc7532SDavid du Colombier 		sprint(str, "$%.17e", a->dval);
1487edc7532SDavid du Colombier 		break;
1497edc7532SDavid du Colombier 
1507edc7532SDavid du Colombier 	case D_SCONST:
1517edc7532SDavid du Colombier 		sprint(str, "$\"%S\"", a->sval);
1527edc7532SDavid du Colombier 		break;
1537edc7532SDavid du Colombier 
1547edc7532SDavid du Colombier 	case D_VCONST:
155*f8bc6aafSDavid du Colombier 		sprint(str, "$0x%llux", a->offset);
1567edc7532SDavid du Colombier 		break;
1577edc7532SDavid du Colombier 	}
1587edc7532SDavid du Colombier 	return fmtstrcpy(fp, str);
1597edc7532SDavid du Colombier }
1607edc7532SDavid du Colombier 
1617edc7532SDavid du Colombier int
Sconv(Fmt * fp)1627edc7532SDavid du Colombier Sconv(Fmt *fp)
1637edc7532SDavid du Colombier {
1647edc7532SDavid du Colombier 	int i, c;
1657edc7532SDavid du Colombier 	char str[STRINGSZ], *p, *a;
1667edc7532SDavid du Colombier 
1677edc7532SDavid du Colombier 	a = va_arg(fp->args, char*);
1687edc7532SDavid du Colombier 	p = str;
1697edc7532SDavid du Colombier 	for(i=0; i<NSNAME; i++) {
1707edc7532SDavid du Colombier 		c = a[i] & 0xff;
1717edc7532SDavid du Colombier 		if(c >= 'a' && c <= 'z' ||
1727edc7532SDavid du Colombier 		   c >= 'A' && c <= 'Z' ||
1737edc7532SDavid du Colombier 		   c >= '0' && c <= '9' ||
1747edc7532SDavid du Colombier 		   c == ' ' || c == '%') {
1757edc7532SDavid du Colombier 			*p++ = c;
1767edc7532SDavid du Colombier 			continue;
1777edc7532SDavid du Colombier 		}
1787edc7532SDavid du Colombier 		*p++ = '\\';
1797edc7532SDavid du Colombier 		switch(c) {
1807edc7532SDavid du Colombier 		case 0:
1817edc7532SDavid du Colombier 			*p++ = 'z';
1827edc7532SDavid du Colombier 			continue;
1837edc7532SDavid du Colombier 		case '\\':
1847edc7532SDavid du Colombier 		case '"':
1857edc7532SDavid du Colombier 			*p++ = c;
1867edc7532SDavid du Colombier 			continue;
1877edc7532SDavid du Colombier 		case '\n':
1887edc7532SDavid du Colombier 			*p++ = 'n';
1897edc7532SDavid du Colombier 			continue;
1907edc7532SDavid du Colombier 		case '\t':
1917edc7532SDavid du Colombier 			*p++ = 't';
1927edc7532SDavid du Colombier 			continue;
1937edc7532SDavid du Colombier 		case '\r':
1947edc7532SDavid du Colombier 			*p++ = 'r';
1957edc7532SDavid du Colombier 			continue;
1967edc7532SDavid du Colombier 		case '\f':
1977edc7532SDavid du Colombier 			*p++ = 'f';
1987edc7532SDavid du Colombier 			continue;
1997edc7532SDavid du Colombier 		}
2007edc7532SDavid du Colombier 		*p++ = (c>>6) + '0';
2017edc7532SDavid du Colombier 		*p++ = ((c>>3) & 7) + '0';
2027edc7532SDavid du Colombier 		*p++ = (c & 7) + '0';
2037edc7532SDavid du Colombier 	}
2047edc7532SDavid du Colombier 	*p = 0;
2057edc7532SDavid du Colombier 	return fmtstrcpy(fp, str);
2067edc7532SDavid du Colombier }
2077edc7532SDavid du Colombier 
2087edc7532SDavid du Colombier int
Nconv(Fmt * fp)2097edc7532SDavid du Colombier Nconv(Fmt *fp)
2107edc7532SDavid du Colombier {
2117edc7532SDavid du Colombier 	char str[STRINGSZ];
2127edc7532SDavid du Colombier 	Adr *a;
2137edc7532SDavid du Colombier 	Sym *s;
2147edc7532SDavid du Colombier 
2157edc7532SDavid du Colombier 	a = va_arg(fp->args, Adr*);
2167edc7532SDavid du Colombier 	s = a->sym;
2177edc7532SDavid du Colombier 	if(s == S) {
218*f8bc6aafSDavid du Colombier 		sprint(str, "%lld", a->offset);
2197edc7532SDavid du Colombier 		goto out;
2207edc7532SDavid du Colombier 	}
2217edc7532SDavid du Colombier 	switch(a->name) {
2227edc7532SDavid du Colombier 	default:
2237edc7532SDavid du Colombier 		sprint(str, "GOK-name(%d)", a->name);
2247edc7532SDavid du Colombier 		break;
2257edc7532SDavid du Colombier 
2267edc7532SDavid du Colombier 	case D_NONE:
227*f8bc6aafSDavid du Colombier 		sprint(str, "%lld", a->offset);
2287edc7532SDavid du Colombier 		break;
2297edc7532SDavid du Colombier 
2307edc7532SDavid du Colombier 	case D_EXTERN:
231*f8bc6aafSDavid du Colombier 		sprint(str, "%s+%lld(SB)", s->name, a->offset);
2327edc7532SDavid du Colombier 		break;
2337edc7532SDavid du Colombier 
2347edc7532SDavid du Colombier 	case D_STATIC:
235*f8bc6aafSDavid du Colombier 		sprint(str, "%s<>+%lld(SB)", s->name, a->offset);
2367edc7532SDavid du Colombier 		break;
2377edc7532SDavid du Colombier 
2387edc7532SDavid du Colombier 	case D_AUTO:
239*f8bc6aafSDavid du Colombier 		sprint(str, "%s-%lld(SP)", s->name, -a->offset);
2407edc7532SDavid du Colombier 		break;
2417edc7532SDavid du Colombier 
2427edc7532SDavid du Colombier 	case D_PARAM:
243*f8bc6aafSDavid du Colombier 		sprint(str, "%s+%lld(FP)", s->name, a->offset);
2447edc7532SDavid du Colombier 		break;
2457edc7532SDavid du Colombier 	}
2467edc7532SDavid du Colombier out:
2477edc7532SDavid du Colombier 	return fmtstrcpy(fp, str);
2487edc7532SDavid du Colombier }
249