summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDungSaga <dungsaga@users.noreply.github.com>2021-11-24 11:18:07 +0000
committerBram Moolenaar <Bram@vim.org>2021-11-24 11:18:07 +0000
commit48608b4a4bfab4b9c0c9199d57b7e876c56db74c (patch)
tree9b369ab05b6ae65545241105b88d6ac49be6cd0d
parent112bed0cbeac84f73dca2682c5c2d74fabe1114d (diff)
downloadvim-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.vim14
-rw-r--r--src/version.c2
-rw-r--r--src/xxd/xxd.c21
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)