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