patch 9.0.2066: xxd: corrupting files when reversing bit dumps

Problem:  xxd: corrupting files when reversing bit dumps
Solution: handle reversing bit dump slightly differently

fixes:  #13410
closes: #13415

Co-authored-by: OldWorldOrdr <joey.t.reinhart@gmail.com>
Co-authored-by: K.Takata <kentkt@csc.jp>
Signed-off-by: Christian Brabandt <cb@256bit.org>
Signed-off-by: K.Takata <kentkt@csc.jp>
Signed-off-by: tristhaus <tristhaus@yahoo.de>
diff --git a/src/testdir/test_xxd.vim b/src/testdir/test_xxd.vim
index 53e1a95..7a2771e 100644
--- a/src/testdir/test_xxd.vim
+++ b/src/testdir/test_xxd.vim
@@ -373,6 +373,13 @@
   bwipe!
 endfunc
 
+func Test_xxd_roundtrip_large_bit_dump()
+  new
+  exe 'r! printf "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789" | ' . s:xxd_cmd . ' -b | ' . s:xxd_cmd . ' -r -b'
+  call assert_match('abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ012345678', 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 9198a78..e45d7fa 100644
--- a/src/version.c
+++ b/src/version.c
@@ -705,6 +705,8 @@
 static int included_patches[] =
 {   /* Add new patch number below this line */
 /**/
+    2066,
+/**/
     2065,
 /**/
     2064,
diff --git a/src/xxd/xxd.c b/src/xxd/xxd.c
index 544aa50..94a0e61 100644
--- a/src/xxd/xxd.c
+++ b/src/xxd/xxd.c
@@ -136,7 +136,7 @@
 # endif
 #endif
 
-char version[] = "xxd 2023-10-08 by Juergen Weigert et al.";
+char version[] = "xxd 2023-10-24 by Juergen Weigert et al.";
 #ifdef WIN32
 char osver[] = " (Win32)";
 #else
@@ -418,19 +418,13 @@
             }
           else /* HEX_BITS */
             {
-              n1 = parse_hex_digit(c);
-              if (n1 >= 0)
-                {
-                  want_off = (want_off << 4) | n1;
-                }
-
-              if (bt < 0)
-                {
-                  p = 0;
+	      if (n1 < 0)
+	        {
+	          p = 0;
                   bcnt = 0;
-                  b = 0;
-                  continue;
-                }
+	          continue;
+	        }
+	      want_off = (want_off << 4) | n1;
             }
           continue;
         }