txd: accept -S for 8-byte swap - plan9port - [fork] Plan 9 from user space
git clone git://src.adamsgaard.dk/plan9port
Log
Files
Refs
README
LICENSE
---
commit 01e3847b7e6ff87f72a34a42cd98425e569250f6
parent 36bb28dc638bb3091e05996156b5fbecbc67dcd5
Author: Russ Cox 
Date:   Mon, 11 Mar 2013 17:26:11 -0400

xd: accept -S for 8-byte swap

R=rsc
https://codereview.appspot.com/7565045

Diffstat:
  M man/man1/xd.1                       |       3 +++
  M src/cmd/xd.c                        |      36 +++++++++++++++++++++++++++++++

2 files changed, 39 insertions(+), 0 deletions(-)
---
diff --git a/man/man1/xd.1 b/man/man1/xd.1
t@@ -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
t@@ -8,6 +8,7 @@ int                ndata;
 unsigned long        addr;
 int                repeats;
 int                swizzle;
+int                swizzle8;
 int                flush;
 int                abase=2;
 int                xd(char *, int);
t@@ -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])
t@@ -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++)
t@@ -277,6 +286,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)
 {
         int i;