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