diff options
author | DungSaga <dungsaga@users.noreply.github.com> | 2021-11-24 11:18:07 +0000 |
---|---|---|
committer | Bram Moolenaar <Bram@vim.org> | 2021-11-24 11:18:07 +0000 |
commit | 48608b4a4bfab4b9c0c9199d57b7e876c56db74c (patch) | |
tree | 9b369ab05b6ae65545241105b88d6ac49be6cd0d | |
parent | 112bed0cbeac84f73dca2682c5c2d74fabe1114d (diff) | |
download | vim-git-48608b4a4bfab4b9c0c9199d57b7e876c56db74c.tar.gz |
patch 8.2.3658: duplicate code in xxdv8.2.3658
Problem: Duplicate code in xxd.
Solution: Merge duplicated code. Add more tests. (closes #9192)
-rw-r--r-- | src/testdir/test_xxd.vim | 14 | ||||
-rw-r--r-- | src/version.c | 2 | ||||
-rw-r--r-- | src/xxd/xxd.c | 21 |
3 files changed, 28 insertions, 9 deletions
diff --git a/src/testdir/test_xxd.vim b/src/testdir/test_xxd.vim index 7768f9044..35d685fe1 100644 --- a/src/testdir/test_xxd.vim +++ b/src/testdir/test_xxd.vim @@ -263,6 +263,20 @@ func Test_xxd_usage() endfor endfunc +func Test_xxd_ignore_garbage() + new + exe 'r! printf "\n\r xxxx 0: 42 42" | ' . s:xxd_cmd . ' -r' + call assert_match('BB', join(getline(1, 3))) + bwipe! +endfunc + +func Test_xxd_bit_dump() + new + exe 'r! printf "123456" | ' . s:xxd_cmd . ' -b1' + call assert_match('00000000: 00110001 00110010 00110011 00110100 00110101 00110110 123456', join(getline(1, 3))) + bwipe! +endfunc + func Test_xxd_version() new exe 'r! ' . s:xxd_cmd . ' -v' diff --git a/src/version.c b/src/version.c index baca0af7e..a261ebd45 100644 --- a/src/version.c +++ b/src/version.c @@ -758,6 +758,8 @@ static char *(features[]) = static int included_patches[] = { /* Add new patch number below this line */ /**/ + 3658, +/**/ 3657, /**/ 3656, diff --git a/src/xxd/xxd.c b/src/xxd/xxd.c index cef3c6127..b6756aa89 100644 --- a/src/xxd/xxd.c +++ b/src/xxd/xxd.c @@ -809,33 +809,34 @@ main(int argc, char *argv[]) e = 0; while ((length < 0 || n < length) && (e = getc(fp)) != EOF) { + int x; + if (p == 0) { addrlen = sprintf(l, decimal_offset ? "%08ld:" : "%08lx:", ((unsigned long)(n + seekoff + displayoff))); for (c = addrlen; c < LLEN; l[c++] = ' '); } + x = hextype == HEX_LITTLEENDIAN ? p ^ (octspergrp-1) : p; + c = addrlen + 1 + (grplen * x) / octspergrp; if (hextype == HEX_NORMAL || hextype == HEX_LITTLEENDIAN) { - int x = hextype == HEX_NORMAL ? p : p ^ (octspergrp-1); - l[c = (addrlen + 1 + (grplen * x) / octspergrp)] - = hexx[(e >> 4) & 0xf]; + l[c] = hexx[(e >> 4) & 0xf]; l[++c] = hexx[e & 0xf]; } else /* hextype == HEX_BITS */ { int i; - - c = (addrlen + 1 + (grplen * p) / octspergrp) - 1; for (i = 7; i >= 0; i--) - l[++c] = (e & (1 << i)) ? '1' : '0'; + l[c++] = (e & (1 << i)) ? '1' : '0'; } if (e) nonzero++; if (ebcdic) e = (e < 64) ? '.' : etoa64[e-64]; /* When changing this update definition of LLEN above. */ - l[addrlen + 3 + (grplen * cols - 1)/octspergrp + p] = + c = addrlen + 3 + (grplen * cols - 1)/octspergrp + p; + l[c++] = #ifdef __MVS__ (e >= 64) #else @@ -845,7 +846,8 @@ main(int argc, char *argv[]) n++; if (++p == cols) { - l[c = (addrlen + 3 + (grplen * cols - 1)/octspergrp + p)] = '\n'; l[++c] = '\0'; + l[c] = '\n'; + l[++c] = '\0'; xxdline(fpo, l, autoskip ? nonzero : 1); nonzero = 0; p = 0; @@ -855,7 +857,8 @@ main(int argc, char *argv[]) perror_exit(2); if (p) { - l[c = (addrlen + 3 + (grplen * cols - 1)/octspergrp + p)] = '\n'; l[++c] = '\0'; + l[c] = '\n'; + l[++c] = '\0'; xxdline(fpo, l, 1); } else if (autoskip) |