1*3b35e7eeSXin LI // SPDX-License-Identifier: 0BSD 2*3b35e7eeSXin LI 381ad8388SMartin Matuska /////////////////////////////////////////////////////////////////////////////// 481ad8388SMartin Matuska // 581ad8388SMartin Matuska /// \file simple_private.h 681ad8388SMartin Matuska /// \brief Private definitions for so called simple filters 781ad8388SMartin Matuska // 881ad8388SMartin Matuska // Author: Lasse Collin 981ad8388SMartin Matuska // 1081ad8388SMartin Matuska /////////////////////////////////////////////////////////////////////////////// 1181ad8388SMartin Matuska 1281ad8388SMartin Matuska #ifndef LZMA_SIMPLE_PRIVATE_H 1381ad8388SMartin Matuska #define LZMA_SIMPLE_PRIVATE_H 1481ad8388SMartin Matuska 1581ad8388SMartin Matuska #include "simple_coder.h" 1681ad8388SMartin Matuska 1781ad8388SMartin Matuska 181456f0f9SXin LI typedef struct { 1981ad8388SMartin Matuska /// Next filter in the chain 2081ad8388SMartin Matuska lzma_next_coder next; 2181ad8388SMartin Matuska 223632bc4cSMartin Matuska /// True if the next coder in the chain has returned LZMA_STREAM_END. 2381ad8388SMartin Matuska bool end_was_reached; 2481ad8388SMartin Matuska 2581ad8388SMartin Matuska /// True if filter() should encode the data; false to decode. 2681ad8388SMartin Matuska /// Currently all simple filters use the same function for encoding 2781ad8388SMartin Matuska /// and decoding, because the difference between encoders and decoders 2881ad8388SMartin Matuska /// is very small. 2981ad8388SMartin Matuska bool is_encoder; 3081ad8388SMartin Matuska 3181ad8388SMartin Matuska /// Pointer to filter-specific function, which does 3281ad8388SMartin Matuska /// the actual filtering. 331456f0f9SXin LI size_t (*filter)(void *simple, uint32_t now_pos, 3481ad8388SMartin Matuska bool is_encoder, uint8_t *buffer, size_t size); 3581ad8388SMartin Matuska 3681ad8388SMartin Matuska /// Pointer to filter-specific data, or NULL if filter doesn't need 3781ad8388SMartin Matuska /// any extra data. 381456f0f9SXin LI void *simple; 3981ad8388SMartin Matuska 4081ad8388SMartin Matuska /// The lowest 32 bits of the current position in the data. Most 4181ad8388SMartin Matuska /// filters need this to do conversions between absolute and relative 4281ad8388SMartin Matuska /// addresses. 4381ad8388SMartin Matuska uint32_t now_pos; 4481ad8388SMartin Matuska 4581ad8388SMartin Matuska /// Size of the memory allocated for the buffer. 4681ad8388SMartin Matuska size_t allocated; 4781ad8388SMartin Matuska 4881ad8388SMartin Matuska /// Flushing position in the temporary buffer. buffer[pos] is the 4981ad8388SMartin Matuska /// next byte to be copied to out[]. 5081ad8388SMartin Matuska size_t pos; 5181ad8388SMartin Matuska 5281ad8388SMartin Matuska /// buffer[filtered] is the first unfiltered byte. When pos is smaller 5381ad8388SMartin Matuska /// than filtered, there is unflushed filtered data in the buffer. 5481ad8388SMartin Matuska size_t filtered; 5581ad8388SMartin Matuska 5681ad8388SMartin Matuska /// Total number of bytes (both filtered and unfiltered) currently 5781ad8388SMartin Matuska /// in the temporary buffer. 5881ad8388SMartin Matuska size_t size; 5981ad8388SMartin Matuska 6081ad8388SMartin Matuska /// Temporary buffer 6181ad8388SMartin Matuska uint8_t buffer[]; 621456f0f9SXin LI } lzma_simple_coder; 6381ad8388SMartin Matuska 6481ad8388SMartin Matuska 6581ad8388SMartin Matuska extern lzma_ret lzma_simple_coder_init(lzma_next_coder *next, 6653200025SRui Paulo const lzma_allocator *allocator, 6753200025SRui Paulo const lzma_filter_info *filters, 681456f0f9SXin LI size_t (*filter)(void *simple, uint32_t now_pos, 6981ad8388SMartin Matuska bool is_encoder, uint8_t *buffer, size_t size), 7081ad8388SMartin Matuska size_t simple_size, size_t unfiltered_max, 7181ad8388SMartin Matuska uint32_t alignment, bool is_encoder); 7281ad8388SMartin Matuska 7381ad8388SMartin Matuska #endif 74