Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
Kitware
GitHub Repository: Kitware/CMake
Path: blob/master/Utilities/cmliblzma/liblzma/delta/delta_common.c
3156 views
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
}
73
74