--- /n/sources/plan9/sys/src/cmd/xd.c Mon May 20 22:09:23 2013 +++ /sys/src/cmd/xd.c Sun Jul 31 00:00:00 2016 @@ -2,8 +2,12 @@ #include #include -uchar odata[16]; -uchar data[32]; +enum { + Nsee = 4*4, /* process this many bytes at a time; see swizz */ +}; + +uchar odata[Nsee]; +uchar data[2*Nsee]; int ndata; int nread; ulong addr; @@ -11,9 +15,11 @@ int swizzle; int flush; int abase=2; + int xd(char *, int); void xprint(char *, ...); void initarg(void), swizz(void); + enum{ Narg=10, @@ -25,7 +31,7 @@ typedef void fmtfn(char *); struct Arg { - int chartype; /* TNone, TAscii, TRunes */ + int chartype; /* TNone, TAscii, TRunes */ int loglen; /* 0==1, 1==2, 2==4, 3==8 */ int base; /* 0==8, 1==10, 2==16 */ fmtfn *fn; /* function to call with data */ @@ -203,12 +209,35 @@ ap->afmt = afmt[narg>1][abase]; } +/* + * format the first ndata bytes in data[] (at most Nsee bytes). + * increment addr to account for them. + */ +void +fmtdata(void) +{ + Arg *ap; + + for(ap=arg; ap<&arg[narg]; ap++){ + xprint(ap->afmt, addr); + (*ap->fn)(ap->fmt); + xprint("\n", 0); + if(flush) + Bflush(&bout); + } + addr += ndata; + if(ndata= 0){ + /* read 2*Nsee but see only Nsee so that runes are happy */ + while((ndata=Bread(bp, data + nleft, 2*Nsee - nleft)) >= 0){ ndata += nleft; nleft = 0; nread = ndata; - if(ndata>nsee) - ndata = nsee; - else if(ndataNsee) + ndata = Nsee; + else if(ndata0 && data[0]==odata[0]){ - for(i=1; i0 && memcmp(odata, data, Nsee) == 0){ + doprint = 0; + if(star == 0){ + star++; + xprint("*\n", 0); } + } else { /* not a repetition */ + memmove(odata, data, Nsee); + star = 0; } - for(i=0; iafmt, addr); - (*ap->fn)(ap->fmt); - xprint("\n", 0); - if(flush) - Bflush(&bout); - } - addr += ndata; - if(ndatansee){ - nleft = nread - nsee; - memmove(data, data + nsee, nleft); + if(nread>Nsee){ + nleft = nread - Nsee; + memmove(data, data + Nsee, nleft); } } Bterm(bp); @@ -287,11 +299,11 @@ { uchar *p, *q; int i; - uchar swdata[16]; + uchar swdata[Nsee]; p = data; q = swdata; - for(i=0; i<16; i++) + for(i=0; i