txd: accept -S for 8-byte swap - plan9port - [fork] Plan 9 from user space
 (HTM) git clone git://src.adamsgaard.dk/plan9port
 (DIR) Log
 (DIR) Files
 (DIR) Refs
 (DIR) README
 (DIR) LICENSE
       ---
 (DIR) commit 01e3847b7e6ff87f72a34a42cd98425e569250f6
 (DIR) parent 36bb28dc638bb3091e05996156b5fbecbc67dcd5
 (HTM) Author: Russ Cox <rsc@swtch.com>
       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(-)
       ---
 (DIR) 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.
 (DIR) 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;