Rizin
unix-like reverse engineering framework and cli tools
delta_encoder.c
Go to the documentation of this file.
1 //
5 //
6 // Author: Lasse Collin
7 //
8 // This file has been put into the public domain.
9 // You can do whatever you want with this file.
10 //
12 
13 #include "delta_encoder.h"
14 #include "delta_private.h"
15 
16 
20 static void
22  const uint8_t *restrict in, uint8_t *restrict out, size_t size)
23 {
24  const size_t distance = coder->distance;
25 
26  for (size_t i = 0; i < size; ++i) {
27  const uint8_t tmp = coder->history[
28  (distance + coder->pos) & 0xFF];
29  coder->history[coder->pos-- & 0xFF] = in[i];
30  out[i] = in[i] - tmp;
31  }
32 }
33 
34 
37 static void
39 {
40  const size_t distance = coder->distance;
41 
42  for (size_t i = 0; i < size; ++i) {
43  const uint8_t tmp = coder->history[
44  (distance + coder->pos) & 0xFF];
45  coder->history[coder->pos-- & 0xFF] = buffer[i];
46  buffer[i] -= tmp;
47  }
48 }
49 
50 
51 static lzma_ret
52 delta_encode(void *coder_ptr, const lzma_allocator *allocator,
53  const uint8_t *restrict in, size_t *restrict in_pos,
54  size_t in_size, uint8_t *restrict out,
55  size_t *restrict out_pos, size_t out_size, lzma_action action)
56 {
57  lzma_delta_coder *coder = coder_ptr;
58 
59  lzma_ret ret;
60 
61  if (coder->next.code == NULL) {
62  const size_t in_avail = in_size - *in_pos;
63  const size_t out_avail = out_size - *out_pos;
64  const size_t size = my_min(in_avail, out_avail);
65 
66  copy_and_encode(coder, in + *in_pos, out + *out_pos, size);
67 
68  *in_pos += size;
69  *out_pos += size;
70 
71  ret = action != LZMA_RUN && *in_pos == in_size
73 
74  } else {
75  const size_t out_start = *out_pos;
76 
77  ret = coder->next.code(coder->next.coder, allocator,
78  in, in_pos, in_size, out, out_pos, out_size,
79  action);
80 
81  encode_in_place(coder, out + out_start, *out_pos - out_start);
82  }
83 
84  return ret;
85 }
86 
87 
88 static lzma_ret
90  const lzma_filter *filters_null lzma_attribute((__unused__)),
91  const lzma_filter *reversed_filters)
92 {
93  lzma_delta_coder *coder = coder_ptr;
94 
95  // Delta doesn't and will never support changing the options in
96  // the middle of encoding. If the app tries to change them, we
97  // simply ignore them.
99  &coder->next, allocator, reversed_filters + 1);
100 }
101 
102 
103 extern lzma_ret
105  const lzma_filter_info *filters)
106 {
107  next->code = &delta_encode;
108  next->update = &delta_encoder_update;
109  return lzma_delta_coder_init(next, allocator, filters);
110 }
111 
112 
113 extern lzma_ret
115 {
116  // The caller must have already validated the options, so it's
117  // LZMA_PROG_ERROR if they are invalid.
119  return LZMA_PROG_ERROR;
120 
121  const lzma_options_delta *opt = options;
122  out[0] = opt->dist - LZMA_DELTA_DIST_MIN;
123 
124  return LZMA_OK;
125 }
lzma_index ** i
Definition: index.h:629
const lzma_allocator const uint8_t size_t uint8_t size_t * out_pos
Definition: block.h:528
const lzma_allocator const uint8_t size_t * in_pos
Definition: block.h:579
const lzma_allocator const uint8_t size_t in_size
Definition: block.h:527
const lzma_allocator * allocator
Definition: block.h:377
const lzma_allocator const uint8_t * in
Definition: block.h:527
const lzma_allocator const uint8_t size_t uint8_t * out
Definition: block.h:528
const lzma_filter * filters
Definition: container.h:315
#define NULL
Definition: cris-opc.c:27
#define LZMA_DELTA_DIST_MIN
Definition: delta.h:60
uint64_t lzma_delta_coder_memusage(const void *options)
Definition: delta_common.c:63
lzma_ret lzma_delta_coder_init(lzma_next_coder *next, const lzma_allocator *allocator, const lzma_filter_info *filters)
Definition: delta_common.c:28
static lzma_ret delta_encode(void *coder_ptr, const lzma_allocator *allocator, const uint8_t *restrict in, size_t *restrict in_pos, size_t in_size, uint8_t *restrict out, size_t *restrict out_pos, size_t out_size, lzma_action action)
Definition: delta_encoder.c:52
static void encode_in_place(lzma_delta_coder *coder, uint8_t *buffer, size_t size)
Definition: delta_encoder.c:38
static lzma_ret delta_encoder_update(void *coder_ptr, const lzma_allocator *allocator, const lzma_filter *filters_null lzma_attribute((__unused__)), const lzma_filter *reversed_filters)
Definition: delta_encoder.c:89
lzma_ret lzma_delta_props_encode(const void *options, uint8_t *out)
static void copy_and_encode(lzma_delta_coder *coder, const uint8_t *restrict in, uint8_t *restrict out, size_t size)
Definition: delta_encoder.c:21
lzma_ret lzma_delta_encoder_init(lzma_next_coder *next, const lzma_allocator *allocator, const lzma_filter_info *filters)
Delta filter encoder.
Private common stuff for Delta encoder and decoder.
voidpf void uLong size
Definition: ioapi.h:138
#define restrict
static const char struct stat static buf struct stat static buf static vhangup int options
Definition: sflib.h:145
#define lzma_attribute(attr)
Definition: lzma.h:259
unsigned char uint8_t
Definition: sftypes.h:31
#define UINT64_MAX
Definition: buffer.h:15
Custom functions for memory handling.
Definition: base.h:372
lzma_next_coder next
Next coder in the chain.
Definition: delta_private.h:20
uint8_t pos
Position in history[].
Definition: delta_private.h:26
uint8_t history[LZMA_DELTA_DIST_MAX]
Buffer to hold history of the original data.
Definition: delta_private.h:29
size_t distance
Delta distance.
Definition: delta_private.h:23
Filter options.
Definition: filter.h:43
Hold data and function pointers of the next filter in the chain.
Definition: common.h:135
lzma_code_function code
Pointer to function to do the actual coding.
Definition: common.h:150
void * coder
Pointer to coder-specific data.
Definition: common.h:137
lzma_ret(* update)(void *coder, const lzma_allocator *allocator, const lzma_filter *filters, const lzma_filter *reversed_filters)
Definition: common.h:173
Options for the Delta filter.
Definition: delta.h:45
uint32_t dist
Delta distance.
Definition: delta.h:59
#define my_min(x, y)
Definition: sysdefs.h:185
lzma_ret
Return values used by several functions in liblzma.
Definition: base.h:57
@ LZMA_PROG_ERROR
Programming error.
Definition: base.h:218
@ LZMA_STREAM_END
End of stream was reached.
Definition: base.h:63
@ LZMA_OK
Operation completed successfully.
Definition: base.h:58
lzma_action
The ‘action’ argument for lzma_code()
Definition: base.h:250
@ LZMA_RUN
Continue coding.
Definition: base.h:251
lzma_ret lzma_next_filter_update(lzma_next_coder *next, const lzma_allocator *allocator, const lzma_filter *reversed_filters)
Definition: common.c:127