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