1207753Smm///////////////////////////////////////////////////////////////////////////////
2207753Smm//
3207753Smm/// \file       filter_flags_encoder.c
4207753Smm/// \brief      Decodes a Filter Flags field
5207753Smm//
6207753Smm//  Author:     Lasse Collin
7207753Smm//
8207753Smm//  This file has been put into the public domain.
9207753Smm//  You can do whatever you want with this file.
10207753Smm//
11207753Smm///////////////////////////////////////////////////////////////////////////////
12207753Smm
13207753Smm#include "filter_encoder.h"
14207753Smm
15207753Smm
16207753Smmextern LZMA_API(lzma_ret)
17207753Smmlzma_filter_flags_size(uint32_t *size, const lzma_filter *filter)
18207753Smm{
19207753Smm	if (filter->id >= LZMA_FILTER_RESERVED_START)
20207753Smm		return LZMA_PROG_ERROR;
21207753Smm
22207753Smm	return_if_error(lzma_properties_size(size, filter));
23207753Smm
24207753Smm	*size += lzma_vli_size(filter->id) + lzma_vli_size(*size);
25207753Smm
26207753Smm	return LZMA_OK;
27207753Smm}
28207753Smm
29207753Smm
30207753Smmextern LZMA_API(lzma_ret)
31207753Smmlzma_filter_flags_encode(const lzma_filter *filter,
32207753Smm		uint8_t *out, size_t *out_pos, size_t out_size)
33207753Smm{
34207753Smm	// Filter ID
35207753Smm	if (filter->id >= LZMA_FILTER_RESERVED_START)
36207753Smm		return LZMA_PROG_ERROR;
37207753Smm
38207753Smm	return_if_error(lzma_vli_encode(filter->id, NULL,
39207753Smm			out, out_pos, out_size));
40207753Smm
41207753Smm	// Size of Properties
42207753Smm	uint32_t props_size;
43207753Smm	return_if_error(lzma_properties_size(&props_size, filter));
44207753Smm	return_if_error(lzma_vli_encode(props_size, NULL,
45207753Smm			out, out_pos, out_size));
46207753Smm
47207753Smm	// Filter Properties
48207753Smm	if (out_size - *out_pos < props_size)
49207753Smm		return LZMA_PROG_ERROR;
50207753Smm
51207753Smm	return_if_error(lzma_properties_encode(filter, out + *out_pos));
52207753Smm
53207753Smm	*out_pos += props_size;
54207753Smm
55207753Smm	return LZMA_OK;
56207753Smm}
57