Subversion Repositories Games.Chess Giants

Rev

Blame | Last modification | View Log | Download | RSS feed

  1. /* wrap.c */
  2.  
  3. /*
  4. This Software is distributed with the following X11 License,
  5. sometimes also known as MIT license.
  6.  
  7. Copyright (c) 2010 Miguel A. Ballicora
  8.  
  9.  Permission is hereby granted, free of charge, to any person
  10.  obtaining a copy of this software and associated documentation
  11.  files (the "Software"), to deal in the Software without
  12.  restriction, including without limitation the rights to use,
  13.  copy, modify, merge, publish, distribute, sublicense, and/or sell
  14.  copies of the Software, and to permit persons to whom the
  15.  Software is furnished to do so, subject to the following
  16.  conditions:
  17.  
  18.  The above copyright notice and this permission notice shall be
  19.  included in all copies or substantial portions of the Software.
  20.  
  21.  THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
  22.  EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
  23.  OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
  24.  NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
  25.  HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
  26.  WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
  27.  FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
  28.  OTHER DEALINGS IN THE SOFTWARE.
  29. */
  30.  
  31. #include "wrap.h"
  32.  
  33. #if defined(LZMA86)
  34. #include "Lzma86Enc.h"
  35. #include "Lzma86Dec.h"
  36. #endif
  37.  
  38. #if defined(ZLIB)
  39. #include "zlib.h"
  40. #endif
  41.  
  42. #if defined(HUFFMAN)
  43. #include "hzip.h"
  44. #endif
  45.  
  46. #if defined(LIBLZF)
  47. #include "lzf.h"
  48. #endif
  49.  
  50. #if defined(LIBBZIP2)
  51. #include "bzlib.h"
  52. #endif
  53.  
  54. #if !defined(NDEBUG)
  55. #define NDEBUG
  56. #endif
  57. #ifdef DEBUG
  58. #undef NDEBUG
  59. #endif
  60. #include "assert.h"
  61.  
  62. /* external, so the compiler can be silenced */
  63. size_t TB_DUMMY_unused;
  64.  
  65. /***********************************************************************************************************/
  66.  
  67. #if defined(ZLIB)
  68. extern int
  69. zlib_encode
  70. (const unsigned char *in_start, size_t in_len, unsigned char *out_start, size_t *pout_len, size_t out_max)
  71. {
  72.         enum COMPRESSION_LEVELS {ZLIB_MAXIMUM_COMPRESSION = 9};
  73.         int outcome;
  74.         unsigned long zz = (unsigned long)out_max;
  75.         outcome = compress2 (out_start, &zz, in_start, in_len, ZLIB_MAXIMUM_COMPRESSION);
  76.         *pout_len = (size_t) zz;
  77.         return outcome == Z_OK;
  78. }
  79.  
  80. extern int
  81. zlib_decode
  82. (const unsigned char *in_start, size_t in_len, unsigned char *out_start, size_t *pout_len, size_t out_max)
  83. {
  84.         int outcome;
  85.         unsigned long nn = (unsigned long) out_max /* *pout_len */;
  86.         outcome = uncompress (out_start, &nn, in_start, (unsigned long)in_len);
  87.         *pout_len = (size_t)nn;
  88.         return outcome == Z_OK;
  89. }
  90. #endif
  91.  
  92. /***********************************************************************************************************/
  93.  
  94. #if defined(LIBLZF)
  95. extern int
  96. lzf_encode
  97. (const unsigned char *in_start, size_t in_len, unsigned char *out_start, size_t *pout_len, size_t out_max)
  98. {
  99.         size_t x = lzf_compress (in_start, (unsigned)in_len, out_start, (unsigned)(in_len-1) /* ensures best compression */);
  100.         TB_DUMMY_unused = out_max;
  101.         if (x != 0)
  102.                 *pout_len = (size_t) x;
  103.         return x != 0;
  104. }
  105.  
  106. extern int
  107. lzf_decode
  108. (const unsigned char *in_start, size_t in_len, unsigned char *out_start, size_t *pout_len, size_t out_max)
  109. {
  110.         *pout_len = (size_t)lzf_decompress (in_start, (unsigned)in_len, out_start, (unsigned)out_max);
  111.         return *pout_len != 0;
  112. }
  113. #endif
  114.  
  115. /***********************************************************************************************************/
  116.  
  117. #if defined(LZMA86)
  118. extern int
  119. lzma_encode
  120. (const unsigned char *in_start, size_t in_len, unsigned char *out_start, size_t *pout_len, size_t out_max)
  121. {
  122.         int level  =    5;                      /* 5 => default compression level */
  123.         unsigned int memory = 4096;     /* dictionary size */
  124.         int filter = SZ_FILTER_NO;      /* => 0, use LZMA, do not try to optimize with x86 filter */
  125.         size_t zz  = out_max;           /* maximum memory allowed, receives back the actual size */
  126.         int x      = Lzma86_Encode(out_start, &zz, in_start, in_len, level, memory, filter);
  127.         *pout_len  = zz;
  128.         return x == 0;
  129. }
  130.  
  131. extern int
  132. lzma_decode
  133. (const unsigned char *in_start, size_t in_len, unsigned char *out_start, size_t *pout_len, size_t out_max)
  134. {
  135.                 size_t nn = out_max;
  136.                 int x = Lzma86_Decode(out_start, &nn, in_start, &in_len);
  137.                 *pout_len = nn;
  138.                 return x == SZ_OK;
  139. }
  140. #endif
  141.  
  142. /***********************************************************************************************************/
  143.  
  144. #if defined (LIBBZIP2)
  145.  
  146. extern int
  147. bzip2_encode
  148. (const unsigned char *in_start, size_t in_len, unsigned char *out_start, size_t *pout_len, size_t out_max)
  149. {
  150.         int     blockSize100k =  9;
  151.         int verbosity     =  0;
  152.         int workFactor    = 30;
  153.         size_t destlen    = out_max;
  154.  
  155.         int x = BZ2_bzBuffToBuffCompress( (char*)out_start, &destlen, (char*)in_start, in_len,
  156.                                                                 blockSize100k, verbosity, workFactor);
  157.         *pout_len = destlen;
  158.         return x == BZ_OK;
  159. }
  160.  
  161. extern int
  162. bzip2_decode
  163. (const unsigned char *in_start, size_t in_len, unsigned char *out_start, size_t *pout_len, size_t out_max)
  164. {
  165.         int     small      = 1;
  166.         int verbosity  = 0;
  167.         size_t destlen = n;
  168.  
  169.         int x = BZ2_bzBuffToBuffDecompress( (char*)out_start, &destlen, (char*)in_start, in_len,
  170.                                small, verbosity);
  171.         *pout_len = destlen;
  172.         return x == BZ_OK;
  173. }
  174.  
  175. #endif
  176.  
  177. /***********************************************************************************************************/
  178.  
  179. extern int
  180. justcopy_encode
  181. (const unsigned char *in_start, size_t in_len, unsigned char *out_start, size_t *pout_len, size_t out_max)
  182. {
  183.         size_t i;
  184.         const unsigned char *in  = in_start;
  185.                   unsigned char *out = out_start;
  186.  
  187.         if (in_len > out_max)
  188.                 return 0;
  189.  
  190.         for (i = 0; i < in_len; i++) {
  191.                 *out++ = *in++;
  192.         }
  193.         *pout_len = in_len;
  194.         return 1;
  195. }
  196.  
  197. extern int
  198. justcopy_decode
  199. (const unsigned char *in_start, size_t in_len, unsigned char *out_start, size_t *pout_len, size_t out_max)
  200. {
  201.         size_t i;
  202.         const unsigned char *in  = in_start;
  203.                   unsigned char *out = out_start;
  204.  
  205.         if (in_len > out_max)
  206.                 return 0;
  207.  
  208.         for (i = 0; i < in_len; i++) {
  209.                 *out++ = *in++;
  210.         }
  211.         *pout_len = in_len;
  212.         return 1;
  213. }
  214.  
  215. /***********************************************************************************************************/
  216.  
  217. #define RLE_ESC 253
  218. #define RLE_TER 254
  219. #define RLE_MAX 252
  220. #define TRUE 1
  221. #define FALSE 0
  222.  
  223. extern int
  224. rle_encode
  225. (const unsigned char *in_start, size_t in_len, unsigned char *out_start, size_t *pout_len, size_t out_max)
  226. {
  227.         const unsigned char *p;
  228.         const unsigned char *in      = in_start;
  229.         const unsigned char *in_end  = in  + in_len;
  230.         unsigned char       *out     = out_start;
  231.         int ok = TRUE;
  232.         int ch;
  233.         ptrdiff_t out_len;
  234.  
  235.         while (in < in_end)
  236.         {
  237.                 if (*in == RLE_ESC) {
  238.  
  239.                         *out++ = RLE_ESC;
  240.                         *out++ = RLE_ESC;
  241.                         in++;
  242.  
  243.                 } else {
  244.  
  245.                         ch = *in;
  246.  
  247.                         if ( (in_end-in) >= 3 /* enough space for a run */
  248.                                 && ch == in[1] && ch == in[2] && ch == in[3] /* enough length */) {
  249.  
  250.                                 p = in;
  251.                                 while (p < in_end && *p == ch && (p-in) < RLE_MAX) {
  252.                                         p++;
  253.                                 }
  254.  
  255.                                 *out++ = RLE_ESC;
  256.                                 assert (RLE_MAX < 256);
  257.                                 *out++ = (unsigned char)(p - in);
  258.                                 *out++ = (unsigned char)ch;
  259.                                 in = p;
  260.  
  261.                         } else {
  262.                                 *out++ = *in++;
  263.                         }
  264.                 }
  265.         }
  266.  
  267.         if (ok) {
  268.                 /*      *out++ = RLE_ESC; *out++ = RLE_TER; */
  269.                 out_len = out - out_start;
  270.                 *pout_len = (size_t)out_len;
  271.                 ok = (size_t)out_len <= out_max;
  272.         }
  273.  
  274.         return ok;
  275. }
  276.  
  277. extern int
  278. rle_decode
  279. (const unsigned char *in_start, size_t in_len, unsigned char *out_start, size_t *pout_len, size_t out_max)
  280. {
  281.         const unsigned char *in  = in_start;
  282.         const unsigned char *in_end  = in  + in_len;
  283.                   unsigned char *out = out_start;
  284.                   unsigned char *out_end = out + *pout_len;
  285.         int ok = TRUE;
  286.         int ch;
  287.         int n;
  288.         ptrdiff_t out_len;
  289.  
  290.         while (in < in_end)
  291.         {
  292.                                                                         if (in  >=  in_end) { ok = FALSE; break;}
  293.                                                                         if (out >= out_end) { ok = FALSE; break;}
  294.  
  295.                 if (*in == RLE_ESC) {
  296.                         ++in;                                   if (in >= in_end) { ok = FALSE; break;}
  297.  
  298.                         if (*in == RLE_ESC) {
  299.                                 *out++ = *in++;
  300.                         } /*else if (*in == RLE_TER) {ok = TRUE;break;} */ else {
  301.  
  302.                                 /* rle */
  303.                                 n  = *in++;             if (in >= in_end) { ok = FALSE; break;}
  304.                                 ch = *in++;
  305.                                 while (n-->0) {         if (out >= out_end) { ok = FALSE; break;}
  306.                                         *out++ = (unsigned char)ch;
  307.                                 }
  308.                         }
  309.                 } else {
  310.                         *out++ = *in++;
  311.                 }
  312.         }
  313.  
  314.         out_len = out - out_start;
  315.  
  316.         if (ok)
  317.                 *pout_len = (size_t)out_len;
  318.  
  319.         ok = ok && (out_max >= (size_t)out_len);
  320.  
  321.         return ok;
  322. }
  323.  
  324.  
  325.  
  326.  
  327.  
  328.  
  329.  
  330.  
  331.  
  332.  
  333.  
  334.  
  335.  
  336.  
  337.  
  338.  
  339.