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