xref: /freebsd-src/contrib/xz/src/liblzma/common/filter_flags_encoder.c (revision 3b35e7ee8de9b0260149a2b77e87a2b9c7a36244)
1 // SPDX-License-Identifier: 0BSD
2 
3 ///////////////////////////////////////////////////////////////////////////////
4 //
5 /// \file       filter_flags_encoder.c
6 /// \brief      Encodes a Filter Flags field
7 //
8 //  Author:     Lasse Collin
9 //
10 ///////////////////////////////////////////////////////////////////////////////
11 
12 #include "filter_encoder.h"
13 
14 
15 extern LZMA_API(lzma_ret)
lzma_filter_flags_size(uint32_t * size,const lzma_filter * filter)16 lzma_filter_flags_size(uint32_t *size, const lzma_filter *filter)
17 {
18 	if (filter->id >= LZMA_FILTER_RESERVED_START)
19 		return LZMA_PROG_ERROR;
20 
21 	return_if_error(lzma_properties_size(size, filter));
22 
23 	*size += lzma_vli_size(filter->id) + lzma_vli_size(*size);
24 
25 	return LZMA_OK;
26 }
27 
28 
29 extern LZMA_API(lzma_ret)
lzma_filter_flags_encode(const lzma_filter * filter,uint8_t * out,size_t * out_pos,size_t out_size)30 lzma_filter_flags_encode(const lzma_filter *filter,
31 		uint8_t *out, size_t *out_pos, size_t out_size)
32 {
33 	// Filter ID
34 	if (filter->id >= LZMA_FILTER_RESERVED_START)
35 		return LZMA_PROG_ERROR;
36 
37 	return_if_error(lzma_vli_encode(filter->id, NULL,
38 			out, out_pos, out_size));
39 
40 	// Size of Properties
41 	uint32_t props_size;
42 	return_if_error(lzma_properties_size(&props_size, filter));
43 	return_if_error(lzma_vli_encode(props_size, NULL,
44 			out, out_pos, out_size));
45 
46 	// Filter Properties
47 	if (out_size - *out_pos < props_size)
48 		return LZMA_PROG_ERROR;
49 
50 	return_if_error(lzma_properties_encode(filter, out + *out_pos));
51 
52 	*out_pos += props_size;
53 
54 	return LZMA_OK;
55 }
56