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.
.TP
.B -s
Reverse (swab) the order of bytes in each group of 4 before printing.
Switch to little-endian units.
.TP
.B -r
Print repeating groups of identical 16-byte sequences as the first group

View file

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