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