0
0
mirror of https://github.com/vim/vim.git synced 2025-10-09 06:14:17 -04:00

updated for version 7.4.652

Problem:    Xxd lacks a few features.
Solution:   Use 8 characters for the file position.  Add the -e and -o
            arguments. (Vadim Vygonets)
This commit is contained in:
Bram Moolenaar
2015-03-05 17:51:15 +01:00
parent 4f36dc3bf7
commit 4dcdf29910
3 changed files with 66 additions and 15 deletions

View File

@@ -76,6 +76,16 @@ Change the character encoding in the righthand column from ASCII to EBCDIC.
This does not change the hexadecimal representation. The option is This does not change the hexadecimal representation. The option is
meaningless in combinations with \-r, \-p or \-i. meaningless in combinations with \-r, \-p or \-i.
.TP .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" .IR "\-g bytes " | " \-groupsize bytes"
separate the output of every separate the output of every
.RI < bytes > .RI < bytes >
@@ -84,7 +94,7 @@ Specify
.I \-g 0 .I \-g 0
to suppress grouping. to suppress grouping.
.RI < Bytes "> defaults to " 2 .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. Grouping does not apply to postscript or include style.
.TP .TP
.IR \-h " | " \-help .IR \-h " | " \-help
@@ -99,6 +109,11 @@ stop after writing
.RI < len > .RI < len >
octets. octets.
.TP .TP
.I \-o offset
add
.RI < offset >
to the displayed file position.
.TP
.IR \-p " | " \-ps " | " \-postscript " | " \-plain .IR \-p " | " \-ps " | " \-postscript " | " \-plain
output in postscript continuous hexdump style. Also known as plain hexdump output in postscript continuous hexdump style. Also known as plain hexdump
style. style.

View File

