Skip to content

Commit

Permalink
Remove global gCheck
Browse files Browse the repository at this point in the history
  • Loading branch information
vasi committed Nov 5, 2012
1 parent 4ef79b6 commit dd86134
Show file tree
Hide file tree
Showing 3 changed files with 53 additions and 52 deletions.
73 changes: 37 additions & 36 deletions common.c
Expand Up @@ -5,16 +5,9 @@


#pragma mark UTILS #pragma mark UTILS


typedef struct {
lzma_block block;
lzma_filter filters[LZMA_FILTERS_MAX + 1];
} block_wrapper_t;

FILE *gInFile = NULL; FILE *gInFile = NULL;
lzma_stream gStream = LZMA_STREAM_INIT; lzma_stream gStream = LZMA_STREAM_INIT;


lzma_check gCheck = LZMA_CHECK_NONE;



void die(const char *fmt, ...) { void die(const char *fmt, ...) {
va_list args; va_list args;
Expand All @@ -36,32 +29,6 @@ char *xstrdup(const char *s) {
return memcpy(r, s, len + 1); return memcpy(r, s, len + 1);
} }


void *decode_block_start(off_t block_seek) {
if (fseeko(gInFile, block_seek, SEEK_SET) == -1)
die("Error seeking to block");

// Some memory in which to keep the discovered filters safe
block_wrapper_t *bw = malloc(sizeof(block_wrapper_t));
bw->block = (lzma_block){ .check = gCheck, .filters = bw->filters,
.version = 0 };

int b = fgetc(gInFile);
if (b == EOF || b == 0)
die("Error reading block size");
bw->block.header_size = lzma_block_header_size_decode(b);
uint8_t hdrbuf[bw->block.header_size];
hdrbuf[0] = (uint8_t)b;
if (fread(hdrbuf + 1, bw->block.header_size - 1, 1, gInFile) != 1)
die("Error reading block header");
if (lzma_block_header_decode(&bw->block, NULL, hdrbuf) != LZMA_OK)
die("Error decoding file index block header");

if (lzma_block_decoder(&gStream, &bw->block) != LZMA_OK)
die("Error initializing file index stream");

return bw;
}

bool is_multi_header(const char *name) { bool is_multi_header(const char *name) {
size_t i = strlen(name); size_t i = strlen(name);
while (i != 0 && name[i - 1] != '/') while (i != 0 && name[i - 1] != '/')
Expand All @@ -82,6 +49,9 @@ static lzma_ret gFIBErr = LZMA_OK;
static uint8_t gFIBInputBuf[CHUNKSIZE]; static uint8_t gFIBInputBuf[CHUNKSIZE];
static size_t gMoved = 0; static size_t gMoved = 0;


static void *decode_file_index_start(off_t block_seek, lzma_check check);
static lzma_vli find_file_index(void **bdatap);

static char *read_file_index_name(void); static char *read_file_index_name(void);
static void read_file_index_make_space(void); static void read_file_index_make_space(void);
static void read_file_index_data(void); static void read_file_index_data(void);
Expand Down Expand Up @@ -109,7 +79,38 @@ void free_file_index(void) {
gFileIndex = gLastFile = NULL; gFileIndex = gLastFile = NULL;
} }


lzma_vli find_file_index(void **bdatap) { typedef struct {
lzma_block block;
lzma_filter filters[LZMA_FILTERS_MAX + 1];
} block_wrapper_t;

static void *decode_file_index_start(off_t block_seek, lzma_check check) {
if (fseeko(gInFile, block_seek, SEEK_SET) == -1)
die("Error seeking to block");

// Some memory in which to keep the discovered filters safe
block_wrapper_t *bw = malloc(sizeof(block_wrapper_t));
bw->block = (lzma_block){ .check = check, .filters = bw->filters,
.version = 0 };

int b = fgetc(gInFile);
if (b == EOF || b == 0)
die("Error reading block size");
bw->block.header_size = lzma_block_header_size_decode(b);
uint8_t hdrbuf[bw->block.header_size];
hdrbuf[0] = (uint8_t)b;
if (fread(hdrbuf + 1, bw->block.header_size - 1, 1, gInFile) != 1)
die("Error reading block header");
if (lzma_block_header_decode(&bw->block, NULL, hdrbuf) != LZMA_OK)
die("Error decoding file index block header");

if (lzma_block_decoder(&gStream, &bw->block) != LZMA_OK)
die("Error initializing file index stream");

return bw;
}

static lzma_vli find_file_index(void **bdatap) {
if (!gIndex) if (!gIndex)
decode_index(); decode_index();


Expand All @@ -119,7 +120,8 @@ lzma_vli find_file_index(void **bdatap) {
lzma_vli loc = lzma_index_uncompressed_size(gIndex) - 1; lzma_vli loc = lzma_index_uncompressed_size(gIndex) - 1;
if (lzma_index_iter_locate(&iter, loc)) if (lzma_index_iter_locate(&iter, loc))
die("Can't locate file index block"); die("Can't locate file index block");
void *bdata = decode_block_start(iter.block.compressed_file_offset); void *bdata = decode_file_index_start(iter.block.compressed_file_offset,
iter.stream.flags->check);


gFileIndexBuf = malloc(gFIBSize); gFileIndexBuf = malloc(gFIBSize);
gStream.avail_out = gFIBSize; gStream.avail_out = gFIBSize;
Expand Down Expand Up @@ -281,7 +283,6 @@ static void stream_footer(bw *b, lzma_stream_flags *flags) {


if (lzma_stream_footer_decode(flags, ftr) != LZMA_OK) if (lzma_stream_footer_decode(flags, ftr) != LZMA_OK)
die("Error decoding stream footer"); die("Error decoding stream footer");
gCheck = flags->check; // FIXME: multiple streams
} }


static lzma_index *next_index(off_t *pos) { static lzma_index *next_index(off_t *pos) {
Expand Down
6 changes: 0 additions & 6 deletions pixz.h
Expand Up @@ -50,8 +50,6 @@ uint64_t xle64dec(const uint8_t *d);
void xle64enc(uint8_t *d, uint64_t n); void xle64enc(uint8_t *d, uint64_t n);
size_t num_threads(void); size_t num_threads(void);


void *decode_block_start(off_t block_seek);



#pragma mark INDEX #pragma mark INDEX


Expand All @@ -64,13 +62,9 @@ struct file_index_t {


extern file_index_t *gFileIndex, *gLastFile; extern file_index_t *gFileIndex, *gLastFile;


// As discovered from footer
extern lzma_check gCheck;

bool is_multi_header(const char *name); bool is_multi_header(const char *name);
bool decode_index(void); // true on success bool decode_index(void); // true on success


lzma_vli find_file_index(void **bdatap);
lzma_vli read_file_index(void); lzma_vli read_file_index(void);
void dump_file_index(FILE *out, bool verbose); void dump_file_index(FILE *out, bool verbose);
void free_file_index(void); void free_file_index(void);
Expand Down
26 changes: 16 additions & 10 deletions read.c
Expand Up @@ -28,6 +28,7 @@ typedef struct {
size_t incap, outcap; size_t incap, outcap;
size_t insize, outsize; size_t insize, outsize;
off_t uoffset; // uncompressed offset off_t uoffset; // uncompressed offset
lzma_check check;
} io_block_t; } io_block_t;


static void *block_create(void); static void *block_create(void);
Expand Down Expand Up @@ -69,8 +70,8 @@ static bool rbuf_cycle(lzma_stream *stream, bool start, size_t skip);
static void rbuf_consume(size_t bytes); static void rbuf_consume(size_t bytes);
static void rbuf_dispatch(void); static void rbuf_dispatch(void);


static bool read_header(void); static bool read_header(lzma_check *check);
static bool read_block(void); static bool read_block(lzma_check check);
static void read_streaming(lzma_block *block); static void read_streaming(lzma_block *block);
static void read_index(void); static void read_index(void);
static void read_footer(void); static void read_footer(void);
Expand Down Expand Up @@ -309,7 +310,7 @@ static void rbuf_dispatch(void) {
} }




static bool read_header(void) { static bool read_header(lzma_check *check) {
lzma_stream_flags stream_flags; lzma_stream_flags stream_flags;
rbuf_read_status st = rbuf_read(LZMA_STREAM_HEADER_SIZE); rbuf_read_status st = rbuf_read(LZMA_STREAM_HEADER_SIZE);
if (st == RBUF_EOF) if (st == RBUF_EOF)
Expand All @@ -321,14 +322,14 @@ static bool read_header(void) {
die("Not an XZ file"); die("Not an XZ file");
else if (err != LZMA_OK) else if (err != LZMA_OK)
die("Error decoding XZ header"); die("Error decoding XZ header");
gCheck = stream_flags.check; *check = stream_flags.check;
rbuf_consume(LZMA_STREAM_HEADER_SIZE); rbuf_consume(LZMA_STREAM_HEADER_SIZE);
return true; return true;
} }


static bool read_block(void) { static bool read_block(lzma_check check) {
lzma_filter filters[LZMA_FILTERS_MAX + 1]; lzma_filter filters[LZMA_FILTERS_MAX + 1];
lzma_block block = { .filters = filters, .check = gCheck, .version = 0 }; lzma_block block = { .filters = filters, .check = check, .version = 0 };


if (rbuf_read(1) != RBUF_FULL) if (rbuf_read(1) != RBUF_FULL)
die("Error reading block header size"); die("Error reading block header size");
Expand All @@ -349,6 +350,7 @@ static bool read_block(void) {
} else { } else {
block_capacity(gRbuf, 0, outsize); block_capacity(gRbuf, 0, outsize);
gRbuf->outsize = outsize; gRbuf->outsize = outsize;
gRbuf->check = check;


if (rbuf_read(lzma_block_total_size(&block)) != RBUF_FULL) if (rbuf_read(lzma_block_total_size(&block)) != RBUF_FULL)
die("Error reading block contents"); die("Error reading block contents");
Expand Down Expand Up @@ -441,9 +443,10 @@ static void read_footer(void) {


static void read_thread_noindex(void) { static void read_thread_noindex(void) {
bool empty = true; bool empty = true;
while (read_header()) { lzma_check check = LZMA_CHECK_NONE;
while (read_header(&check)) {
empty = false; empty = false;
while (read_block()) while (read_block(check))
; // pass ; // pass
read_index(); read_index();
read_footer(); read_footer();
Expand Down Expand Up @@ -496,6 +499,7 @@ static void read_thread(void) {
die("Error reading block contents"); die("Error reading block contents");
offset += bsize; offset += bsize;
ib->uoffset = iter.block.uncompressed_file_offset; ib->uoffset = iter.block.uncompressed_file_offset;
ib->check = iter.stream.flags->check;


pipeline_split(pi); pipeline_split(pi);
} }
Expand All @@ -508,7 +512,8 @@ static void read_thread(void) {
static void decode_thread(size_t thnum) { static void decode_thread(size_t thnum) {
lzma_stream stream = LZMA_STREAM_INIT; lzma_stream stream = LZMA_STREAM_INIT;
lzma_filter filters[LZMA_FILTERS_MAX + 1]; lzma_filter filters[LZMA_FILTERS_MAX + 1];
lzma_block block = { .filters = filters, .check = gCheck, .version = 0 }; lzma_block block = { .filters = filters, .check = LZMA_CHECK_NONE,
.version = 0 };


pipeline_item_t *pi; pipeline_item_t *pi;
io_block_t *ib; io_block_t *ib;
Expand All @@ -517,7 +522,8 @@ static void decode_thread(size_t thnum) {
ib = (io_block_t*)(pi->data); ib = (io_block_t*)(pi->data);


block.header_size = lzma_block_header_size_decode(*(ib->input)); block.header_size = lzma_block_header_size_decode(*(ib->input));
if (lzma_block_header_decode(&block, NULL, ib->input) != LZMA_OK) block.check = ib->check;
if (lzma_block_header_decode(&block, NULL, ib->input) != LZMA_OK)
die("Error decoding block header"); die("Error decoding block header");
if (lzma_block_decoder(&stream, &block) != LZMA_OK) if (lzma_block_decoder(&stream, &block) != LZMA_OK)
die("Error initializing block decode"); die("Error initializing block decode");
Expand Down

0 comments on commit dd86134

Please sign in to comment.