5 unsigned char odata[16];
6 unsigned char data[16];
14 void xprint(char *, ...);
15 void initarg(void), swizz(void);
19 typedef struct Arg Arg;
20 typedef void fmtfn(char *);
23 int ascii; /* 0==none, 1==ascii */
24 int loglen; /* 0==1, 1==2, 2==4, 3==8 */
25 int base; /* 0==8, 1==10, 2==16 */
26 fmtfn *fn; /* function to call with data */
27 char *afmt; /* format to use to print address */
28 char *fmt; /* format to use to print data */
32 fmtfn fmt0, fmt1, fmt2, fmt3, fmtc;
41 " %.3uo", " %.3ud", " %.2ux",
42 " %.6uo", " %.5ud", " %.4ux",
43 " %.11luo", " %.10lud", " %.8lux",
44 " %.22lluo", " %.20llud", " %.16llux",
49 " %.3s", " %.3s", " %.2s",
50 " %.3uo", " %.3ud", " %.2ux",
54 "%.7luo ", "%.7lud ", "%.7lux ",
55 "%7luo ", "%7lud ", "%7lux ",
62 main(int argc, char *argv[])
67 Binit(&bout, 1, OWRITE);
71 while(argc>1 && argv[1][0]=='-' && argv[1][1]){
75 if(argv[0][0] == 'r'){
81 if(argv[0][0] == 's'){
87 if(argv[0][0] == 'u'){
93 if(argv[0][0] == 'a'){
119 if(argv[0][1] || argv[0][-1]!='-')
149 fprint(2, "usage: xd [-u] [-r] [-s] [-a{odx}] [-c|{b1w2l4v8}{odx}] ... file ...\n");
157 ap->fn = fmt[ap->loglen];
158 ap->fmt = dfmt[ap->loglen][ap->base];
159 ap->afmt = afmt[ap>arg][abase];
166 err = xd(argv[1], 0);
167 else for(i=1; i<argc; i++)
168 err |= xd(argv[i], 1);
169 exits(err? "error" : 0);
179 fprint(2, "xd: too many formats (max %d)\n", Narg);
186 ap->fmt = dfmt[ap->loglen][ap->base];
187 ap->afmt = afmt[narg>1][abase];
191 xd(char *name, int title)
200 bp = Bopen(name, OREAD);
202 fprint(2, "xd: can't open %s\n", name);
207 Binit(bp, fd, OREAD);
211 xprint("%s\n", name);
214 while((ndata=Bread(bp, data, 16)) >= 0){
216 for(i=ndata; i<16; i++)
220 if(ndata==16 && repeats){
221 if(addr>0 && data[0]==odata[0]){
223 if(data[i] != odata[i])
238 for(ap=arg; ap<&arg[narg]; ap++){
239 xprint(ap->afmt, addr);
247 xprint(afmt[0][abase], addr);
285 for(i=0; i<ndata; i++)
293 for(i=0; i<ndata; i+=sizeof(unsigned short))
294 xprint(f, (data[i]<<8)|data[i+1]);
301 for(i=0; i<ndata; i+=sizeof(unsigned long))
302 xprint(f, (data[i]<<24)|(data[i+1]<<16)|(data[i+2]<<8)|data[i+3]);
309 unsigned long long v;
310 for(i=0; i<ndata; i+=sizeof(unsigned long long)){
311 v = (data[i]<<24)|(data[i+1]<<16)|(data[i+2]<<8)|data[i+3];
313 v |= (data[i+4]<<24)|(data[i+1+4]<<16)|(data[i+2+4]<<8)|data[i+3+4];
314 if(Bprint(&bout, f, v)<0){
315 fprint(2, "xd: i/o error\n");
327 for(i=0; i<ndata; i++)
330 xprint(cfmt[1][2], "\\t");
333 xprint(cfmt[1][2], "\\r");
336 xprint(cfmt[1][2], "\\n");
339 xprint(cfmt[1][2], "\\b");
342 if(data[i]>=0x7F || ' '>data[i])
343 xprint(cfmt[2][2], data[i]);
345 xprint(cfmt[0][2], data[i]);
351 xprint(char *fmt, ...)
355 va_start(arglist, fmt);
356 if(Bvprint(&bout, fmt, arglist)<0){
357 fprint(2, "xd: i/o error\n");