158551Skris///////////////////////////////////////////////////////////////////////////////
258551Skris//
358551Skris/// \file       simple_private.h
458551Skris/// \brief      Private definitions for so called simple filters
5228060Sbapt//
6228060Sbapt//  Author:     Lasse Collin
7228060Sbapt//
858551Skris//  This file has been put into the public domain.
9228060Sbapt//  You can do whatever you want with this file.
1058551Skris//
11228060Sbapt///////////////////////////////////////////////////////////////////////////////
12228060Sbapt
13228060Sbapt#ifndef LZMA_SIMPLE_PRIVATE_H
14228060Sbapt#define LZMA_SIMPLE_PRIVATE_H
1558551Skris
16228060Sbapt#include "simple_coder.h"
17228060Sbapt
18228060Sbapt
19228060Sbapttypedef struct {
2058551Skris	/// Next filter in the chain
21228060Sbapt	lzma_next_coder next;
22228060Sbapt
23228060Sbapt	/// True if the next coder in the chain has returned LZMA_STREAM_END.
24228060Sbapt	bool end_was_reached;
2558551Skris
2658551Skris	/// True if filter() should encode the data; false to decode.
2758551Skris	/// Currently all simple filters use the same function for encoding
2858551Skris	/// and decoding, because the difference between encoders and decoders
29228060Sbapt	/// is very small.
30228060Sbapt	bool is_encoder;
31228060Sbapt
32228060Sbapt	/// Pointer to filter-specific function, which does
33228060Sbapt	/// the actual filtering.
34228060Sbapt	size_t (*filter)(void *simple, uint32_t now_pos,
35228060Sbapt			bool is_encoder, uint8_t *buffer, size_t size);
36228060Sbapt
3758551Skris	/// Pointer to filter-specific data, or NULL if filter doesn't need
3858551Skris	/// any extra data.
3958551Skris	void *simple;
40228060Sbapt
41228060Sbapt	/// The lowest 32 bits of the current position in the data. Most
42228060Sbapt	/// filters need this to do conversions between absolute and relative
43228060Sbapt	/// addresses.
44228060Sbapt	uint32_t now_pos;
45228060Sbapt
46228060Sbapt	/// Size of the memory allocated for the buffer.
47228060Sbapt	size_t allocated;
48228060Sbapt
49228060Sbapt	/// Flushing position in the temporary buffer. buffer[pos] is the
50228060Sbapt	/// next byte to be copied to out[].
51228060Sbapt	size_t pos;
52228060Sbapt
53228060Sbapt	/// buffer[filtered] is the first unfiltered byte. When pos is smaller
54228060Sbapt	/// than filtered, there is unflushed filtered data in the buffer.
5558551Skris	size_t filtered;
56228060Sbapt
57228060Sbapt	/// Total number of bytes (both filtered and unfiltered) currently
5858551Skris	/// in the temporary buffer.
59228060Sbapt	size_t size;
60228060Sbapt
61228060Sbapt	/// Temporary buffer
62228060Sbapt	uint8_t buffer[];
63228060Sbapt} lzma_simple_coder;
64228060Sbapt
65228060Sbapt
6658551Skrisextern lzma_ret lzma_simple_coder_init(lzma_next_coder *next,
6758551Skris		const lzma_allocator *allocator,
6858551Skris		const lzma_filter_info *filters,
6958551Skris		size_t (*filter)(void *simple, uint32_t now_pos,
7058551Skris			bool is_encoder, uint8_t *buffer, size_t size),
7158551Skris		size_t simple_size, size_t unfiltered_max,
7258551Skris		uint32_t alignment, bool is_encoder);
7358551Skris
7458551Skris#endif
7558551Skris