summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorBram Moolenaar <Bram@vim.org>2023-03-05 20:17:39 +0000
committerBram Moolenaar <Bram@vim.org>2023-03-05 20:17:39 +0000
commit4390d872b6c9498527a43fc7c30a5384f2e1db12 (patch)
tree4e098811c1ab01f99b600ce5b477e254b6d8e348
parentc142d6513e8d71a8f26c5ca1cb00b7b3de9b15e6 (diff)
patch 9.0.1383: xxd: combination of little endian and cols failsv9.0.1383
Problem: xxd: combination of little endian and cols fails. (Aapo Rantalainen) Solution: Round up the space taken by the hex output. (closes #12097)
-rw-r--r--src/testdir/test_xxd.vim14
-rw-r--r--src/version.c2
-rw-r--r--src/xxd/xxd.c10
3 files changed, 24 insertions, 2 deletions
diff --git a/src/testdir/test_xxd.vim b/src/testdir/test_xxd.vim
index 92a4d05998..d20ea9ce10 100644
--- a/src/testdir/test_xxd.vim
+++ b/src/testdir/test_xxd.vim
@@ -401,4 +401,18 @@ func Test_xxd_plain_one_line()
endfor
endfunc
+func Test_xxd_little_endian_with_cols()
+ enew!
+ call writefile(["ABCDEF"], 'Xxdin', 'D')
+ exe 'r! ' .. s:xxd_cmd .. ' -e -c6 ' .. ' Xxdin'
+ call assert_equal('00000000: 44434241 4645 ABCDEF', getline(2))
+
+ enew!
+ call writefile(["ABCDEFGHI"], 'Xxdin', 'D')
+ exe 'r! ' .. s:xxd_cmd .. ' -e -c9 ' .. ' Xxdin'
+ call assert_equal('00000000: 44434241 48474645 49 ABCDEFGHI', getline(2))
+
+ bwipe!
+endfunc
+
" vim: shiftwidth=2 sts=2 expandtab
diff --git a/src/version.c b/src/version.c
index 8533a0815d..4482a6e911 100644
--- a/src/version.c
+++ b/src/version.c
@@ -696,6 +696,8 @@ static char *(features[]) =
static int included_patches[] =
{ /* Add new patch number below this line */
/**/
+ 1383,
+/**/
1382,
/**/
1381,
diff --git a/src/xxd/xxd.c b/src/xxd/xxd.c
index 2105a1c9c6..e2fc9dff6a 100644
--- a/src/xxd/xxd.c
+++ b/src/xxd/xxd.c
@@ -837,7 +837,8 @@ main(int argc, char *argv[])
{
addrlen = sprintf(l, decimal_offset ? "%08ld:" : "%08lx:",
((unsigned long)(n + seekoff + displayoff)));
- for (c = addrlen; c < LLEN; l[c++] = ' ');
+ for (c = addrlen; c < LLEN; l[c++] = ' ')
+ ;
}
x = hextype == HEX_LITTLEENDIAN ? p ^ (octspergrp-1) : p;
c = addrlen + 1 + (grplen * x) / octspergrp;
@@ -857,7 +858,12 @@ main(int argc, char *argv[])
if (ebcdic)
e = (e < 64) ? '.' : etoa64[e-64];
/* When changing this update definition of LLEN above. */
- c = addrlen + 3 + (grplen * cols - 1)/octspergrp + p;
+ if (hextype == HEX_LITTLEENDIAN)
+ /* last group will be fully used, round up */
+ c = grplen * ((cols + octspergrp - 1) / octspergrp);
+ else
+ c = (grplen * cols - 1) / octspergrp;
+ c += addrlen + 3 + p;
l[c++] =
#ifdef __MVS__
(e >= 64)