Commits

James Taylor committed f19cc45

Added a file with methods for seeking to and reading a particular block in
a bzip2 file. Combined with the tables this give pseudo-random access to
bzip2 compressed data.

  • Participants
  • Parent commits 7231dd0

Comments (0)

Files changed (1)

File seek-bunzip.c

+#include <setjmp.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <unistd.h>
+
+#include "micro-bunzip.h"
+
+/**
+ * Seek the bunzip_data `bz` to a specific position in bits `pos` by lseeking
+ * the underlying file descriptor and priming the buffer with appropriate
+ * bits already consuming. This probably only makes sense for seeking to the
+ * start of a compressed block.
+ */
+static unsigned int seek_bits( bunzip_data *bd, unsigned long pos )
+{
+    off_t n_byte = pos / 8;
+    char n_bit = pos % 8;
+    
+    // Seek the underlying file descriptor
+    lseek( bd->in_fd, n_byte, SEEK_SET );
+    
+    // Init the buffer at the right bit position
+    bd->inbufBitCount = bd->inbufPos = bd->inbufCount = 0;
+    get_bits( bd, n_bit );
+    
+    // Update the bit position counter to match
+    bd->inPosBits = pos;
+}
+
+/**
+ * Attempt to uncompress exactly one block of data from the bunzip_data `bz`
+ * to the output buffer `outbuf`. The bunzip_data should be primed at the
+ * start of a block (see `seek_bits`), and outbuf should be large enough
+ * to accomodate `bd->dbufSize` bytes (the block size of the bzip file).
+ */
+int uncompress_block_to_buffer( bunzip_data *bd, char* outbuf )
+{
+    write_bunzip_data( bd, -1, outbuf, bd->dbufSize );
+}