diff options
author | Erik Auerswald <auerswal@unix-ag.uni-kl.de> | 2022-01-14 11:58:48 +0000 |
---|---|---|
committer | Bram Moolenaar <Bram@vim.org> | 2022-01-14 11:58:48 +0000 |
commit | c0a1d370fa655cea9eaa74f5e605b95825dc9de1 (patch) | |
tree | 2cd3664ecb9cc8fc2f32aa23a400aadc1f21bf75 /src/xxd | |
parent | 3e4fa3d7d37162cd08fc0c6e83f52fd323f63eba (diff) | |
download | vim-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.c | 21 |
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; |