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
15extern LZMA_API(lzma_ret)
16lzma_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
29extern LZMA_API(lzma_ret)
30lzma_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