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