+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
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
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))
}
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;