]> git.lizzy.rs Git - plan9front.git/blob - sys/src/cmd/vc/list.c
9bootfat: rename open() to fileinit and make it static as its really a internal funct...
[plan9front.git] / sys / src / cmd / vc / list.c
1 #define EXTERN
2 #include "gc.h"
3
4 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
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
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
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
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_CONST:
99                 if(a->reg != NREG)
100                         sprint(str, "$%N(R%d)", a, a->reg);
101                 else
102                         sprint(str, "$%N", a);
103                 break;
104
105         case D_OREG:
106                 if(a->reg != NREG)
107                         sprint(str, "%N(R%d)", a, a->reg);
108                 else
109                         sprint(str, "%N", a);
110                 break;
111
112         case D_REG:
113                 sprint(str, "R%d", a->reg);
114                 if(a->name != D_NONE || a->sym != S)
115                         sprint(str, "%N(R%d)(REG)", a, a->reg);
116                 break;
117
118         case D_FREG:
119                 sprint(str, "F%d", a->reg);
120                 if(a->name != D_NONE || a->sym != S)
121                         sprint(str, "%N(R%d)(REG)", a, a->reg);
122                 break;
123
124         case D_FCREG:
125                 sprint(str, "FCR%d", a->reg);
126                 if(a->name != D_NONE || a->sym != S)
127                         sprint(str, "%N(R%d)(REG)", a, a->reg);
128                 break;
129
130         case D_LO:
131                 sprint(str, "LO");
132                 if(a->name != D_NONE || a->sym != S)
133                         sprint(str, "%N(LO)(REG)", a);
134                 break;
135
136         case D_HI:
137                 sprint(str, "HI");
138                 if(a->name != D_NONE || a->sym != S)
139                         sprint(str, "%N(HI)(REG)", a);
140                 break;
141
142         case D_BRANCH:
143                 sprint(str, "%ld(PC)", a->offset-pc);
144                 break;
145
146         case D_FCONST:
147                 sprint(str, "$%.17e", a->dval);
148                 break;
149
150         case D_SCONST:
151                 sprint(str, "$\"%S\"", a->sval);
152                 break;
153         }
154         return fmtstrcpy(fp, str);
155 }
156
157 int
158 Sconv(Fmt *fp)
159 {
160         int i, c;
161         char str[STRINGSZ], *p, *a;
162
163         a = va_arg(fp->args, char*);
164         p = str;
165         for(i=0; i<NSNAME; i++) {
166                 c = a[i] & 0xff;
167                 if(c >= 'a' && c <= 'z' ||
168                    c >= 'A' && c <= 'Z' ||
169                    c >= '0' && c <= '9' ||
170                    c == ' ' || c == '%') {
171                         *p++ = c;
172                         continue;
173                 }
174                 *p++ = '\\';
175                 switch(c) {
176                 case 0:
177                         *p++ = 'z';
178                         continue;
179                 case '\\':
180                 case '"':
181                         *p++ = c;
182                         continue;
183                 case '\n':
184                         *p++ = 'n';
185                         continue;
186                 case '\t':
187                         *p++ = 't';
188                         continue;
189                 case '\r':
190                         *p++ = 'r';
191                         continue;
192                 case '\f':
193                         *p++ = 'f';
194                         continue;
195                 }
196                 *p++ = (c>>6) + '0';
197                 *p++ = ((c>>3) & 7) + '0';
198                 *p++ = (c & 7) + '0';
199         }
200         *p = 0;
201         return fmtstrcpy(fp, str);
202 }
203
204 int
205 Nconv(Fmt *fp)
206 {
207         char str[STRINGSZ];
208         Adr *a;
209         Sym *s;
210
211         a = va_arg(fp->args, Adr*);
212         s = a->sym;
213         if(s == S) {
214                 sprint(str, "%ld", a->offset);
215                 goto out;
216         }
217         switch(a->name) {
218         default:
219                 sprint(str, "GOK-name(%d)", a->name);
220                 break;
221
222         case D_NONE:
223                 sprint(str, "%ld", a->offset);
224                 break;
225
226         case D_EXTERN:
227                 sprint(str, "%s+%ld(SB)", s->name, a->offset);
228                 break;
229
230         case D_STATIC:
231                 sprint(str, "%s<>+%ld(SB)", s->name, a->offset);
232                 break;
233
234         case D_AUTO:
235                 sprint(str, "%s-%ld(SP)", s->name, -a->offset);
236                 break;
237
238         case D_PARAM:
239                 sprint(str, "%s+%ld(FP)", s->name, a->offset);
240                 break;
241         }
242 out:
243         return fmtstrcpy(fp, str);
244 }