changeset 32104:5a1113ece237 v9.0.1383

patch 9.0.1383: xxd: combination of little endian and cols fails Commit: https://github.com/vim/vim/commit/4390d872b6c9498527a43fc7c30a5384f2e1db12 Author: Bram Moolenaar <Bram@vim.org> Date: Sun Mar 5 20:17:39 2023 +0000 patch 9.0.1383: xxd: combination of little endian and cols fails Problem: xxd: combination of little endian and cols fails. (Aapo Rantalainen) Solution: Round up the space taken by the hex output. (closes #12097)
author Bram Moolenaar <Bram@vim.org>
date Sun, 05 Mar 2023 21:30:03 +0100
parents 0ec8ebc433fd
children 2065b5d6a4eb
files src/testdir/test_xxd.vim src/version.c src/xxd/xxd.c
diffstat 3 files changed, 24 insertions(+), 2 deletions(-) [+]
line wrap: on
line diff
--- 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
--- 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,
--- 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)