Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
stenzek
GitHub Repository: stenzek/duckstation
Path: blob/master/dep/lzma/src/Delta.c
4253 views
1
/* Delta.c -- Delta converter
2
2021-02-09 : Igor Pavlov : Public domain */
3
4
#include "Precomp.h"
5
6
#include "Delta.h"
7
8
void Delta_Init(Byte *state)
9
{
10
unsigned i;
11
for (i = 0; i < DELTA_STATE_SIZE; i++)
12
state[i] = 0;
13
}
14
15
16
void Delta_Encode(Byte *state, unsigned delta, Byte *data, SizeT size)
17
{
18
Byte temp[DELTA_STATE_SIZE];
19
20
if (size == 0)
21
return;
22
23
{
24
unsigned i = 0;
25
do
26
temp[i] = state[i];
27
while (++i != delta);
28
}
29
30
if (size <= delta)
31
{
32
unsigned i = 0, k;
33
do
34
{
35
Byte b = *data;
36
*data++ = (Byte)(b - temp[i]);
37
temp[i] = b;
38
}
39
while (++i != size);
40
41
k = 0;
42
43
do
44
{
45
if (i == delta)
46
i = 0;
47
state[k] = temp[i++];
48
}
49
while (++k != delta);
50
51
return;
52
}
53
54
{
55
Byte *p = data + size - delta;
56
{
57
unsigned i = 0;
58
do
59
state[i] = *p++;
60
while (++i != delta);
61
}
62
{
63
const Byte *lim = data + delta;
64
ptrdiff_t dif = -(ptrdiff_t)delta;
65
66
if (((ptrdiff_t)size + dif) & 1)
67
{
68
--p; *p = (Byte)(*p - p[dif]);
69
}
70
71
while (p != lim)
72
{
73
--p; *p = (Byte)(*p - p[dif]);
74
--p; *p = (Byte)(*p - p[dif]);
75
}
76
77
dif = -dif;
78
79
do
80
{
81
--p; *p = (Byte)(*p - temp[--dif]);
82
}
83
while (dif != 0);
84
}
85
}
86
}
87
88
89
void Delta_Decode(Byte *state, unsigned delta, Byte *data, SizeT size)
90
{
91
unsigned i;
92
const Byte *lim;
93
94
if (size == 0)
95
return;
96
97
i = 0;
98
lim = data + size;
99
100
if (size <= delta)
101
{
102
do
103
*data = (Byte)(*data + state[i++]);
104
while (++data != lim);
105
106
for (; delta != i; state++, delta--)
107
*state = state[i];
108
data -= i;
109
}
110
else
111
{
112
/*
113
#define B(n) b ## n
114
#define I(n) Byte B(n) = state[n];
115
#define U(n) { B(n) = (Byte)((B(n)) + *data++); data[-1] = (B(n)); }
116
#define F(n) if (data != lim) { U(n) }
117
118
if (delta == 1)
119
{
120
I(0)
121
if ((lim - data) & 1) { U(0) }
122
while (data != lim) { U(0) U(0) }
123
data -= 1;
124
}
125
else if (delta == 2)
126
{
127
I(0) I(1)
128
lim -= 1; while (data < lim) { U(0) U(1) }
129
lim += 1; F(0)
130
data -= 2;
131
}
132
else if (delta == 3)
133
{
134
I(0) I(1) I(2)
135
lim -= 2; while (data < lim) { U(0) U(1) U(2) }
136
lim += 2; F(0) F(1)
137
data -= 3;
138
}
139
else if (delta == 4)
140
{
141
I(0) I(1) I(2) I(3)
142
lim -= 3; while (data < lim) { U(0) U(1) U(2) U(3) }
143
lim += 3; F(0) F(1) F(2)
144
data -= 4;
145
}
146
else
147
*/
148
{
149
do
150
{
151
*data = (Byte)(*data + state[i++]);
152
data++;
153
}
154
while (i != delta);
155
156
{
157
ptrdiff_t dif = -(ptrdiff_t)delta;
158
do
159
*data = (Byte)(*data + data[dif]);
160
while (++data != lim);
161
data += dif;
162
}
163
}
164
}
165
166
do
167
*state++ = *data;
168
while (++data != lim);
169
}
170
171