@@ -741,6 +741,8 @@ static char *(features[]) =
static int included_patches[] = static int included_patches[] =
{ /* Add new patch number below this line */ { /* Add new patch number below this line */
/**/
652,
/**/ /**/
651, 651,
/**/ /**/

View File

@@ -51,6 +51,7 @@
* 16.05.00 Improved MMS file and merge for VMS by Zoltan Arpadffy * 16.05.00 Improved MMS file and merge for VMS by Zoltan Arpadffy
* 2011 March Better error handling by Florian Zumbiehl. * 2011 March Better error handling by Florian Zumbiehl.
* 2011 April Formatting by Bram Moolenaar * 2011 April Formatting by Bram Moolenaar
* 08.06.2013 Little-endian hexdump (-e) and offset (-o) by Vadim Vygonets.
* *
* (c) 1990-1998 by Juergen Weigert (jnweiger@informatik.uni-erlangen.de) * (c) 1990-1998 by Juergen Weigert (jnweiger@informatik.uni-erlangen.de)
* *
@@ -216,7 +217,7 @@ static void xxdline __P((FILE *, char *, int));
#define TRY_SEEK /* attempt to use lseek, or skip forward by reading */ #define TRY_SEEK /* attempt to use lseek, or skip forward by reading */
#define COLS 256 /* change here, if you ever need more columns */ #define COLS 256 /* change here, if you ever need more columns */
#define LLEN (11 + (9*COLS-1)/1 + COLS + 2) #define LLEN (12 + (9*COLS-1) + COLS + 2)
char hexxa[] = "0123456789abcdef0123456789ABCDEF", *hexx = hexxa; char hexxa[] = "0123456789abcdef0123456789ABCDEF", *hexx = hexxa;
@@ -225,6 +226,7 @@ char hexxa[] = "0123456789abcdef0123456789ABCDEF", *hexx = hexxa;
#define HEX_POSTSCRIPT 1 #define HEX_POSTSCRIPT 1
#define HEX_CINCLUDE 2 #define HEX_CINCLUDE 2
#define HEX_BITS 3 /* not hex a dump, but bits: 01111001 */ #define HEX_BITS 3 /* not hex a dump, but bits: 01111001 */
#define HEX_LITTLEENDIAN 4
static char *pname; static char *pname;
@@ -238,10 +240,12 @@ exit_with_usage()
fprintf(stderr, " -b binary digit dump (incompatible with -ps,-i,-r). Default hex.\n"); 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, " -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, " -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, " -h print this summary.\n");
fprintf(stderr, " -i output in C include file style.\n"); fprintf(stderr, " -i output in C include file style.\n");
fprintf(stderr, " -l len stop after <len> octets.\n"); fprintf(stderr, " -l len stop after <len> octets.\n");
fprintf(stderr, " -o off add <off> to the displayed file position.\n");
fprintf(stderr, " -ps output in postscript plain hexdump style.\n"); fprintf(stderr, " -ps output in postscript plain hexdump style.\n");
fprintf(stderr, " -r reverse operation: convert (or patch) hexdump into binary.\n"); fprintf(stderr, " -r reverse operation: convert (or patch) hexdump into binary.\n");
fprintf(stderr, " -r -s off revert with <off> added to file positions found in hexdump.\n"); fprintf(stderr, " -r -s off revert with <off> added to file positions found in hexdump.\n");
@@ -475,7 +479,7 @@ main(argc, argv)
int ebcdic = 0; int ebcdic = 0;
int octspergrp = -1; /* number of octets grouped in output */ int octspergrp = -1; /* number of octets grouped in output */
int grplen; /* total chars per octet group */ int grplen; /* total chars per octet group */
long length = -1, n = 0, seekoff = 0; long length = -1, n = 0, seekoff = 0, displayoff = 0;
static char l[LLEN+1]; /* static because it may be too big for stack */ static char l[LLEN+1]; /* static because it may be too big for stack */
char *pp; char *pp;
@@ -503,6 +507,7 @@ main(argc, argv)
pp = argv[1] + (!STRNCMP(argv[1], "--", 2) && argv[1][2]); pp = argv[1] + (!STRNCMP(argv[1], "--", 2) && argv[1][2]);
if (!STRNCMP(pp, "-a", 2)) autoskip = 1 - autoskip; if (!STRNCMP(pp, "-a", 2)) autoskip = 1 - autoskip;
else if (!STRNCMP(pp, "-b", 2)) hextype = HEX_BITS; 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, "-u", 2)) hexx = hexxa + 16;
else if (!STRNCMP(pp, "-p", 2)) hextype = HEX_POSTSCRIPT; else if (!STRNCMP(pp, "-p", 2)) hextype = HEX_POSTSCRIPT;
else if (!STRNCMP(pp, "-i", 2)) hextype = HEX_CINCLUDE; else if (!STRNCMP(pp, "-i", 2)) hextype = HEX_CINCLUDE;
@@ -539,6 +544,19 @@ main(argc, argv)
argc--; argc--;
} }
} }
else if (!STRNCMP(pp, "-o", 2))
{
if (pp[2] && STRNCMP("ffset", pp + 2, 5))
displayoff = (int)strtol(pp + 2, NULL, 0);
else
{
if (!argv[2])
exit_with_usage();
displayoff = (int)strtol(argv[2], NULL, 0);
argv++;
argc--;
}
}
else if (!STRNCMP(pp, "-s", 2)) else if (!STRNCMP(pp, "-s", 2))
{ {
relseek = 0; relseek = 0;
@@ -603,6 +621,7 @@ main(argc, argv)
case HEX_CINCLUDE: cols = 12; break; case HEX_CINCLUDE: cols = 12; break;
case HEX_BITS: cols = 6; break; case HEX_BITS: cols = 6; break;
case HEX_NORMAL: case HEX_NORMAL:
case HEX_LITTLEENDIAN:
default: cols = 16; break; default: cols = 16; break;
} }
@@ -611,20 +630,28 @@ main(argc, argv)
{ {
case HEX_BITS: octspergrp = 1; break; case HEX_BITS: octspergrp = 1; break;
case HEX_NORMAL: octspergrp = 2; break; case HEX_NORMAL: octspergrp = 2; break;
case HEX_LITTLEENDIAN: octspergrp = 4; break;
case HEX_POSTSCRIPT: case HEX_POSTSCRIPT:
case HEX_CINCLUDE: case HEX_CINCLUDE:
default: octspergrp = 0; break; 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))) && (cols > COLS)))
{ {
fprintf(stderr, "%s: invalid number of columns (max. %d).\n", pname, COLS); fprintf(stderr, "%s: invalid number of columns (max. %d).\n", pname, COLS);
exit(1); exit(1);
} }
if (octspergrp < 1) if (octspergrp < 1 || octspergrp > cols)
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) if (argc > 3)
exit_with_usage(); exit_with_usage();
@@ -781,9 +808,9 @@ main(argc, argv)
return 0; 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 */ grplen = octspergrp + octspergrp + 1; /* chars per octet group */
else /* hextype == HEX_BITS */ else /* hextype == HEX_BITS */
grplen = 8 * octspergrp + 1; grplen = 8 * octspergrp + 1;
@@ -793,26 +820,33 @@ main(argc, argv)
{ {
if (p == 0) if (p == 0)
{ {
sprintf(l, "%07lx: ", n + seekoff); sprintf(l, "%08lx:",
((unsigned long)(n + seekoff + displayoff)) & 0xffffffff);
for (c = 9; c < LLEN; l[c++] = ' '); for (c = 9; c < LLEN; l[c++] = ' ');
} }
if (hextype == HEX_NORMAL) if (hextype == HEX_NORMAL)
{ {
l[c = (9 + (grplen * p) / octspergrp)] = hexx[(e >> 4) & 0xf]; l[c = (10 + (grplen * p) / octspergrp)] = hexx[(e >> 4) & 0xf];
l[++c] = hexx[ e & 0xf]; l[++c] = hexx[ e & 0xf];
}
else if (hextype == HEX_LITTLEENDIAN)
{
int x = p ^ (octspergrp-1);
l[c = (10 + (grplen * x) / octspergrp)] = hexx[(e >> 4) & 0xf];
l[++c] = hexx[ e & 0xf];
} }
else /* hextype == HEX_BITS */ else /* hextype == HEX_BITS */
{ {
int i; int i;
c = (9 + (grplen * p) / octspergrp) - 1; c = (10 + (grplen * p) / octspergrp) - 1;
for (i = 7; i >= 0; i--) for (i = 7; i >= 0; i--)
l[++c] = (e & (1 << i)) ? '1' : '0'; l[++c] = (e & (1 << i)) ? '1' : '0';
} }
if (ebcdic) if (ebcdic)
e = (e < 64) ? '.' : etoa64[e-64]; e = (e < 64) ? '.' : etoa64[e-64];
/* When changing this update definition of LLEN above. */ /* When changing this update definition of LLEN above. */
l[11 + (grplen * cols - 1)/octspergrp + p] = l[12 + (grplen * cols - 1)/octspergrp + p] =
#ifdef __MVS__ #ifdef __MVS__
(e >= 64) (e >= 64)
#else #else
@@ -824,7 +858,7 @@ main(argc, argv)
n++; n++;
if (++p == cols) if (++p == cols)
{ {
l[c = (11 + (grplen * cols - 1)/octspergrp + p)] = '\n'; l[++c] = '\0'; l[c = (12 + (grplen * cols - 1)/octspergrp + p)] = '\n'; l[++c] = '\0';
xxdline(fpo, l, autoskip ? nonzero : 1); xxdline(fpo, l, autoskip ? nonzero : 1);
nonzero = 0; nonzero = 0;
p = 0; p = 0;
@@ -834,7 +868,7 @@ main(argc, argv)
die(2); die(2);
if (p) if (p)
{ {
l[c = (11 + (grplen * cols - 1)/octspergrp + p)] = '\n'; l[++c] = '\0'; l[c = (12 + (grplen * cols - 1)/octspergrp + p)] = '\n'; l[++c] = '\0';
xxdline(fpo, l, 1); xxdline(fpo, l, 1);
} }
else if (autoskip) else if (autoskip)