5 unsigned char odata[16];
6 unsigned char data[16];
10 int le; /* little endian */
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 flushout(Biobufhdr *bp, void *v, long n)
65 return read(bp->fid, v, n);
69 main(int argc, char *argv[])
74 Binit(&bout, 1, OWRITE);
78 while(argc>1 && argv[1][0]=='-' && argv[1][1]){
82 if(argv[0][0] == 'r'){
88 if(argv[0][0] == 's'){
94 if(argv[0][0] == 'u'){
100 if(argv[0][0] == 'a'){
126 if(argv[0][1] || argv[0][-1]!='-')
156 fprint(2, "usage: xd [-u] [-r] [-s] [-a{odx}] [-c|{b1w2l4v8}{odx}] ... file ...\n");
164 ap->fn = fmt[ap->loglen];
165 ap->fmt = dfmt[ap->loglen][ap->base];
166 ap->afmt = afmt[ap>arg][abase];
173 err = xd(argv[1], 0);
174 else for(i=1; i<argc; i++)
175 err |= xd(argv[i], 1);
176 exits(err? "error" : 0);
186 fprint(2, "xd: too many formats (max %d)\n", Narg);
193 ap->fmt = dfmt[ap->loglen][ap->base];
194 ap->afmt = afmt[narg>1][abase];
198 xd(char *name, int title)
207 bp = Bopen(name, OREAD);
209 fprint(2, "xd: can't open %s\n", name);
214 Binit(bp, fd, OREAD);
216 if(flush) Biofn(bp, flushout);
219 xprint("%s\n", name);
222 while((ndata=Bread(bp, data, 16)) >= 0){
224 for(i=ndata; i<16; i++)
226 if(ndata==16 && repeats){
227 if(addr>0 && data[0]==odata[0]){
229 if(data[i] != odata[i])
244 for(ap=arg; ap<&arg[narg]; ap++){
245 xprint(ap->afmt, addr);
251 xprint(afmt[0][abase], addr);
264 for(i=0; i<ndata; i++)
272 for(i=0; i<ndata; i+=sizeof(unsigned short))
273 xprint(f, le ? (data[i+1]<<8)|data[i]
274 : (data[i]<<8)|data[i+1]);
281 for(i=0; i<ndata; i+=sizeof(unsigned long))
282 xprint(f, le ? (data[i+3]<<24)|(data[i+2]<<16)|(data[i+1]<<8)|data[i]
283 : (data[i]<<24)|(data[i+1]<<16)|(data[i+2]<<8)|data[i+3]);
290 unsigned long long v;
291 for(i=0; i<ndata; i+=sizeof(unsigned long long)){
293 v = (data[i+3+4]<<24)|(data[i+2+4]<<16)|(data[i+1+4]<<8)|data[i+4];
295 v |= (data[i+3]<<24)|(data[i+2]<<16)|(data[i+1]<<8)|data[i];
297 v = (data[i]<<24)|(data[i+1]<<16)|(data[i+2]<<8)|data[i+3];
299 v |= (data[i+4]<<24)|(data[i+1+4]<<16)|(data[i+2+4]<<8)|data[i+3+4];
301 if(Bprint(&bout, f, v)<0){
302 fprint(2, "xd: i/o error\n");
314 for(i=0; i<ndata; i++)
317 xprint(cfmt[1][2], "\\t");
320 xprint(cfmt[1][2], "\\r");
323 xprint(cfmt[1][2], "\\n");
326 xprint(cfmt[1][2], "\\b");
329 if(data[i]>=0x7F || ' '>data[i])
330 xprint(cfmt[2][2], data[i]);
332 xprint(cfmt[0][2], data[i]);
338 xprint(char *fmt, ...)
342 va_start(arglist, fmt);
343 if(Bvprint(&bout, fmt, arglist)<0){
344 fprint(2, "xd: i/o error\n");