summaryrefslogtreecommitdiff
path: root/src/xxd
diff options
context:
space:
mode:
authorErik Auerswald <auerswal@unix-ag.uni-kl.de>2022-01-14 11:58:48 +0000
committerBram Moolenaar <Bram@vim.org>2022-01-14 11:58:48 +0000
commitc0a1d370fa655cea9eaa74f5e605b95825dc9de1 (patch)
tree2cd3664ecb9cc8fc2f32aa23a400aadc1f21bf75 /src/xxd
parent3e4fa3d7d37162cd08fc0c6e83f52fd323f63eba (diff)
downloadvim-git-c0a1d370fa655cea9eaa74f5e605b95825dc9de1.tar.gz
patch 8.2.4088: xxd cannot output everything in one linev8.2.4088
Problem: Xxd cannot output everything in one line. Solution: Make zero columns mean infinite columns. (Erik Auerswald, closes #9524)
Diffstat (limited to 'src/xxd')
-rw-r--r--src/xxd/xxd.c21
1 files changed, 14 insertions, 7 deletions
diff --git a/src/xxd/xxd.c b/src/xxd/xxd.c
index c32b9b8fb..0e056c93d 100644
--- a/src/xxd/xxd.c
+++ b/src/xxd/xxd.c
@@ -54,6 +54,7 @@
* 08.06.2013 Little-endian hexdump (-e) and offset (-o) by Vadim Vygonets.
* 11.01.2019 Add full 64/32 bit range to -o and output by Christer Jensen.
* 04.02.2020 Add -d for decimal offsets by Aapo Rantalainen
+ * 14.01.2022 Disable extra newlines with -c0 -p by Erik Auerswald.
*
* (c) 1990-1998 by Juergen Weigert (jnweiger@gmail.com)
*
@@ -135,7 +136,7 @@ extern void perror __P((char *));
extern long int strtol();
extern long int ftell();
-char version[] = "xxd 2021-10-22 by Juergen Weigert et al.";
+char version[] = "xxd 2022-01-14 by Juergen Weigert et al.";
#ifdef WIN32
char osver[] = " (Win32)";
#else
@@ -487,7 +488,7 @@ main(int argc, char *argv[])
{
FILE *fp, *fpo;
int c, e, p = 0, relseek = 1, negseek = 0, revert = 0;
- int cols = 0, nonzero = 0, autoskip = 0, hextype = HEX_NORMAL;
+ int cols = 0, colsgiven = 0, nonzero = 0, autoskip = 0, hextype = HEX_NORMAL;
int capitalize = 0, decimal_offset = 0;
int ebcdic = 0;
int octspergrp = -1; /* number of octets grouped in output */
@@ -540,11 +541,15 @@ main(int argc, char *argv[])
if (pp[2] && !STRNCMP("apitalize", pp + 2, 9))
capitalize = 1;
else if (pp[2] && STRNCMP("ols", pp + 2, 3))
- cols = (int)strtol(pp + 2, NULL, 0);
+ {
+ colsgiven = 1;
+ cols = (int)strtol(pp + 2, NULL, 0);
+ }
else
{
if (!argv[2])
exit_with_usage();
+ colsgiven = 1;
cols = (int)strtol(argv[2], NULL, 0);
argv++;
argc--;
@@ -645,7 +650,7 @@ main(int argc, char *argv[])
argc--;
}
- if (!cols)
+ if (!colsgiven || (!cols && hextype != HEX_POSTSCRIPT))
switch (hextype)
{
case HEX_POSTSCRIPT: cols = 30; break;
@@ -667,7 +672,9 @@ main(int argc, char *argv[])
default: octspergrp = 0; break;
}
- if (cols < 1 || ((hextype == HEX_NORMAL || hextype == HEX_BITS || hextype == HEX_LITTLEENDIAN)
+ if ((hextype == HEX_POSTSCRIPT && cols < 0) ||
+ (hextype != HEX_POSTSCRIPT && 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);
@@ -787,13 +794,13 @@ main(int argc, char *argv[])
putc_or_die(hexx[(e >> 4) & 0xf], fpo);
putc_or_die(hexx[e & 0xf], fpo);
n++;
- if (!--p)
+ if (cols > 0 && !--p)
{
putc_or_die('\n', fpo);
p = cols;
}
}
- if (p < cols)
+ if (cols == 0 || p < cols)
putc_or_die('\n', fpo);
fclose_or_die(fp, fpo);
return 0;