From eb61c947dee780edd8d9150600b59361ade48a3d Mon Sep 17 00:00:00 2001 From: Elliot Nunn Date: Mon, 10 Dec 2018 16:07:34 +0800 Subject: [PATCH] API: add 'sparse' option to Volume.write() This will cause it to return a (bytes, num_free_bytes, bytes) tuple. --- machfs/main.py | 21 +++++++++++++++------ 1 file changed, 15 insertions(+), 6 deletions(-) diff --git a/machfs/main.py b/machfs/main.py index 6cf446f..5155f43 100644 --- a/machfs/main.py +++ b/machfs/main.py @@ -218,7 +218,7 @@ class Volume(AbstractFolder): self.pop('Desktop DB', None) self.pop('Desktop DF', None) - def write(self, size=800*1024, align=512, desktopdb=True, bootable=True, startapp=None): + def write(self, size=800*1024, align=512, desktopdb=True, bootable=True, startapp=None, sparse=False): if align < 512 or align % 512: raise ValueError('align must be multiple of 512') @@ -459,8 +459,17 @@ class Volume(AbstractFolder): vib += bytes(512-len(vib)) assert all(len(x) == drAlBlkSiz for x in blkaccum) - finalchunks = [bootblocks, vib, bitmap, *blkaccum] - finalchunks.append(bytes(size - sum(len(x) for x in finalchunks) - 2*512)) - finalchunks.append(vib) - finalchunks.append(bytes(512)) - return b''.join(finalchunks) + left_elements = [bootblocks, vib, bitmap, *blkaccum] + + unused_offset = sum(len(x) for x in left_elements) + unused_length = size - unused_offset - 2*512 + + right_elements = [vib, bytes(512)] + + if sparse: + return b''.join(left_elements), unused_length, b''.join(right_elements) + else: + all_elements = left_elements + all_elements.append(bytes(unused_length)) + all_elements.extend(right_elements) + return b''.join(all_elements)