xref: /plan9-contrib/sys/src/cmd/9c/list.c (revision fbadb1c4d4463e58337ffb1ed396c9caee5d1889)
1*fbadb1c4SDavid du Colombier #define EXTERN
2*fbadb1c4SDavid du Colombier #include "gc.h"
3*fbadb1c4SDavid du Colombier 
4*fbadb1c4SDavid du Colombier void
listinit(void)5*fbadb1c4SDavid du Colombier listinit(void)
6*fbadb1c4SDavid du Colombier {
7*fbadb1c4SDavid du Colombier 
8*fbadb1c4SDavid du Colombier 	fmtinstall('A', Aconv);
9*fbadb1c4SDavid du Colombier 	fmtinstall('P', Pconv);
10*fbadb1c4SDavid du Colombier 	fmtinstall('S', Sconv);
11*fbadb1c4SDavid du Colombier 	fmtinstall('N', Nconv);
12*fbadb1c4SDavid du Colombier 	fmtinstall('D', Dconv);
13*fbadb1c4SDavid du Colombier 	fmtinstall('B', Bconv);
14*fbadb1c4SDavid du Colombier }
15*fbadb1c4SDavid du Colombier 
16*fbadb1c4SDavid du Colombier int
Bconv(Fmt * fp)17*fbadb1c4SDavid du Colombier Bconv(Fmt *fp)
18*fbadb1c4SDavid du Colombier {
19*fbadb1c4SDavid du Colombier 	char str[STRINGSZ], ss[STRINGSZ], *s;
20*fbadb1c4SDavid du Colombier 	Bits bits;
21*fbadb1c4SDavid du Colombier 	int i;
22*fbadb1c4SDavid du Colombier 
23*fbadb1c4SDavid du Colombier 	str[0] = 0;
24*fbadb1c4SDavid du Colombier 	bits = va_arg(fp->args, Bits);
25*fbadb1c4SDavid du Colombier 	while(bany(&bits)) {
26*fbadb1c4SDavid du Colombier 		i = bnum(bits);
27*fbadb1c4SDavid du Colombier 		if(str[0])
28*fbadb1c4SDavid du Colombier 			strcat(str, " ");
29*fbadb1c4SDavid du Colombier 		if(var[i].sym == S) {
30*fbadb1c4SDavid du Colombier 			sprint(ss, "$%lld", var[i].offset);
31*fbadb1c4SDavid du Colombier 			s = ss;
32*fbadb1c4SDavid du Colombier 		} else
33*fbadb1c4SDavid du Colombier 			s = var[i].sym->name;
34*fbadb1c4SDavid du Colombier 		if(strlen(str) + strlen(s) + 1 >= STRINGSZ)
35*fbadb1c4SDavid du Colombier 			break;
36*fbadb1c4SDavid du Colombier 		strcat(str, s);
37*fbadb1c4SDavid du Colombier 		bits.b[i/32] &= ~(1L << (i%32));
38*fbadb1c4SDavid du Colombier 	}
39*fbadb1c4SDavid du Colombier 	return fmtstrcpy(fp, str);
40*fbadb1c4SDavid du Colombier }
41*fbadb1c4SDavid du Colombier 
42*fbadb1c4SDavid du Colombier int
Pconv(Fmt * fp)43*fbadb1c4SDavid du Colombier Pconv(Fmt *fp)
44*fbadb1c4SDavid du Colombier {
45*fbadb1c4SDavid du Colombier 	char str[STRINGSZ];
46*fbadb1c4SDavid du Colombier 	Prog *p;
47*fbadb1c4SDavid du Colombier 	int a;
48*fbadb1c4SDavid du Colombier 
49*fbadb1c4SDavid du Colombier 	p = va_arg(fp->args, Prog*);
50*fbadb1c4SDavid du Colombier 	a = p->as;
51*fbadb1c4SDavid du Colombier 	if(a == ADATA)
52*fbadb1c4SDavid du Colombier 		sprint(str, "	%A	%D/%d,%D", a, &p->from, p->reg, &p->to);
53*fbadb1c4SDavid du Colombier 	else
54*fbadb1c4SDavid du Colombier 	if(p->as == ATEXT)
55*fbadb1c4SDavid du Colombier 		sprint(str, "	%A	%D,%d,%D", a, &p->from, p->reg, &p->to);
56*fbadb1c4SDavid du Colombier 	else
57*fbadb1c4SDavid du Colombier 	if(p->reg == NREG)
58*fbadb1c4SDavid du Colombier 		sprint(str, "	%A	%D,%D", a, &p->from, &p->to);
59*fbadb1c4SDavid du Colombier 	else
60*fbadb1c4SDavid du Colombier 	if(p->from.type != D_FREG)
61*fbadb1c4SDavid du Colombier 		sprint(str, "	%A	%D,R%d,%D", a, &p->from, p->reg, &p->to);
62*fbadb1c4SDavid du Colombier 	else
63*fbadb1c4SDavid du Colombier 		sprint(str, "	%A	%D,F%d,%D", a, &p->from, p->reg, &p->to);
64*fbadb1c4SDavid du Colombier 	return fmtstrcpy(fp, str);
65*fbadb1c4SDavid du Colombier }
66*fbadb1c4SDavid du Colombier 
67*fbadb1c4SDavid du Colombier int
Aconv(Fmt * fp)68*fbadb1c4SDavid du Colombier Aconv(Fmt *fp)
69*fbadb1c4SDavid du Colombier {
70*fbadb1c4SDavid du Colombier 	char *s;
71*fbadb1c4SDavid du Colombier 	int a;
72*fbadb1c4SDavid du Colombier 
73*fbadb1c4SDavid du Colombier 	a = va_arg(fp->args, int);
74*fbadb1c4SDavid du Colombier 	s = "???";
75*fbadb1c4SDavid du Colombier 	if(a >= AXXX && a <= ALAST)
76*fbadb1c4SDavid du Colombier 		s = anames[a];
77*fbadb1c4SDavid du Colombier 	return fmtstrcpy(fp, s);
78*fbadb1c4SDavid du Colombier }
79*fbadb1c4SDavid du Colombier 
80*fbadb1c4SDavid du Colombier int
Dconv(Fmt * fp)81*fbadb1c4SDavid du Colombier Dconv(Fmt *fp)
82*fbadb1c4SDavid du Colombier {
83*fbadb1c4SDavid du Colombier 	char str[STRINGSZ];
84*fbadb1c4SDavid du Colombier 	Adr *a;
85*fbadb1c4SDavid du Colombier 
86*fbadb1c4SDavid du Colombier 	a = va_arg(fp->args, Adr*);
87*fbadb1c4SDavid du Colombier 	switch(a->type) {
88*fbadb1c4SDavid du Colombier 
89*fbadb1c4SDavid du Colombier 	default:
90*fbadb1c4SDavid du Colombier 		sprint(str, "GOK-type(%d)", a->type);
91*fbadb1c4SDavid du Colombier 		break;
92*fbadb1c4SDavid du Colombier 
93*fbadb1c4SDavid du Colombier 	case D_NONE:
94*fbadb1c4SDavid du Colombier 		str[0] = 0;
95*fbadb1c4SDavid du Colombier 		if(a->name != D_NONE || a->reg != NREG || a->sym != S)
96*fbadb1c4SDavid du Colombier 			sprint(str, "%N(R%d)(NONE)", a, a->reg);
97*fbadb1c4SDavid du Colombier 		break;
98*fbadb1c4SDavid du Colombier 
99*fbadb1c4SDavid du Colombier 	case D_CONST:
100*fbadb1c4SDavid du Colombier 		if(a->reg != NREG)
101*fbadb1c4SDavid du Colombier 			sprint(str, "$%N(R%d)", a, a->reg);
102*fbadb1c4SDavid du Colombier 		else
103*fbadb1c4SDavid du Colombier 			sprint(str, "$%N", a);
104*fbadb1c4SDavid du Colombier 		break;
105*fbadb1c4SDavid du Colombier 
106*fbadb1c4SDavid du Colombier 	case D_OREG:
107*fbadb1c4SDavid du Colombier 		if(a->reg != NREG)
108*fbadb1c4SDavid du Colombier 			sprint(str, "%N(R%d)", a, a->reg);
109*fbadb1c4SDavid du Colombier 		else
110*fbadb1c4SDavid du Colombier 			sprint(str, "%N", a);
111*fbadb1c4SDavid du Colombier 		break;
112*fbadb1c4SDavid du Colombier 
113*fbadb1c4SDavid du Colombier 	case D_REG:
114*fbadb1c4SDavid du Colombier 		sprint(str, "R%d", a->reg);
115*fbadb1c4SDavid du Colombier 		if(a->name != D_NONE || a->sym != S)
116*fbadb1c4SDavid du Colombier 			sprint(str, "%N(R%d)(REG)", a, a->reg);
117*fbadb1c4SDavid du Colombier 		break;
118*fbadb1c4SDavid du Colombier 
119*fbadb1c4SDavid du Colombier 	case D_FREG:
120*fbadb1c4SDavid du Colombier 		sprint(str, "F%d", a->reg);
121*fbadb1c4SDavid du Colombier 		if(a->name != D_NONE || a->sym != S)
122*fbadb1c4SDavid du Colombier 			sprint(str, "%N(F%d)(REG)", a, a->reg);
123*fbadb1c4SDavid du Colombier 		break;
124*fbadb1c4SDavid du Colombier 
125*fbadb1c4SDavid du Colombier 	case D_CREG:
126*fbadb1c4SDavid du Colombier 		sprint(str, "C%d", a->reg);
127*fbadb1c4SDavid du Colombier 		if(a->name != D_NONE || a->sym != S)
128*fbadb1c4SDavid du Colombier 			sprint(str, "%N(C%d)(REG)", a, a->reg);
129*fbadb1c4SDavid du Colombier 		break;
130*fbadb1c4SDavid du Colombier 
131*fbadb1c4SDavid du Colombier 	case D_BRANCH:
132*fbadb1c4SDavid du Colombier 		sprint(str, "%lld(PC)", a->offset-pc);
133*fbadb1c4SDavid du Colombier 		break;
134*fbadb1c4SDavid du Colombier 
135*fbadb1c4SDavid du Colombier 	case D_FCONST:
136*fbadb1c4SDavid du Colombier 		sprint(str, "$%.17e", a->dval);
137*fbadb1c4SDavid du Colombier 		break;
138*fbadb1c4SDavid du Colombier 
139*fbadb1c4SDavid du Colombier 	case D_SCONST:
140*fbadb1c4SDavid du Colombier 		sprint(str, "$\"%S\"", a->sval);
141*fbadb1c4SDavid du Colombier 		break;
142*fbadb1c4SDavid du Colombier 	}
143*fbadb1c4SDavid du Colombier 	return fmtstrcpy(fp, str);
144*fbadb1c4SDavid du Colombier }
145*fbadb1c4SDavid du Colombier 
146*fbadb1c4SDavid du Colombier int
Sconv(Fmt * fp)147*fbadb1c4SDavid du Colombier Sconv(Fmt *fp)
148*fbadb1c4SDavid du Colombier {
149*fbadb1c4SDavid du Colombier 	int i, c;
150*fbadb1c4SDavid du Colombier 	char str[STRINGSZ], *p, *a;
151*fbadb1c4SDavid du Colombier 
152*fbadb1c4SDavid du Colombier 	a = va_arg(fp->args, char*);
153*fbadb1c4SDavid du Colombier 	p = str;
154*fbadb1c4SDavid du Colombier 	for(i=0; i<NSNAME; i++) {
155*fbadb1c4SDavid du Colombier 		c = a[i] & 0xff;
156*fbadb1c4SDavid du Colombier 		if(c >= 'a' && c <= 'z' ||
157*fbadb1c4SDavid du Colombier 		   c >= 'A' && c <= 'Z' ||
158*fbadb1c4SDavid du Colombier 		   c >= '0' && c <= '9' ||
159*fbadb1c4SDavid du Colombier 		   c == ' ' || c == '%') {
160*fbadb1c4SDavid du Colombier 			*p++ = c;
161*fbadb1c4SDavid du Colombier 			continue;
162*fbadb1c4SDavid du Colombier 		}
163*fbadb1c4SDavid du Colombier 		*p++ = '\\';
164*fbadb1c4SDavid du Colombier 		switch(c) {
165*fbadb1c4SDavid du Colombier 		case 0:
166*fbadb1c4SDavid du Colombier 			*p++ = 'z';
167*fbadb1c4SDavid du Colombier 			continue;
168*fbadb1c4SDavid du Colombier 		case '\\':
169*fbadb1c4SDavid du Colombier 		case '"':
170*fbadb1c4SDavid du Colombier 			*p++ = c;
171*fbadb1c4SDavid du Colombier 			continue;
172*fbadb1c4SDavid du Colombier 		case '\n':
173*fbadb1c4SDavid du Colombier 			*p++ = 'n';
174*fbadb1c4SDavid du Colombier 			continue;
175*fbadb1c4SDavid du Colombier 		case '\t':
176*fbadb1c4SDavid du Colombier 			*p++ = 't';
177*fbadb1c4SDavid du Colombier 			continue;
178*fbadb1c4SDavid du Colombier 		case '\r':
179*fbadb1c4SDavid du Colombier 			*p++ = 'r';
180*fbadb1c4SDavid du Colombier 			continue;
181*fbadb1c4SDavid du Colombier 		case '\f':
182*fbadb1c4SDavid du Colombier 			*p++ = 'f';
183*fbadb1c4SDavid du Colombier 			continue;
184*fbadb1c4SDavid du Colombier 		}
185*fbadb1c4SDavid du Colombier 		*p++ = (c>>6) + '0';
186*fbadb1c4SDavid du Colombier 		*p++ = ((c>>3) & 7) + '0';
187*fbadb1c4SDavid du Colombier 		*p++ = (c & 7) + '0';
188*fbadb1c4SDavid du Colombier 	}
189*fbadb1c4SDavid du Colombier 	*p = 0;
190*fbadb1c4SDavid du Colombier 	return fmtstrcpy(fp, str);
191*fbadb1c4SDavid du Colombier }
192*fbadb1c4SDavid du Colombier 
193*fbadb1c4SDavid du Colombier int
Nconv(Fmt * fp)194*fbadb1c4SDavid du Colombier Nconv(Fmt *fp)
195*fbadb1c4SDavid du Colombier {
196*fbadb1c4SDavid du Colombier 	char str[STRINGSZ];
197*fbadb1c4SDavid du Colombier 	Adr *a;
198*fbadb1c4SDavid du Colombier 	Sym *s;
199*fbadb1c4SDavid du Colombier 
200*fbadb1c4SDavid du Colombier 	a = va_arg(fp->args, Adr*);
201*fbadb1c4SDavid du Colombier 	s = a->sym;
202*fbadb1c4SDavid du Colombier 	if(s == S) {
203*fbadb1c4SDavid du Colombier 		sprint(str, "%lld", a->offset);
204*fbadb1c4SDavid du Colombier 		goto out;
205*fbadb1c4SDavid du Colombier 	}
206*fbadb1c4SDavid du Colombier 	switch(a->name) {
207*fbadb1c4SDavid du Colombier 	default:
208*fbadb1c4SDavid du Colombier 		sprint(str, "GOK-name(%d)", a->name);
209*fbadb1c4SDavid du Colombier 		break;
210*fbadb1c4SDavid du Colombier 
211*fbadb1c4SDavid du Colombier 	case D_EXTERN:
212*fbadb1c4SDavid du Colombier 		sprint(str, "%s+%lld(SB)", s->name, a->offset);
213*fbadb1c4SDavid du Colombier 		break;
214*fbadb1c4SDavid du Colombier 
215*fbadb1c4SDavid du Colombier 	case D_STATIC:
216*fbadb1c4SDavid du Colombier 		sprint(str, "%s<>+%lld(SB)", s->name, a->offset);
217*fbadb1c4SDavid du Colombier 		break;
218*fbadb1c4SDavid du Colombier 
219*fbadb1c4SDavid du Colombier 	case D_AUTO:
220*fbadb1c4SDavid du Colombier 		sprint(str, "%s-%lld(SP)", s->name, -a->offset);
221*fbadb1c4SDavid du Colombier 		break;
222*fbadb1c4SDavid du Colombier 
223*fbadb1c4SDavid du Colombier 	case D_PARAM:
224*fbadb1c4SDavid du Colombier 		sprint(str, "%s+%lld(FP)", s->name, a->offset);
225*fbadb1c4SDavid du Colombier 		break;
226*fbadb1c4SDavid du Colombier 	}
227*fbadb1c4SDavid du Colombier out:
228*fbadb1c4SDavid du Colombier 	return fmtstrcpy(fp, str);
229*fbadb1c4SDavid du Colombier }
230