Delta.c 3.0 KB

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