]> pd.if.org Git - zpackage/blobdiff - lzma/common/index_decoder.c
use lzma from xz 5.2.4
[zpackage] / lzma / common / index_decoder.c
index 795d1834cc58d65a3ff48e688c7a7aa6a2ef5d4a..cc07a1b8c5335623778e1075d1916c5447ebcde3 100644 (file)
@@ -14,7 +14,7 @@
 #include "check.h"
 
 
-struct lzma_coder_s {
+typedef struct {
        enum {
                SEQ_INDICATOR,
                SEQ_COUNT,
@@ -50,11 +50,11 @@ struct lzma_coder_s {
 
        /// CRC32 of the List of Records field
        uint32_t crc32;
-};
+} lzma_index_coder;
 
 
 static lzma_ret
-index_decode(lzma_coder *coder, const lzma_allocator *allocator,
+index_decode(void *coder_ptr, const lzma_allocator *allocator,
                const uint8_t *restrict in, size_t *restrict in_pos,
                size_t in_size,
                uint8_t *restrict out lzma_attribute((__unused__)),
@@ -62,6 +62,8 @@ index_decode(lzma_coder *coder, const lzma_allocator *allocator,
                size_t out_size lzma_attribute((__unused__)),
                lzma_action action lzma_attribute((__unused__)))
 {
+       lzma_index_coder *coder = coder_ptr;
+
        // Similar optimization as in index_encoder.c
        const size_t in_start = *in_pos;
        lzma_ret ret = LZMA_OK;
@@ -207,8 +209,9 @@ out:
 
 
 static void
-index_decoder_end(lzma_coder *coder, const lzma_allocator *allocator)
+index_decoder_end(void *coder_ptr, const lzma_allocator *allocator)
 {
+       lzma_index_coder *coder = coder_ptr;
        lzma_index_end(coder->index, allocator);
        lzma_free(coder, allocator);
        return;
@@ -216,9 +219,11 @@ index_decoder_end(lzma_coder *coder, const lzma_allocator *allocator)
 
 
 static lzma_ret
-index_decoder_memconfig(lzma_coder *coder, uint64_t *memusage,
+index_decoder_memconfig(void *coder_ptr, uint64_t *memusage,
                uint64_t *old_memlimit, uint64_t new_memlimit)
 {
+       lzma_index_coder *coder = coder_ptr;
+
        *memusage = lzma_index_memusage(1, coder->count);
        *old_memlimit = coder->memlimit;
 
@@ -234,7 +239,7 @@ index_decoder_memconfig(lzma_coder *coder, uint64_t *memusage,
 
 
 static lzma_ret
-index_decoder_reset(lzma_coder *coder, const lzma_allocator *allocator,
+index_decoder_reset(lzma_index_coder *coder, const lzma_allocator *allocator,
                lzma_index **i, uint64_t memlimit)
 {
        // Remember the pointer given by the application. We will set it
@@ -251,7 +256,7 @@ index_decoder_reset(lzma_coder *coder, const lzma_allocator *allocator,
 
        // Initialize the rest.
        coder->sequence = SEQ_INDICATOR;
-       coder->memlimit = memlimit;
+       coder->memlimit = my_max(1, memlimit);
        coder->count = 0; // Needs to be initialized due to _memconfig().
        coder->pos = 0;
        coder->crc32 = 0;
@@ -266,23 +271,25 @@ index_decoder_init(lzma_next_coder *next, const lzma_allocator *allocator,
 {
        lzma_next_coder_init(&index_decoder_init, next, allocator);
 
-       if (i == NULL || memlimit == 0)
+       if (i == NULL)
                return LZMA_PROG_ERROR;
 
-       if (next->coder == NULL) {
-               next->coder = lzma_alloc(sizeof(lzma_coder), allocator);
-               if (next->coder == NULL)
+       lzma_index_coder *coder = next->coder;
+       if (coder == NULL) {
+               coder = lzma_alloc(sizeof(lzma_index_coder), allocator);
+               if (coder == NULL)
                        return LZMA_MEM_ERROR;
 
+               next->coder = coder;
                next->code = &index_decode;
                next->end = &index_decoder_end;
                next->memconfig = &index_decoder_memconfig;
-               next->coder->index = NULL;
+               coder->index = NULL;
        } else {
-               lzma_index_end(next->coder->index, allocator);
+               lzma_index_end(coder->index, allocator);
        }
 
-       return index_decoder_reset(next->coder, allocator, i, memlimit);
+       return index_decoder_reset(coder, allocator, i, memlimit);
 }
 
 
@@ -309,7 +316,7 @@ lzma_index_buffer_decode(lzma_index **i, uint64_t *memlimit,
                return LZMA_PROG_ERROR;
 
        // Initialize the decoder.
-       lzma_coder coder;
+       lzma_index_coder coder;
        return_if_error(index_decoder_reset(&coder, allocator, i, *memlimit));
 
        // Store the input start position so that we can restore it in case