1 bc7cb1a1 2003-11-23 devnull #include <u.h>
2 bc7cb1a1 2003-11-23 devnull #include <libc.h>
3 bc7cb1a1 2003-11-23 devnull #include <bio.h>
5 bc7cb1a1 2003-11-23 devnull unsigned char odata[16];
6 c665ab76 2017-10-01 0intro unsigned char data[32];
7 bc7cb1a1 2003-11-23 devnull int ndata;
9 bc7cb1a1 2003-11-23 devnull unsigned long addr;
10 bc7cb1a1 2003-11-23 devnull int repeats;
11 bc7cb1a1 2003-11-23 devnull int swizzle;
12 01e3847b 2013-03-11 rsc int swizzle8;
13 bc7cb1a1 2003-11-23 devnull int flush;
14 bc7cb1a1 2003-11-23 devnull int abase=2;
15 bc7cb1a1 2003-11-23 devnull int xd(char *, int);
16 c665ab76 2017-10-01 0intro void xprint(char *, ...);
17 075c3bdc 2013-09-26 0intro void initarg(void), swizz(void), swizz8(void);
25 bc7cb1a1 2003-11-23 devnull typedef struct Arg Arg;
26 bc7cb1a1 2003-11-23 devnull typedef void fmtfn(char *);
27 bc7cb1a1 2003-11-23 devnull struct Arg
29 c665ab76 2017-10-01 0intro int chartype; /* TNone, TAscii, TRunes */
30 bc7cb1a1 2003-11-23 devnull int loglen; /* 0==1, 1==2, 2==4, 3==8 */
31 bc7cb1a1 2003-11-23 devnull int base; /* 0==8, 1==10, 2==16 */
32 bc7cb1a1 2003-11-23 devnull fmtfn *fn; /* function to call with data */
33 bc7cb1a1 2003-11-23 devnull char *afmt; /* format to use to print address */
34 bc7cb1a1 2003-11-23 devnull char *fmt; /* format to use to print data */
35 bc7cb1a1 2003-11-23 devnull }arg[Narg];
36 bc7cb1a1 2003-11-23 devnull int narg;
38 c665ab76 2017-10-01 0intro fmtfn fmt0, fmt1, fmt2, fmt3, fmtc, fmtr;
39 bc7cb1a1 2003-11-23 devnull fmtfn *fmt[4] = {
46 bc7cb1a1 2003-11-23 devnull char *dfmt[4][3] = {
47 bc7cb1a1 2003-11-23 devnull " %.3uo", " %.3ud", " %.2ux",
48 bc7cb1a1 2003-11-23 devnull " %.6uo", " %.5ud", " %.4ux",
49 bc7cb1a1 2003-11-23 devnull " %.11luo", " %.10lud", " %.8lux",
50 bc7cb1a1 2003-11-23 devnull " %.22lluo", " %.20llud", " %.16llux",
53 bc7cb1a1 2003-11-23 devnull char *cfmt[3][3] = {
54 c665ab76 2017-10-01 0intro " %c", " %c", " %c",
55 bc7cb1a1 2003-11-23 devnull " %.3s", " %.3s", " %.2s",
56 bc7cb1a1 2003-11-23 devnull " %.3uo", " %.3ud", " %.2ux",
59 c665ab76 2017-10-01 0intro char *rfmt[1][1] = {
63 bc7cb1a1 2003-11-23 devnull char *afmt[2][3] = {
64 bc7cb1a1 2003-11-23 devnull "%.7luo ", "%.7lud ", "%.7lux ",
65 bc7cb1a1 2003-11-23 devnull "%7luo ", "%7lud ", "%7lux ",
68 bc7cb1a1 2003-11-23 devnull Biobuf bin;
69 bc7cb1a1 2003-11-23 devnull Biobuf bout;
72 bc7cb1a1 2003-11-23 devnull main(int argc, char *argv[])
74 bc7cb1a1 2003-11-23 devnull int i, err;
77 bc7cb1a1 2003-11-23 devnull Binit(&bout, 1, OWRITE);
80 bc7cb1a1 2003-11-23 devnull while(argc>1 && argv[1][0]=='-' && argv[1][1]){
83 bc7cb1a1 2003-11-23 devnull argv[0]++;
84 bc7cb1a1 2003-11-23 devnull if(argv[0][0] == 'r'){
85 bc7cb1a1 2003-11-23 devnull repeats = 1;
86 bc7cb1a1 2003-11-23 devnull if(argv[0][1])
87 bc7cb1a1 2003-11-23 devnull goto Usage;
88 bc7cb1a1 2003-11-23 devnull continue;
90 bc7cb1a1 2003-11-23 devnull if(argv[0][0] == 's'){
91 bc7cb1a1 2003-11-23 devnull swizzle = 1;
92 bc7cb1a1 2003-11-23 devnull if(argv[0][1])
93 bc7cb1a1 2003-11-23 devnull goto Usage;
94 bc7cb1a1 2003-11-23 devnull continue;
96 01e3847b 2013-03-11 rsc if(argv[0][0] == 'S'){
97 01e3847b 2013-03-11 rsc swizzle8 = 1;
98 01e3847b 2013-03-11 rsc if(argv[0][1])
102 bc7cb1a1 2003-11-23 devnull if(argv[0][0] == 'u'){
103 bc7cb1a1 2003-11-23 devnull flush = 1;
104 bc7cb1a1 2003-11-23 devnull if(argv[0][1])
105 bc7cb1a1 2003-11-23 devnull goto Usage;
106 bc7cb1a1 2003-11-23 devnull continue;
108 bc7cb1a1 2003-11-23 devnull if(argv[0][0] == 'a'){
109 bc7cb1a1 2003-11-23 devnull argv[0]++;
110 bc7cb1a1 2003-11-23 devnull switch(argv[0][0]){
111 bc7cb1a1 2003-11-23 devnull case 'o':
112 bc7cb1a1 2003-11-23 devnull abase = 0;
114 bc7cb1a1 2003-11-23 devnull case 'd':
115 bc7cb1a1 2003-11-23 devnull abase = 1;
117 bc7cb1a1 2003-11-23 devnull case 'x':
118 bc7cb1a1 2003-11-23 devnull abase = 2;
120 bc7cb1a1 2003-11-23 devnull default:
121 bc7cb1a1 2003-11-23 devnull goto Usage;
123 bc7cb1a1 2003-11-23 devnull if(argv[0][1])
124 bc7cb1a1 2003-11-23 devnull goto Usage;
125 bc7cb1a1 2003-11-23 devnull continue;
127 bc7cb1a1 2003-11-23 devnull ap = &arg[narg];
128 bc7cb1a1 2003-11-23 devnull initarg();
129 bc7cb1a1 2003-11-23 devnull while(argv[0][0]){
130 bc7cb1a1 2003-11-23 devnull switch(argv[0][0]){
131 bc7cb1a1 2003-11-23 devnull case 'c':
132 c665ab76 2017-10-01 0intro ap->chartype = TAscii;
133 bc7cb1a1 2003-11-23 devnull ap->loglen = 0;
134 bc7cb1a1 2003-11-23 devnull if(argv[0][1] || argv[0][-1]!='-')
135 bc7cb1a1 2003-11-23 devnull goto Usage;
137 c665ab76 2017-10-01 0intro case 'R':
138 c665ab76 2017-10-01 0intro ap->chartype = TRune;
139 c665ab76 2017-10-01 0intro ap->loglen = 0;
140 c665ab76 2017-10-01 0intro if(argv[0][1] || argv[0][-1]!='-')
141 c665ab76 2017-10-01 0intro goto Usage;
143 bc7cb1a1 2003-11-23 devnull case 'o':
144 bc7cb1a1 2003-11-23 devnull ap->base = 0;
146 bc7cb1a1 2003-11-23 devnull case 'd':
147 bc7cb1a1 2003-11-23 devnull ap->base = 1;
149 bc7cb1a1 2003-11-23 devnull case 'x':
150 bc7cb1a1 2003-11-23 devnull ap->base = 2;
152 bc7cb1a1 2003-11-23 devnull case 'b':
153 bc7cb1a1 2003-11-23 devnull case '1':
154 bc7cb1a1 2003-11-23 devnull ap->loglen = 0;
156 bc7cb1a1 2003-11-23 devnull case 'w':
157 bc7cb1a1 2003-11-23 devnull case '2':
158 bc7cb1a1 2003-11-23 devnull ap->loglen = 1;
160 bc7cb1a1 2003-11-23 devnull case 'l':
161 bc7cb1a1 2003-11-23 devnull case '4':
162 bc7cb1a1 2003-11-23 devnull ap->loglen = 2;
164 bc7cb1a1 2003-11-23 devnull case 'v':
165 bc7cb1a1 2003-11-23 devnull case '8':
166 bc7cb1a1 2003-11-23 devnull ap->loglen = 3;
168 bc7cb1a1 2003-11-23 devnull default:
170 bc7cb1a1 2003-11-23 devnull fprint(2, "usage: xd [-u] [-r] [-s] [-a{odx}] [-c|{b1w2l4v8}{odx}] ... file ...\n");
171 bc7cb1a1 2003-11-23 devnull exits("usage");
173 bc7cb1a1 2003-11-23 devnull argv[0]++;
175 c665ab76 2017-10-01 0intro if(ap->chartype == TRune)
176 c665ab76 2017-10-01 0intro ap->fn = fmtr;
177 c665ab76 2017-10-01 0intro else if(ap->chartype == TAscii)
178 bc7cb1a1 2003-11-23 devnull ap->fn = fmtc;
180 bc7cb1a1 2003-11-23 devnull ap->fn = fmt[ap->loglen];
181 bc7cb1a1 2003-11-23 devnull ap->fmt = dfmt[ap->loglen][ap->base];
182 bc7cb1a1 2003-11-23 devnull ap->afmt = afmt[ap>arg][abase];
184 bc7cb1a1 2003-11-23 devnull if(narg == 0)
185 bc7cb1a1 2003-11-23 devnull initarg();
186 bc7cb1a1 2003-11-23 devnull if(argc == 1)
187 bc7cb1a1 2003-11-23 devnull err = xd(0, 0);
188 bc7cb1a1 2003-11-23 devnull else if(argc == 2)
189 bc7cb1a1 2003-11-23 devnull err = xd(argv[1], 0);
190 bc7cb1a1 2003-11-23 devnull else for(i=1; i<argc; i++)
191 bc7cb1a1 2003-11-23 devnull err |= xd(argv[i], 1);
192 bc7cb1a1 2003-11-23 devnull exits(err? "error" : 0);
196 bc7cb1a1 2003-11-23 devnull initarg(void)
198 bc7cb1a1 2003-11-23 devnull Arg *ap;
200 bc7cb1a1 2003-11-23 devnull ap = &arg[narg++];
201 bc7cb1a1 2003-11-23 devnull if(narg >= Narg){
202 bc7cb1a1 2003-11-23 devnull fprint(2, "xd: too many formats (max %d)\n", Narg);
203 bc7cb1a1 2003-11-23 devnull exits("usage");
205 c665ab76 2017-10-01 0intro ap->chartype = TNone;
206 bc7cb1a1 2003-11-23 devnull ap->loglen = 2;
207 bc7cb1a1 2003-11-23 devnull ap->base = 2;
208 bc7cb1a1 2003-11-23 devnull ap->fn = fmt2;
209 bc7cb1a1 2003-11-23 devnull ap->fmt = dfmt[ap->loglen][ap->base];
210 bc7cb1a1 2003-11-23 devnull ap->afmt = afmt[narg>1][abase];
214 bc7cb1a1 2003-11-23 devnull xd(char *name, int title)
217 c665ab76 2017-10-01 0intro int i, star, nsee, nleft;
218 bc7cb1a1 2003-11-23 devnull Arg *ap;
219 bc7cb1a1 2003-11-23 devnull Biobuf *bp;
222 bc7cb1a1 2003-11-23 devnull if(name){
223 bc7cb1a1 2003-11-23 devnull bp = Bopen(name, OREAD);
224 bc7cb1a1 2003-11-23 devnull if(bp == 0){
225 bc7cb1a1 2003-11-23 devnull fprint(2, "xd: can't open %s\n", name);
226 bc7cb1a1 2003-11-23 devnull return 1;
229 bc7cb1a1 2003-11-23 devnull bp = &bin;
230 bc7cb1a1 2003-11-23 devnull Binit(bp, fd, OREAD);
232 bc7cb1a1 2003-11-23 devnull if(title)
233 bc7cb1a1 2003-11-23 devnull xprint("%s\n", (long)name);
234 bc7cb1a1 2003-11-23 devnull addr = 0;
235 bc7cb1a1 2003-11-23 devnull star = 0;
236 c665ab76 2017-10-01 0intro nsee = 16;
237 c665ab76 2017-10-01 0intro nleft = 0;
238 c665ab76 2017-10-01 0intro /* read 32 but see only 16 so that runes are happy */
239 c665ab76 2017-10-01 0intro while((ndata=Bread(bp, data + nleft, 32 - nleft)) >= 0){
240 c665ab76 2017-10-01 0intro ndata += nleft;
241 c665ab76 2017-10-01 0intro nleft = 0;
242 c665ab76 2017-10-01 0intro nread = ndata;
243 c665ab76 2017-10-01 0intro if(ndata>nsee)
244 c665ab76 2017-10-01 0intro ndata = nsee;
245 c665ab76 2017-10-01 0intro else if(ndata<nsee)
246 c665ab76 2017-10-01 0intro for(i=ndata; i<nsee; i++)
247 bc7cb1a1 2003-11-23 devnull data[i] = 0;
248 bc7cb1a1 2003-11-23 devnull if(swizzle)
249 bc7cb1a1 2003-11-23 devnull swizz();
250 01e3847b 2013-03-11 rsc if(swizzle8)
252 c665ab76 2017-10-01 0intro if(ndata==nsee && repeats){
253 bc7cb1a1 2003-11-23 devnull if(addr>0 && data[0]==odata[0]){
254 c665ab76 2017-10-01 0intro for(i=1; i<nsee; i++)
255 bc7cb1a1 2003-11-23 devnull if(data[i] != odata[i])
257 c665ab76 2017-10-01 0intro if(i == nsee){
258 c665ab76 2017-10-01 0intro addr += nsee;
259 bc7cb1a1 2003-11-23 devnull if(star == 0){
261 bc7cb1a1 2003-11-23 devnull xprint("*\n", 0);
263 bc7cb1a1 2003-11-23 devnull continue;
266 c665ab76 2017-10-01 0intro for(i=0; i<nsee; i++)
267 bc7cb1a1 2003-11-23 devnull odata[i] = data[i];
268 bc7cb1a1 2003-11-23 devnull star = 0;
270 bc7cb1a1 2003-11-23 devnull for(ap=arg; ap<&arg[narg]; ap++){
271 bc7cb1a1 2003-11-23 devnull xprint(ap->afmt, addr);
272 bc7cb1a1 2003-11-23 devnull (*ap->fn)(ap->fmt);
273 bc7cb1a1 2003-11-23 devnull xprint("\n", 0);
274 bc7cb1a1 2003-11-23 devnull if(flush)
275 bc7cb1a1 2003-11-23 devnull Bflush(&bout);
277 bc7cb1a1 2003-11-23 devnull addr += ndata;
278 c665ab76 2017-10-01 0intro if(ndata<nsee){
279 bc7cb1a1 2003-11-23 devnull xprint(afmt[0][abase], addr);
280 bc7cb1a1 2003-11-23 devnull xprint("\n", 0);
281 bc7cb1a1 2003-11-23 devnull if(flush)
282 bc7cb1a1 2003-11-23 devnull Bflush(&bout);
285 c665ab76 2017-10-01 0intro if(nread>nsee){
286 c665ab76 2017-10-01 0intro nleft = nread - nsee;
287 c665ab76 2017-10-01 0intro memmove(data, data + nsee, nleft);
290 bc7cb1a1 2003-11-23 devnull Bterm(bp);
291 bc7cb1a1 2003-11-23 devnull return 0;
295 bc7cb1a1 2003-11-23 devnull swizz(void)
297 bc7cb1a1 2003-11-23 devnull uchar *p, *q;
299 bc7cb1a1 2003-11-23 devnull uchar swdata[16];
301 bc7cb1a1 2003-11-23 devnull p = data;
302 bc7cb1a1 2003-11-23 devnull q = swdata;
303 bc7cb1a1 2003-11-23 devnull for(i=0; i<16; i++)
304 bc7cb1a1 2003-11-23 devnull *q++ = *p++;
305 bc7cb1a1 2003-11-23 devnull p = data;
306 bc7cb1a1 2003-11-23 devnull q = swdata;
307 bc7cb1a1 2003-11-23 devnull for(i=0; i<4; i++){
308 bc7cb1a1 2003-11-23 devnull p[0] = q[3];
309 bc7cb1a1 2003-11-23 devnull p[1] = q[2];
310 bc7cb1a1 2003-11-23 devnull p[2] = q[1];
311 bc7cb1a1 2003-11-23 devnull p[3] = q[0];
318 01e3847b 2013-03-11 rsc swizz8(void)
320 01e3847b 2013-03-11 rsc uchar *p, *q;
322 01e3847b 2013-03-11 rsc uchar swdata[16];
326 01e3847b 2013-03-11 rsc for(i=0; i<16; i++)
327 01e3847b 2013-03-11 rsc *q++ = *p++;
330 20c14efa 2021-01-29 crossd for(i=0; i<2; i++){
331 01e3847b 2013-03-11 rsc p[0] = q[7];
332 01e3847b 2013-03-11 rsc p[1] = q[6];
333 01e3847b 2013-03-11 rsc p[2] = q[5];
334 01e3847b 2013-03-11 rsc p[3] = q[4];
335 01e3847b 2013-03-11 rsc p[4] = q[3];
336 01e3847b 2013-03-11 rsc p[5] = q[2];
337 01e3847b 2013-03-11 rsc p[6] = q[1];
338 01e3847b 2013-03-11 rsc p[7] = q[0];
345 bc7cb1a1 2003-11-23 devnull fmt0(char *f)
348 bc7cb1a1 2003-11-23 devnull for(i=0; i<ndata; i++)
349 bc7cb1a1 2003-11-23 devnull xprint(f, data[i]);
353 bc7cb1a1 2003-11-23 devnull fmt1(char *f)
356 1adb2a07 2009-02-05 rsc for(i=0; i<ndata; i+=2)
357 bc7cb1a1 2003-11-23 devnull xprint(f, (data[i]<<8)|data[i+1]);
361 bc7cb1a1 2003-11-23 devnull fmt2(char *f)
364 1adb2a07 2009-02-05 rsc for(i=0; i<ndata; i+=4)
365 54dd92be 2008-01-30 rsc xprint(f, (u32int)((data[i]<<24)|(data[i+1]<<16)|(data[i+2]<<8)|data[i+3]));
369 bc7cb1a1 2003-11-23 devnull fmt3(char *f)
372 bc7cb1a1 2003-11-23 devnull unsigned long long v;
373 1adb2a07 2009-02-05 rsc for(i=0; i<ndata; i+=8){
374 bc7cb1a1 2003-11-23 devnull v = (data[i]<<24)|(data[i+1]<<16)|(data[i+2]<<8)|data[i+3];
375 bc7cb1a1 2003-11-23 devnull v <<= 32;
376 bc7cb1a1 2003-11-23 devnull v |= (data[i+4]<<24)|(data[i+1+4]<<16)|(data[i+2+4]<<8)|data[i+3+4];
377 bc7cb1a1 2003-11-23 devnull if(Bprint(&bout, f, v)<0){
378 bc7cb1a1 2003-11-23 devnull fprint(2, "xd: i/o error\n");
379 bc7cb1a1 2003-11-23 devnull exits("i/o error");
385 c665ab76 2017-10-01 0intro onefmtc(uchar c)
387 c665ab76 2017-10-01 0intro switch(c){
388 c665ab76 2017-10-01 0intro case '\t':
389 c665ab76 2017-10-01 0intro xprint(cfmt[1][2], (long)"\\t");
391 c665ab76 2017-10-01 0intro case '\r':
392 c665ab76 2017-10-01 0intro xprint(cfmt[1][2], (long)"\\r");
394 c665ab76 2017-10-01 0intro case '\n':
395 c665ab76 2017-10-01 0intro xprint(cfmt[1][2], (long)"\\n");
397 c665ab76 2017-10-01 0intro case '\b':
398 c665ab76 2017-10-01 0intro xprint(cfmt[1][2], (long)"\\b");
401 c665ab76 2017-10-01 0intro if(c>=0x7F || ' '>c)
402 c665ab76 2017-10-01 0intro xprint(cfmt[2][2], c);
404 c665ab76 2017-10-01 0intro xprint(cfmt[0][2], c);
410 bc7cb1a1 2003-11-23 devnull fmtc(char *f)
414 bc7cb1a1 2003-11-23 devnull USED(f);
415 bc7cb1a1 2003-11-23 devnull for(i=0; i<ndata; i++)
416 c665ab76 2017-10-01 0intro onefmtc(data[i]);
420 c665ab76 2017-10-01 0intro fmtr(char *f)
422 c665ab76 2017-10-01 0intro int i, w, cw;
424 c665ab76 2017-10-01 0intro static int nstart;
427 c665ab76 2017-10-01 0intro if(nstart)
428 c665ab76 2017-10-01 0intro xprint("%*c", 3*nstart, ' ');
429 c665ab76 2017-10-01 0intro for(i=nstart; i<ndata; )
430 c665ab76 2017-10-01 0intro if(data[i] < Runeself)
431 c665ab76 2017-10-01 0intro onefmtc(data[i++]);
433 c665ab76 2017-10-01 0intro w = chartorune(&r, (char *)data+i);
434 c665ab76 2017-10-01 0intro if(w == 1 || i + w>nread)
435 c665ab76 2017-10-01 0intro onefmtc(data[i++]);
438 c665ab76 2017-10-01 0intro if(i + w>ndata)
439 c665ab76 2017-10-01 0intro cw = ndata - i;
440 c665ab76 2017-10-01 0intro xprint(rfmt[0][0], r);
441 c665ab76 2017-10-01 0intro xprint("%*c", 3*cw-3, ' ');
445 c665ab76 2017-10-01 0intro if(i > ndata)
446 c665ab76 2017-10-01 0intro nstart = i - ndata;
448 c665ab76 2017-10-01 0intro nstart = 0;
452 c665ab76 2017-10-01 0intro xprint(char *fmt, ...)
454 c665ab76 2017-10-01 0intro va_list arglist;
456 c665ab76 2017-10-01 0intro va_start(arglist, fmt);
457 c665ab76 2017-10-01 0intro if(Bvprint(&bout, fmt, arglist)<0){
458 bc7cb1a1 2003-11-23 devnull fprint(2, "xd: i/o error\n");
459 bc7cb1a1 2003-11-23 devnull exits("i/o error");
461 c665ab76 2017-10-01 0intro va_end(arglist);