]> granicus.if.org Git - vim/commitdiff
patch 8.2.3658: duplicate code in xxd v8.2.3658
authorDungSaga <dungsaga@users.noreply.github.com>
Wed, 24 Nov 2021 11:18:07 +0000 (11:18 +0000)
committerBram Moolenaar <Bram@vim.org>
Wed, 24 Nov 2021 11:18:07 +0000 (11:18 +0000)
Problem:    Duplicate code in xxd.
Solution:   Merge duplicated code. Add more tests. (closes #9192)

src/testdir/test_xxd.vim
src/version.c
src/xxd/xxd.c

index 7768f904427720d792c9e9c4555dfdb96204afc3..35d685fe1581bb3ee61be18e3b3c254b5069bb04 100644 (file)
@@ -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'
index baca0af7e6e91c153287fb3468edcf8d76e88a42..a261ebd4531396a4b6cae339a679ee3d2ab05032 100644 (file)
@@ -757,6 +757,8 @@ static char *(features[]) =
 
 static int included_patches[] =
 {   /* Add new patch number below this line */
+/**/
+    3658,
 /**/
     3657,
 /**/
index cef3c61279f24d5ea420a8f23b882fd1b756b95d..b6756aa8992228791f2343b3f3edf4a9a87c5ad5 100644 (file)
@@ -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)