From 01e3847b7e6ff87f72a34a42cd98425e569250f6 Mon Sep 17 00:00:00 2001 From: Russ Cox Date: Mon, 11 Mar 2013 17:26:11 -0400 Subject: xd: accept -S for 8-byte swap R=rsc https://codereview.appspot.com/7565045 --- man/man1/xd.1 | 3 +++ src/cmd/xd.c | 36 ++++++++++++++++++++++++++++++++++++ 2 files changed, 39 insertions(+) diff --git a/man/man1/xd.1 b/man/man1/xd.1 index 10307aa0..9d43a750 100644 --- a/man/man1/xd.1 +++ b/man/man1/xd.1 @@ -75,6 +75,9 @@ Print file addresses in the given style (and size 4). .B -s Reverse (swab) the order of bytes in each group of 4 before printing. .TP +.B -S +Reverse the order of bytes in each group of 8 before printing. +.TP .B -r Print repeating groups of identical 16-byte sequences as the first group followed by an asterisk. diff --git a/src/cmd/xd.c b/src/cmd/xd.c index 3e8ba5d3..7be55b21 100644 --- a/src/cmd/xd.c +++ b/src/cmd/xd.c @@ -8,6 +8,7 @@ int ndata; unsigned long addr; int repeats; int swizzle; +int swizzle8; int flush; int abase=2; int xd(char *, int); @@ -83,6 +84,12 @@ main(int argc, char *argv[]) goto Usage; continue; } + if(argv[0][0] == 'S'){ + swizzle8 = 1; + if(argv[0][1]) + goto Usage; + continue; + } if(argv[0][0] == 'u'){ flush = 1; if(argv[0][1]) @@ -215,6 +222,8 @@ xd(char *name, int title) data[i] = 0; if(swizzle) swizz(); + if(swizzle8) + swizz8(); if(ndata==16 && repeats){ if(addr>0 && data[0]==odata[0]){ for(i=1; i<16; i++) @@ -276,6 +285,33 @@ swizz(void) } } +void +swizz8(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<8; i++){ + p[0] = q[7]; + p[1] = q[6]; + p[2] = q[5]; + p[3] = q[4]; + p[4] = q[3]; + p[5] = q[2]; + p[6] = q[1]; + p[7] = q[0]; + p += 8; + q += 8; + } +} + void fmt0(char *f) { -- cgit v1.2.3