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