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);
70 while(argc>1 && argv[1][0]=='-' && argv[1][1]){
74 if(argv[0][0] == 'r'){
80 if(argv[0][0] == 's'){
86 if(argv[0][0] == 'u'){
92 if(argv[0][0] == 'a'){
118 if(argv[0][1] || argv[0][-1]!='-')
148 fprint(2, "usage: xd [-u] [-r] [-s] [-a{odx}] [-c|{b1w2l4v8}{odx}] ... file ...\n");
156 ap->fn = fmt[ap->loglen];
157 ap->fmt = dfmt[ap->loglen][ap->base];
158 ap->afmt = afmt[ap>arg][abase];
165 err = xd(argv[1], 0);
166 else for(i=1; i<argc; i++)
167 err |= xd(argv[i], 1);
168 exits(err? "error" : 0);
178 fprint(2, "xd: too many formats (max %d)\n", Narg);
185 ap->fmt = dfmt[ap->loglen][ap->base];
186 ap->afmt = afmt[narg>1][abase];
190 xd(char *name, int title)
199 bp = Bopen(name, OREAD);
201 fprint(2, "xd: can't open %s\n", name);
206 Binit(bp, fd, OREAD);
209 xprint("%s\n", name);
212 while((ndata=Bread(bp, data, 16)) >= 0){
214 for(i=ndata; i<16; i++)
218 if(ndata==16 && repeats){
219 if(addr>0 && data[0]==odata[0]){
221 if(data[i] != odata[i])
236 for(ap=arg; ap<&arg[narg]; ap++){
237 xprint(ap->afmt, addr);
245 xprint(afmt[0][abase], addr);
283 for(i=0; i<ndata; i++)
291 for(i=0; i<ndata; i+=sizeof(unsigned short))
292 xprint(f, (data[i]<<8)|data[i+1]);
299 for(i=0; i<ndata; i+=sizeof(unsigned long))
300 xprint(f, (data[i]<<24)|(data[i+1]<<16)|(data[i+2]<<8)|data[i+3]);
307 unsigned long long v;
308 for(i=0; i<ndata; i+=sizeof(unsigned long long)){
309 v = (data[i]<<24)|(data[i+1]<<16)|(data[i+2]<<8)|data[i+3];
311 v |= (data[i+4]<<24)|(data[i+1+4]<<16)|(data[i+2+4]<<8)|data[i+3+4];
312 if(Bprint(&bout, f, v)<0){
313 fprint(2, "xd: i/o error\n");
325 for(i=0; i<ndata; i++)
328 xprint(cfmt[1][2], "\\t");
331 xprint(cfmt[1][2], "\\r");
334 xprint(cfmt[1][2], "\\n");
337 xprint(cfmt[1][2], "\\b");
340 if(data[i]>=0x7F || ' '>data[i])
341 xprint(cfmt[2][2], data[i]);
343 xprint(cfmt[0][2], data[i]);
349 xprint(char *fmt, ...)
353 va_start(arglist, fmt);
354 if(Bvprint(&bout, fmt, arglist)<0){
355 fprint(2, "xd: i/o error\n");