]> pd.if.org Git - zpackage/blobdiff - lzma/lz/lz_encoder.c
use lzma from xz 5.2.4
[zpackage] / lzma / lz / lz_encoder.c
index 5a2be798fd8e9918e3d7c296b98f75871782746f..9a74b7c47ce8d335465a895a0a384602b59cdd8c 100644 (file)
@@ -23,7 +23,7 @@
 #include "memcmplen.h"
 
 
-struct lzma_coder_s {
+typedef struct {
        /// LZ-based encoder e.g. LZMA
        lzma_lz_encoder lz;
 
@@ -32,7 +32,7 @@ struct lzma_coder_s {
 
        /// Next coder in the chain
        lzma_next_coder next;
-};
+} lzma_coder;
 
 
 /// \brief      Moves the data in the input window to free space for new data
@@ -157,12 +157,14 @@ fill_window(lzma_coder *coder, const lzma_allocator *allocator,
 
 
 static lzma_ret
-lz_encode(lzma_coder *coder, const lzma_allocator *allocator,
+lz_encode(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, size_t *restrict out_pos,
                size_t out_size, lzma_action action)
 {
+       lzma_coder *coder = coder_ptr;
+
        while (*out_pos < out_size
                        && (*in_pos < in_size || action != LZMA_RUN)) {
                // Read more data to coder->mf.buffer if needed.
@@ -481,8 +483,10 @@ lzma_lz_encoder_memusage(const lzma_lz_options *lz_options)
 
 
 static void
-lz_encoder_end(lzma_coder *coder, const lzma_allocator *allocator)
+lz_encoder_end(void *coder_ptr, const lzma_allocator *allocator)
 {
+       lzma_coder *coder = coder_ptr;
+
        lzma_next_end(&coder->next, allocator);
 
        lzma_free(coder->mf.son, allocator);
@@ -500,10 +504,12 @@ lz_encoder_end(lzma_coder *coder, const lzma_allocator *allocator)
 
 
 static lzma_ret
-lz_encoder_update(lzma_coder *coder, const lzma_allocator *allocator,
+lz_encoder_update(void *coder_ptr, const lzma_allocator *allocator,
                const lzma_filter *filters_null lzma_attribute((__unused__)),
                const lzma_filter *reversed_filters)
 {
+       lzma_coder *coder = coder_ptr;
+
        if (coder->lz.options_update == NULL)
                return LZMA_PROG_ERROR;
 
@@ -528,50 +534,51 @@ lzma_lz_encoder_init(lzma_next_coder *next, const lzma_allocator *allocator,
 #endif
 
        // Allocate and initialize the base data structure.
-       if (next->coder == NULL) {
-               next->coder = lzma_alloc(sizeof(lzma_coder), allocator);
-               if (next->coder == NULL)
+       lzma_coder *coder = next->coder;
+       if (coder == NULL) {
+               coder = lzma_alloc(sizeof(lzma_coder), allocator);
+               if (coder == NULL)
                        return LZMA_MEM_ERROR;
 
+               next->coder = coder;
                next->code = &lz_encode;
                next->end = &lz_encoder_end;
                next->update = &lz_encoder_update;
 
-               next->coder->lz.coder = NULL;
-               next->coder->lz.code = NULL;
-               next->coder->lz.end = NULL;
+               coder->lz.coder = NULL;
+               coder->lz.code = NULL;
+               coder->lz.end = NULL;
 
                // mf.size is initialized to silence Valgrind
                // when used on optimized binaries (GCC may reorder
                // code in a way that Valgrind gets unhappy).
-               next->coder->mf.buffer = NULL;
-               next->coder->mf.size = 0;
-               next->coder->mf.hash = NULL;
-               next->coder->mf.son = NULL;
-               next->coder->mf.hash_count = 0;
-               next->coder->mf.sons_count = 0;
-
-               next->coder->next = LZMA_NEXT_CODER_INIT;
+               coder->mf.buffer = NULL;
+               coder->mf.size = 0;
+               coder->mf.hash = NULL;
+               coder->mf.son = NULL;
+               coder->mf.hash_count = 0;
+               coder->mf.sons_count = 0;
+
+               coder->next = LZMA_NEXT_CODER_INIT;
        }
 
        // Initialize the LZ-based encoder.
        lzma_lz_options lz_options;
-       return_if_error(lz_init(&next->coder->lz, allocator,
+       return_if_error(lz_init(&coder->lz, allocator,
                        filters[0].options, &lz_options));
 
-       // Setup the size information into next->coder->mf and deallocate
+       // Setup the size information into coder->mf and deallocate
        // old buffers if they have wrong size.
-       if (lz_encoder_prepare(&next->coder->mf, allocator, &lz_options))
+       if (lz_encoder_prepare(&coder->mf, allocator, &lz_options))
                return LZMA_OPTIONS_ERROR;
 
        // Allocate new buffers if needed, and do the rest of
        // the initialization.
-       if (lz_encoder_init(&next->coder->mf, allocator, &lz_options))
+       if (lz_encoder_init(&coder->mf, allocator, &lz_options))
                return LZMA_MEM_ERROR;
 
        // Initialize the next filter in the chain, if any.
-       return lzma_next_filter_init(&next->coder->next, allocator,
-                       filters + 1);
+       return lzma_next_filter_init(&coder->next, allocator, filters + 1);
 }