1 | // SPDX-License-Identifier: 0BSD
|
---|
2 |
|
---|
3 | ///////////////////////////////////////////////////////////////////////////////
|
---|
4 | //
|
---|
5 | /// \file delta_common.c
|
---|
6 | /// \brief Common stuff for Delta encoder and decoder
|
---|
7 | //
|
---|
8 | // Author: Lasse Collin
|
---|
9 | //
|
---|
10 | ///////////////////////////////////////////////////////////////////////////////
|
---|
11 |
|
---|
12 | #include "delta_common.h"
|
---|
13 | #include "delta_private.h"
|
---|
14 |
|
---|
15 |
|
---|
16 | static void
|
---|
17 | delta_coder_end(void *coder_ptr, const lzma_allocator *allocator)
|
---|
18 | {
|
---|
19 | lzma_delta_coder *coder = coder_ptr;
|
---|
20 | lzma_next_end(&coder->next, allocator);
|
---|
21 | lzma_free(coder, allocator);
|
---|
22 | return;
|
---|
23 | }
|
---|
24 |
|
---|
25 |
|
---|
26 | extern lzma_ret
|
---|
27 | lzma_delta_coder_init(lzma_next_coder *next, const lzma_allocator *allocator,
|
---|
28 | const lzma_filter_info *filters)
|
---|
29 | {
|
---|
30 | // Allocate memory for the decoder if needed.
|
---|
31 | lzma_delta_coder *coder = next->coder;
|
---|
32 | if (coder == NULL) {
|
---|
33 | coder = lzma_alloc(sizeof(lzma_delta_coder), allocator);
|
---|
34 | if (coder == NULL)
|
---|
35 | return LZMA_MEM_ERROR;
|
---|
36 |
|
---|
37 | next->coder = coder;
|
---|
38 |
|
---|
39 | // End function is the same for encoder and decoder.
|
---|
40 | next->end = &delta_coder_end;
|
---|
41 | coder->next = LZMA_NEXT_CODER_INIT;
|
---|
42 | }
|
---|
43 |
|
---|
44 | // Validate the options.
|
---|
45 | if (lzma_delta_coder_memusage(filters[0].options) == UINT64_MAX)
|
---|
46 | return LZMA_OPTIONS_ERROR;
|
---|
47 |
|
---|
48 | // Set the delta distance.
|
---|
49 | const lzma_options_delta *opt = filters[0].options;
|
---|
50 | coder->distance = opt->dist;
|
---|
51 |
|
---|
52 | // Initialize the rest of the variables.
|
---|
53 | coder->pos = 0;
|
---|
54 | memzero(coder->history, LZMA_DELTA_DIST_MAX);
|
---|
55 |
|
---|
56 | // Initialize the next decoder in the chain, if any.
|
---|
57 | return lzma_next_filter_init(&coder->next, allocator, filters + 1);
|
---|
58 | }
|
---|
59 |
|
---|
60 |
|
---|
61 | extern uint64_t
|
---|
62 | lzma_delta_coder_memusage(const void *options)
|
---|
63 | {
|
---|
64 | const lzma_options_delta *opt = options;
|
---|
65 |
|
---|
66 | if (opt == NULL || opt->type != LZMA_DELTA_TYPE_BYTE
|
---|
67 | || opt->dist < LZMA_DELTA_DIST_MIN
|
---|
68 | || opt->dist > LZMA_DELTA_DIST_MAX)
|
---|
69 | return UINT64_MAX;
|
---|
70 |
|
---|
71 | return sizeof(lzma_delta_coder);
|
---|
72 | }
|
---|