]> pd.if.org Git - zpackage/commitdiff
use lzma from xz 5.2.4
authorNathan Wagner <nw@hydaspes.if.org>
Sun, 9 Sep 2018 12:59:21 +0000 (12:59 +0000)
committerNathan Wagner <nw@hydaspes.if.org>
Sun, 9 Sep 2018 12:59:21 +0000 (12:59 +0000)
32 files changed:
lzma/api/lzma.h
lzma/api/lzma/base.h
lzma/api/lzma/container.h
lzma/api/lzma/index.h
lzma/api/lzma/version.h
lzma/check/crc32_tablegen.c
lzma/check/crc64_tablegen.c
lzma/common/alone_decoder.c
lzma/common/alone_encoder.c
lzma/common/auto_decoder.c
lzma/common/block_decoder.c
lzma/common/block_encoder.c
lzma/common/common.c
lzma/common/common.h
lzma/common/index_decoder.c
lzma/common/index_encoder.c
lzma/common/stream_decoder.c
lzma/common/stream_encoder.c
lzma/lz/lz_decoder.c
lzma/lz/lz_decoder.h
lzma/lz/lz_encoder.c
lzma/lz/lz_encoder.h
lzma/lzma/lzma2_decoder.c
lzma/lzma/lzma2_encoder.c
lzma/lzma/lzma_decoder.c
lzma/lzma/lzma_encoder.c
lzma/lzma/lzma_encoder.h
lzma/lzma/lzma_encoder_optimum_fast.c
lzma/lzma/lzma_encoder_optimum_normal.c
lzma/lzma/lzma_encoder_private.h
lzma/rangecoder/range_common.h
lzma/rangecoder/range_encoder.h

index ce675a7887164888acd53f376eeb8086874bffcc..aa88e4243a29ada2db41eaeb1c966a5e65b2267c 100644 (file)
  */
 #ifndef lzma_nothrow
 #      if defined(__cplusplus)
-#              define lzma_nothrow throw()
+#              if __cplusplus >= 201103L
+#                      define lzma_nothrow noexcept
+#              else
+#                      define lzma_nothrow throw()
+#              endif
 #      elif __GNUC__ > 3 || (__GNUC__ == 3 && __GNUC_MINOR__ >= 3)
 #              define lzma_nothrow __attribute__((__nothrow__))
 #      else
index 7a31a4205136c868e85ee6f018f6fa84350fffad..a6005accc93d813042af29a5561f95153f4b1854 100644 (file)
@@ -644,11 +644,16 @@ extern LZMA_API(uint64_t) lzma_memlimit_get(const lzma_stream *strm)
  * This function is supported only when *strm has been initialized with
  * a function that takes a memlimit argument.
  *
+ * liblzma 5.2.3 and earlier has a bug where memlimit value of 0 causes
+ * this function to do nothing (leaving the limit unchanged) and still
+ * return LZMA_OK. Later versions treat 0 as if 1 had been specified (so
+ * lzma_memlimit_get() will return 1 even if you specify 0 here).
+ *
  * \return      - LZMA_OK: New memory usage limit successfully set.
  *              - LZMA_MEMLIMIT_ERROR: The new limit is too small.
  *                The limit was not changed.
  *              - LZMA_PROG_ERROR: Invalid arguments, e.g. *strm doesn't
- *                support memory usage limit or memlimit was zero.
+ *                support memory usage limit.
  */
 extern LZMA_API(lzma_ret) lzma_memlimit_set(
                lzma_stream *strm, uint64_t memlimit) lzma_nothrow;
