xref: /freebsd/contrib/xz/src/liblzma/api/lzma/index.h (revision 81ad83880dcc267b198c781929dd9a009f98c5f7)
1*81ad8388SMartin Matuska /**
2*81ad8388SMartin Matuska  * \file        lzma/index.h
3*81ad8388SMartin Matuska  * \brief       Handling of .xz Index and related information
4*81ad8388SMartin Matuska  */
5*81ad8388SMartin Matuska 
6*81ad8388SMartin Matuska /*
7*81ad8388SMartin Matuska  * Author: Lasse Collin
8*81ad8388SMartin Matuska  *
9*81ad8388SMartin Matuska  * This file has been put into the public domain.
10*81ad8388SMartin Matuska  * You can do whatever you want with this file.
11*81ad8388SMartin Matuska  *
12*81ad8388SMartin Matuska  * See ../lzma.h for information about liblzma as a whole.
13*81ad8388SMartin Matuska  */
14*81ad8388SMartin Matuska 
15*81ad8388SMartin Matuska #ifndef LZMA_H_INTERNAL
16*81ad8388SMartin Matuska #	error Never include this file directly. Use <lzma.h> instead.
17*81ad8388SMartin Matuska #endif
18*81ad8388SMartin Matuska 
19*81ad8388SMartin Matuska 
20*81ad8388SMartin Matuska /**
21*81ad8388SMartin Matuska  * \brief       Opaque data type to hold the Index(es) and other information
22*81ad8388SMartin Matuska  *
23*81ad8388SMartin Matuska  * lzma_index often holds just one .xz Index and possibly the Stream Flags
24*81ad8388SMartin Matuska  * of the same Stream and size of the Stream Padding field. However,
25*81ad8388SMartin Matuska  * multiple lzma_indexes can be concatenated with lzma_index_cat() and then
26*81ad8388SMartin Matuska  * there may be information about multiple Streams in the same lzma_index.
27*81ad8388SMartin Matuska  *
28*81ad8388SMartin Matuska  * Notes about thread safety: Only one thread may modify lzma_index at
29*81ad8388SMartin Matuska  * a time. All functions that take non-const pointer to lzma_index
30*81ad8388SMartin Matuska  * modify it. As long as no thread is modifying the lzma_index, getting
31*81ad8388SMartin Matuska  * information from the same lzma_index can be done from multiple threads
32*81ad8388SMartin Matuska  * at the same time with functions that take a const pointer to
33*81ad8388SMartin Matuska  * lzma_index or use lzma_index_iter. The same iterator must be used
34*81ad8388SMartin Matuska  * only by one thread at a time, of course, but there can be as many
35*81ad8388SMartin Matuska  * iterators for the same lzma_index as needed.
36*81ad8388SMartin Matuska  */
37*81ad8388SMartin Matuska typedef struct lzma_index_s lzma_index;
38*81ad8388SMartin Matuska 
39*81ad8388SMartin Matuska 
40*81ad8388SMartin Matuska /**
41*81ad8388SMartin Matuska  * \brief       Iterator to get information about Blocks and Streams
42*81ad8388SMartin Matuska  */
43*81ad8388SMartin Matuska typedef struct {
44*81ad8388SMartin Matuska 	struct {
45*81ad8388SMartin Matuska 		/**
46*81ad8388SMartin Matuska 		 * \brief       Pointer to Stream Flags
47*81ad8388SMartin Matuska 		 *
48*81ad8388SMartin Matuska 		 * This is NULL if Stream Flags have not been set for
49*81ad8388SMartin Matuska 		 * this Stream with lzma_index_stream_flags().
50*81ad8388SMartin Matuska 		 */
51*81ad8388SMartin Matuska 		const lzma_stream_flags *flags;
52*81ad8388SMartin Matuska 
53*81ad8388SMartin Matuska 		const void *reserved_ptr1;
54*81ad8388SMartin Matuska 		const void *reserved_ptr2;
55*81ad8388SMartin Matuska 		const void *reserved_ptr3;
56*81ad8388SMartin Matuska 
57*81ad8388SMartin Matuska 		/**
58*81ad8388SMartin Matuska 		 * \brief       Stream number in the lzma_index
59*81ad8388SMartin Matuska 		 *
60*81ad8388SMartin Matuska 		 * The first Stream is 1.
61*81ad8388SMartin Matuska 		 */
62*81ad8388SMartin Matuska 		lzma_vli number;
63*81ad8388SMartin Matuska 
64*81ad8388SMartin Matuska 		/**
65*81ad8388SMartin Matuska 		 * \brief       Number of Blocks in the Stream
66*81ad8388SMartin Matuska 		 *
67*81ad8388SMartin Matuska 		 * If this is zero, the block structure below has
68*81ad8388SMartin Matuska 		 * undefined values.
69*81ad8388SMartin Matuska 		 */
70*81ad8388SMartin Matuska 		lzma_vli block_count;
71*81ad8388SMartin Matuska 
72*81ad8388SMartin Matuska 		/**
73*81ad8388SMartin Matuska 		 * \brief       Compressed start offset of this Stream
74*81ad8388SMartin Matuska 		 *
75*81ad8388SMartin Matuska 		 * The offset is relative to the beginning of the lzma_index
76*81ad8388SMartin Matuska 		 * (i.e. usually the beginning of the .xz file).
77*81ad8388SMartin Matuska 		 */
78*81ad8388SMartin Matuska 		lzma_vli compressed_offset;
79*81ad8388SMartin Matuska 
80*81ad8388SMartin Matuska 		/**
81*81ad8388SMartin Matuska 		 * \brief       Uncompressed start offset of this Stream
82*81ad8388SMartin Matuska 		 *
83*81ad8388SMartin Matuska 		 * The offset is relative to the beginning of the lzma_index
84*81ad8388SMartin Matuska 		 * (i.e. usually the beginning of the .xz file).
85*81ad8388SMartin Matuska 		 */
86*81ad8388SMartin Matuska 		lzma_vli uncompressed_offset;
87*81ad8388SMartin Matuska 
88*81ad8388SMartin Matuska 		/**
89*81ad8388SMartin Matuska 		 * \brief       Compressed size of this Stream
90*81ad8388SMartin Matuska 		 *
91*81ad8388SMartin Matuska 		 * This includes all headers except the possible
92*81ad8388SMartin Matuska 		 * Stream Padding after this Stream.
93*81ad8388SMartin Matuska 		 */
94*81ad8388SMartin Matuska 		lzma_vli compressed_size;
95*81ad8388SMartin Matuska 
96*81ad8388SMartin Matuska 		/**
97*81ad8388SMartin Matuska 		 * \brief       Uncompressed size of this Stream
98*81ad8388SMartin Matuska 		 */
99*81ad8388SMartin Matuska 		lzma_vli uncompressed_size;
100*81ad8388SMartin Matuska 
101*81ad8388SMartin Matuska 		/**
102*81ad8388SMartin Matuska 		 * \brief       Size of Stream Padding after this Stream
103*81ad8388SMartin Matuska 		 *
104*81ad8388SMartin Matuska 		 * If it hasn't been set with lzma_index_stream_padding(),
105*81ad8388SMartin Matuska 		 * this defaults to zero. Stream Padding is always
106*81ad8388SMartin Matuska 		 * a multiple of four bytes.
107*81ad8388SMartin Matuska 		 */
108*81ad8388SMartin Matuska 		lzma_vli padding;
109*81ad8388SMartin Matuska 
110*81ad8388SMartin Matuska 		lzma_vli reserved_vli1;
111*81ad8388SMartin Matuska 		lzma_vli reserved_vli2;
112*81ad8388SMartin Matuska 		lzma_vli reserved_vli3;
113*81ad8388SMartin Matuska 		lzma_vli reserved_vli4;
114*81ad8388SMartin Matuska 	} stream;
115*81ad8388SMartin Matuska 
116*81ad8388SMartin Matuska 	struct {
117*81ad8388SMartin Matuska 		/**
118*81ad8388SMartin Matuska 		 * \brief       Block number in the file
119*81ad8388SMartin Matuska 		 *
120*81ad8388SMartin Matuska 		 * The first Block is 1.
121*81ad8388SMartin Matuska 		 */
122*81ad8388SMartin Matuska 		lzma_vli number_in_file;
123*81ad8388SMartin Matuska 
124*81ad8388SMartin Matuska 		/**
125*81ad8388SMartin Matuska 		 * \brief       Compressed start offset of this Block
126*81ad8388SMartin Matuska 		 *
127*81ad8388SMartin Matuska 		 * This offset is relative to the beginning of the
128*81ad8388SMartin Matuska 		 * lzma_index (i.e. usually the beginning of the .xz file).
129*81ad8388SMartin Matuska 		 * Normally this is where you should seek in the .xz file
130*81ad8388SMartin Matuska 		 * to start decompressing this Block.
131*81ad8388SMartin Matuska 		 */
132*81ad8388SMartin Matuska 		lzma_vli compressed_file_offset;
133*81ad8388SMartin Matuska 
134*81ad8388SMartin Matuska 		/**
135*81ad8388SMartin Matuska 		 * \brief       Uncompressed start offset of this Block
136*81ad8388SMartin Matuska 		 *
137*81ad8388SMartin Matuska 		 * This offset is relative to the beginning of the lzma_index
138*81ad8388SMartin Matuska 		 * (i.e. usually the beginning of the .xz file).
139*81ad8388SMartin Matuska 		 */
140*81ad8388SMartin Matuska 		lzma_vli uncompressed_file_offset;
141*81ad8388SMartin Matuska 
142*81ad8388SMartin Matuska 		/**
143*81ad8388SMartin Matuska 		 * \brief       Block number in this Stream
144*81ad8388SMartin Matuska 		 *
145*81ad8388SMartin Matuska 		 * The first Block is 1.
146*81ad8388SMartin Matuska 		 */
147*81ad8388SMartin Matuska 		lzma_vli number_in_stream;
148*81ad8388SMartin Matuska 
149*81ad8388SMartin Matuska 		/**
150*81ad8388SMartin Matuska 		 * \brief       Compressed start offset of this Block
151*81ad8388SMartin Matuska 		 *
152*81ad8388SMartin Matuska 		 * This offset is relative to the beginning of the Stream
153*81ad8388SMartin Matuska 		 * containing this Block.
154*81ad8388SMartin Matuska 		 */
155*81ad8388SMartin Matuska 		lzma_vli compressed_stream_offset;
156*81ad8388SMartin Matuska 
157*81ad8388SMartin Matuska 		/**
158*81ad8388SMartin Matuska 		 * \brief       Uncompressed start offset of this Block
159*81ad8388SMartin Matuska 		 *
160*81ad8388SMartin Matuska 		 * This offset is relative to the beginning of the Stream
161*81ad8388SMartin Matuska 		 * containing this Block.
162*81ad8388SMartin Matuska 		 */
163*81ad8388SMartin Matuska 		lzma_vli uncompressed_stream_offset;
164*81ad8388SMartin Matuska 
165*81ad8388SMartin Matuska 		/**
166*81ad8388SMartin Matuska 		 * \brief       Uncompressed size of this Block
167*81ad8388SMartin Matuska 		 *
168*81ad8388SMartin Matuska 		 * You should pass this to the Block decoder if you will
169*81ad8388SMartin Matuska 		 * decode this Block.
170*81ad8388SMartin Matuska 		 *
171*81ad8388SMartin Matuska 		 * When doing random-access reading, it is possible that
172*81ad8388SMartin Matuska 		 * the target offset is not exactly at Block boundary. One
173*81ad8388SMartin Matuska 		 * will need to compare the target offset against
174*81ad8388SMartin Matuska 		 * uncompressed_file_offset or uncompressed_stream_offset,
175*81ad8388SMartin Matuska 		 * and possibly decode and throw away some amount of data
176*81ad8388SMartin Matuska 		 * before reaching the target offset.
177*81ad8388SMartin Matuska 		 */
178*81ad8388SMartin Matuska 		lzma_vli uncompressed_size;
179*81ad8388SMartin Matuska 
180*81ad8388SMartin Matuska 		/**
181*81ad8388SMartin Matuska 		 * \brief       Unpadded size of this Block
182*81ad8388SMartin Matuska 		 *
183*81ad8388SMartin Matuska 		 * You should pass this to the Block decoder if you will
184*81ad8388SMartin Matuska 		 * decode this Block.
185*81ad8388SMartin Matuska 		 */
186*81ad8388SMartin Matuska 		lzma_vli unpadded_size;
187*81ad8388SMartin Matuska 
188*81ad8388SMartin Matuska 		/**
189*81ad8388SMartin Matuska 		 * \brief       Total compressed size
190*81ad8388SMartin Matuska 		 *
191*81ad8388SMartin Matuska 		 * This includes all headers and padding in this Block.
192*81ad8388SMartin Matuska 		 * This is useful if you need to know how many bytes
193*81ad8388SMartin Matuska 		 * the Block decoder will actually read.
194*81ad8388SMartin Matuska 		 */
195*81ad8388SMartin Matuska 		lzma_vli total_size;
196*81ad8388SMartin Matuska 
197*81ad8388SMartin Matuska 		lzma_vli reserved_vli1;
198*81ad8388SMartin Matuska 		lzma_vli reserved_vli2;
199*81ad8388SMartin Matuska 		lzma_vli reserved_vli3;
200*81ad8388SMartin Matuska 		lzma_vli reserved_vli4;
201*81ad8388SMartin Matuska 
202*81ad8388SMartin Matuska 		const void *reserved_ptr1;
203*81ad8388SMartin Matuska 		const void *reserved_ptr2;
204*81ad8388SMartin Matuska 		const void *reserved_ptr3;
205*81ad8388SMartin Matuska 		const void *reserved_ptr4;
206*81ad8388SMartin Matuska 	} block;
207*81ad8388SMartin Matuska 
208*81ad8388SMartin Matuska 	/*
209*81ad8388SMartin Matuska 	 * Internal data which is used to store the state of the iterator.
210*81ad8388SMartin Matuska 	 * The exact format may vary between liblzma versions, so don't
211*81ad8388SMartin Matuska 	 * touch these in any way.
212*81ad8388SMartin Matuska 	 */
213*81ad8388SMartin Matuska 	union {
214*81ad8388SMartin Matuska 		const void *p;
215*81ad8388SMartin Matuska 		size_t s;
216*81ad8388SMartin Matuska 		lzma_vli v;
217*81ad8388SMartin Matuska 	} internal[6];
218*81ad8388SMartin Matuska } lzma_index_iter;
219*81ad8388SMartin Matuska 
220*81ad8388SMartin Matuska 
221*81ad8388SMartin Matuska /**
222*81ad8388SMartin Matuska  * \brief       Operation mode for lzma_index_iter_next()
223*81ad8388SMartin Matuska  */
224*81ad8388SMartin Matuska typedef enum {
225*81ad8388SMartin Matuska 	LZMA_INDEX_ITER_ANY             = 0,
226*81ad8388SMartin Matuska 		/**<
227*81ad8388SMartin Matuska 		 * \brief       Get the next Block or Stream
228*81ad8388SMartin Matuska 		 *
229*81ad8388SMartin Matuska 		 * Go to the next Block if the current Stream has at least
230*81ad8388SMartin Matuska 		 * one Block left. Otherwise go to the next Stream even if
231*81ad8388SMartin Matuska 		 * it has no Blocks. If the Stream has no Blocks
232*81ad8388SMartin Matuska 		 * (lzma_index_iter.stream.block_count == 0),
233*81ad8388SMartin Matuska 		 * lzma_index_iter.block will have undefined values.
234*81ad8388SMartin Matuska 		 */
235*81ad8388SMartin Matuska 
236*81ad8388SMartin Matuska 	LZMA_INDEX_ITER_STREAM          = 1,
237*81ad8388SMartin Matuska 		/**<
238*81ad8388SMartin Matuska 		 * \brief       Get the next Stream
239*81ad8388SMartin Matuska 		 *
240*81ad8388SMartin Matuska 		 * Go to the next Stream even if the current Stream has
241*81ad8388SMartin Matuska 		 * unread Blocks left. If the next Stream has at least one
242*81ad8388SMartin Matuska 		 * Block, the iterator will point to the first Block.
243*81ad8388SMartin Matuska 		 * If there are no Blocks, lzma_index_iter.block will have
244*81ad8388SMartin Matuska 		 * undefined values.
245*81ad8388SMartin Matuska 		 */
246*81ad8388SMartin Matuska 
247*81ad8388SMartin Matuska 	LZMA_INDEX_ITER_BLOCK           = 2,
248*81ad8388SMartin Matuska 		/**<
249*81ad8388SMartin Matuska 		 * \brief       Get the next Block
250*81ad8388SMartin Matuska 		 *
251*81ad8388SMartin Matuska 		 * Go to the next Block if the current Stream has at least
252*81ad8388SMartin Matuska 		 * one Block left. If the current Stream has no Blocks left,
253*81ad8388SMartin Matuska 		 * the next Stream with at least one Block is located and
254*81ad8388SMartin Matuska 		 * the iterator will be made to point to the first Block of
255*81ad8388SMartin Matuska 		 * that Stream.
256*81ad8388SMartin Matuska 		 */
257*81ad8388SMartin Matuska 
258*81ad8388SMartin Matuska 	LZMA_INDEX_ITER_NONEMPTY_BLOCK  = 3
259*81ad8388SMartin Matuska 		/**<
260*81ad8388SMartin Matuska 		 * \brief       Get the next non-empty Block
261*81ad8388SMartin Matuska 		 *
262*81ad8388SMartin Matuska 		 * This is like LZMA_INDEX_ITER_BLOCK except that it will
263*81ad8388SMartin Matuska 		 * skip Blocks whose Uncompressed Size is zero.
264*81ad8388SMartin Matuska 		 */
265*81ad8388SMartin Matuska 
266*81ad8388SMartin Matuska } lzma_index_iter_mode;
267*81ad8388SMartin Matuska 
268*81ad8388SMartin Matuska 
269*81ad8388SMartin Matuska /**
270*81ad8388SMartin Matuska  * \brief       Calculate memory usage of lzma_index
271*81ad8388SMartin Matuska  *
272*81ad8388SMartin Matuska  * On disk, the size of the Index field depends on both the number of Records
273*81ad8388SMartin Matuska  * stored and how big values the Records store (due to variable-length integer
274*81ad8388SMartin Matuska  * encoding). When the Index is kept in lzma_index structure, the memory usage
275*81ad8388SMartin Matuska  * depends only on the number of Records/Blocks stored in the Index(es), and
276*81ad8388SMartin Matuska  * in case of concatenated lzma_indexes, the number of Streams. The size in
277*81ad8388SMartin Matuska  * RAM is almost always significantly bigger than in the encoded form on disk.
278*81ad8388SMartin Matuska  *
279*81ad8388SMartin Matuska  * This function calculates an approximate amount of memory needed hold
280*81ad8388SMartin Matuska  * the given number of Streams and Blocks in lzma_index structure. This
281*81ad8388SMartin Matuska  * value may vary between CPU architectures and also between liblzma versions
282*81ad8388SMartin Matuska  * if the internal implementation is modified.
283*81ad8388SMartin Matuska  */
284*81ad8388SMartin Matuska extern LZMA_API(uint64_t) lzma_index_memusage(
285*81ad8388SMartin Matuska 		lzma_vli streams, lzma_vli blocks) lzma_nothrow;
286*81ad8388SMartin Matuska 
287*81ad8388SMartin Matuska 
288*81ad8388SMartin Matuska /**
289*81ad8388SMartin Matuska  * \brief       Calculate the memory usage of an existing lzma_index
290*81ad8388SMartin Matuska  *
291*81ad8388SMartin Matuska  * This is a shorthand for lzma_index_memusage(lzma_index_stream_count(i),
292*81ad8388SMartin Matuska  * lzma_index_block_count(i)).
293*81ad8388SMartin Matuska  */
294*81ad8388SMartin Matuska extern LZMA_API(uint64_t) lzma_index_memused(const lzma_index *i)
295*81ad8388SMartin Matuska 		lzma_nothrow;
296*81ad8388SMartin Matuska 
297*81ad8388SMartin Matuska 
298*81ad8388SMartin Matuska /**
299*81ad8388SMartin Matuska  * \brief       Allocate and initialize a new lzma_index structure
300*81ad8388SMartin Matuska  *
301*81ad8388SMartin Matuska  * \return      On success, a pointer to an empty initialized lzma_index is
302*81ad8388SMartin Matuska  *              returned. If allocation fails, NULL is returned.
303*81ad8388SMartin Matuska  */
304*81ad8388SMartin Matuska extern LZMA_API(lzma_index *) lzma_index_init(lzma_allocator *allocator)
305*81ad8388SMartin Matuska 		lzma_nothrow;
306*81ad8388SMartin Matuska 
307*81ad8388SMartin Matuska 
308*81ad8388SMartin Matuska /**
309*81ad8388SMartin Matuska  * \brief       Deallocate lzma_index
310*81ad8388SMartin Matuska  *
311*81ad8388SMartin Matuska  * If i is NULL, this does nothing.
312*81ad8388SMartin Matuska  */
313*81ad8388SMartin Matuska extern LZMA_API(void) lzma_index_end(lzma_index *i, lzma_allocator *allocator)
314*81ad8388SMartin Matuska 		lzma_nothrow;
315*81ad8388SMartin Matuska 
316*81ad8388SMartin Matuska 
317*81ad8388SMartin Matuska /**
318*81ad8388SMartin Matuska  * \brief       Add a new Block to lzma_index
319*81ad8388SMartin Matuska  *
320*81ad8388SMartin Matuska  * \param       i                 Pointer to a lzma_index structure
321*81ad8388SMartin Matuska  * \param       allocator         Pointer to lzma_allocator, or NULL to
322*81ad8388SMartin Matuska  *                                use malloc()
323*81ad8388SMartin Matuska  * \param       unpadded_size     Unpadded Size of a Block. This can be
324*81ad8388SMartin Matuska  *                                calculated with lzma_block_unpadded_size()
325*81ad8388SMartin Matuska  *                                after encoding or decoding the Block.
326*81ad8388SMartin Matuska  * \param       uncompressed_size Uncompressed Size of a Block. This can be
327*81ad8388SMartin Matuska  *                                taken directly from lzma_block structure
328*81ad8388SMartin Matuska  *                                after encoding or decoding the Block.
329*81ad8388SMartin Matuska  *
330*81ad8388SMartin Matuska  * Appending a new Block does not invalidate iterators. For example,
331*81ad8388SMartin Matuska  * if an iterator was pointing to the end of the lzma_index, after
332*81ad8388SMartin Matuska  * lzma_index_append() it is possible to read the next Block with
333*81ad8388SMartin Matuska  * an existing iterator.
334*81ad8388SMartin Matuska  *
335*81ad8388SMartin Matuska  * \return      - LZMA_OK
336*81ad8388SMartin Matuska  *              - LZMA_MEM_ERROR
337*81ad8388SMartin Matuska  *              - LZMA_DATA_ERROR: Compressed or uncompressed size of the
338*81ad8388SMartin Matuska  *                Stream or size of the Index field would grow too big.
339*81ad8388SMartin Matuska  *              - LZMA_PROG_ERROR
340*81ad8388SMartin Matuska  */
341*81ad8388SMartin Matuska extern LZMA_API(lzma_ret) lzma_index_append(
342*81ad8388SMartin Matuska 		lzma_index *i, lzma_allocator *allocator,
343*81ad8388SMartin Matuska 		lzma_vli unpadded_size, lzma_vli uncompressed_size)
344*81ad8388SMartin Matuska 		lzma_nothrow lzma_attr_warn_unused_result;
345*81ad8388SMartin Matuska 
346*81ad8388SMartin Matuska 
347*81ad8388SMartin Matuska /**
348*81ad8388SMartin Matuska  * \brief       Set the Stream Flags
349*81ad8388SMartin Matuska  *
350*81ad8388SMartin Matuska  * Set the Stream Flags of the last (and typically the only) Stream
351*81ad8388SMartin Matuska  * in lzma_index. This can be useful when reading information from the
352*81ad8388SMartin Matuska  * lzma_index, because to decode Blocks, knowing the integrity check type
353*81ad8388SMartin Matuska  * is needed.
354*81ad8388SMartin Matuska  *
355*81ad8388SMartin Matuska  * The given Stream Flags are copied into internal preallocated structure
356*81ad8388SMartin Matuska  * in the lzma_index, thus the caller doesn't need to keep the *stream_flags
357*81ad8388SMartin Matuska  * available after calling this function.
358*81ad8388SMartin Matuska  *
359*81ad8388SMartin Matuska  * \return      - LZMA_OK
360*81ad8388SMartin Matuska  *              - LZMA_OPTIONS_ERROR: Unsupported stream_flags->version.
361*81ad8388SMartin Matuska  *              - LZMA_PROG_ERROR
362*81ad8388SMartin Matuska  */
363*81ad8388SMartin Matuska extern LZMA_API(lzma_ret) lzma_index_stream_flags(
364*81ad8388SMartin Matuska 		lzma_index *i, const lzma_stream_flags *stream_flags)
365*81ad8388SMartin Matuska 		lzma_nothrow lzma_attr_warn_unused_result;
366*81ad8388SMartin Matuska 
367*81ad8388SMartin Matuska 
368*81ad8388SMartin Matuska /**
369*81ad8388SMartin Matuska  * \brief       Get the types of integrity Checks
370*81ad8388SMartin Matuska  *
371*81ad8388SMartin Matuska  * If lzma_index_stream_padding() is used to set the Stream Flags for
372*81ad8388SMartin Matuska  * every Stream, lzma_index_checks() can be used to get a bitmask to
373*81ad8388SMartin Matuska  * indicate which Check types have been used. It can be useful e.g. if
374*81ad8388SMartin Matuska  * showing the Check types to the user.
375*81ad8388SMartin Matuska  *
376*81ad8388SMartin Matuska  * The bitmask is 1 << check_id, e.g. CRC32 is 1 << 1 and SHA-256 is 1 << 10.
377*81ad8388SMartin Matuska  */
378*81ad8388SMartin Matuska extern LZMA_API(uint32_t) lzma_index_checks(const lzma_index *i)
379*81ad8388SMartin Matuska 		lzma_nothrow lzma_attr_pure;
380*81ad8388SMartin Matuska 
381*81ad8388SMartin Matuska 
382*81ad8388SMartin Matuska /**
383*81ad8388SMartin Matuska  * \brief       Set the amount of Stream Padding
384*81ad8388SMartin Matuska  *
385*81ad8388SMartin Matuska  * Set the amount of Stream Padding of the last (and typically the only)
386*81ad8388SMartin Matuska  * Stream in the lzma_index. This is needed when planning to do random-access
387*81ad8388SMartin Matuska  * reading within multiple concatenated Streams.
388*81ad8388SMartin Matuska  *
389*81ad8388SMartin Matuska  * By default, the amount of Stream Padding is assumed to be zero bytes.
390*81ad8388SMartin Matuska  *
391*81ad8388SMartin Matuska  * \return      - LZMA_OK
392*81ad8388SMartin Matuska  *              - LZMA_DATA_ERROR: The file size would grow too big.
393*81ad8388SMartin Matuska  *              - LZMA_PROG_ERROR
394*81ad8388SMartin Matuska  */
395*81ad8388SMartin Matuska extern LZMA_API(lzma_ret) lzma_index_stream_padding(
396*81ad8388SMartin Matuska 		lzma_index *i, lzma_vli stream_padding)
397*81ad8388SMartin Matuska 		lzma_nothrow lzma_attr_warn_unused_result;
398*81ad8388SMartin Matuska 
399*81ad8388SMartin Matuska 
400*81ad8388SMartin Matuska /**
401*81ad8388SMartin Matuska  * \brief       Get the number of Streams
402*81ad8388SMartin Matuska  */
403*81ad8388SMartin Matuska extern LZMA_API(lzma_vli) lzma_index_stream_count(const lzma_index *i)
404*81ad8388SMartin Matuska 		lzma_nothrow lzma_attr_pure;
405*81ad8388SMartin Matuska 
406*81ad8388SMartin Matuska 
407*81ad8388SMartin Matuska /**
408*81ad8388SMartin Matuska  * \brief       Get the number of Blocks
409*81ad8388SMartin Matuska  *
410*81ad8388SMartin Matuska  * This returns the total number of Blocks in lzma_index. To get number
411*81ad8388SMartin Matuska  * of Blocks in individual Streams, use lzma_index_iter.
412*81ad8388SMartin Matuska  */
413*81ad8388SMartin Matuska extern LZMA_API(lzma_vli) lzma_index_block_count(const lzma_index *i)
414*81ad8388SMartin Matuska 		lzma_nothrow lzma_attr_pure;
415*81ad8388SMartin Matuska 
416*81ad8388SMartin Matuska 
417*81ad8388SMartin Matuska /**
418*81ad8388SMartin Matuska  * \brief       Get the size of the Index field as bytes
419*81ad8388SMartin Matuska  *
420*81ad8388SMartin Matuska  * This is needed to verify the Backward Size field in the Stream Footer.
421*81ad8388SMartin Matuska  */
422*81ad8388SMartin Matuska extern LZMA_API(lzma_vli) lzma_index_size(const lzma_index *i)
423*81ad8388SMartin Matuska 		lzma_nothrow lzma_attr_pure;
424*81ad8388SMartin Matuska 
425*81ad8388SMartin Matuska 
426*81ad8388SMartin Matuska /**
427*81ad8388SMartin Matuska  * \brief       Get the total size of the Stream
428*81ad8388SMartin Matuska  *
429*81ad8388SMartin Matuska  * If multiple lzma_indexes have been combined, this works as if the Blocks
430*81ad8388SMartin Matuska  * were in a single Stream. This is useful if you are going to combine
431*81ad8388SMartin Matuska  * Blocks from multiple Streams into a single new Stream.
432*81ad8388SMartin Matuska  */
433*81ad8388SMartin Matuska extern LZMA_API(lzma_vli) lzma_index_stream_size(const lzma_index *i)
434*81ad8388SMartin Matuska 		lzma_nothrow lzma_attr_pure;
435*81ad8388SMartin Matuska 
436*81ad8388SMartin Matuska 
437*81ad8388SMartin Matuska /**
438*81ad8388SMartin Matuska  * \brief       Get the total size of the Blocks
439*81ad8388SMartin Matuska  *
440*81ad8388SMartin Matuska  * This doesn't include the Stream Header, Stream Footer, Stream Padding,
441*81ad8388SMartin Matuska  * or Index fields.
442*81ad8388SMartin Matuska  */
443*81ad8388SMartin Matuska extern LZMA_API(lzma_vli) lzma_index_total_size(const lzma_index *i)
444*81ad8388SMartin Matuska 		lzma_nothrow lzma_attr_pure;
445*81ad8388SMartin Matuska 
446*81ad8388SMartin Matuska 
447*81ad8388SMartin Matuska /**
448*81ad8388SMartin Matuska  * \brief       Get the total size of the file
449*81ad8388SMartin Matuska  *
450*81ad8388SMartin Matuska  * When no lzma_indexes have been combined with lzma_index_cat() and there is
451*81ad8388SMartin Matuska  * no Stream Padding, this function is identical to lzma_index_stream_size().
452*81ad8388SMartin Matuska  * If multiple lzma_indexes have been combined, this includes also the headers
453*81ad8388SMartin Matuska  * of each separate Stream and the possible Stream Padding fields.
454*81ad8388SMartin Matuska  */
455*81ad8388SMartin Matuska extern LZMA_API(lzma_vli) lzma_index_file_size(const lzma_index *i)
456*81ad8388SMartin Matuska 		lzma_nothrow lzma_attr_pure;
457*81ad8388SMartin Matuska 
458*81ad8388SMartin Matuska 
459*81ad8388SMartin Matuska /**
460*81ad8388SMartin Matuska  * \brief       Get the uncompressed size of the file
461*81ad8388SMartin Matuska  */
462*81ad8388SMartin Matuska extern LZMA_API(lzma_vli) lzma_index_uncompressed_size(const lzma_index *i)
463*81ad8388SMartin Matuska 		lzma_nothrow lzma_attr_pure;
464*81ad8388SMartin Matuska 
465*81ad8388SMartin Matuska 
466*81ad8388SMartin Matuska /**
467*81ad8388SMartin Matuska  * \brief       Initialize an iterator
468*81ad8388SMartin Matuska  *
469*81ad8388SMartin Matuska  * \param       iter    Pointer to a lzma_index_iter structure
470*81ad8388SMartin Matuska  * \param       i       lzma_index to which the iterator will be associated
471*81ad8388SMartin Matuska  *
472*81ad8388SMartin Matuska  * This function associates the iterator with the given lzma_index, and calls
473*81ad8388SMartin Matuska  * lzma_index_iter_rewind() on the iterator.
474*81ad8388SMartin Matuska  *
475*81ad8388SMartin Matuska  * This function doesn't allocate any memory, thus there is no
476*81ad8388SMartin Matuska  * lzma_index_iter_end(). The iterator is valid as long as the
477*81ad8388SMartin Matuska  * associated lzma_index is valid, that is, until lzma_index_end() or
478*81ad8388SMartin Matuska  * using it as source in lzma_index_cat(). Specifically, lzma_index doesn't
479*81ad8388SMartin Matuska  * become invalid if new Blocks are added to it with lzma_index_append() or
480*81ad8388SMartin Matuska  * if it is used as the destination in lzma_index_cat().
481*81ad8388SMartin Matuska  *
482*81ad8388SMartin Matuska  * It is safe to make copies of an initialized lzma_index_iter, for example,
483*81ad8388SMartin Matuska  * to easily restart reading at some particular position.
484*81ad8388SMartin Matuska  */
485*81ad8388SMartin Matuska extern LZMA_API(void) lzma_index_iter_init(
486*81ad8388SMartin Matuska 		lzma_index_iter *iter, const lzma_index *i) lzma_nothrow;
487*81ad8388SMartin Matuska 
488*81ad8388SMartin Matuska 
489*81ad8388SMartin Matuska /**
490*81ad8388SMartin Matuska  * \brief       Rewind the iterator
491*81ad8388SMartin Matuska  *
492*81ad8388SMartin Matuska  * Rewind the iterator so that next call to lzma_index_iter_next() will
493*81ad8388SMartin Matuska  * return the first Block or Stream.
494*81ad8388SMartin Matuska  */
495*81ad8388SMartin Matuska extern LZMA_API(void) lzma_index_iter_rewind(lzma_index_iter *iter)
496*81ad8388SMartin Matuska 		lzma_nothrow;
497*81ad8388SMartin Matuska 
498*81ad8388SMartin Matuska 
499*81ad8388SMartin Matuska /**
500*81ad8388SMartin Matuska  * \brief       Get the next Block or Stream
501*81ad8388SMartin Matuska  *
502*81ad8388SMartin Matuska  * \param       iter    Iterator initialized with lzma_index_iter_init()
503*81ad8388SMartin Matuska  * \param       mode    Specify what kind of information the caller wants
504*81ad8388SMartin Matuska  *                      to get. See lzma_index_iter_mode for details.
505*81ad8388SMartin Matuska  *
506*81ad8388SMartin Matuska  * \return      If next Block or Stream matching the mode was found, *iter
507*81ad8388SMartin Matuska  *              is updated and this function returns false. If no Block or
508*81ad8388SMartin Matuska  *              Stream matching the mode is found, *iter is not modified
509*81ad8388SMartin Matuska  *              and this function returns true. If mode is set to an unknown
510*81ad8388SMartin Matuska  *              value, *iter is not modified and this function returns true.
511*81ad8388SMartin Matuska  */
512*81ad8388SMartin Matuska extern LZMA_API(lzma_bool) lzma_index_iter_next(
513*81ad8388SMartin Matuska 		lzma_index_iter *iter, lzma_index_iter_mode mode)
514*81ad8388SMartin Matuska 		lzma_nothrow lzma_attr_warn_unused_result;
515*81ad8388SMartin Matuska 
516*81ad8388SMartin Matuska 
517*81ad8388SMartin Matuska /**
518*81ad8388SMartin Matuska  * \brief       Locate a Block
519*81ad8388SMartin Matuska  *
520*81ad8388SMartin Matuska  * If it is possible to seek in the .xz file, it is possible to parse
521*81ad8388SMartin Matuska  * the Index field(s) and use lzma_index_iter_locate() to do random-access
522*81ad8388SMartin Matuska  * reading with granularity of Block size.
523*81ad8388SMartin Matuska  *
524*81ad8388SMartin Matuska  * \param       iter    Iterator that was earlier initialized with
525*81ad8388SMartin Matuska  *                      lzma_index_iter_init().
526*81ad8388SMartin Matuska  * \param       target  Uncompressed target offset which the caller would
527*81ad8388SMartin Matuska  *                      like to locate from the Stream
528*81ad8388SMartin Matuska  *
529*81ad8388SMartin Matuska  * If the target is smaller than the uncompressed size of the Stream (can be
530*81ad8388SMartin Matuska  * checked with lzma_index_uncompressed_size()):
531*81ad8388SMartin Matuska  *  - Information about the Stream and Block containing the requested
532*81ad8388SMartin Matuska  *    uncompressed offset is stored into *iter.
533*81ad8388SMartin Matuska  *  - Internal state of the iterator is adjusted so that
534*81ad8388SMartin Matuska  *    lzma_index_iter_next() can be used to read subsequent Blocks or Streams.
535*81ad8388SMartin Matuska  *  - This function returns false.
536*81ad8388SMartin Matuska  *
537*81ad8388SMartin Matuska  * If target is greater than the uncompressed size of the Stream, *iter
538*81ad8388SMartin Matuska  * is not modified, and this function returns true.
539*81ad8388SMartin Matuska  */
540*81ad8388SMartin Matuska extern LZMA_API(lzma_bool) lzma_index_iter_locate(
541*81ad8388SMartin Matuska 		lzma_index_iter *iter, lzma_vli target) lzma_nothrow;
542*81ad8388SMartin Matuska 
543*81ad8388SMartin Matuska 
544*81ad8388SMartin Matuska /**
545*81ad8388SMartin Matuska  * \brief       Concatenate lzma_indexes
546*81ad8388SMartin Matuska  *
547*81ad8388SMartin Matuska  * Concatenating lzma_indexes is useful when doing random-access reading in
548*81ad8388SMartin Matuska  * multi-Stream .xz file, or when combining multiple Streams into single
549*81ad8388SMartin Matuska  * Stream.
550*81ad8388SMartin Matuska  *
551*81ad8388SMartin Matuska  * \param       dest      lzma_index after which src is appended
552*81ad8388SMartin Matuska  * \param       src       lzma_index to be appended after dest. If this
553*81ad8388SMartin Matuska  *                        function succeeds, the memory allocated for src
554*81ad8388SMartin Matuska  *                        is freed or moved to be part of dest, and all
555*81ad8388SMartin Matuska  *                        iterators pointing to src will become invalid.
556*81ad8388SMartin Matuska  * \param       allocator Custom memory allocator; can be NULL to use
557*81ad8388SMartin Matuska  *                        malloc() and free().
558*81ad8388SMartin Matuska  *
559*81ad8388SMartin Matuska  * \return      - LZMA_OK: lzma_indexes were concatenated successfully.
560*81ad8388SMartin Matuska  *                src is now a dangling pointer.
561*81ad8388SMartin Matuska  *              - LZMA_DATA_ERROR: *dest would grow too big.
562*81ad8388SMartin Matuska  *              - LZMA_MEM_ERROR
563*81ad8388SMartin Matuska  *              - LZMA_PROG_ERROR
564*81ad8388SMartin Matuska  */
565*81ad8388SMartin Matuska extern LZMA_API(lzma_ret) lzma_index_cat(lzma_index *lzma_restrict dest,
566*81ad8388SMartin Matuska 		lzma_index *lzma_restrict src,
567*81ad8388SMartin Matuska 		lzma_allocator *allocator)
568*81ad8388SMartin Matuska 		lzma_nothrow lzma_attr_warn_unused_result;
569*81ad8388SMartin Matuska 
570*81ad8388SMartin Matuska 
571*81ad8388SMartin Matuska /**
572*81ad8388SMartin Matuska  * \brief       Duplicate lzma_index
573*81ad8388SMartin Matuska  *
574*81ad8388SMartin Matuska  * \return      A copy of the lzma_index, or NULL if memory allocation failed.
575*81ad8388SMartin Matuska  */
576*81ad8388SMartin Matuska extern LZMA_API(lzma_index *) lzma_index_dup(
577*81ad8388SMartin Matuska 		const lzma_index *i, lzma_allocator *allocator)
578*81ad8388SMartin Matuska 		lzma_nothrow lzma_attr_warn_unused_result;
579*81ad8388SMartin Matuska 
580*81ad8388SMartin Matuska 
581*81ad8388SMartin Matuska /**
582*81ad8388SMartin Matuska  * \brief       Initialize .xz Index encoder
583*81ad8388SMartin Matuska  *
584*81ad8388SMartin Matuska  * \param       strm        Pointer to properly prepared lzma_stream
585*81ad8388SMartin Matuska  * \param       i           Pointer to lzma_index which should be encoded.
586*81ad8388SMartin Matuska  *
587*81ad8388SMartin Matuska  * The only valid action value for lzma_code() is LZMA_RUN.
588*81ad8388SMartin Matuska  *
589*81ad8388SMartin Matuska  * \return      - LZMA_OK: Initialization succeeded, continue with lzma_code().
590*81ad8388SMartin Matuska  *              - LZMA_MEM_ERROR
591*81ad8388SMartin Matuska  *              - LZMA_PROG_ERROR
592*81ad8388SMartin Matuska  */
593*81ad8388SMartin Matuska extern LZMA_API(lzma_ret) lzma_index_encoder(
594*81ad8388SMartin Matuska 		lzma_stream *strm, const lzma_index *i)
595*81ad8388SMartin Matuska 		lzma_nothrow lzma_attr_warn_unused_result;
596*81ad8388SMartin Matuska 
597*81ad8388SMartin Matuska 
598*81ad8388SMartin Matuska /**
599*81ad8388SMartin Matuska  * \brief       Initialize .xz Index decoder
600*81ad8388SMartin Matuska  *
601*81ad8388SMartin Matuska  * \param       strm        Pointer to properly prepared lzma_stream
602*81ad8388SMartin Matuska  * \param       i           The decoded Index will be made available via
603*81ad8388SMartin Matuska  *                          this pointer. Initially this function will
604*81ad8388SMartin Matuska  *                          set *i to NULL (the old value is ignored). If
605*81ad8388SMartin Matuska  *                          decoding succeeds (lzma_code() returns
606*81ad8388SMartin Matuska  *                          LZMA_STREAM_END), *i will be set to point
607*81ad8388SMartin Matuska  *                          to a new lzma_index, which the application
608*81ad8388SMartin Matuska  *                          has to later free with lzma_index_end().
609*81ad8388SMartin Matuska  * \param       memlimit    How much memory the resulting lzma_index is
610*81ad8388SMartin Matuska  *                          allowed to require.
611*81ad8388SMartin Matuska  *
612*81ad8388SMartin Matuska  * The only valid action value for lzma_code() is LZMA_RUN.
613*81ad8388SMartin Matuska  *
614*81ad8388SMartin Matuska  * \return      - LZMA_OK: Initialization succeeded, continue with lzma_code().
615*81ad8388SMartin Matuska  *              - LZMA_MEM_ERROR
616*81ad8388SMartin Matuska  *              - LZMA_MEMLIMIT_ERROR
617*81ad8388SMartin Matuska  *              - LZMA_PROG_ERROR
618*81ad8388SMartin Matuska  */
619*81ad8388SMartin Matuska extern LZMA_API(lzma_ret) lzma_index_decoder(
620*81ad8388SMartin Matuska 		lzma_stream *strm, lzma_index **i, uint64_t memlimit)
621*81ad8388SMartin Matuska 		lzma_nothrow lzma_attr_warn_unused_result;
622*81ad8388SMartin Matuska 
623*81ad8388SMartin Matuska 
624*81ad8388SMartin Matuska /**
625*81ad8388SMartin Matuska  * \brief       Single-call .xz Index encoder
626*81ad8388SMartin Matuska  *
627*81ad8388SMartin Matuska  * \param       i         lzma_index to be encoded
628*81ad8388SMartin Matuska  * \param       out       Beginning of the output buffer
629*81ad8388SMartin Matuska  * \param       out_pos   The next byte will be written to out[*out_pos].
630*81ad8388SMartin Matuska  *                        *out_pos is updated only if encoding succeeds.
631*81ad8388SMartin Matuska  * \param       out_size  Size of the out buffer; the first byte into
632*81ad8388SMartin Matuska  *                        which no data is written to is out[out_size].
633*81ad8388SMartin Matuska  *
634*81ad8388SMartin Matuska  * \return      - LZMA_OK: Encoding was successful.
635*81ad8388SMartin Matuska  *              - LZMA_BUF_ERROR: Output buffer is too small. Use
636*81ad8388SMartin Matuska  *                lzma_index_size() to find out how much output
637*81ad8388SMartin Matuska  *                space is needed.
638*81ad8388SMartin Matuska  *              - LZMA_PROG_ERROR
639*81ad8388SMartin Matuska  *
640*81ad8388SMartin Matuska  * \note        This function doesn't take allocator argument since all
641*81ad8388SMartin Matuska  *              the internal data is allocated on stack.
642*81ad8388SMartin Matuska  */
643*81ad8388SMartin Matuska extern LZMA_API(lzma_ret) lzma_index_buffer_encode(const lzma_index *i,
644*81ad8388SMartin Matuska 		uint8_t *out, size_t *out_pos, size_t out_size) lzma_nothrow;
645*81ad8388SMartin Matuska 
646*81ad8388SMartin Matuska 
647*81ad8388SMartin Matuska /**
648*81ad8388SMartin Matuska  * \brief       Single-call .xz Index decoder
649*81ad8388SMartin Matuska  *
650*81ad8388SMartin Matuska  * \param       i           If decoding succeeds, *i will point to a new
651*81ad8388SMartin Matuska  *                          lzma_index, which the application has to
652*81ad8388SMartin Matuska  *                          later free with lzma_index_end(). If an error
653*81ad8388SMartin Matuska  *                          occurs, *i will be NULL. The old value of *i
654*81ad8388SMartin Matuska  *                          is always ignored and thus doesn't need to be
655*81ad8388SMartin Matuska  *                          initialized by the caller.
656*81ad8388SMartin Matuska  * \param       memlimit    Pointer to how much memory the resulting
657*81ad8388SMartin Matuska  *                          lzma_index is allowed to require. The value
658*81ad8388SMartin Matuska  *                          pointed by this pointer is modified if and only
659*81ad8388SMartin Matuska  *                          if LZMA_MEMLIMIT_ERROR is returned.
660*81ad8388SMartin Matuska  * \param       allocator   Pointer to lzma_allocator, or NULL to use malloc()
661*81ad8388SMartin Matuska  * \param       in          Beginning of the input buffer
662*81ad8388SMartin Matuska  * \param       in_pos      The next byte will be read from in[*in_pos].
663*81ad8388SMartin Matuska  *                          *in_pos is updated only if decoding succeeds.
664*81ad8388SMartin Matuska  * \param       in_size     Size of the input buffer; the first byte that
665*81ad8388SMartin Matuska  *                          won't be read is in[in_size].
666*81ad8388SMartin Matuska  *
667*81ad8388SMartin Matuska  * \return      - LZMA_OK: Decoding was successful.
668*81ad8388SMartin Matuska  *              - LZMA_MEM_ERROR
669*81ad8388SMartin Matuska  *              - LZMA_MEMLIMIT_ERROR: Memory usage limit was reached.
670*81ad8388SMartin Matuska  *                The minimum required memlimit value was stored to *memlimit.
671*81ad8388SMartin Matuska  *              - LZMA_DATA_ERROR
672*81ad8388SMartin Matuska  *              - LZMA_PROG_ERROR
673*81ad8388SMartin Matuska  */
674*81ad8388SMartin Matuska extern LZMA_API(lzma_ret) lzma_index_buffer_decode(lzma_index **i,
675*81ad8388SMartin Matuska 		uint64_t *memlimit, lzma_allocator *allocator,
676*81ad8388SMartin Matuska 		const uint8_t *in, size_t *in_pos, size_t in_size)
677*81ad8388SMartin Matuska 		lzma_nothrow;
678