|
|
@ -58,7 +58,8 @@ static archive_close_callback tar_ok;
|
|
|
|
|
|
|
|
|
|
|
|
static void block_init(lzma_block *block);
|
|
|
|
static void block_init(lzma_block *block);
|
|
|
|
static void stream_edge(lzma_vli backward_size);
|
|
|
|
static void stream_edge(lzma_vli backward_size);
|
|
|
|
static void write_blocks(io_block_t **ibs, size_t *seq);
|
|
|
|
static void write_blocks(size_t *seq, io_block_t **ibs, io_block_t *ib);
|
|
|
|
|
|
|
|
static void write_block(io_block_t *ib);
|
|
|
|
static void encode_index(void);
|
|
|
|
static void encode_index(void);
|
|
|
|
|
|
|
|
|
|
|
|
static void write_file_index(void);
|
|
|
|
static void write_file_index(void);
|
|
|
@ -84,7 +85,7 @@ int main(int argc, char **argv) {
|
|
|
|
.options = &lzma_opts };
|
|
|
|
.options = &lzma_opts };
|
|
|
|
gFilters[1] = (lzma_filter){ .id = LZMA_VLI_UNKNOWN, .options = NULL };
|
|
|
|
gFilters[1] = (lzma_filter){ .id = LZMA_VLI_UNKNOWN, .options = NULL };
|
|
|
|
|
|
|
|
|
|
|
|
gBlockInSize = lzma_opts.dict_size * 2.0;
|
|
|
|
gBlockInSize = lzma_opts.dict_size * 1.0;
|
|
|
|
gBlockOutSize = lzma_block_buffer_bound(gBlockInSize);
|
|
|
|
gBlockOutSize = lzma_block_buffer_bound(gBlockInSize);
|
|
|
|
|
|
|
|
|
|
|
|
// thread setup
|
|
|
|
// thread setup
|
|
|
@ -121,9 +122,7 @@ int main(int argc, char **argv) {
|
|
|
|
if (msg == MSG_STOP)
|
|
|
|
if (msg == MSG_STOP)
|
|
|
|
break;
|
|
|
|
break;
|
|
|
|
|
|
|
|
|
|
|
|
ib->next = ibs;
|
|
|
|
write_blocks(&seq, &ibs, ib);
|
|
|
|
ibs = ib;
|
|
|
|
|
|
|
|
write_blocks(&ibs, &seq);
|
|
|
|
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
// file index
|
|
|
|
// file index
|
|
|
@ -321,38 +320,43 @@ static void stream_edge(lzma_vli backward_size) {
|
|
|
|
die("Error writing stream edge");
|
|
|
|
die("Error writing stream edge");
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
static void write_blocks(io_block_t **ibs, size_t *seq) {
|
|
|
|
static void write_block(io_block_t *ib) {
|
|
|
|
// check if we can write anything
|
|
|
|
// Does it make sense to chunk this?
|
|
|
|
bool block_missing = false;
|
|
|
|
size_t written = 0;
|
|
|
|
while (!block_missing) {
|
|
|
|
while (ib->outsize > written) {
|
|
|
|
block_missing = true; // assume no match
|
|
|
|
size_t size = ib->outsize - written;
|
|
|
|
|
|
|
|
if (size > CHUNKSIZE)
|
|
|
|
io_block_t *prev = NULL;
|
|
|
|
size = CHUNKSIZE;
|
|
|
|
for (io_block_t *ib = *ibs; ib; ib = ib->next) {
|
|
|
|
if (fwrite(ib->output + written, size, 1, gOutFile) != 1)
|
|
|
|
if (ib->seq == *seq) { // we have the next block
|
|
|
|
die("Error writing block data");
|
|
|
|
if (fwrite(ib->output, ib->outsize, 1, gOutFile) != 1)
|
|
|
|
written += size;
|
|
|
|
die("Error writing block data");
|
|
|
|
}
|
|
|
|
if (lzma_index_append(gIndex, NULL,
|
|
|
|
|
|
|
|
lzma_block_unpadded_size(&ib->block),
|
|
|
|
if (lzma_index_append(gIndex, NULL,
|
|
|
|
ib->block.uncompressed_size) != LZMA_OK)
|
|
|
|
lzma_block_unpadded_size(&ib->block),
|
|
|
|
die("Error adding to index");
|
|
|
|
ib->block.uncompressed_size) != LZMA_OK)
|
|
|
|
|
|
|
|
die("Error adding to index");
|
|
|
|
// remove the found block
|
|
|
|
}
|
|
|
|
if (prev) {
|
|
|
|
|
|
|
|
prev->next = ib->next;
|
|
|
|
static void write_blocks(size_t *seq, io_block_t **ibs, io_block_t *ib) {
|
|
|
|
} else {
|
|
|
|
// insert it into the queue, in order
|
|
|
|
*ibs = ib->next;
|
|
|
|
io_block_t **prev = ibs, *post = *ibs;
|
|
|
|
}
|
|
|
|
while (post && post->seq < ib->seq) {
|
|
|
|
queue_push(gReadQ, MSG_BLOCK, ib);
|
|
|
|
prev = &post->next;
|
|
|
|
|
|
|
|
post = post->next;
|
|
|
|
++*seq;
|
|
|
|
}
|
|
|
|
block_missing = false;
|
|
|
|
ib->next = post;
|
|
|
|
break;
|
|
|
|
*prev = ib;
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
// write the blocks that we can
|
|
|
|
prev = ib;
|
|
|
|
io_block_t *cur = *ibs;
|
|
|
|
} // for io_block_t
|
|
|
|
while (cur && cur->seq == *seq) {
|
|
|
|
} // while !block_missing
|
|
|
|
write_block(cur);
|
|
|
|
|
|
|
|
queue_push(gReadQ, MSG_BLOCK, cur);
|
|
|
|
|
|
|
|
++*seq;
|
|
|
|
|
|
|
|
cur = cur->next;
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
*ibs = cur;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
static void encode_index(void) {
|
|
|
|
static void encode_index(void) {
|
|
|
|