index 86991add1967fb746d52fb6fe799d5d0622418ea..9fbf4df06178e1523cb4769e6a3b247e213f3e7c 100644 (file)
@@ -520,7 +520,10 @@ extern LZMA_API(lzma_ret) lzma_stream_buffer_encode(
  *
  * \param       strm        Pointer to properly prepared lzma_stream
  * \param       memlimit    Memory usage limit as bytes. Use UINT64_MAX
- *                          to effectively disable the limiter.
+ *                          to effectively disable the limiter. liblzma
+ *                          5.2.3 and earlier don't allow 0 here and return
+ *                          LZMA_PROG_ERROR; later versions treat 0 as if 1
+ *                          had been specified.
  * \param       flags       Bitwise-or of zero or more of the decoder flags:
  *                          LZMA_TELL_NO_CHECK, LZMA_TELL_UNSUPPORTED_CHECK,
  *                          LZMA_TELL_ANY_CHECK, LZMA_CONCATENATED
@@ -544,7 +547,10 @@ extern LZMA_API(lzma_ret) lzma_stream_decoder(
  *
  * \param       strm        Pointer to properly prepared lzma_stream
  * \param       memlimit    Memory usage limit as bytes. Use UINT64_MAX
- *                          to effectively disable the limiter.
+ *                          to effectively disable the limiter. liblzma
+ *                          5.2.3 and earlier don't allow 0 here and return
+ *                          LZMA_PROG_ERROR; later versions treat 0 as if 1
+ *                          had been specified.
  * \param       flags       Bitwise-or of flags, or zero for no flags.
  *
  * \return      - LZMA_OK: Initialization was successful.
@@ -560,9 +566,16 @@ extern LZMA_API(lzma_ret) lzma_auto_decoder(
 /**
  * \brief       Initialize .lzma decoder (legacy file format)
  *
+ * \param       strm        Pointer to properly prepared lzma_stream
+ * \param       memlimit    Memory usage limit as bytes. Use UINT64_MAX
+ *                          to effectively disable the limiter. liblzma
+ *                          5.2.3 and earlier don't allow 0 here and return
+ *                          LZMA_PROG_ERROR; later versions treat 0 as if 1
+ *                          had been specified.
+ *
  * Valid `action' arguments to lzma_code() are LZMA_RUN and LZMA_FINISH.
- * There is no need to use LZMA_FINISH, but allowing it may simplify
- * certain types of applications.
+ * There is no need to use LZMA_FINISH, but it's allowed because it may
+ * simplify certain types of applications.
  *
  * \return      - LZMA_OK
  *              - LZMA_MEM_ERROR
index dda60ec1c185c5c1f8475122ff35fbcf67f1bb6f..3dac6fb85ccb9b6191817fd9a45764e10cb07e0e 100644 (file)
@@ -586,8 +586,7 @@ extern LZMA_API(lzma_index *) lzma_index_dup(
  * \param       i           Pointer to lzma_index which should be encoded.
  *
  * The valid `action' values for lzma_code() are LZMA_RUN and LZMA_FINISH.
- * It is enough to use only one of them (you can choose freely; use LZMA_RUN
- * to support liblzma versions older than 5.0.0).
+ * It is enough to use only one of them (you can choose freely).
  *
  * \return      - LZMA_OK: Initialization succeeded, continue with lzma_code().
  *              - LZMA_MEM_ERROR
@@ -610,16 +609,21 @@ extern LZMA_API(lzma_ret) lzma_index_encoder(
  *                          to a new lzma_index, which the application
  *                          has to later free with lzma_index_end().
  * \param       memlimit    How much memory the resulting lzma_index is
- *                          allowed to require.
+ *                          allowed to require. liblzma 5.2.3 and earlier
+ *                          don't allow 0 here and return LZMA_PROG_ERROR;
+ *                          later versions treat 0 as if 1 had been specified.
  *
- * The valid `action' values for lzma_code() are LZMA_RUN and LZMA_FINISH.
- * It is enough to use only one of them (you can choose freely; use LZMA_RUN
- * to support liblzma versions older than 5.0.0).
+ * Valid `action' arguments to lzma_code() are LZMA_RUN and LZMA_FINISH.
+ * There is no need to use LZMA_FINISH, but it's allowed because it may
+ * simplify certain types of applications.
  *
  * \return      - LZMA_OK: Initialization succeeded, continue with lzma_code().
  *              - LZMA_MEM_ERROR
- *              - LZMA_MEMLIMIT_ERROR
  *              - LZMA_PROG_ERROR
+ *
+ *              liblzma 5.2.3 and older list also LZMA_MEMLIMIT_ERROR here
+ *              but that error code has never been possible from this
+ *              initialization function.
  */
 extern LZMA_API(lzma_ret) lzma_index_decoder(
                lzma_stream *strm, lzma_index **i, uint64_t memlimit)
index 2c26ed244a00151c04854337e7a1b81af00a477e..143c7dea69f511fd3a2e0fafb2f9803be8b44b23 100644 (file)
@@ -21,9 +21,9 @@
  * Version number split into components
  */
 #define LZMA_VERSION_MAJOR 5
-#define LZMA_VERSION_MINOR 3
-#define LZMA_VERSION_PATCH 0
-#define LZMA_VERSION_STABILITY LZMA_VERSION_STABILITY_ALPHA
+#define LZMA_VERSION_MINOR 2
+#define LZMA_VERSION_PATCH 4
+#define LZMA_VERSION_STABILITY LZMA_VERSION_STABILITY_STABLE
 
 #ifndef LZMA_VERSION_COMMIT
 #      define LZMA_VERSION_COMMIT ""
index 44bd66805e83755c8e057cb052e28ae7ffa41758..31a4d2751db2974d812dac730edd9472f56f54d8 100644 (file)
@@ -15,7 +15,7 @@
 ///////////////////////////////////////////////////////////////////////////////
 
 #include <stdio.h>
-#include "tuklib_integer.h"
+#include "../../common/tuklib_integer.h"
 
 
 static uint32_t crc32_table[8][256];
index 40fcf498927769a2b4564a205d77b378bec884c0..fddaa7ed1400cecf74b3860e05cec629dc3f1169 100644 (file)
@@ -14,7 +14,7 @@
 ///////////////////////////////////////////////////////////////////////////////
 
 #include <stdio.h>
-#include "tuklib_integer.h"
+#include "../../common/tuklib_integer.h"
 
 
 static uint64_t crc64_table[4][256];
index 37cfb851d25b5be1c31282f9744d00ca8ef0d5ab..77d0a9b1002c9979d40a0377406f7d9ea045cee9 100644 (file)
 //
 ///////////////////////////////////////////////////////////////////////////////
 
-#define _POSIX_C_SOURCE 199309L
-
 #include "alone_decoder.h"
 #include "lzma_decoder.h"
 #include "lz_decoder.h"
 
 
-struct lzma_coder_s {
+typedef struct {
        lzma_next_coder next;
 
        enum {
@@ -48,17 +46,19 @@ struct lzma_coder_s {
        /// Options decoded from the header needed to initialize
        /// the LZMA decoder
        lzma_options_lzma options;
-};
+} lzma_alone_coder;
 
 
 static lzma_ret
-alone_decode(lzma_coder *coder,
+alone_decode(void *coder_ptr,
                const lzma_allocator *allocator lzma_attribute((__unused__)),
                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_alone_coder *coder = coder_ptr;
+
        while (*out_pos < out_size
                        && (coder->sequence == SEQ_CODE || *in_pos < in_size))
        switch (coder->sequence) {
@@ -168,8 +168,9 @@ alone_decode(lzma_coder *coder,
 
 
 static void
-alone_decoder_end(lzma_coder *coder, const lzma_allocator *allocator)
+alone_decoder_end(void *coder_ptr, const lzma_allocator *allocator)
 {
+       lzma_alone_coder *coder = coder_ptr;
        lzma_next_end(&coder->next, allocator);
        lzma_free(coder, allocator);
        return;
@@ -177,9 +178,11 @@ alone_decoder_end(lzma_coder *coder, const lzma_allocator *allocator)
 
 
 static lzma_ret
-alone_decoder_memconfig(lzma_coder *coder, uint64_t *memusage,
+alone_decoder_memconfig(void *coder_ptr, uint64_t *memusage,
                uint64_t *old_memlimit, uint64_t new_memlimit)
 {
+       lzma_alone_coder *coder = coder_ptr;
+
        *memusage = coder->memusage;
        *old_memlimit = coder->memlimit;
 
@@ -200,29 +203,29 @@ lzma_alone_decoder_init(lzma_next_coder *next, const lzma_allocator *allocator,
 {
        lzma_next_coder_init(&lzma_alone_decoder_init, next, allocator);
 
-       if (memlimit == 0)
-               return LZMA_PROG_ERROR;
+       lzma_alone_coder *coder = next->coder;
 
-       if (next->coder == NULL) {
-               next->coder = lzma_alloc(sizeof(lzma_coder), allocator);
-               if (next->coder == NULL)
+       if (coder == NULL) {
+               coder = lzma_alloc(sizeof(lzma_alone_coder), allocator);
+               if (coder == NULL)
                        return LZMA_MEM_ERROR;
 
+               next->coder = coder;
                next->code = &alone_decode;
                next->end = &alone_decoder_end;
                next->memconfig = &alone_decoder_memconfig;
-               next->coder->next = LZMA_NEXT_CODER_INIT;
+               coder->next = LZMA_NEXT_CODER_INIT;
        }
 
-       next->coder->sequence = SEQ_PROPERTIES;
-       next->coder->picky = picky;
-       next->coder->pos = 0;
-       next->coder->options.dict_size = 0;
-       next->coder->options.preset_dict = NULL;
-       next->coder->options.preset_dict_size = 0;
-       next->coder->uncompressed_size = 0;
-       next->coder->memlimit = memlimit;
-       next->coder->memusage = LZMA_MEMUSAGE_BASE;
+       coder->sequence = SEQ_PROPERTIES;
+       coder->picky = picky;
+       coder->pos = 0;
+       coder->options.dict_size = 0;
+       coder->options.preset_dict = NULL;
+       coder->options.preset_dict_size = 0;
+       coder->uncompressed_size = 0;
+       coder->memlimit = my_max(1, memlimit);
+       coder->memusage = LZMA_MEMUSAGE_BASE;
 
        return LZMA_OK;
 }
index a2bc9eee1fa9ba68ed120fe40acf170cada82d55..4853cfd1d64805ed582b41e6cfc11d133df83449 100644 (file)
@@ -17,7 +17,7 @@
 #define ALONE_HEADER_SIZE (1 + 4 + 8)
 
 
-struct lzma_coder_s {
+typedef struct {
        lzma_next_coder next;
 
        enum {
@@ -27,17 +27,19 @@ struct lzma_coder_s {
 
        size_t header_pos;
        uint8_t header[ALONE_HEADER_SIZE];
-};
+} lzma_alone_coder;
 
 
 static lzma_ret
-alone_encode(lzma_coder *coder,
+alone_encode(void *coder_ptr,
                const lzma_allocator *allocator lzma_attribute((__unused__)),
                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_alone_coder *coder = coder_ptr;
+
        while (*out_pos < out_size)
        switch (coder->sequence) {
        case SEQ_HEADER:
@@ -65,8 +67,9 @@ alone_encode(lzma_coder *coder,
 
 
 static void
-alone_encoder_end(lzma_coder *coder, const lzma_allocator *allocator)
+alone_encoder_end(void *coder_ptr, const lzma_allocator *allocator)
 {
+       lzma_alone_coder *coder = coder_ptr;
        lzma_next_end(&coder->next, allocator);
        lzma_free(coder, allocator);
        return;
@@ -80,23 +83,26 @@ alone_encoder_init(lzma_next_coder *next, const lzma_allocator *allocator,
 {
        lzma_next_coder_init(&alone_encoder_init, next, allocator);
 
-       if (next->coder == NULL) {
-               next->coder = lzma_alloc(sizeof(lzma_coder), allocator);
-               if (next->coder == NULL)
+       lzma_alone_coder *coder = next->coder;
+
+       if (coder == NULL) {
+               coder = lzma_alloc(sizeof(lzma_alone_coder), allocator);
+               if (coder == NULL)
                        return LZMA_MEM_ERROR;
 
+               next->coder = coder;
                next->code = &alone_encode;
                next->end = &alone_encoder_end;
-               next->coder->next = LZMA_NEXT_CODER_INIT;
+               coder->next = LZMA_NEXT_CODER_INIT;
        }
 
        // Basic initializations
-       next->coder->sequence = SEQ_HEADER;
-       next->coder->header_pos = 0;
+       coder->sequence = SEQ_HEADER;
+       coder->header_pos = 0;
 
        // Encode the header:
        // - Properties (1 byte)
-       if (lzma_lzma_lclppb_encode(options, next->coder->header))
+       if (lzma_lzma_lclppb_encode(options, coder->header))
                return LZMA_OPTIONS_ERROR;
 
        // - Dictionary size (4 bytes)
@@ -116,10 +122,10 @@ alone_encoder_init(lzma_next_coder *next, const lzma_allocator *allocator,
        if (d != UINT32_MAX)
                ++d;
 
-       unaligned_write32le(next->coder->header + 1, d);
+       unaligned_write32le(coder->header + 1, d);
 
        // - Uncompressed size (always unknown and using EOPM)
-       memset(next->coder->header + 1 + 4, 0xFF, 8);
+       memset(coder->header + 1 + 4, 0xFF, 8);
 
        // Initialize the LZMA encoder.
        const lzma_filter_info filters[2] = {
@@ -131,7 +137,7 @@ alone_encoder_init(lzma_next_coder *next, const lzma_allocator *allocator,
                }
        };
 
-       return lzma_next_filter_init(&next->coder->next, allocator, filters);
+       return lzma_next_filter_init(&coder->next, allocator, filters);
 }
 
 
index bf3550701fe6612d9fe3de3450fca07c9d424a84..6895c7ccf7b55c21adf0cdc4492944321112c37a 100644 (file)
@@ -14,7 +14,7 @@
 #include "alone_decoder.h"
 
 
-struct lzma_coder_s {
+typedef struct {
        /// Stream decoder or LZMA_Alone decoder
        lzma_next_coder next;
 
@@ -26,15 +26,17 @@ struct lzma_coder_s {
                SEQ_CODE,
                SEQ_FINISH,
        } sequence;
-};
+} lzma_auto_coder;
 
 
 static lzma_ret
-auto_decode(lzma_coder *coder, const lzma_allocator *allocator,
+auto_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,
                size_t *restrict out_pos, size_t out_size, lzma_action action)
 {
+       lzma_auto_coder *coder = coder_ptr;
+
        switch (coder->sequence) {
        case SEQ_INIT:
                if (*in_pos >= in_size)
@@ -100,8 +102,9 @@ auto_decode(lzma_coder *coder, const lzma_allocator *allocator,
 
 
 static void
-auto_decoder_end(lzma_coder *coder, const lzma_allocator *allocator)
+auto_decoder_end(void *coder_ptr, const lzma_allocator *allocator)
 {
+       lzma_auto_coder *coder = coder_ptr;
        lzma_next_end(&coder->next, allocator);
        lzma_free(coder, allocator);
        return;
@@ -109,8 +112,10 @@ auto_decoder_end(lzma_coder *coder, const lzma_allocator *allocator)
 
 
 static lzma_check
-auto_decoder_get_check(const lzma_coder *coder)
+auto_decoder_get_check(const void *coder_ptr)
 {
+       const lzma_auto_coder *coder = coder_ptr;
+
        // It is LZMA_Alone if get_check is NULL.
        return coder->next.get_check == NULL ? LZMA_CHECK_NONE
                        : coder->next.get_check(coder->next.coder);
@@ -118,9 +123,11 @@ auto_decoder_get_check(const lzma_coder *coder)
 
 
 static lzma_ret
-auto_decoder_memconfig(lzma_coder *coder, uint64_t *memusage,
+auto_decoder_memconfig(void *coder_ptr, uint64_t *memusage,
                uint64_t *old_memlimit, uint64_t new_memlimit)
 {
+       lzma_auto_coder *coder = coder_ptr;
+
        lzma_ret ret;
 
        if (coder->next.memconfig != NULL) {
@@ -132,7 +139,10 @@ auto_decoder_memconfig(lzma_coder *coder, uint64_t *memusage,
                // the current memory usage.
                *memusage = LZMA_MEMUSAGE_BASE;
                *old_memlimit = coder->memlimit;
+
                ret = LZMA_OK;
+               if (new_memlimit != 0 && new_memlimit < *memusage)
+                       ret = LZMA_MEMLIMIT_ERROR;
        }
 
        if (ret == LZMA_OK && new_memlimit != 0)
@@ -148,27 +158,26 @@ auto_decoder_init(lzma_next_coder *next, const lzma_allocator *allocator,
 {
        lzma_next_coder_init(&auto_decoder_init, next, allocator);
 
-       if (memlimit == 0)
-               return LZMA_PROG_ERROR;
-
        if (flags & ~LZMA_SUPPORTED_FLAGS)
                return LZMA_OPTIONS_ERROR;
 
-       if (next->coder == NULL) {
-               next->coder = lzma_alloc(sizeof(lzma_coder), allocator);
-               if (next->coder == NULL)
+       lzma_auto_coder *coder = next->coder;
+       if (coder == NULL) {
+               coder = lzma_alloc(sizeof(lzma_auto_coder), allocator);
+               if (coder == NULL)
                        return LZMA_MEM_ERROR;
 
+               next->coder = coder;
                next->code = &auto_decode;
                next->end = &auto_decoder_end;
                next->get_check = &auto_decoder_get_check;
                next->memconfig = &auto_decoder_memconfig;
-               next->coder->next = LZMA_NEXT_CODER_INIT;
+               coder->next = LZMA_NEXT_CODER_INIT;
        }
 
-       next->coder->memlimit = memlimit;
-       next->coder->flags = flags;
-       next->coder->sequence = SEQ_INIT;
+       coder->memlimit = my_max(1, memlimit);
+       coder->flags = flags;
+       coder->sequence = SEQ_INIT;
 
        return LZMA_OK;
 }
index 685c3b038fc3244fe39a84e603ab98526ae27e2e..075bd279ff6074c35c0f2d31436be0b08bf95d25 100644 (file)
@@ -15,7 +15,7 @@
 #include "check.h"
 
 
-struct lzma_coder_s {
+typedef struct {
        enum {
                SEQ_CODE,
                SEQ_PADDING,
@@ -48,7 +48,7 @@ struct lzma_coder_s {
 
        /// True if the integrity check won't be calculated and verified.
        bool ignore_check;
-};
+} lzma_block_coder;
 
 
 static inline bool
@@ -74,11 +74,13 @@ is_size_valid(lzma_vli size, lzma_vli reference)
 
 
 static lzma_ret
-block_decode(lzma_coder *coder, const lzma_allocator *allocator,
+block_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,
                size_t *restrict out_pos, size_t out_size, lzma_action action)
 {
+       lzma_block_coder *coder = coder_ptr;
+
        switch (coder->sequence) {
        case SEQ_CODE: {
                const size_t in_start = *in_pos;
@@ -177,8 +179,9 @@ block_decode(lzma_coder *coder, const lzma_allocator *allocator,
 
 
 static void
-block_decoder_end(lzma_coder *coder, const lzma_allocator *allocator)
+block_decoder_end(void *coder_ptr, const lzma_allocator *allocator)
 {
+       lzma_block_coder *coder = coder_ptr;
        lzma_next_end(&coder->next, allocator);
        lzma_free(coder, allocator);
        return;
@@ -198,27 +201,29 @@ lzma_block_decoder_init(lzma_next_coder *next, const lzma_allocator *allocator,
                        || !lzma_vli_is_valid(block->uncompressed_size))
                return LZMA_PROG_ERROR;
 
-       // Allocate and initialize *next->coder if needed.
-       if (next->coder == NULL) {
-               next->coder = lzma_alloc(sizeof(lzma_coder), allocator);
-               if (next->coder == NULL)
+       // Allocate *next->coder if needed.
+       lzma_block_coder *coder = next->coder;
+       if (coder == NULL) {
+               coder = lzma_alloc(sizeof(lzma_block_coder), allocator);
+               if (coder == NULL)
                        return LZMA_MEM_ERROR;
 
+               next->coder = coder;
                next->code = &block_decode;
                next->end = &block_decoder_end;
-               next->coder->next = LZMA_NEXT_CODER_INIT;
+               coder->next = LZMA_NEXT_CODER_INIT;
        }
 
        // Basic initializations
-       next->coder->sequence = SEQ_CODE;
-       next->coder->block = block;
-       next->coder->compressed_size = 0;
-       next->coder->uncompressed_size = 0;
+       coder->sequence = SEQ_CODE;
+       coder->block = block;
+       coder->compressed_size = 0;
+       coder->uncompressed_size = 0;
 
        // If Compressed Size is not known, we calculate the maximum allowed
        // value so that encoded size of the Block (including Block Padding)
        // is still a valid VLI and a multiple of four.
-       next->coder->compressed_limit
+       coder->compressed_limit
                        = block->compressed_size == LZMA_VLI_UNKNOWN
                                ? (LZMA_VLI_MAX & ~LZMA_VLI_C(3))
                                        - block->header_size
@@ -228,14 +233,14 @@ lzma_block_decoder_init(lzma_next_coder *next, const lzma_allocator *allocator,
        // Initialize the check. It's caller's problem if the Check ID is not
        // supported, and the Block decoder cannot verify the Check field.
        // Caller can test lzma_check_is_supported(block->check).
-       next->coder->check_pos = 0;
-       lzma_check_init(&next->coder->check, block->check);
+       coder->check_pos = 0;
+       lzma_check_init(&coder->check, block->check);
 
-       next->coder->ignore_check = block->version >= 1
+       coder->ignore_check = block->version >= 1
                        ? block->ignore_check : false;
 
        // Initialize the filter chain.
-       return lzma_raw_decoder_init(&next->coder->next, allocator,
+       return lzma_raw_decoder_init(&coder->next, allocator,
                        block->filters);
 }
 
index def586410d287e53ccfeeacbeceef6e9d8ab0dd1..168846ad6899a27bc196669d9617870b0aaf5ca0 100644 (file)
@@ -15,7 +15,7 @@
 #include "check.h"
 
 
-struct lzma_coder_s {
+typedef struct {
        /// The filters in the chain; initialized with lzma_raw_decoder_init().
        lzma_next_coder next;
 
@@ -41,15 +41,17 @@ struct lzma_coder_s {
 
        /// Check of the uncompressed data
        lzma_check_state check;
-};
+} lzma_block_coder;
 
 
 static lzma_ret
-block_encode(lzma_coder *coder, const lzma_allocator *allocator,
+block_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_block_coder *coder = coder_ptr;
+
        // Check that our amount of input stays in proper limits.
        if (LZMA_VLI_MAX - coder->uncompressed_size < in_size - *in_pos)
                return LZMA_DATA_ERROR;
@@ -134,8 +136,9 @@ block_encode(lzma_coder *coder, const lzma_allocator *allocator,
 
 
 static void
-block_encoder_end(lzma_coder *coder, const lzma_allocator *allocator)
+block_encoder_end(void *coder_ptr, const lzma_allocator *allocator)
 {
+       lzma_block_coder *coder = coder_ptr;
        lzma_next_end(&coder->next, allocator);
        lzma_free(coder, allocator);
        return;
@@ -143,10 +146,12 @@ block_encoder_end(lzma_coder *coder, const lzma_allocator *allocator)
 
 
 static lzma_ret
-block_encoder_update(lzma_coder *coder, const lzma_allocator *allocator,
+block_encoder_update(void *coder_ptr, const lzma_allocator *allocator,
                const lzma_filter *filters lzma_attribute((__unused__)),
                const lzma_filter *reversed_filters)
 {
+       lzma_block_coder *coder = coder_ptr;
+
        if (coder->sequence != SEQ_CODE)
                return LZMA_PROG_ERROR;
 
@@ -178,30 +183,31 @@ lzma_block_encoder_init(lzma_next_coder *next, const lzma_allocator *allocator,
                return LZMA_UNSUPPORTED_CHECK;
 
        // Allocate and initialize *next->coder if needed.
-       if (next->coder == NULL) {
-               next->coder = lzma_alloc(sizeof(lzma_coder), allocator);
-               if (next->coder == NULL)
+       lzma_block_coder *coder = next->coder;
+       if (coder == NULL) {
+               coder = lzma_alloc(sizeof(lzma_block_coder), allocator);
+               if (coder == NULL)
                        return LZMA_MEM_ERROR;
 
+               next->coder = coder;
                next->code = &block_encode;
                next->end = &block_encoder_end;
                next->update = &block_encoder_update;
-               next->coder->next = LZMA_NEXT_CODER_INIT;
+               coder->next = LZMA_NEXT_CODER_INIT;
        }
 
        // Basic initializations
-       next->coder->sequence = SEQ_CODE;
-       next->coder->block = block;
-       next->coder->compressed_size = 0;
-       next->coder->uncompressed_size = 0;
-       next->coder->pos = 0;
+       coder->sequence = SEQ_CODE;
+       coder->block = block;
+       coder->compressed_size = 0;
+       coder->uncompressed_size = 0;
+       coder->pos = 0;
 
        // Initialize the check
-       lzma_check_init(&next->coder->check, block->check);
+       lzma_check_init(&coder->check, block->check);
 
        // Initialize the requested filters.
-       return lzma_raw_encoder_init(&next->coder->next, allocator,
-                       block->filters);
+       return lzma_raw_encoder_init(&coder->next, allocator, block->filters);
 }
 
 
index 28aa2b7142f47051a5d31ee3b1b0c8570c8cd3e2..57e3f8ebd62a64a3325b2b9ace1ab7c9470cc89c 100644 (file)
@@ -435,8 +435,10 @@ lzma_memlimit_set(lzma_stream *strm, uint64_t new_memlimit)
                        || strm->internal->next.memconfig == NULL)
                return LZMA_PROG_ERROR;
 
-       if (new_memlimit != 0 && new_memlimit < LZMA_MEMUSAGE_BASE)
-               return LZMA_MEMLIMIT_ERROR;
+       // Zero is a special value that cannot be used as an actual limit.
+       // If 0 was specified, use 1 instead.
+       if (new_memlimit == 0)
+               new_memlimit = 1;
 
        return strm->internal->next.memconfig(strm->internal->next.coder,
                        &memusage, &old_memlimit, new_memlimit);
index 955d784a5b6aff7f584ac978e524b87013b7b0d1..b3d3b7a059b108592e23232c6b92779000d41d18 100644 (file)
 #define LZMA_TIMED_OUT 32
 
 
-/// Type of encoder/decoder specific data; the actual structure is defined
-/// differently in different coders.
-typedef struct lzma_coder_s lzma_coder;
-
 typedef struct lzma_next_coder_s lzma_next_coder;
 
 typedef struct lzma_filter_info_s lzma_filter_info;
@@ -107,7 +103,7 @@ typedef lzma_ret (*lzma_init_function)(
 /// input and output buffers, but for simplicity they still use this same
 /// function prototype.
 typedef lzma_ret (*lzma_code_function)(
-               lzma_coder *coder, const lzma_allocator *allocator,
+               void *coder, 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,
@@ -115,7 +111,7 @@ typedef lzma_ret (*lzma_code_function)(
 
 /// Type of a function to free the memory allocated for the coder
 typedef void (*lzma_end_function)(
-               lzma_coder *coder, const lzma_allocator *allocator);
+               void *coder, const lzma_allocator *allocator);
 
 
 /// Raw coder validates and converts an array of lzma_filter structures to
@@ -138,7 +134,7 @@ struct lzma_filter_info_s {
 /// Hold data and function pointers of the next filter in the chain.
 struct lzma_next_coder_s {
        /// Pointer to coder-specific data
-       lzma_coder *coder;
+       void *coder;
 
        /// Filter ID. This is LZMA_VLI_UNKNOWN when this structure doesn't
        /// point to a filter coder.
@@ -160,21 +156,21 @@ struct lzma_next_coder_s {
 
        /// Pointer to a function to get progress information. If this is NULL,
        /// lzma_stream.total_in and .total_out are used instead.
-       void (*get_progress)(lzma_coder *coder,
+       void (*get_progress)(void *coder,
                        uint64_t *progress_in, uint64_t *progress_out);
 
        /// Pointer to function to return the type of the integrity check.
        /// Most coders won't support this.
-       lzma_check (*get_check)(const lzma_coder *coder);
+       lzma_check (*get_check)(const void *coder);
 
        /// Pointer to function to get and/or change the memory usage limit.
        /// If new_memlimit == 0, the limit is not changed.
-       lzma_ret (*memconfig)(lzma_coder *coder, uint64_t *memusage,
+       lzma_ret (*memconfig)(void *coder, uint64_t *memusage,
                        uint64_t *old_memlimit, uint64_t new_memlimit);
 
        /// Update the filter-specific options or the whole filter chain
        /// in the encoder.
-       lzma_ret (*update)(lzma_coder *coder, const lzma_allocator *allocator,
+       lzma_ret (*update)(void *coder, const lzma_allocator *allocator,
                        const lzma_filter *filters,
                        const lzma_filter *reversed_filters);
 };
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
index d25ac7d3372b546bd2d925d0c273ee20214155dc..ac97d0cebf81af09d341a17f501e4b198e2c2547 100644 (file)
@@ -15,7 +15,7 @@
 #include "check.h"
 
 
-struct lzma_coder_s {
+typedef struct {
        enum {
                SEQ_INDICATOR,
                SEQ_COUNT,
@@ -37,11 +37,11 @@ struct lzma_coder_s {
 
        /// CRC32 of the List of Records field
        uint32_t crc32;
-};
+} lzma_index_coder;
 
 
 static lzma_ret
-index_encode(lzma_coder *coder,
+index_encode(void *coder_ptr,
                const lzma_allocator *allocator lzma_attribute((__unused__)),
                const uint8_t *restrict in lzma_attribute((__unused__)),
                size_t *restrict in_pos lzma_attribute((__unused__)),
@@ -50,6 +50,8 @@ index_encode(lzma_coder *coder,
                size_t out_size,
                lzma_action action lzma_attribute((__unused__)))
 {
+       lzma_index_coder *coder = coder_ptr;
+
        // Position where to start calculating CRC32. The idea is that we
        // need to call lzma_crc32() only once per call to index_encode().
        const size_t out_start = *out_pos;
@@ -159,7 +161,7 @@ out:
 
 
 static void
-index_encoder_end(lzma_coder *coder, const lzma_allocator *allocator)
+index_encoder_end(void *coder, const lzma_allocator *allocator)
 {
        lzma_free(coder, allocator);
        return;
@@ -167,7 +169,7 @@ index_encoder_end(lzma_coder *coder, const lzma_allocator *allocator)
 
 
 static void
-index_encoder_reset(lzma_coder *coder, const lzma_index *i)
+index_encoder_reset(lzma_index_coder *coder, const lzma_index *i)
 {
        lzma_index_iter_init(&coder->iter, i);
 
@@ -190,7 +192,7 @@ lzma_index_encoder_init(lzma_next_coder *next, const lzma_allocator *allocator,
                return LZMA_PROG_ERROR;
 
        if (next->coder == NULL) {
-               next->coder = lzma_alloc(sizeof(lzma_coder), allocator);
+               next->coder = lzma_alloc(sizeof(lzma_index_coder), allocator);
                if (next->coder == NULL)
                        return LZMA_MEM_ERROR;
 
@@ -230,7 +232,7 @@ lzma_index_buffer_encode(const lzma_index *i,
 
        // The Index encoder needs just one small data structure so we can
        // allocate it on stack.
-       lzma_coder coder;
+       lzma_index_coder coder;
        index_encoder_reset(&coder, i);
 
        // Do the actual encoding. This should never fail, but store
index 3ab938c9f1426d7421a8c5d52b299cad33614b4c..fdd8ff2f9a3e3bc40c695f87410d571d8fbc5b99 100644 (file)
@@ -14,7 +14,7 @@
 #include "block_decoder.h"
 
 
-struct lzma_coder_s {
+typedef struct {
        enum {
                SEQ_STREAM_HEADER,
                SEQ_BLOCK_HEADER,
@@ -80,11 +80,11 @@ struct lzma_coder_s {
        /// Buffer to hold Stream Header, Block Header, and Stream Footer.
        /// Block Header has biggest maximum size.
        uint8_t buffer[LZMA_BLOCK_HEADER_SIZE_MAX];
-};
+} lzma_stream_coder;
 
 
 static lzma_ret
-stream_decoder_reset(lzma_coder *coder, const lzma_allocator *allocator)
+stream_decoder_reset(lzma_stream_coder *coder, const lzma_allocator *allocator)
 {
        // Initialize the Index hash used to verify the Index.
        coder->index_hash = lzma_index_hash_init(coder->index_hash, allocator);
@@ -100,11 +100,13 @@ stream_decoder_reset(lzma_coder *coder, const lzma_allocator *allocator)
 
 
 static lzma_ret
-stream_decode(lzma_coder *coder, const lzma_allocator *allocator,
+stream_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,
                size_t *restrict out_pos, size_t out_size, lzma_action action)
 {
+       lzma_stream_coder *coder = coder_ptr;
+
        // When decoding the actual Block, it may be able to produce more
        // output even if we don't give it any new input.
        while (true)
@@ -375,8 +377,9 @@ stream_decode(lzma_coder *coder, const lzma_allocator *allocator,
 
 
 static void
-stream_decoder_end(lzma_coder *coder, const lzma_allocator *allocator)
+stream_decoder_end(void *coder_ptr, const lzma_allocator *allocator)
 {
+       lzma_stream_coder *coder = coder_ptr;
        lzma_next_end(&coder->block_decoder, allocator);
        lzma_index_hash_end(coder->index_hash, allocator);
        lzma_free(coder, allocator);
@@ -385,16 +388,19 @@ stream_decoder_end(lzma_coder *coder, const lzma_allocator *allocator)
 
 
 static lzma_check
-stream_decoder_get_check(const lzma_coder *coder)
+stream_decoder_get_check(const void *coder_ptr)
 {
+       const lzma_stream_coder *coder = coder_ptr;
        return coder->stream_flags.check;
 }
 
 
 static lzma_ret
-stream_decoder_memconfig(lzma_coder *coder, uint64_t *memusage,
+stream_decoder_memconfig(void *coder_ptr, uint64_t *memusage,
                uint64_t *old_memlimit, uint64_t new_memlimit)
 {
+       lzma_stream_coder *coder = coder_ptr;
+
        *memusage = coder->memusage;
        *old_memlimit = coder->memlimit;
 
@@ -416,37 +422,36 @@ lzma_stream_decoder_init(
 {
        lzma_next_coder_init(&lzma_stream_decoder_init, next, allocator);
 
-       if (memlimit == 0)
-               return LZMA_PROG_ERROR;
-
        if (flags & ~LZMA_SUPPORTED_FLAGS)
                return LZMA_OPTIONS_ERROR;
 
-       if (next->coder == NULL) {
-               next->coder = lzma_alloc(sizeof(lzma_coder), allocator);
-               if (next->coder == NULL)
+       lzma_stream_coder *coder = next->coder;
+       if (coder == NULL) {
+               coder = lzma_alloc(sizeof(lzma_stream_coder), allocator);
+               if (coder == NULL)
                        return LZMA_MEM_ERROR;
 
+               next->coder = coder;
                next->code = &stream_decode;
                next->end = &stream_decoder_end;
                next->get_check = &stream_decoder_get_check;
                next->memconfig = &stream_decoder_memconfig;
 
-               next->coder->block_decoder = LZMA_NEXT_CODER_INIT;
-               next->coder->index_hash = NULL;
+               coder->block_decoder = LZMA_NEXT_CODER_INIT;
+               coder->index_hash = NULL;
        }
 
-       next->coder->memlimit = memlimit;
-       next->coder->memusage = LZMA_MEMUSAGE_BASE;
-       next->coder->tell_no_check = (flags & LZMA_TELL_NO_CHECK) != 0;
-       next->coder->tell_unsupported_check
+       coder->memlimit = my_max(1, memlimit);
+       coder->memusage = LZMA_MEMUSAGE_BASE;
+       coder->tell_no_check = (flags & LZMA_TELL_NO_CHECK) != 0;
+       coder->tell_unsupported_check
                        = (flags & LZMA_TELL_UNSUPPORTED_CHECK) != 0;
-       next->coder->tell_any_check = (flags & LZMA_TELL_ANY_CHECK) != 0;
-       next->coder->ignore_check = (flags & LZMA_IGNORE_CHECK) != 0;
-       next->coder->concatenated = (flags & LZMA_CONCATENATED) != 0;
-       next->coder->first_stream = true;
+       coder->tell_any_check = (flags & LZMA_TELL_ANY_CHECK) != 0;
+       coder->ignore_check = (flags & LZMA_IGNORE_CHECK) != 0;
+       coder->concatenated = (flags & LZMA_CONCATENATED) != 0;
+       coder->first_stream = true;
 
-       return stream_decoder_reset(next->coder, allocator);
+       return stream_decoder_reset(coder, allocator);
 }
 
 
index a7663bc48db30e29c41234307bacb0b033006ad8..858cba473ad49b81b5942a44ca80a0eee317f6e0 100644 (file)
@@ -14,7 +14,7 @@
 #include "index_encoder.h"
 
 
-struct lzma_coder_s {
+typedef struct {
        enum {
                SEQ_STREAM_HEADER,
                SEQ_BLOCK_INIT,
@@ -55,11 +55,11 @@ struct lzma_coder_s {
        /// Buffer to hold Stream Header, Block Header, and Stream Footer.
        /// Block Header has biggest maximum size.
        uint8_t buffer[LZMA_BLOCK_HEADER_SIZE_MAX];
-};
+} lzma_stream_coder;
 
 
 static lzma_ret
-block_encoder_init(lzma_coder *coder, const lzma_allocator *allocator)
+block_encoder_init(lzma_stream_coder *coder, const lzma_allocator *allocator)
 {
        // Prepare the Block options. Even though Block encoder doesn't need
        // compressed_size, uncompressed_size, and header_size to be
@@ -78,11 +78,13 @@ block_encoder_init(lzma_coder *coder, const lzma_allocator *allocator)
 
 
 static lzma_ret
-stream_encode(lzma_coder *coder, const lzma_allocator *allocator,
+stream_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_stream_coder *coder = coder_ptr;
+
        // Main loop
        while (*out_pos < out_size)
        switch (coder->sequence) {
@@ -209,8 +211,10 @@ stream_encode(lzma_coder *coder, const lzma_allocator *allocator,
 
 
 static void
-stream_encoder_end(lzma_coder *coder, const lzma_allocator *allocator)
+stream_encoder_end(void *coder_ptr, const lzma_allocator *allocator)
 {
+       lzma_stream_coder *coder = coder_ptr;
+
        lzma_next_end(&coder->block_encoder, allocator);
        lzma_next_end(&coder->index_encoder, allocator);
        lzma_index_end(coder->index, allocator);
@@ -224,10 +228,12 @@ stream_encoder_end(lzma_coder *coder, const lzma_allocator *allocator)
 
 
 static lzma_ret
-stream_encoder_update(lzma_coder *coder, const lzma_allocator *allocator,
+stream_encoder_update(void *coder_ptr, const lzma_allocator *allocator,
                const lzma_filter *filters,
                const lzma_filter *reversed_filters)
 {
+       lzma_stream_coder *coder = coder_ptr;
+
        if (coder->sequence <= SEQ_BLOCK_INIT) {
                // There is no incomplete Block waiting to be finished,
                // thus we can change the whole filter chain. Start by
@@ -271,30 +277,33 @@ stream_encoder_init(lzma_next_coder *next, const lzma_allocator *allocator,
        if (filters == NULL)
                return LZMA_PROG_ERROR;
 
-       if (next->coder == NULL) {
-               next->coder = lzma_alloc(sizeof(lzma_coder), allocator);
-               if (next->coder == NULL)
+       lzma_stream_coder *coder = next->coder;
+
+       if (coder == NULL) {
+               coder = lzma_alloc(sizeof(lzma_stream_coder), allocator);
+               if (coder == NULL)
                        return LZMA_MEM_ERROR;
 
+               next->coder = coder;
                next->code = &stream_encode;
                next->end = &stream_encoder_end;
                next->update = &stream_encoder_update;
 
-               next->coder->filters[0].id = LZMA_VLI_UNKNOWN;
-               next->coder->block_encoder = LZMA_NEXT_CODER_INIT;
-               next->coder->index_encoder = LZMA_NEXT_CODER_INIT;
-               next->coder->index = NULL;
+               coder->filters[0].id = LZMA_VLI_UNKNOWN;
+               coder->block_encoder = LZMA_NEXT_CODER_INIT;
+               coder->index_encoder = LZMA_NEXT_CODER_INIT;
+               coder->index = NULL;
        }
 
        // Basic initializations
-       next->coder->sequence = SEQ_STREAM_HEADER;
-       next->coder->block_options.version = 0;
-       next->coder->block_options.check = check;
+       coder->sequence = SEQ_STREAM_HEADER;
+       coder->block_options.version = 0;
+       coder->block_options.check = check;
 
        // Initialize the Index
-       lzma_index_end(next->coder->index, allocator);
-       next->coder->index = lzma_index_init(allocator);
-       if (next->coder->index == NULL)
+       lzma_index_end(coder->index, allocator);
+       coder->index = lzma_index_init(allocator);
+       if (coder->index == NULL)
                return LZMA_MEM_ERROR;
 
        // Encode the Stream Header
@@ -303,16 +312,15 @@ stream_encoder_init(lzma_next_coder *next, const lzma_allocator *allocator,
                .check = check,
        };
        return_if_error(lzma_stream_header_encode(
-                       &stream_flags, next->coder->buffer));
+                       &stream_flags, coder->buffer));
 
-       next->coder->buffer_pos = 0;
-       next->coder->buffer_size = LZMA_STREAM_HEADER_SIZE;
+       coder->buffer_pos = 0;
+       coder->buffer_size = LZMA_STREAM_HEADER_SIZE;
 
        // Initialize the Block encoder. This way we detect unsupported
        // filter chains when initializing the Stream encoder instead of
        // giving an error after Stream Header has already written out.
-       return stream_encoder_update(
-                       next->coder, allocator, filters, NULL);
+       return stream_encoder_update(coder, allocator, filters, NULL);
 }
 
 
index 2328a8e73f07c7b78dcbce723ef1a8e08faaae50..c7086440bfa9aecb384adbe8be9084bef83cf584 100644 (file)
@@ -20,7 +20,7 @@
 #include "lz_decoder.h"
 
 
-struct lzma_coder_s {
+typedef struct {
        /// Dictionary (history buffer)
        lzma_dict dict;
 
@@ -48,7 +48,7 @@ struct lzma_coder_s {
                size_t size;
                uint8_t buffer[LZMA_BUFFER_SIZE];
        } temp;
-};
+} lzma_coder;
 
 
 static void
@@ -125,13 +125,15 @@ decode_buffer(lzma_coder *coder,
 
 
 static lzma_ret
-lz_decode(lzma_coder *coder,
+lz_decode(void *coder_ptr,
                const lzma_allocator *allocator lzma_attribute((__unused__)),
                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;
+
        if (coder->next.code == NULL)
                return decode_buffer(coder, in, in_pos, in_size,
                                out, out_pos, out_size);
@@ -184,8 +186,10 @@ lz_decode(lzma_coder *coder,
 
 
 static void
-lz_decoder_end(lzma_coder *coder, const lzma_allocator *allocator)
+lz_decoder_end(void *coder_ptr, const lzma_allocator *allocator)
 {
+       lzma_coder *coder = coder_ptr;
+
        lzma_next_end(&coder->next, allocator);
        lzma_free(coder->dict.buf, allocator);
 
@@ -207,24 +211,26 @@ lzma_lz_decoder_init(lzma_next_coder *next, const lzma_allocator *allocator,
                        lzma_lz_options *lz_options))
 {
        // Allocate the base structure if it isn't already allocated.
-       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_decode;
                next->end = &lz_decoder_end;
 
-               next->coder->dict.buf = NULL;
-               next->coder->dict.size = 0;
-               next->coder->lz = LZMA_LZ_DECODER_INIT;
-               next->coder->next = LZMA_NEXT_CODER_INIT;
+               coder->dict.buf = NULL;
+               coder->dict.size = 0;
+               coder->lz = LZMA_LZ_DECODER_INIT;
+               coder->next = LZMA_NEXT_CODER_INIT;
        }
 
        // Allocate and initialize the LZ-based decoder. It will also give
        // us the dictionary size.
        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));
 
        // If the dictionary size is very small, increase it to 4096 bytes.
@@ -248,14 +254,14 @@ lzma_lz_decoder_init(lzma_next_coder *next, const lzma_allocator *allocator,
        lz_options.dict_size = (lz_options.dict_size + 15) & ~((size_t)(15));
 
        // Allocate and initialize the dictionary.
-       if (next->coder->dict.size != lz_options.dict_size) {
-               lzma_free(next->coder->dict.buf, allocator);
-               next->coder->dict.buf
+       if (coder->dict.size != lz_options.dict_size) {
+               lzma_free(coder->dict.buf, allocator);
+               coder->dict.buf
                                = lzma_alloc(lz_options.dict_size, allocator);
-               if (next->coder->dict.buf == NULL)
+               if (coder->dict.buf == NULL)
                        return LZMA_MEM_ERROR;
 
-               next->coder->dict.size = lz_options.dict_size;
+               coder->dict.size = lz_options.dict_size;
        }
 
        lz_decoder_reset(next->coder);
@@ -268,21 +274,20 @@ lzma_lz_decoder_init(lzma_next_coder *next, const lzma_allocator *allocator,
                const size_t copy_size = my_min(lz_options.preset_dict_size,
                                lz_options.dict_size);
                const size_t offset = lz_options.preset_dict_size - copy_size;
-               memcpy(next->coder->dict.buf, lz_options.preset_dict + offset,
+               memcpy(coder->dict.buf, lz_options.preset_dict + offset,
                                copy_size);
-               next->coder->dict.pos = copy_size;
-               next->coder->dict.full = copy_size;
+               coder->dict.pos = copy_size;
+               coder->dict.full = copy_size;
        }
 
        // Miscellaneous initializations
-       next->coder->next_finished = false;
-       next->coder->this_finished = false;
-       next->coder->temp.pos = 0;
-       next->coder->temp.size = 0;
+       coder->next_finished = false;
+       coder->this_finished = false;
+       coder->temp.pos = 0;
+       coder->temp.size = 0;
 
        // 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);
 }
 
 
@@ -294,7 +299,8 @@ lzma_lz_decoder_memusage(size_t dictionary_size)
 
 
 extern void
-lzma_lz_decoder_uncompressed(lzma_coder *coder, lzma_vli uncompressed_size)
+lzma_lz_decoder_uncompressed(void *coder_ptr, lzma_vli uncompressed_size)
 {
+       lzma_coder *coder = coder_ptr;
        coder->lz.set_uncompressed(coder->lz.coder, uncompressed_size);
 }
index 277900afb71454f0daa597ea6994a0e39f27f341..754ccf37c6a4fddf30328ff2456a68ca02bc4161 100644 (file)
@@ -53,21 +53,20 @@ typedef struct {
 
 typedef struct {
        /// Data specific to the LZ-based decoder
-       lzma_coder *coder;
+       void *coder;
 
        /// Function to decode from in[] to *dict
-       lzma_ret (*code)(lzma_coder *restrict coder,
+       lzma_ret (*code)(void *coder,
                        lzma_dict *restrict dict, const uint8_t *restrict in,
                        size_t *restrict in_pos, size_t in_size);
 
-       void (*reset)(lzma_coder *coder, const void *options);
+       void (*reset)(void *coder, const void *options);
 
        /// Set the uncompressed size
-       void (*set_uncompressed)(lzma_coder *coder,
-                       lzma_vli uncompressed_size);
+       void (*set_uncompressed)(void *coder, lzma_vli uncompressed_size);
 
        /// Free allocated resources
-       void (*end)(lzma_coder *coder, const lzma_allocator *allocator);
+       void (*end)(void *coder, const lzma_allocator *allocator);
 
 } lzma_lz_decoder;
 
@@ -92,7 +91,7 @@ extern lzma_ret lzma_lz_decoder_init(lzma_next_coder *next,
 extern uint64_t lzma_lz_decoder_memusage(size_t dictionary_size);
 
 extern void lzma_lz_decoder_uncompressed(
-               lzma_coder *coder, lzma_vli uncompressed_size);
+               void *coder, lzma_vli uncompressed_size);
 
 
 //////////////////////
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);
 }
 
 
index dad9c6b29980ed0f107e18665a7af2195bc2433c..426dcd8a38750d5120bbe11e6e87103c229506dd 100644 (file)
@@ -191,19 +191,18 @@ typedef struct {
 
 typedef struct {
        /// Data specific to the LZ-based encoder
-       lzma_coder *coder;
+       void *coder;
 
        /// Function to encode from *dict to out[]
-       lzma_ret (*code)(lzma_coder *restrict coder,
+       lzma_ret (*code)(void *coder,
                        lzma_mf *restrict mf, uint8_t *restrict out,
                        size_t *restrict out_pos, size_t out_size);
 
        /// Free allocated resources
-       void (*end)(lzma_coder *coder, const lzma_allocator *allocator);
+       void (*end)(void *coder, const lzma_allocator *allocator);
 
        /// Update the options in the middle of the encoding.
-       lzma_ret (*options_update)(lzma_coder *coder,
-                       const lzma_filter *filter);
+       lzma_ret (*options_update)(void *coder, const lzma_filter *filter);
 
 } lzma_lz_encoder;
 
index 84982d2c4286146bda1b757b8dedec1893000309..878c870ae1a254939e6045f2d9308669f53c89e7 100644 (file)
@@ -16,7 +16,7 @@
 #include "lzma_decoder.h"
 
 
-struct lzma_coder_s {
+typedef struct {
        enum sequence {
                SEQ_CONTROL,
                SEQ_UNCOMPRESSED_1,
@@ -50,14 +50,16 @@ struct lzma_coder_s {
        bool need_dictionary_reset;
 
        lzma_options_lzma options;
-};
+} lzma_lzma2_coder;
 
 
 static lzma_ret
-lzma2_decode(lzma_coder *restrict coder, lzma_dict *restrict dict,
+lzma2_decode(void *coder_ptr, lzma_dict *restrict dict,
                const uint8_t *restrict in, size_t *restrict in_pos,
                size_t in_size)
 {
+       lzma_lzma2_coder *restrict coder = coder_ptr;
+
        // With SEQ_LZMA it is possible that no new input is needed to do
        // some progress. The rest of the sequences assume that there is
        // at least one byte of input.
@@ -209,8 +211,10 @@ lzma2_decode(lzma_coder *restrict coder, lzma_dict *restrict dict,
 
 
 static void
-lzma2_decoder_end(lzma_coder *coder, const lzma_allocator *allocator)
+lzma2_decoder_end(void *coder_ptr, const lzma_allocator *allocator)
 {
+       lzma_lzma2_coder *coder = coder_ptr;
+
        assert(coder->lzma.end == NULL);
        lzma_free(coder->lzma.coder, allocator);
 
@@ -224,25 +228,27 @@ static lzma_ret
 lzma2_decoder_init(lzma_lz_decoder *lz, const lzma_allocator *allocator,
                const void *opt, lzma_lz_options *lz_options)
 {
-       if (lz->coder == NULL) {
-               lz->coder = lzma_alloc(sizeof(lzma_coder), allocator);
-               if (lz->coder == NULL)
+       lzma_lzma2_coder *coder = lz->coder;
+       if (coder == NULL) {
+               coder = lzma_alloc(sizeof(lzma_lzma2_coder), allocator);
+               if (coder == NULL)
                        return LZMA_MEM_ERROR;
 
+               lz->coder = coder;
                lz->code = &lzma2_decode;
                lz->end = &lzma2_decoder_end;
 
-               lz->coder->lzma = LZMA_LZ_DECODER_INIT;
+               coder->lzma = LZMA_LZ_DECODER_INIT;
        }
 
        const lzma_options_lzma *options = opt;
 
-       lz->coder->sequence = SEQ_CONTROL;
-       lz->coder->need_properties = true;
-       lz->coder->need_dictionary_reset = options->preset_dict == NULL
+       coder->sequence = SEQ_CONTROL;
+       coder->need_properties = true;
+       coder->need_dictionary_reset = options->preset_dict == NULL
                        || options->preset_dict_size == 0;
 
-       return lzma_lzma_decoder_create(&lz->coder->lzma,
+       return lzma_lzma_decoder_create(&coder->lzma,
                        allocator, options, lz_options);
 }
 
@@ -263,7 +269,7 @@ lzma_lzma2_decoder_init(lzma_next_coder *next, const lzma_allocator *allocator,
 extern uint64_t
 lzma_lzma2_decoder_memusage(const void *options)
 {
-       return sizeof(lzma_coder)
+       return sizeof(lzma_lzma2_coder)
                        + lzma_lzma_decoder_memusage_nocheck(options);
 }
 
index b6756bfc2b1c8abd9d71c0bb7b06f282e3ba97e5..63588ee30c6b829096b38bba137f974be8387c25 100644 (file)
@@ -17,7 +17,7 @@
 #include "lzma2_encoder.h"
 
 
-struct lzma_coder_s {
+typedef struct {
        enum {
                SEQ_INIT,
                SEQ_LZMA_ENCODE,
@@ -27,7 +27,7 @@ struct lzma_coder_s {
        } sequence;
 
        /// LZMA encoder
-       lzma_coder *lzma;
+       void *lzma;
 
        /// LZMA options currently in use.
        lzma_options_lzma opt_cur;
@@ -48,11 +48,11 @@ struct lzma_coder_s {
 
        /// Buffer to hold the chunk header and LZMA compressed data
        uint8_t buf[LZMA2_HEADER_MAX + LZMA2_CHUNK_MAX];
-};
+} lzma_lzma2_coder;
 
 
 static void
-lzma2_header_lzma(lzma_coder *coder)
+lzma2_header_lzma(lzma_lzma2_coder *coder)
 {
        assert(coder->uncompressed_size > 0);
        assert(coder->uncompressed_size <= LZMA2_UNCOMPRESSED_MAX);
@@ -108,7 +108,7 @@ lzma2_header_lzma(lzma_coder *coder)
 
 
 static void
-lzma2_header_uncompressed(lzma_coder *coder)
+lzma2_header_uncompressed(lzma_lzma2_coder *coder)
 {
        assert(coder->uncompressed_size > 0);
        assert(coder->uncompressed_size <= LZMA2_CHUNK_MAX);
@@ -133,10 +133,12 @@ lzma2_header_uncompressed(lzma_coder *coder)
 
 
 static lzma_ret
-lzma2_encode(lzma_coder *restrict coder, lzma_mf *restrict mf,
+lzma2_encode(void *coder_ptr, lzma_mf *restrict mf,
                uint8_t *restrict out, size_t *restrict out_pos,
                size_t out_size)
 {
+       lzma_lzma2_coder *restrict coder = coder_ptr;
+
        while (*out_pos < out_size)
        switch (coder->sequence) {
        case SEQ_INIT:
@@ -262,8 +264,9 @@ lzma2_encode(lzma_coder *restrict coder, lzma_mf *restrict mf,
 
 
 static void
-lzma2_encoder_end(lzma_coder *coder, const lzma_allocator *allocator)
+lzma2_encoder_end(void *coder_ptr, const lzma_allocator *allocator)
 {
+       lzma_lzma2_coder *coder = coder_ptr;
        lzma_free(coder->lzma, allocator);
        lzma_free(coder, allocator);
        return;
@@ -271,8 +274,10 @@ lzma2_encoder_end(lzma_coder *coder, const lzma_allocator *allocator)
 
 
 static lzma_ret
-lzma2_encoder_options_update(lzma_coder *coder, const lzma_filter *filter)
+lzma2_encoder_options_update(void *coder_ptr, const lzma_filter *filter)
 {
+       lzma_lzma2_coder *coder = coder_ptr;
+
        // New options can be set only when there is no incomplete chunk.
        // This is the case at the beginning of the raw stream and right
        // after LZMA_SYNC_FLUSH.
@@ -310,30 +315,32 @@ lzma2_encoder_init(lzma_lz_encoder *lz, const lzma_allocator *allocator,
        if (options == NULL)
                return LZMA_PROG_ERROR;
 
-       if (lz->coder == NULL) {
-               lz->coder = lzma_alloc(sizeof(lzma_coder), allocator);
-               if (lz->coder == NULL)
+       lzma_lzma2_coder *coder = lz->coder;
+       if (coder == NULL) {
+               coder = lzma_alloc(sizeof(lzma_lzma2_coder), allocator);
+               if (coder == NULL)
                        return LZMA_MEM_ERROR;
 
+               lz->coder = coder;
                lz->code = &lzma2_encode;
                lz->end = &lzma2_encoder_end;
                lz->options_update = &lzma2_encoder_options_update;
 
-               lz->coder->lzma = NULL;
+               coder->lzma = NULL;
        }
 
-       lz->coder->opt_cur = *(const lzma_options_lzma *)(options);
+       coder->opt_cur = *(const lzma_options_lzma *)(options);
 
-       lz->coder->sequence = SEQ_INIT;
-       lz->coder->need_properties = true;
-       lz->coder->need_state_reset = false;
-       lz->coder->need_dictionary_reset
-                       = lz->coder->opt_cur.preset_dict == NULL
-                       || lz->coder->opt_cur.preset_dict_size == 0;
+       coder->sequence = SEQ_INIT;
+       coder->need_properties = true;
+       coder->need_state_reset = false;
+       coder->need_dictionary_reset
+                       = coder->opt_cur.preset_dict == NULL
+                       || coder->opt_cur.preset_dict_size == 0;
 
        // Initialize LZMA encoder
-       return_if_error(lzma_lzma_encoder_create(&lz->coder->lzma, allocator,
-                       &lz->coder->opt_cur, lz_options));
+       return_if_error(lzma_lzma_encoder_create(&coder->lzma, allocator,
+                       &coder->opt_cur, lz_options));
 
        // Make sure that we will always have enough history available in
        // case we need to use uncompressed chunks. They are used when the
@@ -364,7 +371,7 @@ lzma_lzma2_encoder_memusage(const void *options)
        if (lzma_mem == UINT64_MAX)
                return UINT64_MAX;
 
-       return sizeof(lzma_coder) + lzma_mem;
+       return sizeof(lzma_lzma2_coder) + lzma_mem;
 }
 
 
index b8f931705bf9b7214046cdcb2058533fb25851ba..d0f29b763a3c384a6760d7f8a5d1133e8d3fd8fe 100644 (file)
 #include "lzma_decoder.h"
 #include "range_decoder.h"
 
+// The macros unroll loops with switch statements.
+// Silence warnings about missing fall-through comments.
+#if TUKLIB_GNUC_REQ(7, 0)
+#      pragma GCC diagnostic ignored "-Wimplicit-fallthrough"
+#endif
+
 
 #ifdef HAVE_SMALL
 
@@ -161,7 +167,7 @@ typedef struct {
 } lzma_length_decoder;
 
 
-struct lzma_coder_s {
+typedef struct {
        ///////////////////
        // Probabilities //
        ///////////////////
@@ -277,14 +283,16 @@ struct lzma_coder_s {
        /// If decoding a literal: match byte.
        /// If decoding a match: length of the match.
        uint32_t len;
-};
+} lzma_lzma1_decoder;
 
 
 static lzma_ret
-lzma_decode(lzma_coder *restrict coder, lzma_dict *restrict dictptr,
+lzma_decode(void *coder_ptr, lzma_dict *restrict dictptr,
                const uint8_t *restrict in,
                size_t *restrict in_pos, size_t in_size)
 {
+       lzma_lzma1_decoder *restrict coder = coder_ptr;
+
        ////////////////////
        // Initialization //
        ////////////////////
@@ -840,23 +848,17 @@ out:
 
 
 static void
-lzma_decoder_uncompressed(lzma_coder *coder, lzma_vli uncompressed_size)
+lzma_decoder_uncompressed(void *coder_ptr, lzma_vli uncompressed_size)
 {
+       lzma_lzma1_decoder *coder = coder_ptr;
        coder->uncompressed_size = uncompressed_size;
 }
 
-/*
-extern void
-lzma_lzma_decoder_uncompressed(void *coder_ptr, lzma_vli uncompressed_size)
-{
-       // This is hack.
-       (*(lzma_coder **)(coder))->uncompressed_size = uncompressed_size;
-}
-*/
 
 static void
-lzma_decoder_reset(lzma_coder *coder, const void *opt)
+lzma_decoder_reset(void *coder_ptr, const void *opt)
 {
+       lzma_lzma1_decoder *coder = coder_ptr;
        const lzma_options_lzma *options = opt;
 
        // NOTE: We assume that lc/lp/pb are valid since they were
@@ -941,7 +943,7 @@ lzma_lzma_decoder_create(lzma_lz_decoder *lz, const lzma_allocator *allocator,
                const void *opt, lzma_lz_options *lz_options)
 {
        if (lz->coder == NULL) {
-               lz->coder = lzma_alloc(sizeof(lzma_coder), allocator);
+               lz->coder = lzma_alloc(sizeof(lzma_lzma1_decoder), allocator);
                if (lz->coder == NULL)
                        return LZMA_MEM_ERROR;
 
@@ -1014,7 +1016,8 @@ extern uint64_t
 lzma_lzma_decoder_memusage_nocheck(const void *options)
 {
        const lzma_options_lzma *const opt = options;
-       return sizeof(lzma_coder) + lzma_lz_decoder_memusage(opt->dict_size);
+       return sizeof(lzma_lzma1_decoder)
+                       + lzma_lz_decoder_memusage(opt->dict_size);
 }
 
 
index 4c5f99c3823db92fc37e2cddbf7e9befbdaee6f4..ba9ce6989c0151d7b20e7d39f11b413c9ff9fabf 100644 (file)
@@ -43,7 +43,7 @@ literal_matched(lzma_range_encoder *rc, probability *subcoder,
 
 
 static inline void
-literal(lzma_coder *coder, lzma_mf *mf, uint32_t position)
+literal(lzma_lzma1_encoder *coder, lzma_mf *mf, uint32_t position)
 {
        // Locate the literal byte to be encoded and the subcoder.
        const uint8_t cur_byte = mf->buffer[
@@ -140,7 +140,7 @@ length(lzma_range_encoder *rc, lzma_length_encoder *lc,
 ///////////
 
 static inline void
-match(lzma_coder *coder, const uint32_t pos_state,
+match(lzma_lzma1_encoder *coder, const uint32_t pos_state,
                const uint32_t distance, const uint32_t len)
 {
        update_match(coder->state);
@@ -187,7 +187,7 @@ match(lzma_coder *coder, const uint32_t pos_state,
 ////////////////////
 
 static inline void
-rep_match(lzma_coder *coder, const uint32_t pos_state,
+rep_match(lzma_lzma1_encoder *coder, const uint32_t pos_state,
                const uint32_t rep, const uint32_t len)
 {
        if (rep == 0) {
@@ -231,7 +231,7 @@ rep_match(lzma_coder *coder, const uint32_t pos_state,
 //////////
 
 static void
-encode_symbol(lzma_coder *coder, lzma_mf *mf,
+encode_symbol(lzma_lzma1_encoder *coder, lzma_mf *mf,
                uint32_t back, uint32_t len, uint32_t position)
 {
        const uint32_t pos_state = position & coder->pos_mask;
@@ -265,7 +265,7 @@ encode_symbol(lzma_coder *coder, lzma_mf *mf,
 
 
 static bool
-encode_init(lzma_coder *coder, lzma_mf *mf)
+encode_init(lzma_lzma1_encoder *coder, lzma_mf *mf)
 {
        assert(mf_position(mf) == 0);
 
@@ -293,7 +293,7 @@ encode_init(lzma_coder *coder, lzma_mf *mf)
 
 
 static void
-encode_eopm(lzma_coder *coder, uint32_t position)
+encode_eopm(lzma_lzma1_encoder *coder, uint32_t position)
 {
        const uint32_t pos_state = position & coder->pos_mask;
        rc_bit(&coder->rc, &coder->is_match[coder->state][pos_state], 1);
@@ -309,7 +309,7 @@ encode_eopm(lzma_coder *coder, uint32_t position)
 
 
 extern lzma_ret
-lzma_lzma_encode(lzma_coder *restrict coder, lzma_mf *restrict mf,
+lzma_lzma_encode(lzma_lzma1_encoder *restrict coder, lzma_mf *restrict mf,
                uint8_t *restrict out, size_t *restrict out_pos,
                size_t out_size, uint32_t limit)
 {
@@ -402,7 +402,7 @@ lzma_lzma_encode(lzma_coder *restrict coder, lzma_mf *restrict mf,
 
 
 static lzma_ret
-lzma_encode(lzma_coder *restrict coder, lzma_mf *restrict mf,
+lzma_encode(void *coder, lzma_mf *restrict mf,
                uint8_t *restrict out, size_t *restrict out_pos,
                size_t out_size)
 {
@@ -473,7 +473,8 @@ length_encoder_reset(lzma_length_encoder *lencoder,
 
 
 extern lzma_ret
-lzma_lzma_encoder_reset(lzma_coder *coder, const lzma_options_lzma *options)
+lzma_lzma_encoder_reset(lzma_lzma1_encoder *coder,
+               const lzma_options_lzma *options)
 {
        if (!is_options_valid(options))
                return LZMA_OPTIONS_ERROR;
@@ -545,18 +546,18 @@ lzma_lzma_encoder_reset(lzma_coder *coder, const lzma_options_lzma *options)
 
 
 extern lzma_ret
-lzma_lzma_encoder_create(lzma_coder **coder_ptr,
+lzma_lzma_encoder_create(void **coder_ptr,
                const lzma_allocator *allocator,
                const lzma_options_lzma *options, lzma_lz_options *lz_options)
 {
-       // Allocate lzma_coder if it wasn't already allocated.
+       // Allocate lzma_lzma1_encoder if it wasn't already allocated.
        if (*coder_ptr == NULL) {
-               *coder_ptr = lzma_alloc(sizeof(lzma_coder), allocator);
+               *coder_ptr = lzma_alloc(sizeof(lzma_lzma1_encoder), allocator);
                if (*coder_ptr == NULL)
                        return LZMA_MEM_ERROR;
        }
 
-       lzma_coder *coder = *coder_ptr;
+       lzma_lzma1_encoder *coder = *coder_ptr;
 
        // Set compression mode. We haven't validates the options yet,
        // but it's OK here, since nothing bad happens with invalid
@@ -636,7 +637,7 @@ lzma_lzma_encoder_memusage(const void *options)
        if (lz_memusage == UINT64_MAX)
                return UINT64_MAX;
 
-       return (uint64_t)(sizeof(lzma_coder)) + lz_memusage;
+       return (uint64_t)(sizeof(lzma_lzma1_encoder)) + lz_memusage;
 }
 
 
index cc9cc2f27ecb9bc4c3b8bd33ef22bf5f43de3181..6cfdf228bf5c610afe71c8ae7eac921588b3b14e 100644 (file)
@@ -17,6 +17,9 @@
 #include "common.h"
 
 
+typedef struct lzma_lzma1_encoder_s lzma_lzma1_encoder;
+
+
 extern lzma_ret lzma_lzma_encoder_init(lzma_next_coder *next,
                const lzma_allocator *allocator,
                const lzma_filter_info *filters);
@@ -36,16 +39,16 @@ extern bool lzma_lzma_lclppb_encode(
 
 /// Initializes raw LZMA encoder; this is used by LZMA2.
 extern lzma_ret lzma_lzma_encoder_create(
-               lzma_coder **coder_ptr, const lzma_allocator *allocator,
+               void **coder_ptr, const lzma_allocator *allocator,
                const lzma_options_lzma *options, lzma_lz_options *lz_options);
 
 
 /// Resets an already initialized LZMA encoder; this is used by LZMA2.
 extern lzma_ret lzma_lzma_encoder_reset(
-               lzma_coder *coder, const lzma_options_lzma *options);
+               lzma_lzma1_encoder *coder, const lzma_options_lzma *options);
 
 
-extern lzma_ret lzma_lzma_encode(lzma_coder *restrict coder,
+extern lzma_ret lzma_lzma_encode(lzma_lzma1_encoder *restrict coder,
                lzma_mf *restrict mf, uint8_t *restrict out,
                size_t *restrict out_pos, size_t out_size,
                uint32_t read_limit);
index 9b30347cbc4279d4e66828c5bff605483de12fc7..6c53d2bd0082b84ce7ee2c3a8f4b88cc8ea3e2f0 100644 (file)
@@ -18,7 +18,8 @@
 
 
 extern void
-lzma_lzma_optimum_fast(lzma_coder *restrict coder, lzma_mf *restrict mf,
+lzma_lzma_optimum_fast(lzma_lzma1_encoder *restrict coder,
+               lzma_mf *restrict mf,
                uint32_t *restrict back_res, uint32_t *restrict len_res)
 {
        const uint32_t nice_len = mf->nice_len;
index a360579885dbd5c08fe9b790220a379df2388b72..59f77343ed793bd662c7b17fb0977a267b82df32 100644 (file)
@@ -19,7 +19,7 @@
 ////////////
 
 static uint32_t
-get_literal_price(const lzma_coder *const coder, const uint32_t pos,
+get_literal_price(const lzma_lzma1_encoder *const coder, const uint32_t pos,
                const uint32_t prev_byte, const bool match_mode,
                uint32_t match_byte, uint32_t symbol)
 {
@@ -65,7 +65,7 @@ get_len_price(const lzma_length_encoder *const lencoder,
 
 
 static inline uint32_t
-get_short_rep_price(const lzma_coder *const coder,
+get_short_rep_price(const lzma_lzma1_encoder *const coder,
                const lzma_lzma_state state, const uint32_t pos_state)
 {
        return rc_bit_0_price(coder->is_rep0[state])
@@ -74,7 +74,7 @@ get_short_rep_price(const lzma_coder *const coder,
 
 
 static inline uint32_t
-get_pure_rep_price(const lzma_coder *const coder, const uint32_t rep_index,
+get_pure_rep_price(const lzma_lzma1_encoder *const coder, const uint32_t rep_index,
                const lzma_lzma_state state, uint32_t pos_state)
 {
        uint32_t price;
@@ -99,7 +99,7 @@ get_pure_rep_price(const lzma_coder *const coder, const uint32_t rep_index,
 
 
 static inline uint32_t
-get_rep_price(const lzma_coder *const coder, const uint32_t rep_index,
+get_rep_price(const lzma_lzma1_encoder *const coder, const uint32_t rep_index,
                const uint32_t len, const lzma_lzma_state state,
                const uint32_t pos_state)
 {
@@ -109,7 +109,7 @@ get_rep_price(const lzma_coder *const coder, const uint32_t rep_index,
 
 
 static inline uint32_t
-get_dist_len_price(const lzma_coder *const coder, const uint32_t dist,
+get_dist_len_price(const lzma_lzma1_encoder *const coder, const uint32_t dist,
                const uint32_t len, const uint32_t pos_state)
 {
        const uint32_t dist_state = get_dist_state(len);
@@ -130,7 +130,7 @@ get_dist_len_price(const lzma_coder *const coder, const uint32_t dist,
 
 
 static void
-fill_dist_prices(lzma_coder *coder)
+fill_dist_prices(lzma_lzma1_encoder *coder)
 {
        for (uint32_t dist_state = 0; dist_state < DIST_STATES; ++dist_state) {
 
@@ -185,7 +185,7 @@ fill_dist_prices(lzma_coder *coder)
 
 
 static void
-fill_align_prices(lzma_coder *coder)
+fill_align_prices(lzma_lzma1_encoder *coder)
 {
        for (uint32_t i = 0; i < ALIGN_SIZE; ++i)
                coder->align_prices[i] = rc_bittree_reverse_price(
@@ -221,7 +221,7 @@ make_short_rep(lzma_optimal *optimal)
 
 
 static void
-backward(lzma_coder *restrict coder, uint32_t *restrict len_res,
+backward(lzma_lzma1_encoder *restrict coder, uint32_t *restrict len_res,
                uint32_t *restrict back_res, uint32_t cur)
 {
        coder->opts_end_index = cur;
@@ -269,7 +269,7 @@ backward(lzma_coder *restrict coder, uint32_t *restrict len_res,
 //////////
 
 static inline uint32_t
-helper1(lzma_coder *restrict coder, lzma_mf *restrict mf,
+helper1(lzma_lzma1_encoder *restrict coder, lzma_mf *restrict mf,
                uint32_t *restrict back_res, uint32_t *restrict len_res,
                uint32_t position)
 {
@@ -441,7 +441,7 @@ helper1(lzma_coder *restrict coder, lzma_mf *restrict mf,
 
 
 static inline uint32_t
-helper2(lzma_coder *coder, uint32_t *reps, const uint8_t *buf,
+helper2(lzma_lzma1_encoder *coder, uint32_t *reps, const uint8_t *buf,
                uint32_t len_end, uint32_t position, const uint32_t cur,
                const uint32_t nice_len, const uint32_t buf_avail_full)
 {
@@ -797,7 +797,8 @@ helper2(lzma_coder *coder, uint32_t *reps, const uint8_t *buf,
 
 
 extern void
-lzma_lzma_optimum_normal(lzma_coder *restrict coder, lzma_mf *restrict mf,
+lzma_lzma_optimum_normal(lzma_lzma1_encoder *restrict coder,
+               lzma_mf *restrict mf,
                uint32_t *restrict back_res, uint32_t *restrict len_res,
                uint32_t position)
 {
index 2f62d6cba0b7e260a641396fb7e8b65605e18e7c..a2da969f4958f5a50e32df2602b746399fd039f2 100644 (file)
@@ -69,7 +69,7 @@ typedef struct {
 } lzma_optimal;
 
 
-struct lzma_coder_s {
+struct lzma_lzma1_encoder_s {
        /// Range encoder
        lzma_range_encoder rc;
 
@@ -138,10 +138,10 @@ struct lzma_coder_s {
 
 
 extern void lzma_lzma_optimum_fast(
-               lzma_coder *restrict coder, lzma_mf *restrict mf,
+               lzma_lzma1_encoder *restrict coder, lzma_mf *restrict mf,
                uint32_t *restrict back_res, uint32_t *restrict len_res);
 
-extern void lzma_lzma_optimum_normal(lzma_coder *restrict coder,
+extern void lzma_lzma_optimum_normal(lzma_lzma1_encoder *restrict coder,
                lzma_mf *restrict mf, uint32_t *restrict back_res,
                uint32_t *restrict len_res, uint32_t position);
 
index ce6b9db6215f72e7cd26cf2151b267167e451544..2c74dc1537c8fa1c2fe86ca73f6c19f8315d479f 100644 (file)
 #ifndef LZMA_RANGE_COMMON_H
 #define LZMA_RANGE_COMMON_H
 
-#include <stdint.h>
-#ifdef HAVE_CONFIG_H
-#      include "common.h"
-#endif
+#include "common.h"
 
 
 ///////////////
index 22be7aff8e55165f685b82ddf5ac59dab572215a..1e1c36995b6332382661ce51fc4d8c12c5e52811 100644 (file)
 #ifndef LZMA_RANGE_ENCODER_H
 #define LZMA_RANGE_ENCODER_H
 
-#include <stdlib.h>
-#include <stdbool.h>
-
-#include <assert.h>
-
 #include "range_common.h"
 #include "price.h"