xref: /freebsd/contrib/xz/src/liblzma/common/index.h (revision 2f9cd13d)
181ad8388SMartin Matuska ///////////////////////////////////////////////////////////////////////////////
281ad8388SMartin Matuska //
381ad8388SMartin Matuska /// \file       index.h
481ad8388SMartin Matuska /// \brief      Handling of Index
5047153b4SXin LI /// \note       This header file does not include common.h or lzma.h because
6047153b4SXin LI ///             this file is needed by both liblzma internally and by the
7047153b4SXin LI ///             tests. Including common.h will include and define many things
8047153b4SXin LI ///             the tests do not need and prevents issues with header file
9047153b4SXin LI ///             include order. This way, if lzma.h or common.h are not
10047153b4SXin LI ///             included before this file it will break on every OS instead
11047153b4SXin LI ///             of causing more subtle errors.
1281ad8388SMartin Matuska //
1381ad8388SMartin Matuska //  Author:     Lasse Collin
1481ad8388SMartin Matuska //
152f9cd13dSXin LI //  This file has been put into the public domain.
162f9cd13dSXin LI //  You can do whatever you want with this file.
172f9cd13dSXin LI //
1881ad8388SMartin Matuska ///////////////////////////////////////////////////////////////////////////////
1981ad8388SMartin Matuska 
2081ad8388SMartin Matuska #ifndef LZMA_INDEX_H
2181ad8388SMartin Matuska #define LZMA_INDEX_H
2281ad8388SMartin Matuska 
2381ad8388SMartin Matuska 
2481ad8388SMartin Matuska /// Minimum Unpadded Size
2581ad8388SMartin Matuska #define UNPADDED_SIZE_MIN LZMA_VLI_C(5)
2681ad8388SMartin Matuska 
2781ad8388SMartin Matuska /// Maximum Unpadded Size
2881ad8388SMartin Matuska #define UNPADDED_SIZE_MAX (LZMA_VLI_MAX & ~LZMA_VLI_C(3))
2981ad8388SMartin Matuska 
30047153b4SXin LI /// Index Indicator based on xz specification
31047153b4SXin LI #define INDEX_INDICATOR 0
32047153b4SXin LI 
3381ad8388SMartin Matuska 
3481ad8388SMartin Matuska /// Get the size of the Index Padding field. This is needed by Index encoder
3581ad8388SMartin Matuska /// and decoder, but applications should have no use for this.
3681ad8388SMartin Matuska extern uint32_t lzma_index_padding_size(const lzma_index *i);
3781ad8388SMartin Matuska 
3881ad8388SMartin Matuska 
3981ad8388SMartin Matuska /// Set for how many Records to allocate memory the next time
4081ad8388SMartin Matuska /// lzma_index_append() needs to allocate space for a new Record.
4181ad8388SMartin Matuska /// This is used only by the Index decoder.
4281ad8388SMartin Matuska extern void lzma_index_prealloc(lzma_index *i, lzma_vli records);
4381ad8388SMartin Matuska 
4481ad8388SMartin Matuska 
4581ad8388SMartin Matuska /// Round the variable-length integer to the next multiple of four.
4681ad8388SMartin Matuska static inline lzma_vli
vli_ceil4(lzma_vli vli)4781ad8388SMartin Matuska vli_ceil4(lzma_vli vli)
4881ad8388SMartin Matuska {
49ca6a6373SXin LI 	assert(vli <= UNPADDED_SIZE_MAX);
5081ad8388SMartin Matuska 	return (vli + 3) & ~LZMA_VLI_C(3);
5181ad8388SMartin Matuska }
5281ad8388SMartin Matuska 
5381ad8388SMartin Matuska 
5481ad8388SMartin Matuska /// Calculate the size of the Index field excluding Index Padding
5581ad8388SMartin Matuska static inline lzma_vli
index_size_unpadded(lzma_vli count,lzma_vli index_list_size)5681ad8388SMartin Matuska index_size_unpadded(lzma_vli count, lzma_vli index_list_size)
5781ad8388SMartin Matuska {
5881ad8388SMartin Matuska 	// Index Indicator + Number of Records + List of Records + CRC32
5981ad8388SMartin Matuska 	return 1 + lzma_vli_size(count) + index_list_size + 4;
6081ad8388SMartin Matuska }
6181ad8388SMartin Matuska 
6281ad8388SMartin Matuska 
6381ad8388SMartin Matuska /// Calculate the size of the Index field including Index Padding
6481ad8388SMartin Matuska static inline lzma_vli
index_size(lzma_vli count,lzma_vli index_list_size)6581ad8388SMartin Matuska index_size(lzma_vli count, lzma_vli index_list_size)
6681ad8388SMartin Matuska {
6781ad8388SMartin Matuska 	return vli_ceil4(index_size_unpadded(count, index_list_size));
6881ad8388SMartin Matuska }
6981ad8388SMartin Matuska 
7081ad8388SMartin Matuska 
7181ad8388SMartin Matuska /// Calculate the total size of the Stream
7281ad8388SMartin Matuska static inline lzma_vli
index_stream_size(lzma_vli blocks_size,lzma_vli count,lzma_vli index_list_size)7381ad8388SMartin Matuska index_stream_size(lzma_vli blocks_size,
7481ad8388SMartin Matuska 		lzma_vli count, lzma_vli index_list_size)
7581ad8388SMartin Matuska {
7681ad8388SMartin Matuska 	return LZMA_STREAM_HEADER_SIZE + blocks_size
7781ad8388SMartin Matuska 			+ index_size(count, index_list_size)
7881ad8388SMartin Matuska 			+ LZMA_STREAM_HEADER_SIZE;
7981ad8388SMartin Matuska }
8081ad8388SMartin Matuska 
8181ad8388SMartin Matuska #endif
82