# HG changeset patch # User Bram Moolenaar # Date 1642161607 -3600 # Node ID 2f854597399f933fbc557557c42ad9ee0e3d7046 # Parent a11e7c054f98b113da874e7de87824df3ef499ba patch 8.2.4088: xxd cannot output everything in one line Commit: https://github.com/vim/vim/commit/c0a1d370fa655cea9eaa74f5e605b95825dc9de1 Author: Erik Auerswald Date: Fri Jan 14 11:58:48 2022 +0000 patch 8.2.4088: xxd cannot output everything in one line Problem: Xxd cannot output everything in one line. Solution: Make zero columns mean infinite columns. (Erik Auerswald, closes #9524) diff --git a/runtime/doc/xxd.1 b/runtime/doc/xxd.1 --- a/runtime/doc/xxd.1 +++ b/runtime/doc/xxd.1 @@ -70,6 +70,7 @@ followed by an ascii (or ebcdic) represe Format .RI < cols > octets per line. Default 16 (\-i: 12, \-ps: 30, \-b: 6). Max 256. +No maxmimum for \-ps. With \-ps, 0 results in one long line of output. .TP .IR \-C " | " \-capitalize Capitalize variable names in C include file style, when using \-i. diff --git a/runtime/doc/xxd.man b/runtime/doc/xxd.man --- a/runtime/doc/xxd.man +++ b/runtime/doc/xxd.man @@ -42,7 +42,8 @@ OPTIONS -c cols | -cols cols Format octets per line. Default 16 (-i: 12, -ps: 30, -b: - 6). Max 256. + 6). Max 256. No maxmimum for -ps. With -ps, 0 results in one + long line of output. -C | -capitalize Capitalize variable names in C include file style, when using diff --git a/src/testdir/test_xxd.vim b/src/testdir/test_xxd.vim --- a/src/testdir/test_xxd.vim +++ b/src/testdir/test_xxd.vim @@ -320,10 +320,11 @@ func Test_xxd_max_cols() endfunc " -c0 selects the format specific default column value, as if no -c was given +" except for -ps, where it disables extra newlines func Test_xxd_c0_is_def_cols() call writefile(["abcdefghijklmnopqrstuvwxyz0123456789"], 'Xxdin') for cols in ['-c0', '-c 0', '-cols 0'] - for fmt in ['', '-b', '-e', '-i', '-p', ] + for fmt in ['', '-b', '-e', '-i'] exe 'r! ' . s:xxd_cmd . ' ' . fmt ' Xxdin > Xxdout1' exe 'r! ' . s:xxd_cmd . ' ' . cols . ' ' . fmt ' Xxdin > Xxdout2' call assert_equalfile('Xxdout1', 'Xxdout2') @@ -334,4 +335,27 @@ func Test_xxd_c0_is_def_cols() call delete('Xxdout2') endfunc +" all output in a single line for -c0 -ps +func Test_xxd_plain_one_line() + call writefile([ + \ "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789", + \ "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789", + \ "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789", + \ "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789", + \ "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789", + \ "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789"], + \ 'Xxdin') + for cols in ['-c0', '-c 0', '-cols 0'] + exe 'r! ' . s:xxd_cmd . ' -ps ' . cols ' Xxdin' + " output seems to start in line 2 + let out = join(getline(2, '$')) + bwipe! + " newlines in xxd output result in spaces in the string variable out + call assert_notmatch(" ", out) + " xxd output must be non-empty and comprise only lower case hex digits + call assert_match("^[0-9a-f][0-9a-f]*$", out) + endfor + call delete('Xxdin') +endfunc + " vim: shiftwidth=2 sts=2 expandtab diff --git a/src/version.c b/src/version.c --- a/src/version.c +++ b/src/version.c @@ -751,6 +751,8 @@ static char *(features[]) = static int included_patches[] = { /* Add new patch number below this line */ /**/ + 4088, +/**/ 4087, /**/ 4086, diff --git a/src/xxd/xxd.c b/src/xxd/xxd.c --- 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;