]> git.ipfire.org Git - thirdparty/grub.git/commitdiff
* grub-core/fs/ntfs.c (read_run_data): Rewrite using bitfields.
authorVladimir 'phcoder' Serbinenko <phcoder@gmail.com>
Mon, 21 Oct 2013 02:05:23 +0000 (04:05 +0200)
committerVladimir 'phcoder' Serbinenko <phcoder@gmail.com>
Mon, 21 Oct 2013 02:05:23 +0000 (04:05 +0200)
Saves 40 bytes on compressed image.

ChangeLog
grub-core/fs/ntfs.c

index e5c837514dd186e3f94a50146a73f8c6657e5b19..29525cb53f27874974bc1e26132f8baed2579e8a 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,9 @@
+2013-10-21  Vladimir Serbinenko  <phcoder@gmail.com>
+
+       * grub-core/fs/ntfs.c (read_run_data): Rewrite using bitfields.
+
+       Saves 40 bytes on compressed image.
+
 2013-10-21  Vladimir Serbinenko  <phcoder@gmail.com>
 
        * grub-core/fs/ntfs.c (grub_ntfs_iterate_dir): Use grub_uint8_t for
index 3ed926dc6e2ccd615667aab039c74e274dcf56a0..f917ab91c5d5eeacc55d472cd76b2142593f7fed 100644 (file)
@@ -283,25 +283,17 @@ locate_attr (struct grub_ntfs_attr *at, struct grub_ntfs_file *mft,
   return pa;
 }
 
-static grub_uint8_t *
-read_run_data (grub_uint8_t *run, int nn, grub_disk_addr_t * val, int sig)
+static grub_disk_addr_t
+read_run_data (const grub_uint8_t *run, int nn, int sig)
 {
-  grub_disk_addr_t r, v;
-
-  r = 0;
-  v = 1;
+  grub_uint64_t r = 0;
 
-  while (nn--)
-    {
-      r += v * (*(run++));
-      v <<= 8;
-    }
+  if (sig && nn && (run[nn - 1] & 0x80))
+    r = -1;
 
-  if ((sig) && (r & (v >> 1)))
-    r -= v;
+  grub_memcpy (&r, run, nn);
 
-  *val = r;
-  return run;
+  return grub_le_to_cpu64 (r);
 }
 
 grub_err_t
@@ -313,8 +305,9 @@ grub_ntfs_read_run_list (struct grub_ntfs_rlst * ctx)
 
   run = ctx->cur_run;
 retry:
-  c1 = ((*run) & 0xF);
-  c2 = ((*run) >> 4);
+  c1 = ((*run) & 0x7);
+  c2 = ((*run) >> 4) & 0x7;
+  run++;
   if (!c1)
     {
       if ((ctx->attr) && (ctx->attr->flags & GRUB_NTFS_AF_ALST))
@@ -338,10 +331,11 @@ retry:
        }
       return grub_error (GRUB_ERR_BAD_FS, "run list overflown");
     }
-  run = read_run_data (run + 1, c1, &val, 0);  /* length of current VCN */
   ctx->curr_vcn = ctx->next_vcn;
-  ctx->next_vcn += val;
-  run = read_run_data (run, c2, &val, 1);      /* offset to previous LCN */
+  ctx->next_vcn += read_run_data (run, c1, 0); /* length of current VCN */
+  run += c1;
+  val = read_run_data (run, c2, 1);    /* offset to previous LCN */
+  run += c2;
   ctx->curr_lcn += val;
   if (val == 0)
     ctx->flags |= GRUB_NTFS_RF_BLNK;