xref: /freebsd/contrib/xz/src/liblzma/api/lzma/index.h (revision 542aef4874baf2030a1e5fd995419e25398252d4)
181ad8388SMartin Matuska /**
281ad8388SMartin Matuska  * \file        lzma/index.h
381ad8388SMartin Matuska  * \brief       Handling of .xz Index and related information
481ad8388SMartin Matuska  */
581ad8388SMartin Matuska 
681ad8388SMartin Matuska /*
781ad8388SMartin Matuska  * Author: Lasse Collin
881ad8388SMartin Matuska  *
981ad8388SMartin Matuska  * This file has been put into the public domain.
1081ad8388SMartin Matuska  * You can do whatever you want with this file.
1181ad8388SMartin Matuska  *
1281ad8388SMartin Matuska  * See ../lzma.h for information about liblzma as a whole.
1381ad8388SMartin Matuska  */
1481ad8388SMartin Matuska 
1581ad8388SMartin Matuska #ifndef LZMA_H_INTERNAL
1681ad8388SMartin Matuska #	error Never include this file directly. Use <lzma.h> instead.
1781ad8388SMartin Matuska #endif
1881ad8388SMartin Matuska 
1981ad8388SMartin Matuska 
2081ad8388SMartin Matuska /**
2181ad8388SMartin Matuska  * \brief       Opaque data type to hold the Index(es) and other information
2281ad8388SMartin Matuska  *
2381ad8388SMartin Matuska  * lzma_index often holds just one .xz Index and possibly the Stream Flags
2481ad8388SMartin Matuska  * of the same Stream and size of the Stream Padding field. However,
2581ad8388SMartin Matuska  * multiple lzma_indexes can be concatenated with lzma_index_cat() and then
2681ad8388SMartin Matuska  * there may be information about multiple Streams in the same lzma_index.
2781ad8388SMartin Matuska  *
2881ad8388SMartin Matuska  * Notes about thread safety: Only one thread may modify lzma_index at
2981ad8388SMartin Matuska  * a time. All functions that take non-const pointer to lzma_index
3081ad8388SMartin Matuska  * modify it. As long as no thread is modifying the lzma_index, getting
3181ad8388SMartin Matuska  * information from the same lzma_index can be done from multiple threads
3281ad8388SMartin Matuska  * at the same time with functions that take a const pointer to
3381ad8388SMartin Matuska  * lzma_index or use lzma_index_iter. The same iterator must be used
3481ad8388SMartin Matuska  * only by one thread at a time, of course, but there can be as many
3581ad8388SMartin Matuska  * iterators for the same lzma_index as needed.
3681ad8388SMartin Matuska  */
3781ad8388SMartin Matuska typedef struct lzma_index_s lzma_index;
3881ad8388SMartin Matuska 
3981ad8388SMartin Matuska 
4081ad8388SMartin Matuska /**
4181ad8388SMartin Matuska  * \brief       Iterator to get information about Blocks and Streams
4281ad8388SMartin Matuska  */
4381ad8388SMartin Matuska typedef struct {
4481ad8388SMartin Matuska 	struct {
4581ad8388SMartin Matuska 		/**
4681ad8388SMartin Matuska 		 * \brief       Pointer to Stream Flags
4781ad8388SMartin Matuska 		 *
4881ad8388SMartin Matuska 		 * This is NULL if Stream Flags have not been set for
4981ad8388SMartin Matuska 		 * this Stream with lzma_index_stream_flags().
5081ad8388SMartin Matuska 		 */
5181ad8388SMartin Matuska 		const lzma_stream_flags *flags;
5281ad8388SMartin Matuska 
5381ad8388SMartin Matuska 		const void *reserved_ptr1;
5481ad8388SMartin Matuska 		const void *reserved_ptr2;
5581ad8388SMartin Matuska 		const void *reserved_ptr3;
5681ad8388SMartin Matuska 
5781ad8388SMartin Matuska 		/**
5881ad8388SMartin Matuska 		 * \brief       Stream number in the lzma_index
5981ad8388SMartin Matuska 		 *
6081ad8388SMartin Matuska 		 * The first Stream is 1.
6181ad8388SMartin Matuska 		 */
6281ad8388SMartin Matuska 		lzma_vli number;
6381ad8388SMartin Matuska 
6481ad8388SMartin Matuska 		/**
6581ad8388SMartin Matuska 		 * \brief       Number of Blocks in the Stream
6681ad8388SMartin Matuska 		 *
6781ad8388SMartin Matuska 		 * If this is zero, the block structure below has
6881ad8388SMartin Matuska 		 * undefined values.
6981ad8388SMartin Matuska 		 */
7081ad8388SMartin Matuska 		lzma_vli block_count;
7181ad8388SMartin Matuska 
7281ad8388SMartin Matuska 		/**
7381ad8388SMartin Matuska 		 * \brief       Compressed start offset of this Stream
7481ad8388SMartin Matuska 		 *
7581ad8388SMartin Matuska 		 * The offset is relative to the beginning of the lzma_index
7681ad8388SMartin Matuska 		 * (i.e. usually the beginning of the .xz file).
7781ad8388SMartin Matuska 		 */
7881ad8388SMartin Matuska 		lzma_vli compressed_offset;
7981ad8388SMartin Matuska 
8081ad8388SMartin Matuska 		/**
8181ad8388SMartin Matuska 		 * \brief       Uncompressed start offset of this Stream
8281ad8388SMartin Matuska 		 *
8381ad8388SMartin Matuska 		 * The offset is relative to the beginning of the lzma_index
8481ad8388SMartin Matuska 		 * (i.e. usually the beginning of the .xz file).
8581ad8388SMartin Matuska 		 */
8681ad8388SMartin Matuska 		lzma_vli uncompressed_offset;
8781ad8388SMartin Matuska 
8881ad8388SMartin Matuska 		/**
8981ad8388SMartin Matuska 		 * \brief       Compressed size of this Stream
9081ad8388SMartin Matuska 		 *
9181ad8388SMartin Matuska 		 * This includes all headers except the possible
9281ad8388SMartin Matuska 		 * Stream Padding after this Stream.
9381ad8388SMartin Matuska 		 */
9481ad8388SMartin Matuska 		lzma_vli compressed_size;
9581ad8388SMartin Matuska 
9681ad8388SMartin Matuska 		/**
9781ad8388SMartin Matuska 		 * \brief       Uncompressed size of this Stream
9881ad8388SMartin Matuska 		 */
9981ad8388SMartin Matuska 		lzma_vli uncompressed_size;
10081ad8388SMartin Matuska 
10181ad8388SMartin Matuska 		/**
10281ad8388SMartin Matuska 		 * \brief       Size of Stream Padding after this Stream
10381ad8388SMartin Matuska 		 *
10481ad8388SMartin Matuska 		 * If it hasn't been set with lzma_index_stream_padding(),
10581ad8388SMartin Matuska 		 * this defaults to zero. Stream Padding is always
10681ad8388SMartin Matuska 		 * a multiple of four bytes.
10781ad8388SMartin Matuska 		 */
10881ad8388SMartin Matuska 		lzma_vli padding;
10981ad8388SMartin Matuska 
11081ad8388SMartin Matuska 		lzma_vli reserved_vli1;
11181ad8388SMartin Matuska 		lzma_vli reserved_vli2;
11281ad8388SMartin Matuska 		lzma_vli reserved_vli3;
11381ad8388SMartin Matuska 		lzma_vli reserved_vli4;
11481ad8388SMartin Matuska 	} stream;
11581ad8388SMartin Matuska 
11681ad8388SMartin Matuska 	struct {
11781ad8388SMartin Matuska 		/**
11881ad8388SMartin Matuska 		 * \brief       Block number in the file
11981ad8388SMartin Matuska 		 *
12081ad8388SMartin Matuska 		 * The first Block is 1.
12181ad8388SMartin Matuska 		 */
12281ad8388SMartin Matuska 		lzma_vli number_in_file;
12381ad8388SMartin Matuska 
12481ad8388SMartin Matuska 		/**
12581ad8388SMartin Matuska 		 * \brief       Compressed start offset of this Block
12681ad8388SMartin Matuska 		 *
12781ad8388SMartin Matuska 		 * This offset is relative to the beginning of the
12881ad8388SMartin Matuska 		 * lzma_index (i.e. usually the beginning of the .xz file).
12981ad8388SMartin Matuska 		 * Normally this is where you should seek in the .xz file
13081ad8388SMartin Matuska 		 * to start decompressing this Block.
13181ad8388SMartin Matuska 		 */
13281ad8388SMartin Matuska 		lzma_vli compressed_file_offset;
13381ad8388SMartin Matuska 
13481ad8388SMartin Matuska 		/**
13581ad8388SMartin Matuska 		 * \brief       Uncompressed start offset of this Block
13681ad8388SMartin Matuska 		 *
13781ad8388SMartin Matuska 		 * This offset is relative to the beginning of the lzma_index
13881ad8388SMartin Matuska 		 * (i.e. usually the beginning of the .xz file).
139*542aef48SMartin Matuska 		 *
140*542aef48SMartin Matuska 		 * When doing random-access reading, it is possible that
141*542aef48SMartin Matuska 		 * the target offset is not exactly at Block boundary. One
142*542aef48SMartin Matuska 		 * will need to compare the target offset against
143*542aef48SMartin Matuska 		 * uncompressed_file_offset or uncompressed_stream_offset,
144*542aef48SMartin Matuska 		 * and possibly decode and throw away some amount of data
145*542aef48SMartin Matuska 		 * before reaching the target offset.
14681ad8388SMartin Matuska 		 */
14781ad8388SMartin Matuska 		lzma_vli uncompressed_file_offset;
14881ad8388SMartin Matuska 
14981ad8388SMartin Matuska 		/**
15081ad8388SMartin Matuska 		 * \brief       Block number in this Stream
15181ad8388SMartin Matuska 		 *
15281ad8388SMartin Matuska 		 * The first Block is 1.
15381ad8388SMartin Matuska 		 */
15481ad8388SMartin Matuska 		lzma_vli number_in_stream;
15581ad8388SMartin Matuska 
15681ad8388SMartin Matuska 		/**
15781ad8388SMartin Matuska 		 * \brief       Compressed start offset of this Block
15881ad8388SMartin Matuska 		 *
15981ad8388SMartin Matuska 		 * This offset is relative to the beginning of the Stream
16081ad8388SMartin Matuska 		 * containing this Block.
16181ad8388SMartin Matuska 		 */
16281ad8388SMartin Matuska 		lzma_vli compressed_stream_offset;
16381ad8388SMartin Matuska 
16481ad8388SMartin Matuska 		/**
16581ad8388SMartin Matuska 		 * \brief       Uncompressed start offset of this Block
16681ad8388SMartin Matuska 		 *
16781ad8388SMartin Matuska 		 * This offset is relative to the beginning of the Stream
16881ad8388SMartin Matuska 		 * containing this Block.
16981ad8388SMartin Matuska 		 */
17081ad8388SMartin Matuska 		lzma_vli uncompressed_stream_offset;
17181ad8388SMartin Matuska 
17281ad8388SMartin Matuska 		/**
17381ad8388SMartin Matuska 		 * \brief       Uncompressed size of this Block
17481ad8388SMartin Matuska 		 *
17581ad8388SMartin Matuska 		 * You should pass this to the Block decoder if you will
176*542aef48SMartin Matuska 		 * decode this Block. It will allow the Block decoder to
177*542aef48SMartin Matuska 		 * validate the uncompressed size.
17881ad8388SMartin Matuska 		 */
17981ad8388SMartin Matuska 		lzma_vli uncompressed_size;
18081ad8388SMartin Matuska 
18181ad8388SMartin Matuska 		/**
18281ad8388SMartin Matuska 		 * \brief       Unpadded size of this Block
18381ad8388SMartin Matuska 		 *
18481ad8388SMartin Matuska 		 * You should pass this to the Block decoder if you will
185*542aef48SMartin Matuska 		 * decode this Block. It will allow the Block decoder to
186*542aef48SMartin Matuska 		 * validate the unpadded size.
18781ad8388SMartin Matuska 		 */
18881ad8388SMartin Matuska 		lzma_vli unpadded_size;
18981ad8388SMartin Matuska 
19081ad8388SMartin Matuska 		/**
19181ad8388SMartin Matuska 		 * \brief       Total compressed size
19281ad8388SMartin Matuska 		 *
19381ad8388SMartin Matuska 		 * This includes all headers and padding in this Block.
19481ad8388SMartin Matuska 		 * This is useful if you need to know how many bytes
19581ad8388SMartin Matuska 		 * the Block decoder will actually read.
19681ad8388SMartin Matuska 		 */
19781ad8388SMartin Matuska 		lzma_vli total_size;
19881ad8388SMartin Matuska 
19981ad8388SMartin Matuska 		lzma_vli reserved_vli1;
20081ad8388SMartin Matuska 		lzma_vli reserved_vli2;
20181ad8388SMartin Matuska 		lzma_vli reserved_vli3;
20281ad8388SMartin Matuska 		lzma_vli reserved_vli4;
20381ad8388SMartin Matuska 
20481ad8388SMartin Matuska 		const void *reserved_ptr1;
20581ad8388SMartin Matuska 		const void *reserved_ptr2;
20681ad8388SMartin Matuska 		const void *reserved_ptr3;
20781ad8388SMartin Matuska 		const void *reserved_ptr4;
20881ad8388SMartin Matuska 	} block;
20981ad8388SMartin Matuska 
21081ad8388SMartin Matuska 	/*
21181ad8388SMartin Matuska 	 * Internal data which is used to store the state of the iterator.
21281ad8388SMartin Matuska 	 * The exact format may vary between liblzma versions, so don't
21381ad8388SMartin Matuska 	 * touch these in any way.
21481ad8388SMartin Matuska 	 */
21581ad8388SMartin Matuska 	union {
21681ad8388SMartin Matuska 		const void *p;
21781ad8388SMartin Matuska 		size_t s;
21881ad8388SMartin Matuska 		lzma_vli v;
21981ad8388SMartin Matuska 	} internal[6];
22081ad8388SMartin Matuska } lzma_index_iter;
22181ad8388SMartin Matuska 
22281ad8388SMartin Matuska 
22381ad8388SMartin Matuska /**
22481ad8388SMartin Matuska  * \brief       Operation mode for lzma_index_iter_next()
22581ad8388SMartin Matuska  */
22681ad8388SMartin Matuska typedef enum {
22781ad8388SMartin Matuska 	LZMA_INDEX_ITER_ANY             = 0,
22881ad8388SMartin Matuska 		/**<
22981ad8388SMartin Matuska 		 * \brief       Get the next Block or Stream
23081ad8388SMartin Matuska 		 *
23181ad8388SMartin Matuska 		 * Go to the next Block if the current Stream has at least
23281ad8388SMartin Matuska 		 * one Block left. Otherwise go to the next Stream even if
23381ad8388SMartin Matuska 		 * it has no Blocks. If the Stream has no Blocks
23481ad8388SMartin Matuska 		 * (lzma_index_iter.stream.block_count == 0),
23581ad8388SMartin Matuska 		 * lzma_index_iter.block will have undefined values.
23681ad8388SMartin Matuska 		 */
23781ad8388SMartin Matuska 
23881ad8388SMartin Matuska 	LZMA_INDEX_ITER_STREAM          = 1,
23981ad8388SMartin Matuska 		/**<
24081ad8388SMartin Matuska 		 * \brief       Get the next Stream
24181ad8388SMartin Matuska 		 *
24281ad8388SMartin Matuska 		 * Go to the next Stream even if the current Stream has
24381ad8388SMartin Matuska 		 * unread Blocks left. If the next Stream has at least one
24481ad8388SMartin Matuska 		 * Block, the iterator will point to the first Block.
24581ad8388SMartin Matuska 		 * If there are no Blocks, lzma_index_iter.block will have
24681ad8388SMartin Matuska 		 * undefined values.
24781ad8388SMartin Matuska 		 */
24881ad8388SMartin Matuska 
24981ad8388SMartin Matuska 	LZMA_INDEX_ITER_BLOCK           = 2,
25081ad8388SMartin Matuska 		/**<
25181ad8388SMartin Matuska 		 * \brief       Get the next Block
25281ad8388SMartin Matuska 		 *
25381ad8388SMartin Matuska 		 * Go to the next Block if the current Stream has at least
25481ad8388SMartin Matuska 		 * one Block left. If the current Stream has no Blocks left,
25581ad8388SMartin Matuska 		 * the next Stream with at least one Block is located and
25681ad8388SMartin Matuska 		 * the iterator will be made to point to the first Block of
25781ad8388SMartin Matuska 		 * that Stream.
25881ad8388SMartin Matuska 		 */
25981ad8388SMartin Matuska 
26081ad8388SMartin Matuska 	LZMA_INDEX_ITER_NONEMPTY_BLOCK  = 3
26181ad8388SMartin Matuska 		/**<
26281ad8388SMartin Matuska 		 * \brief       Get the next non-empty Block
26381ad8388SMartin Matuska 		 *
26481ad8388SMartin Matuska 		 * This is like LZMA_INDEX_ITER_BLOCK except that it will
26581ad8388SMartin Matuska 		 * skip Blocks whose Uncompressed Size is zero.
26681ad8388SMartin Matuska 		 */
26781ad8388SMartin Matuska 
26881ad8388SMartin Matuska } lzma_index_iter_mode;
26981ad8388SMartin Matuska 
27081ad8388SMartin Matuska 
27181ad8388SMartin Matuska /**
27281ad8388SMartin Matuska  * \brief       Calculate memory usage of lzma_index
27381ad8388SMartin Matuska  *
27481ad8388SMartin Matuska  * On disk, the size of the Index field depends on both the number of Records
27581ad8388SMartin Matuska  * stored and how big values the Records store (due to variable-length integer
27681ad8388SMartin Matuska  * encoding). When the Index is kept in lzma_index structure, the memory usage
27781ad8388SMartin Matuska  * depends only on the number of Records/Blocks stored in the Index(es), and
27881ad8388SMartin Matuska  * in case of concatenated lzma_indexes, the number of Streams. The size in
27981ad8388SMartin Matuska  * RAM is almost always significantly bigger than in the encoded form on disk.
28081ad8388SMartin Matuska  *
28181ad8388SMartin Matuska  * This function calculates an approximate amount of memory needed hold
28281ad8388SMartin Matuska  * the given number of Streams and Blocks in lzma_index structure. This
28381ad8388SMartin Matuska  * value may vary between CPU architectures and also between liblzma versions
28481ad8388SMartin Matuska  * if the internal implementation is modified.
28581ad8388SMartin Matuska  */
28681ad8388SMartin Matuska extern LZMA_API(uint64_t) lzma_index_memusage(
28781ad8388SMartin Matuska 		lzma_vli streams, lzma_vli blocks) lzma_nothrow;
28881ad8388SMartin Matuska 
28981ad8388SMartin Matuska 
29081ad8388SMartin Matuska /**
29181ad8388SMartin Matuska  * \brief       Calculate the memory usage of an existing lzma_index
29281ad8388SMartin Matuska  *
29381ad8388SMartin Matuska  * This is a shorthand for lzma_index_memusage(lzma_index_stream_count(i),
29481ad8388SMartin Matuska  * lzma_index_block_count(i)).
29581ad8388SMartin Matuska  */
29681ad8388SMartin Matuska extern LZMA_API(uint64_t) lzma_index_memused(const lzma_index *i)
29781ad8388SMartin Matuska 		lzma_nothrow;
29881ad8388SMartin Matuska 
29981ad8388SMartin Matuska 
30081ad8388SMartin Matuska /**
30181ad8388SMartin Matuska  * \brief       Allocate and initialize a new lzma_index structure
30281ad8388SMartin Matuska  *
30381ad8388SMartin Matuska  * \return      On success, a pointer to an empty initialized lzma_index is
30481ad8388SMartin Matuska  *              returned. If allocation fails, NULL is returned.
30581ad8388SMartin Matuska  */
30681ad8388SMartin Matuska extern LZMA_API(lzma_index *) lzma_index_init(lzma_allocator *allocator)
30781ad8388SMartin Matuska 		lzma_nothrow;
30881ad8388SMartin Matuska 
30981ad8388SMartin Matuska 
31081ad8388SMartin Matuska /**
31181ad8388SMartin Matuska  * \brief       Deallocate lzma_index
31281ad8388SMartin Matuska  *
31381ad8388SMartin Matuska  * If i is NULL, this does nothing.
31481ad8388SMartin Matuska  */
31581ad8388SMartin Matuska extern LZMA_API(void) lzma_index_end(lzma_index *i, lzma_allocator *allocator)
31681ad8388SMartin Matuska 		lzma_nothrow;
31781ad8388SMartin Matuska 
31881ad8388SMartin Matuska 
31981ad8388SMartin Matuska /**
32081ad8388SMartin Matuska  * \brief       Add a new Block to lzma_index
32181ad8388SMartin Matuska  *
32281ad8388SMartin Matuska  * \param       i                 Pointer to a lzma_index structure
32381ad8388SMartin Matuska  * \param       allocator         Pointer to lzma_allocator, or NULL to
32481ad8388SMartin Matuska  *                                use malloc()
32581ad8388SMartin Matuska  * \param       unpadded_size     Unpadded Size of a Block. This can be
32681ad8388SMartin Matuska  *                                calculated with lzma_block_unpadded_size()
32781ad8388SMartin Matuska  *                                after encoding or decoding the Block.
32881ad8388SMartin Matuska  * \param       uncompressed_size Uncompressed Size of a Block. This can be
32981ad8388SMartin Matuska  *                                taken directly from lzma_block structure
33081ad8388SMartin Matuska  *                                after encoding or decoding the Block.
33181ad8388SMartin Matuska  *
33281ad8388SMartin Matuska  * Appending a new Block does not invalidate iterators. For example,
33381ad8388SMartin Matuska  * if an iterator was pointing to the end of the lzma_index, after
33481ad8388SMartin Matuska  * lzma_index_append() it is possible to read the next Block with
33581ad8388SMartin Matuska  * an existing iterator.
33681ad8388SMartin Matuska  *
33781ad8388SMartin Matuska  * \return      - LZMA_OK
33881ad8388SMartin Matuska  *              - LZMA_MEM_ERROR
33981ad8388SMartin Matuska  *              - LZMA_DATA_ERROR: Compressed or uncompressed size of the
34081ad8388SMartin Matuska  *                Stream or size of the Index field would grow too big.
34181ad8388SMartin Matuska  *              - LZMA_PROG_ERROR
34281ad8388SMartin Matuska  */
34381ad8388SMartin Matuska extern LZMA_API(lzma_ret) lzma_index_append(
34481ad8388SMartin Matuska 		lzma_index *i, lzma_allocator *allocator,
34581ad8388SMartin Matuska 		lzma_vli unpadded_size, lzma_vli uncompressed_size)
34681ad8388SMartin Matuska 		lzma_nothrow lzma_attr_warn_unused_result;
34781ad8388SMartin Matuska 
34881ad8388SMartin Matuska 
34981ad8388SMartin Matuska /**
35081ad8388SMartin Matuska  * \brief       Set the Stream Flags
35181ad8388SMartin Matuska  *
35281ad8388SMartin Matuska  * Set the Stream Flags of the last (and typically the only) Stream
35381ad8388SMartin Matuska  * in lzma_index. This can be useful when reading information from the
35481ad8388SMartin Matuska  * lzma_index, because to decode Blocks, knowing the integrity check type
35581ad8388SMartin Matuska  * is needed.
35681ad8388SMartin Matuska  *
35781ad8388SMartin Matuska  * The given Stream Flags are copied into internal preallocated structure
35881ad8388SMartin Matuska  * in the lzma_index, thus the caller doesn't need to keep the *stream_flags
35981ad8388SMartin Matuska  * available after calling this function.
36081ad8388SMartin Matuska  *
36181ad8388SMartin Matuska  * \return      - LZMA_OK
36281ad8388SMartin Matuska  *              - LZMA_OPTIONS_ERROR: Unsupported stream_flags->version.
36381ad8388SMartin Matuska  *              - LZMA_PROG_ERROR
36481ad8388SMartin Matuska  */
36581ad8388SMartin Matuska extern LZMA_API(lzma_ret) lzma_index_stream_flags(
36681ad8388SMartin Matuska 		lzma_index *i, const lzma_stream_flags *stream_flags)
36781ad8388SMartin Matuska 		lzma_nothrow lzma_attr_warn_unused_result;
36881ad8388SMartin Matuska 
36981ad8388SMartin Matuska 
37081ad8388SMartin Matuska /**
37181ad8388SMartin Matuska  * \brief       Get the types of integrity Checks
37281ad8388SMartin Matuska  *
373e0f0e66dSMartin Matuska  * If lzma_index_stream_flags() is used to set the Stream Flags for
37481ad8388SMartin Matuska  * every Stream, lzma_index_checks() can be used to get a bitmask to
37581ad8388SMartin Matuska  * indicate which Check types have been used. It can be useful e.g. if
37681ad8388SMartin Matuska  * showing the Check types to the user.
37781ad8388SMartin Matuska  *
37881ad8388SMartin Matuska  * The bitmask is 1 << check_id, e.g. CRC32 is 1 << 1 and SHA-256 is 1 << 10.
37981ad8388SMartin Matuska  */
38081ad8388SMartin Matuska extern LZMA_API(uint32_t) lzma_index_checks(const lzma_index *i)
38181ad8388SMartin Matuska 		lzma_nothrow lzma_attr_pure;
38281ad8388SMartin Matuska 
38381ad8388SMartin Matuska 
38481ad8388SMartin Matuska /**
38581ad8388SMartin Matuska  * \brief       Set the amount of Stream Padding
38681ad8388SMartin Matuska  *
38781ad8388SMartin Matuska  * Set the amount of Stream Padding of the last (and typically the only)
38881ad8388SMartin Matuska  * Stream in the lzma_index. This is needed when planning to do random-access
38981ad8388SMartin Matuska  * reading within multiple concatenated Streams.
39081ad8388SMartin Matuska  *
39181ad8388SMartin Matuska  * By default, the amount of Stream Padding is assumed to be zero bytes.
39281ad8388SMartin Matuska  *
39381ad8388SMartin Matuska  * \return      - LZMA_OK
39481ad8388SMartin Matuska  *              - LZMA_DATA_ERROR: The file size would grow too big.
39581ad8388SMartin Matuska  *              - LZMA_PROG_ERROR
39681ad8388SMartin Matuska  */
39781ad8388SMartin Matuska extern LZMA_API(lzma_ret) lzma_index_stream_padding(
39881ad8388SMartin Matuska 		lzma_index *i, lzma_vli stream_padding)
39981ad8388SMartin Matuska 		lzma_nothrow lzma_attr_warn_unused_result;
40081ad8388SMartin Matuska 
40181ad8388SMartin Matuska 
40281ad8388SMartin Matuska /**
40381ad8388SMartin Matuska  * \brief       Get the number of Streams
40481ad8388SMartin Matuska  */
40581ad8388SMartin Matuska extern LZMA_API(lzma_vli) lzma_index_stream_count(const lzma_index *i)
40681ad8388SMartin Matuska 		lzma_nothrow lzma_attr_pure;
40781ad8388SMartin Matuska 
40881ad8388SMartin Matuska 
40981ad8388SMartin Matuska /**
41081ad8388SMartin Matuska  * \brief       Get the number of Blocks
41181ad8388SMartin Matuska  *
41281ad8388SMartin Matuska  * This returns the total number of Blocks in lzma_index. To get number
41381ad8388SMartin Matuska  * of Blocks in individual Streams, use lzma_index_iter.
41481ad8388SMartin Matuska  */
41581ad8388SMartin Matuska extern LZMA_API(lzma_vli) lzma_index_block_count(const lzma_index *i)
41681ad8388SMartin Matuska 		lzma_nothrow lzma_attr_pure;
41781ad8388SMartin Matuska 
41881ad8388SMartin Matuska 
41981ad8388SMartin Matuska /**
42081ad8388SMartin Matuska  * \brief       Get the size of the Index field as bytes
42181ad8388SMartin Matuska  *
42281ad8388SMartin Matuska  * This is needed to verify the Backward Size field in the Stream Footer.
42381ad8388SMartin Matuska  */
42481ad8388SMartin Matuska extern LZMA_API(lzma_vli) lzma_index_size(const lzma_index *i)
42581ad8388SMartin Matuska 		lzma_nothrow lzma_attr_pure;
42681ad8388SMartin Matuska 
42781ad8388SMartin Matuska 
42881ad8388SMartin Matuska /**
42981ad8388SMartin Matuska  * \brief       Get the total size of the Stream
43081ad8388SMartin Matuska  *
43181ad8388SMartin Matuska  * If multiple lzma_indexes have been combined, this works as if the Blocks
43281ad8388SMartin Matuska  * were in a single Stream. This is useful if you are going to combine
43381ad8388SMartin Matuska  * Blocks from multiple Streams into a single new Stream.
43481ad8388SMartin Matuska  */
43581ad8388SMartin Matuska extern LZMA_API(lzma_vli) lzma_index_stream_size(const lzma_index *i)
43681ad8388SMartin Matuska 		lzma_nothrow lzma_attr_pure;
43781ad8388SMartin Matuska 
43881ad8388SMartin Matuska 
43981ad8388SMartin Matuska /**
44081ad8388SMartin Matuska  * \brief       Get the total size of the Blocks
44181ad8388SMartin Matuska  *
44281ad8388SMartin Matuska  * This doesn't include the Stream Header, Stream Footer, Stream Padding,
44381ad8388SMartin Matuska  * or Index fields.
44481ad8388SMartin Matuska  */
44581ad8388SMartin Matuska extern LZMA_API(lzma_vli) lzma_index_total_size(const lzma_index *i)
44681ad8388SMartin Matuska 		lzma_nothrow lzma_attr_pure;
44781ad8388SMartin Matuska 
44881ad8388SMartin Matuska 
44981ad8388SMartin Matuska /**
45081ad8388SMartin Matuska  * \brief       Get the total size of the file
45181ad8388SMartin Matuska  *
45281ad8388SMartin Matuska  * When no lzma_indexes have been combined with lzma_index_cat() and there is
45381ad8388SMartin Matuska  * no Stream Padding, this function is identical to lzma_index_stream_size().
45481ad8388SMartin Matuska  * If multiple lzma_indexes have been combined, this includes also the headers
45581ad8388SMartin Matuska  * of each separate Stream and the possible Stream Padding fields.
45681ad8388SMartin Matuska  */
45781ad8388SMartin Matuska extern LZMA_API(lzma_vli) lzma_index_file_size(const lzma_index *i)
45881ad8388SMartin Matuska 		lzma_nothrow lzma_attr_pure;
45981ad8388SMartin Matuska 
46081ad8388SMartin Matuska 
46181ad8388SMartin Matuska /**
46281ad8388SMartin Matuska  * \brief       Get the uncompressed size of the file
46381ad8388SMartin Matuska  */
46481ad8388SMartin Matuska extern LZMA_API(lzma_vli) lzma_index_uncompressed_size(const lzma_index *i)
46581ad8388SMartin Matuska 		lzma_nothrow lzma_attr_pure;
46681ad8388SMartin Matuska 
46781ad8388SMartin Matuska 
46881ad8388SMartin Matuska /**
46981ad8388SMartin Matuska  * \brief       Initialize an iterator
47081ad8388SMartin Matuska  *
47181ad8388SMartin Matuska  * \param       iter    Pointer to a lzma_index_iter structure
47281ad8388SMartin Matuska  * \param       i       lzma_index to which the iterator will be associated
47381ad8388SMartin Matuska  *
47481ad8388SMartin Matuska  * This function associates the iterator with the given lzma_index, and calls
47581ad8388SMartin Matuska  * lzma_index_iter_rewind() on the iterator.
47681ad8388SMartin Matuska  *
47781ad8388SMartin Matuska  * This function doesn't allocate any memory, thus there is no
47881ad8388SMartin Matuska  * lzma_index_iter_end(). The iterator is valid as long as the
47981ad8388SMartin Matuska  * associated lzma_index is valid, that is, until lzma_index_end() or
48081ad8388SMartin Matuska  * using it as source in lzma_index_cat(). Specifically, lzma_index doesn't
48181ad8388SMartin Matuska  * become invalid if new Blocks are added to it with lzma_index_append() or
48281ad8388SMartin Matuska  * if it is used as the destination in lzma_index_cat().
48381ad8388SMartin Matuska  *
48481ad8388SMartin Matuska  * It is safe to make copies of an initialized lzma_index_iter, for example,
48581ad8388SMartin Matuska  * to easily restart reading at some particular position.
48681ad8388SMartin Matuska  */
48781ad8388SMartin Matuska extern LZMA_API(void) lzma_index_iter_init(
48881ad8388SMartin Matuska 		lzma_index_iter *iter, const lzma_index *i) lzma_nothrow;
48981ad8388SMartin Matuska 
49081ad8388SMartin Matuska 
49181ad8388SMartin Matuska /**
49281ad8388SMartin Matuska  * \brief       Rewind the iterator
49381ad8388SMartin Matuska  *
49481ad8388SMartin Matuska  * Rewind the iterator so that next call to lzma_index_iter_next() will
49581ad8388SMartin Matuska  * return the first Block or Stream.
49681ad8388SMartin Matuska  */
49781ad8388SMartin Matuska extern LZMA_API(void) lzma_index_iter_rewind(lzma_index_iter *iter)
49881ad8388SMartin Matuska 		lzma_nothrow;
49981ad8388SMartin Matuska 
50081ad8388SMartin Matuska 
50181ad8388SMartin Matuska /**
50281ad8388SMartin Matuska  * \brief       Get the next Block or Stream
50381ad8388SMartin Matuska  *
50481ad8388SMartin Matuska  * \param       iter    Iterator initialized with lzma_index_iter_init()
50581ad8388SMartin Matuska  * \param       mode    Specify what kind of information the caller wants
50681ad8388SMartin Matuska  *                      to get. See lzma_index_iter_mode for details.
50781ad8388SMartin Matuska  *
50881ad8388SMartin Matuska  * \return      If next Block or Stream matching the mode was found, *iter
50981ad8388SMartin Matuska  *              is updated and this function returns false. If no Block or
51081ad8388SMartin Matuska  *              Stream matching the mode is found, *iter is not modified
51181ad8388SMartin Matuska  *              and this function returns true. If mode is set to an unknown
51281ad8388SMartin Matuska  *              value, *iter is not modified and this function returns true.
51381ad8388SMartin Matuska  */
51481ad8388SMartin Matuska extern LZMA_API(lzma_bool) lzma_index_iter_next(
51581ad8388SMartin Matuska 		lzma_index_iter *iter, lzma_index_iter_mode mode)
51681ad8388SMartin Matuska 		lzma_nothrow lzma_attr_warn_unused_result;
51781ad8388SMartin Matuska 
51881ad8388SMartin Matuska 
51981ad8388SMartin Matuska /**
52081ad8388SMartin Matuska  * \brief       Locate a Block
52181ad8388SMartin Matuska  *
52281ad8388SMartin Matuska  * If it is possible to seek in the .xz file, it is possible to parse
52381ad8388SMartin Matuska  * the Index field(s) and use lzma_index_iter_locate() to do random-access
52481ad8388SMartin Matuska  * reading with granularity of Block size.
52581ad8388SMartin Matuska  *
52681ad8388SMartin Matuska  * \param       iter    Iterator that was earlier initialized with
52781ad8388SMartin Matuska  *                      lzma_index_iter_init().
52881ad8388SMartin Matuska  * \param       target  Uncompressed target offset which the caller would
52981ad8388SMartin Matuska  *                      like to locate from the Stream
53081ad8388SMartin Matuska  *
53181ad8388SMartin Matuska  * If the target is smaller than the uncompressed size of the Stream (can be
53281ad8388SMartin Matuska  * checked with lzma_index_uncompressed_size()):
53381ad8388SMartin Matuska  *  - Information about the Stream and Block containing the requested
53481ad8388SMartin Matuska  *    uncompressed offset is stored into *iter.
53581ad8388SMartin Matuska  *  - Internal state of the iterator is adjusted so that
53681ad8388SMartin Matuska  *    lzma_index_iter_next() can be used to read subsequent Blocks or Streams.
53781ad8388SMartin Matuska  *  - This function returns false.
53881ad8388SMartin Matuska  *
53981ad8388SMartin Matuska  * If target is greater than the uncompressed size of the Stream, *iter
54081ad8388SMartin Matuska  * is not modified, and this function returns true.
54181ad8388SMartin Matuska  */
54281ad8388SMartin Matuska extern LZMA_API(lzma_bool) lzma_index_iter_locate(
54381ad8388SMartin Matuska 		lzma_index_iter *iter, lzma_vli target) lzma_nothrow;
54481ad8388SMartin Matuska 
54581ad8388SMartin Matuska 
54681ad8388SMartin Matuska /**
54781ad8388SMartin Matuska  * \brief       Concatenate lzma_indexes
54881ad8388SMartin Matuska  *
54981ad8388SMartin Matuska  * Concatenating lzma_indexes is useful when doing random-access reading in
55081ad8388SMartin Matuska  * multi-Stream .xz file, or when combining multiple Streams into single
55181ad8388SMartin Matuska  * Stream.
55281ad8388SMartin Matuska  *
55381ad8388SMartin Matuska  * \param       dest      lzma_index after which src is appended
55481ad8388SMartin Matuska  * \param       src       lzma_index to be appended after dest. If this
55581ad8388SMartin Matuska  *                        function succeeds, the memory allocated for src
55681ad8388SMartin Matuska  *                        is freed or moved to be part of dest, and all
55781ad8388SMartin Matuska  *                        iterators pointing to src will become invalid.
55881ad8388SMartin Matuska  * \param       allocator Custom memory allocator; can be NULL to use
55981ad8388SMartin Matuska  *                        malloc() and free().
56081ad8388SMartin Matuska  *
56181ad8388SMartin Matuska  * \return      - LZMA_OK: lzma_indexes were concatenated successfully.
56281ad8388SMartin Matuska  *                src is now a dangling pointer.
56381ad8388SMartin Matuska  *              - LZMA_DATA_ERROR: *dest would grow too big.
56481ad8388SMartin Matuska  *              - LZMA_MEM_ERROR
56581ad8388SMartin Matuska  *              - LZMA_PROG_ERROR
56681ad8388SMartin Matuska  */
567e0f0e66dSMartin Matuska extern LZMA_API(lzma_ret) lzma_index_cat(
568e0f0e66dSMartin Matuska 		lzma_index *dest, lzma_index *src, lzma_allocator *allocator)
56981ad8388SMartin Matuska 		lzma_nothrow lzma_attr_warn_unused_result;
57081ad8388SMartin Matuska 
57181ad8388SMartin Matuska 
57281ad8388SMartin Matuska /**
57381ad8388SMartin Matuska  * \brief       Duplicate lzma_index
57481ad8388SMartin Matuska  *
57581ad8388SMartin Matuska  * \return      A copy of the lzma_index, or NULL if memory allocation failed.
57681ad8388SMartin Matuska  */
57781ad8388SMartin Matuska extern LZMA_API(lzma_index *) lzma_index_dup(
57881ad8388SMartin Matuska 		const lzma_index *i, lzma_allocator *allocator)
57981ad8388SMartin Matuska 		lzma_nothrow lzma_attr_warn_unused_result;
58081ad8388SMartin Matuska 
58181ad8388SMartin Matuska 
58281ad8388SMartin Matuska /**
58381ad8388SMartin Matuska  * \brief       Initialize .xz Index encoder
58481ad8388SMartin Matuska  *
58581ad8388SMartin Matuska  * \param       strm        Pointer to properly prepared lzma_stream
58681ad8388SMartin Matuska  * \param       i           Pointer to lzma_index which should be encoded.
58781ad8388SMartin Matuska  *
588*542aef48SMartin Matuska  * The valid `action' values for lzma_code() are LZMA_RUN and LZMA_FINISH.
589*542aef48SMartin Matuska  * It is enough to use only one of them (you can choose freely; use LZMA_RUN
590*542aef48SMartin Matuska  * to support liblzma versions older than 5.0.0).
59181ad8388SMartin Matuska  *
59281ad8388SMartin Matuska  * \return      - LZMA_OK: Initialization succeeded, continue with lzma_code().
59381ad8388SMartin Matuska  *              - LZMA_MEM_ERROR
59481ad8388SMartin Matuska  *              - LZMA_PROG_ERROR
59581ad8388SMartin Matuska  */
59681ad8388SMartin Matuska extern LZMA_API(lzma_ret) lzma_index_encoder(
59781ad8388SMartin Matuska 		lzma_stream *strm, const lzma_index *i)
59881ad8388SMartin Matuska 		lzma_nothrow lzma_attr_warn_unused_result;
59981ad8388SMartin Matuska 
60081ad8388SMartin Matuska 
60181ad8388SMartin Matuska /**
60281ad8388SMartin Matuska  * \brief       Initialize .xz Index decoder
60381ad8388SMartin Matuska  *
60481ad8388SMartin Matuska  * \param       strm        Pointer to properly prepared lzma_stream
60581ad8388SMartin Matuska  * \param       i           The decoded Index will be made available via
60681ad8388SMartin Matuska  *                          this pointer. Initially this function will
60781ad8388SMartin Matuska  *                          set *i to NULL (the old value is ignored). If
60881ad8388SMartin Matuska  *                          decoding succeeds (lzma_code() returns
60981ad8388SMartin Matuska  *                          LZMA_STREAM_END), *i will be set to point
61081ad8388SMartin Matuska  *                          to a new lzma_index, which the application
61181ad8388SMartin Matuska  *                          has to later free with lzma_index_end().
61281ad8388SMartin Matuska  * \param       memlimit    How much memory the resulting lzma_index is
61381ad8388SMartin Matuska  *                          allowed to require.
61481ad8388SMartin Matuska  *
615*542aef48SMartin Matuska  * The valid `action' values for lzma_code() are LZMA_RUN and LZMA_FINISH.
616*542aef48SMartin Matuska  * It is enough to use only one of them (you can choose freely; use LZMA_RUN
617*542aef48SMartin Matuska  * to support liblzma versions older than 5.0.0).
61881ad8388SMartin Matuska  *
61981ad8388SMartin Matuska  * \return      - LZMA_OK: Initialization succeeded, continue with lzma_code().
62081ad8388SMartin Matuska  *              - LZMA_MEM_ERROR
62181ad8388SMartin Matuska  *              - LZMA_MEMLIMIT_ERROR
62281ad8388SMartin Matuska  *              - LZMA_PROG_ERROR
62381ad8388SMartin Matuska  */
62481ad8388SMartin Matuska extern LZMA_API(lzma_ret) lzma_index_decoder(
62581ad8388SMartin Matuska 		lzma_stream *strm, lzma_index **i, uint64_t memlimit)
62681ad8388SMartin Matuska 		lzma_nothrow lzma_attr_warn_unused_result;
62781ad8388SMartin Matuska 
62881ad8388SMartin Matuska 
62981ad8388SMartin Matuska /**
63081ad8388SMartin Matuska  * \brief       Single-call .xz Index encoder
63181ad8388SMartin Matuska  *
63281ad8388SMartin Matuska  * \param       i         lzma_index to be encoded
63381ad8388SMartin Matuska  * \param       out       Beginning of the output buffer
63481ad8388SMartin Matuska  * \param       out_pos   The next byte will be written to out[*out_pos].
63581ad8388SMartin Matuska  *                        *out_pos is updated only if encoding succeeds.
63681ad8388SMartin Matuska  * \param       out_size  Size of the out buffer; the first byte into
63781ad8388SMartin Matuska  *                        which no data is written to is out[out_size].
63881ad8388SMartin Matuska  *
63981ad8388SMartin Matuska  * \return      - LZMA_OK: Encoding was successful.
64081ad8388SMartin Matuska  *              - LZMA_BUF_ERROR: Output buffer is too small. Use
64181ad8388SMartin Matuska  *                lzma_index_size() to find out how much output
64281ad8388SMartin Matuska  *                space is needed.
64381ad8388SMartin Matuska  *              - LZMA_PROG_ERROR
64481ad8388SMartin Matuska  *
64581ad8388SMartin Matuska  * \note        This function doesn't take allocator argument since all
64681ad8388SMartin Matuska  *              the internal data is allocated on stack.
64781ad8388SMartin Matuska  */
64881ad8388SMartin Matuska extern LZMA_API(lzma_ret) lzma_index_buffer_encode(const lzma_index *i,
64981ad8388SMartin Matuska 		uint8_t *out, size_t *out_pos, size_t out_size) lzma_nothrow;
65081ad8388SMartin Matuska 
65181ad8388SMartin Matuska 
65281ad8388SMartin Matuska /**
65381ad8388SMartin Matuska  * \brief       Single-call .xz Index decoder
65481ad8388SMartin Matuska  *
65581ad8388SMartin Matuska  * \param       i           If decoding succeeds, *i will point to a new
65681ad8388SMartin Matuska  *                          lzma_index, which the application has to
65781ad8388SMartin Matuska  *                          later free with lzma_index_end(). If an error
65881ad8388SMartin Matuska  *                          occurs, *i will be NULL. The old value of *i
65981ad8388SMartin Matuska  *                          is always ignored and thus doesn't need to be
66081ad8388SMartin Matuska  *                          initialized by the caller.
66181ad8388SMartin Matuska  * \param       memlimit    Pointer to how much memory the resulting
66281ad8388SMartin Matuska  *                          lzma_index is allowed to require. The value
66381ad8388SMartin Matuska  *                          pointed by this pointer is modified if and only
66481ad8388SMartin Matuska  *                          if LZMA_MEMLIMIT_ERROR is returned.
66581ad8388SMartin Matuska  * \param       allocator   Pointer to lzma_allocator, or NULL to use malloc()
66681ad8388SMartin Matuska  * \param       in          Beginning of the input buffer
66781ad8388SMartin Matuska  * \param       in_pos      The next byte will be read from in[*in_pos].
66881ad8388SMartin Matuska  *                          *in_pos is updated only if decoding succeeds.
66981ad8388SMartin Matuska  * \param       in_size     Size of the input buffer; the first byte that
67081ad8388SMartin Matuska  *                          won't be read is in[in_size].
67181ad8388SMartin Matuska  *
67281ad8388SMartin Matuska  * \return      - LZMA_OK: Decoding was successful.
67381ad8388SMartin Matuska  *              - LZMA_MEM_ERROR
67481ad8388SMartin Matuska  *              - LZMA_MEMLIMIT_ERROR: Memory usage limit was reached.
67581ad8388SMartin Matuska  *                The minimum required memlimit value was stored to *memlimit.
67681ad8388SMartin Matuska  *              - LZMA_DATA_ERROR
67781ad8388SMartin Matuska  *              - LZMA_PROG_ERROR
67881ad8388SMartin Matuska  */
67981ad8388SMartin Matuska extern LZMA_API(lzma_ret) lzma_index_buffer_decode(lzma_index **i,
68081ad8388SMartin Matuska 		uint64_t *memlimit, lzma_allocator *allocator,
68181ad8388SMartin Matuska 		const uint8_t *in, size_t *in_pos, size_t in_size)
68281ad8388SMartin Matuska 		lzma_nothrow;
683