1 /* -*- mode: C; c-basic-offset: 4; indent-tabs-mode: nil -*- */
2 // vim: expandtab:ts=8:sw=4:softtabstop=4:
3 ///////////////////////////////////////////////////////////////////////////////
4 //
5 /// \file       filter_flags_encoder.c
6 /// \brief      Decodes a Filter Flags field
7 //
8 //  Author:     Lasse Collin
9 //
10 //  This file has been put into the public domain.
11 //  You can do whatever you want with this file.
12 //
13 ///////////////////////////////////////////////////////////////////////////////
14 
15 #include "filter_encoder.h"
16 
17 
18 extern LZMA_API(lzma_ret)
19 lzma_filter_flags_size(uint32_t *size, const lzma_filter *filter)
20 {
21 	if (filter->id >= LZMA_FILTER_RESERVED_START)
22 		return LZMA_PROG_ERROR;
23 
24 	return_if_error(lzma_properties_size(size, filter));
25 
26 	*size += lzma_vli_size(filter->id) + lzma_vli_size(*size);
27 
28 	return LZMA_OK;
29 }
30 
31 
32 extern LZMA_API(lzma_ret)
33 lzma_filter_flags_encode(const lzma_filter *filter,
34 		uint8_t *out, size_t *out_pos, size_t out_size)
35 {
36 	// Filter ID
37 	if (filter->id >= LZMA_FILTER_RESERVED_START)
38 		return LZMA_PROG_ERROR;
39 
40 	return_if_error(lzma_vli_encode(filter->id, NULL,
41 			out, out_pos, out_size));
42 
43 	// Size of Properties
44 	uint32_t props_size;
45 	return_if_error(lzma_properties_size(&props_size, filter));
46 	return_if_error(lzma_vli_encode(props_size, NULL,
47 			out, out_pos, out_size));
48 
49 	// Filter Properties
50 	if (out_size - *out_pos < props_size)
51 		return LZMA_PROG_ERROR;
52 
53 	return_if_error(lzma_properties_encode(filter, out + *out_pos));
54 
55 	*out_pos += props_size;
56 
57 	return LZMA_OK;
58 }
59