]> git.ipfire.org Git - thirdparty/coreutils.git/commitdiff
od: simplify away one loop copy
authorPaul Eggert <eggert@cs.ucla.edu>
Sat, 28 Jun 2025 21:01:18 +0000 (14:01 -0700)
committerPaul Eggert <eggert@cs.ucla.edu>
Sun, 29 Jun 2025 04:00:41 +0000 (21:00 -0700)
* src/od.c (dump): Coalesce two loops into one.

src/od.c

index 563baf0b167e5f4360418397e7b5028e4c0794bc..847eb6d74353a72863a3e986c3f6afc34f018521 100644 (file)
--- a/src/od.c
+++ b/src/od.c
@@ -1467,7 +1467,6 @@ static bool
 dump (void)
 {
   char *block[2];
-  intmax_t current_offset;
   bool idx = false;
   bool ok = true;
   idx_t n_bytes_read;
@@ -1475,46 +1474,30 @@ dump (void)
   block[0] = xinmalloc (2, bytes_per_block);
   block[1] = block[0] + bytes_per_block;
 
-  current_offset = n_bytes_to_skip;
+  intmax_t current_offset = n_bytes_to_skip;
 
-  if (0 <= end_offset)
-    {
-      while (ok)
-        {
-          if (current_offset >= end_offset)
-            {
-              n_bytes_read = 0;
-              break;
-            }
-          idx_t n_needed = MIN (end_offset - current_offset, bytes_per_block);
-          ok &= read_block (n_needed, block[idx], &n_bytes_read);
-          if (n_bytes_read < bytes_per_block)
-            break;
-          affirm (n_bytes_read == bytes_per_block);
-          write_block (current_offset, n_bytes_read,
-                       block[!idx], block[idx]);
-          if (ferror (stdout))
-            ok = false;
-          current_offset += n_bytes_read;
-          idx = !idx;
-        }
-    }
-  else
+  do
     {
-      while (ok)
+      intmax_t needed_bound
+        = end_offset < 0 ? INTMAX_MAX : end_offset - current_offset;
+      if (needed_bound <= 0)
         {
-          ok &= read_block (bytes_per_block, block[idx], &n_bytes_read);
-          if (n_bytes_read < bytes_per_block)
-            break;
-          affirm (n_bytes_read == bytes_per_block);
-          write_block (current_offset, n_bytes_read,
-                       block[!idx], block[idx]);
-          if (ferror (stdout))
-            ok = false;
-          current_offset += n_bytes_read;
-          idx = !idx;
+          n_bytes_read = 0;
+          break;
         }
+      idx_t n_needed = MIN (bytes_per_block, needed_bound);
+      ok &= read_block (n_needed, block[idx], &n_bytes_read);
+      if (n_bytes_read < bytes_per_block)
+        break;
+      affirm (n_bytes_read == bytes_per_block);
+      write_block (current_offset, n_bytes_read,
+                   block[!idx], block[idx]);
+      if (ferror (stdout))
+        ok = false;
+      current_offset += n_bytes_read;
+      idx = !idx;
     }
+  while (ok);
 
   if (n_bytes_read > 0)
     {