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