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