Coverage Report

Created: 2025-06-16 07:00

/src/xz/src/liblzma/delta/delta_common.c
Line
Count
Source (jump to first uncovered line)
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
74
{
19
74
  lzma_delta_coder *coder = coder_ptr;
20
74
  lzma_next_end(&coder->next, allocator);
21
74
  lzma_free(coder, allocator);
22
74
  return;
23
74
}
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
75
{
30
  // Allocate memory for the decoder if needed.
31
75
  lzma_delta_coder *coder = next->coder;
32
75
  if (coder == NULL) {
33
74
    coder = lzma_alloc(sizeof(lzma_delta_coder), allocator);
34
74
    if (coder == NULL)
35
0
      return LZMA_MEM_ERROR;
36
37
74
    next->coder = coder;
38
39
    // End function is the same for encoder and decoder.
40
74
    next->end = &delta_coder_end;
41
74
    coder->next = LZMA_NEXT_CODER_INIT;
42
74
  }
43
44
  // Validate the options.
45
75
  if (lzma_delta_coder_memusage(filters[0].options) == UINT64_MAX)
46
0
    return LZMA_OPTIONS_ERROR;
47
48
  // Set the delta distance.
49
75
  const lzma_options_delta *opt = filters[0].options;
50
75
  coder->distance = opt->dist;
51
52
  // Initialize the rest of the variables.
53
75
  coder->pos = 0;
54
75
  memzero(coder->history, LZMA_DELTA_DIST_MAX);
55
56
  // Initialize the next decoder in the chain, if any.
57
75
  return lzma_next_filter_init(&coder->next, allocator, filters + 1);
58
75
}
59
60
61
extern uint64_t
62
lzma_delta_coder_memusage(const void *options)
63
150
{
64
150
  const lzma_options_delta *opt = options;
65
66
150
  if (opt == NULL || opt->type != LZMA_DELTA_TYPE_BYTE
67
150
      || opt->dist < LZMA_DELTA_DIST_MIN
68
150
      || opt->dist > LZMA_DELTA_DIST_MAX)
69
0
    return UINT64_MAX;
70
71
150
  return sizeof(lzma_delta_coder);
72
150
}