Skip to content

Commit

Permalink
do_xpress_decompress: handle uncompressed chunks
Browse files Browse the repository at this point in the history
  • Loading branch information
maharmstone committed Jan 5, 2021
1 parent f9f6bf7 commit 83f2100
Showing 1 changed file with 19 additions and 6 deletions.
25 changes: 19 additions & 6 deletions src/decomp.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -198,13 +198,26 @@ string do_xpress_decompress(const string_view& compdata, uint64_t size, uint32_t

for (uint64_t i = 0; i < num_chunks; i++) {
uint64_t off = i == 0 ? 0 : offsets[i - 1];
uint64_t complen;

if (i == 0)
complen = num_chunks > 1 ? offsets[0] : data.length();
else if (i == num_chunks - 1)
complen = data.length() - offsets[i - 1];
else
complen = offsets[i] - offsets[i - 1];

if (complen == (i == num_chunks - 1 ? (ret.length() - (i * chunk_size)) : chunk_size)) {
// stored uncompressed
memcpy(ret.data() + (i * chunk_size), data.data() + off, complen);
} else {
auto err = xpress_decompress(ctx, data.data() + off, complen, ret.data() + (i * chunk_size),
i == num_chunks - 1 ? (ret.length() - (i * chunk_size)) : chunk_size);

auto err = xpress_decompress(ctx, data.data() + off, data.length() - off, ret.data() + (i * chunk_size),
i == num_chunks - 1 ? (ret.length() - (i * chunk_size)) : chunk_size);

if (err != 0) {
xpress_free_decompressor(ctx);
throw formatted_error(FMT_STRING("xpress_decompress returned {}."), err);
if (err != 0) {
xpress_free_decompressor(ctx);
throw formatted_error(FMT_STRING("xpress_decompress returned {}."), err);
}
}
}

Expand Down

0 comments on commit 83f2100

Please sign in to comment.