xd: changed -s option to switch to little-endian units

This commit is contained in:
aap 2014-02-16 21:32:14 +01:00
parent 1225ebec71
commit cd27c0cca2
2 changed files with 16 additions and 33 deletions

View file

@ -73,7 +73,7 @@ Print file addresses in the given style (and size 4).
(Unbuffered) Flush the output buffer after each 16-byte sequence. (Unbuffered) Flush the output buffer after each 16-byte sequence.
.TP .TP
.B -s .B -s
Reverse (swab) the order of bytes in each group of 4 before printing. Switch to little-endian units.
.TP .TP
.B -r .B -r
Print repeating groups of identical 16-byte sequences as the first group Print repeating groups of identical 16-byte sequences as the first group

View file

@ -7,7 +7,7 @@ unsigned char data[16];
int ndata; int ndata;
unsigned long addr; unsigned long addr;
int repeats; int repeats;
int swizzle; int le; /* little endian */
int flush; int flush;
int abase=2; int abase=2;
int xd(char *, int); int xd(char *, int);
@ -79,7 +79,7 @@ main(int argc, char *argv[])
continue; continue;
} }
if(argv[0][0] == 's'){ if(argv[0][0] == 's'){
swizzle = 1; le = 1;
if(argv[0][1]) if(argv[0][1])
goto Usage; goto Usage;
continue; continue;
@ -215,8 +215,6 @@ xd(char *name, int title)
if(ndata < 16) if(ndata < 16)
for(i=ndata; i<16; i++) for(i=ndata; i<16; i++)
data[i] = 0; data[i] = 0;
if(swizzle)
swizz();
if(ndata==16 && repeats){ if(ndata==16 && repeats){
if(addr>0 && data[0]==odata[0]){ if(addr>0 && data[0]==odata[0]){
for(i=1; i<16; i++) for(i=1; i<16; i++)
@ -255,29 +253,6 @@ xd(char *name, int title)
return 0; return 0;
} }
void
swizz(void)
{
uchar *p, *q;
int i;
uchar swdata[16];
p = data;
q = swdata;
for(i=0; i<16; i++)
*q++ = *p++;
p = data;
q = swdata;
for(i=0; i<4; i++){
p[0] = q[3];
p[1] = q[2];
p[2] = q[1];
p[3] = q[0];
p += 4;
q += 4;
}
}
void void
fmt0(char *f) fmt0(char *f)
{ {
@ -291,7 +266,8 @@ fmt1(char *f)
{ {
int i; int i;
for(i=0; i<ndata; i+=sizeof(unsigned short)) for(i=0; i<ndata; i+=sizeof(unsigned short))
xprint(f, (data[i]<<8)|data[i+1]); xprint(f, le ? (data[i+1]<<8)|data[i]
: (data[i]<<8)|data[i+1]);
} }
void void
@ -299,7 +275,8 @@ fmt2(char *f)
{ {
int i; int i;
for(i=0; i<ndata; i+=sizeof(unsigned long)) for(i=0; i<ndata; i+=sizeof(unsigned long))
xprint(f, (data[i]<<24)|(data[i+1]<<16)|(data[i+2]<<8)|data[i+3]); xprint(f, le ? (data[i+3]<<24)|(data[i+2]<<16)|(data[i+1]<<8)|data[i]
: (data[i]<<24)|(data[i+1]<<16)|(data[i+2]<<8)|data[i+3]);
} }
void void
@ -308,9 +285,15 @@ fmt3(char *f)
int i; int i;
unsigned long long v; unsigned long long v;
for(i=0; i<ndata; i+=sizeof(unsigned long long)){ for(i=0; i<ndata; i+=sizeof(unsigned long long)){
v = (data[i]<<24)|(data[i+1]<<16)|(data[i+2]<<8)|data[i+3]; if(le){
v <<= 32; v = (data[i+3+4]<<24)|(data[i+2+4]<<16)|(data[i+1+4]<<8)|data[i+4];
v |= (data[i+4]<<24)|(data[i+1+4]<<16)|(data[i+2+4]<<8)|data[i+3+4]; v <<= 32;
v |= (data[i+3]<<24)|(data[i+2]<<16)|(data[i+1]<<8)|data[i];
}else{
v = (data[i]<<24)|(data[i+1]<<16)|(data[i+2]<<8)|data[i+3];
v <<= 32;
v |= (data[i+4]<<24)|(data[i+1+4]<<16)|(data[i+2+4]<<8)|data[i+3+4];
}
if(Bprint(&bout, f, v)<0){ if(Bprint(&bout, f, v)<0){
fprint(2, "xd: i/o error\n"); fprint(2, "xd: i/o error\n");
exits("i/o error"); exits("i/o error");