runtime/doc/xxd.1 | 12 +++++++++++-
src/xxd/xxd.c | 29 ++++++++++++++++++++++++-----
2 files changed, 35 insertions(+), 6 deletions(-)
# HG changeset patch
# User Vadim Vygonets <
va...@vygo.net>
# Date 1384858885 -3600
# Node ID e5b9ff009e25d661ad1f71bba70c3f7ac71d2e80
# Parent 58bcf8fa172f6bbb254a90d1b9cec91d0a040157
xxd: Add -e: little endian hexdump
diff -r 58bcf8fa172f -r e5b9ff009e25 runtime/doc/xxd.1
--- a/runtime/doc/xxd.1 Sun Nov 17 20:32:54 2013 +0100
+++ b/runtime/doc/xxd.1 Tue Nov 19 12:01:25 2013 +0100
@@ -76,6 +76,16 @@
This does not change the hexadecimal representation. The option is
meaningless in combinations with \-r, \-p or \-i.
.TP
+.IR \-e
+Switch to little-endian hexdump.
+This option treats byte groups as words in little-endian byte order.
+The default grouping of 4 bytes may be changed using
+.RI "" \-g .
+This option only applies to hexdump, leaving the ASCII (or EBCDIC)
+representation unchanged.
+The command line switches
+\-r, \-p, \-i do not work with this mode.
+.TP
.IR "\-g bytes " | " \-groupsize bytes"
separate the output of every
.RI < bytes >
@@ -84,7 +94,7 @@
.I \-g 0
to suppress grouping.
.RI < Bytes "> defaults to " 2
-in normal mode and \fI1\fP in bits mode.
+in normal mode, \fI4\fP in little-endian mode and \fI1\fP in bits mode.
Grouping does not apply to postscript or include style.
.TP
.IR \-h " | " \-help
diff -r 58bcf8fa172f -r e5b9ff009e25 src/xxd/xxd.c
--- a/src/xxd/xxd.c Sun Nov 17 20:32:54 2013 +0100
+++ b/src/xxd/xxd.c Tue Nov 19 12:01:25 2013 +0100
@@ -51,6 +51,7 @@
* 16.05.00 Improved MMS file and merge for VMS by Zoltan Arpadffy
* 2011 March Better error handling by Florian Zumbiehl.
* 2011 April Formatting by Bram Moolenaar
+ * 08.06.2013 Little-endian hexdump (-e) by Vadim Vygonets.
*
* (c) 1990-1998 by Juergen Weigert (
jnwe...@informatik.uni-erlangen.de)
*
@@ -225,6 +226,7 @@
#define HEX_POSTSCRIPT 1
#define HEX_CINCLUDE 2
#define HEX_BITS 3 /* not hex a dump, but bits: 01111001 */
+#define HEX_LITTLEENDIAN 4
static char *pname;
@@ -238,7 +240,8 @@
fprintf(stderr, " -b binary digit dump (incompatible with -ps,-i,-r). Default hex.\n");
fprintf(stderr, " -c cols format <cols> octets per line. Default 16 (-i: 12, -ps: 30).\n");
fprintf(stderr, " -E show characters in EBCDIC. Default ASCII.\n");
- fprintf(stderr, " -g number of octets per group in normal output. Default 2.\n");
+ fprintf(stderr, " -e little-endian dump (incompatible with -ps,-i,-r).\n");
+ fprintf(stderr, " -g number of octets per group in normal output. Default 2 (-e: 4).\n");
fprintf(stderr, " -h print this summary.\n");
fprintf(stderr, " -i output in C include file style.\n");
fprintf(stderr, " -l len stop after <len> octets.\n");
@@ -503,6 +506,7 @@
pp = argv[1] + (!STRNCMP(argv[1], "--", 2) && argv[1][2]);
if (!STRNCMP(pp, "-a", 2)) autoskip = 1 - autoskip;
else if (!STRNCMP(pp, "-b", 2)) hextype = HEX_BITS;
+ else if (!STRNCMP(pp, "-e", 2)) hextype = HEX_LITTLEENDIAN;
else if (!STRNCMP(pp, "-u", 2)) hexx = hexxa + 16;
else if (!STRNCMP(pp, "-p", 2)) hextype = HEX_POSTSCRIPT;
else if (!STRNCMP(pp, "-i", 2)) hextype = HEX_CINCLUDE;
@@ -603,6 +607,7 @@
case HEX_CINCLUDE: cols = 12; break;
case HEX_BITS: cols = 6; break;
case HEX_NORMAL:
+ case HEX_LITTLEENDIAN:
default: cols = 16; break;
}
@@ -611,20 +616,28 @@
{
case HEX_BITS: octspergrp = 1; break;
case HEX_NORMAL: octspergrp = 2; break;
+ case HEX_LITTLEENDIAN: octspergrp = 4; break;
case HEX_POSTSCRIPT:
case HEX_CINCLUDE:
default: octspergrp = 0; break;
}
- if (cols < 1 || ((hextype == HEX_NORMAL || hextype == HEX_BITS)
+ if (cols < 1 || ((hextype == HEX_NORMAL || hextype == HEX_BITS || hextype == HEX_LITTLEENDIAN)
&& (cols > COLS)))
{
fprintf(stderr, "%s: invalid number of columns (max. %d).\n", pname, COLS);
exit(1);
}
- if (octspergrp < 1)
+ if (octspergrp < 1 || octspergrp > cols)
octspergrp = cols;
+ else if (hextype == HEX_LITTLEENDIAN && (octspergrp & (octspergrp-1)))
+ {
+ fprintf(stderr,
+ "%s: number of octets per group must be a power of 2 with -e.\n",
+ pname);
+ exit(1);
+ }
if (argc > 3)
exit_with_usage();
@@ -781,9 +794,9 @@
return 0;
}
- /* hextype: HEX_NORMAL or HEX_BITS */
+ /* hextype: HEX_NORMAL or HEX_BITS or HEX_LITTLEENDIAN */
- if (hextype == HEX_NORMAL)
+ if (hextype != HEX_BITS)
grplen = octspergrp + octspergrp + 1; /* chars per octet group */
else /* hextype == HEX_BITS */
grplen = 8 * octspergrp + 1;
@@ -801,6 +814,12 @@
l[c = (9 + (grplen * p) / octspergrp)] = hexx[(e >> 4) & 0xf];
l[++c] = hexx[ e & 0xf];
}
+ else if (hextype == HEX_LITTLEENDIAN)
+ {
+ int x = p ^ (octspergrp-1);
+ l[c = (9 + (grplen * x) / octspergrp)] = hexx[(e >> 4) & 0xf];
+ l[++c] = hexx[ e & 0xf];
+ }
else /* hextype == HEX_BITS */
{
int i;