Imported Upstream version 9.20
[platform/upstream/7zip.git] / C / Delta.c
1 /* Delta.c -- Delta converter\r
2 2009-05-26 : Igor Pavlov : Public domain */\r
3 \r
4 #include "Delta.h"\r
5 \r
6 void Delta_Init(Byte *state)\r
7 {\r
8   unsigned i;\r
9   for (i = 0; i < DELTA_STATE_SIZE; i++)\r
10     state[i] = 0;\r
11 }\r
12 \r
13 static void MyMemCpy(Byte *dest, const Byte *src, unsigned size)\r
14 {\r
15   unsigned i;\r
16   for (i = 0; i < size; i++)\r
17     dest[i] = src[i];\r
18 }\r
19 \r
20 void Delta_Encode(Byte *state, unsigned delta, Byte *data, SizeT size)\r
21 {\r
22   Byte buf[DELTA_STATE_SIZE];\r
23   unsigned j = 0;\r
24   MyMemCpy(buf, state, delta);\r
25   {\r
26     SizeT i;\r
27     for (i = 0; i < size;)\r
28     {\r
29       for (j = 0; j < delta && i < size; i++, j++)\r
30       {\r
31         Byte b = data[i];\r
32         data[i] = (Byte)(b - buf[j]);\r
33         buf[j] = b;\r
34       }\r
35     }\r
36   }\r
37   if (j == delta)\r
38     j = 0;\r
39   MyMemCpy(state, buf + j, delta - j);\r
40   MyMemCpy(state + delta - j, buf, j);\r
41 }\r
42 \r
43 void Delta_Decode(Byte *state, unsigned delta, Byte *data, SizeT size)\r
44 {\r
45   Byte buf[DELTA_STATE_SIZE];\r
46   unsigned j = 0;\r
47   MyMemCpy(buf, state, delta);\r
48   {\r
49     SizeT i;\r
50     for (i = 0; i < size;)\r
51     {\r
52       for (j = 0; j < delta && i < size; i++, j++)\r
53       {\r
54         buf[j] = data[i] = (Byte)(buf[j] + data[i]);\r
55       }\r
56     }\r
57   }\r
58   if (j == delta)\r
59     j = 0;\r
60   MyMemCpy(state, buf + j, delta - j);\r
61   MyMemCpy(state + delta - j, buf, j);\r
62 }\r