zstdlib 0.1.0-x64-mingw32

Sign up to get free protection for your applications and to get access to all the features.
Files changed (104) hide show
  1. checksums.yaml +7 -0
  2. data/CHANGES.md +9 -0
  3. data/Gemfile +3 -0
  4. data/README.md +96 -0
  5. data/Rakefile +29 -0
  6. data/ext/zstdlib/extconf.rb +53 -0
  7. data/ext/zstdlib/ruby/zlib-2.2/zlib.c +4659 -0
  8. data/ext/zstdlib/ruby/zlib-2.3/zlib.c +4686 -0
  9. data/ext/zstdlib/ruby/zlib-2.4/zlib.c +4843 -0
  10. data/ext/zstdlib/ruby/zlib-2.5/zlib.c +4848 -0
  11. data/ext/zstdlib/ruby/zlib-2.6/zlib.c +4890 -0
  12. data/ext/zstdlib/zlib-1.2.11/adler32.c +186 -0
  13. data/ext/zstdlib/zlib-1.2.11/compress.c +86 -0
  14. data/ext/zstdlib/zlib-1.2.11/crc32.c +442 -0
  15. data/ext/zstdlib/zlib-1.2.11/crc32.h +441 -0
  16. data/ext/zstdlib/zlib-1.2.11/deflate.c +2163 -0
  17. data/ext/zstdlib/zlib-1.2.11/deflate.h +349 -0
  18. data/ext/zstdlib/zlib-1.2.11/gzclose.c +25 -0
  19. data/ext/zstdlib/zlib-1.2.11/gzguts.h +218 -0
  20. data/ext/zstdlib/zlib-1.2.11/gzlib.c +637 -0
  21. data/ext/zstdlib/zlib-1.2.11/gzread.c +654 -0
  22. data/ext/zstdlib/zlib-1.2.11/gzwrite.c +665 -0
  23. data/ext/zstdlib/zlib-1.2.11/infback.c +640 -0
  24. data/ext/zstdlib/zlib-1.2.11/inffast.c +323 -0
  25. data/ext/zstdlib/zlib-1.2.11/inffast.h +11 -0
  26. data/ext/zstdlib/zlib-1.2.11/inffixed.h +94 -0
  27. data/ext/zstdlib/zlib-1.2.11/inflate.c +1561 -0
  28. data/ext/zstdlib/zlib-1.2.11/inflate.h +125 -0
  29. data/ext/zstdlib/zlib-1.2.11/inftrees.c +304 -0
  30. data/ext/zstdlib/zlib-1.2.11/inftrees.h +62 -0
  31. data/ext/zstdlib/zlib-1.2.11/trees.c +1203 -0
  32. data/ext/zstdlib/zlib-1.2.11/trees.h +128 -0
  33. data/ext/zstdlib/zlib-1.2.11/uncompr.c +93 -0
  34. data/ext/zstdlib/zlib-1.2.11/zconf.h +534 -0
  35. data/ext/zstdlib/zlib-1.2.11/zlib.h +1912 -0
  36. data/ext/zstdlib/zlib-1.2.11/zutil.c +325 -0
  37. data/ext/zstdlib/zlib-1.2.11/zutil.h +271 -0
  38. data/ext/zstdlib/zlib.mk +14 -0
  39. data/ext/zstdlib/zlibwrapper.mk +14 -0
  40. data/ext/zstdlib/zlibwrapper/zlibwrapper.c +14 -0
  41. data/ext/zstdlib/zstd-1.3.8/lib/common/bitstream.h +455 -0
  42. data/ext/zstdlib/zstd-1.3.8/lib/common/compiler.h +140 -0
  43. data/ext/zstdlib/zstd-1.3.8/lib/common/cpu.h +215 -0
  44. data/ext/zstdlib/zstd-1.3.8/lib/common/debug.c +44 -0
  45. data/ext/zstdlib/zstd-1.3.8/lib/common/debug.h +134 -0
  46. data/ext/zstdlib/zstd-1.3.8/lib/common/entropy_common.c +236 -0
  47. data/ext/zstdlib/zstd-1.3.8/lib/common/error_private.c +54 -0
  48. data/ext/zstdlib/zstd-1.3.8/lib/common/error_private.h +76 -0
  49. data/ext/zstdlib/zstd-1.3.8/lib/common/fse.h +708 -0
  50. data/ext/zstdlib/zstd-1.3.8/lib/common/fse_decompress.c +309 -0
  51. data/ext/zstdlib/zstd-1.3.8/lib/common/huf.h +358 -0
  52. data/ext/zstdlib/zstd-1.3.8/lib/common/mem.h +380 -0
  53. data/ext/zstdlib/zstd-1.3.8/lib/common/pool.c +340 -0
  54. data/ext/zstdlib/zstd-1.3.8/lib/common/pool.h +84 -0
  55. data/ext/zstdlib/zstd-1.3.8/lib/common/threading.c +75 -0
  56. data/ext/zstdlib/zstd-1.3.8/lib/common/threading.h +123 -0
  57. data/ext/zstdlib/zstd-1.3.8/lib/common/xxhash.c +876 -0
  58. data/ext/zstdlib/zstd-1.3.8/lib/common/xxhash.h +305 -0
  59. data/ext/zstdlib/zstd-1.3.8/lib/common/zstd_common.c +83 -0
  60. data/ext/zstdlib/zstd-1.3.8/lib/common/zstd_errors.h +93 -0
  61. data/ext/zstdlib/zstd-1.3.8/lib/common/zstd_internal.h +266 -0
  62. data/ext/zstdlib/zstd-1.3.8/lib/compress/fse_compress.c +721 -0
  63. data/ext/zstdlib/zstd-1.3.8/lib/compress/hist.c +203 -0
  64. data/ext/zstdlib/zstd-1.3.8/lib/compress/hist.h +95 -0
  65. data/ext/zstdlib/zstd-1.3.8/lib/compress/huf_compress.c +798 -0
  66. data/ext/zstdlib/zstd-1.3.8/lib/compress/zstd_compress.c +4290 -0
  67. data/ext/zstdlib/zstd-1.3.8/lib/compress/zstd_compress_internal.h +860 -0
  68. data/ext/zstdlib/zstd-1.3.8/lib/compress/zstd_double_fast.c +499 -0
  69. data/ext/zstdlib/zstd-1.3.8/lib/compress/zstd_double_fast.h +38 -0
  70. data/ext/zstdlib/zstd-1.3.8/lib/compress/zstd_fast.c +391 -0
  71. data/ext/zstdlib/zstd-1.3.8/lib/compress/zstd_fast.h +37 -0
  72. data/ext/zstdlib/zstd-1.3.8/lib/compress/zstd_lazy.c +1106 -0
  73. data/ext/zstdlib/zstd-1.3.8/lib/compress/zstd_lazy.h +67 -0
  74. data/ext/zstdlib/zstd-1.3.8/lib/compress/zstd_ldm.c +597 -0
  75. data/ext/zstdlib/zstd-1.3.8/lib/compress/zstd_ldm.h +105 -0
  76. data/ext/zstdlib/zstd-1.3.8/lib/compress/zstd_opt.c +1217 -0
  77. data/ext/zstdlib/zstd-1.3.8/lib/compress/zstd_opt.h +56 -0
  78. data/ext/zstdlib/zstd-1.3.8/lib/compress/zstdmt_compress.c +2107 -0
  79. data/ext/zstdlib/zstd-1.3.8/lib/compress/zstdmt_compress.h +174 -0
  80. data/ext/zstdlib/zstd-1.3.8/lib/decompress/huf_decompress.c +1232 -0
  81. data/ext/zstdlib/zstd-1.3.8/lib/decompress/zstd_ddict.c +240 -0
  82. data/ext/zstdlib/zstd-1.3.8/lib/decompress/zstd_ddict.h +44 -0
  83. data/ext/zstdlib/zstd-1.3.8/lib/decompress/zstd_decompress.c +1672 -0
  84. data/ext/zstdlib/zstd-1.3.8/lib/decompress/zstd_decompress_block.c +1307 -0
  85. data/ext/zstdlib/zstd-1.3.8/lib/decompress/zstd_decompress_block.h +59 -0
  86. data/ext/zstdlib/zstd-1.3.8/lib/decompress/zstd_decompress_internal.h +168 -0
  87. data/ext/zstdlib/zstd-1.3.8/lib/zstd.h +1766 -0
  88. data/ext/zstdlib/zstd-1.3.8/zlibWrapper/gzclose.c +28 -0
  89. data/ext/zstdlib/zstd-1.3.8/zlibWrapper/gzcompatibility.h +68 -0
  90. data/ext/zstdlib/zstd-1.3.8/zlibWrapper/gzguts.h +227 -0
  91. data/ext/zstdlib/zstd-1.3.8/zlibWrapper/gzlib.c +640 -0
  92. data/ext/zstdlib/zstd-1.3.8/zlibWrapper/gzread.c +670 -0
  93. data/ext/zstdlib/zstd-1.3.8/zlibWrapper/gzwrite.c +671 -0
  94. data/ext/zstdlib/zstd-1.3.8/zlibWrapper/zstd_zlibwrapper.c +1105 -0
  95. data/ext/zstdlib/zstd-1.3.8/zlibWrapper/zstd_zlibwrapper.h +88 -0
  96. data/ext/zstdlib/zstd.mk +14 -0
  97. data/lib/2.2/zstdlib.so +0 -0
  98. data/lib/2.3/zstdlib.so +0 -0
  99. data/lib/2.4/zstdlib.so +0 -0
  100. data/lib/2.5/zstdlib.so +0 -0
  101. data/lib/2.6/zstdlib.so +0 -0
  102. data/lib/zstdlib.rb +6 -0
  103. data/test/zstdlib_test.rb +21 -0
  104. metadata +205 -0
@@ -0,0 +1,236 @@
1
+ /*
2
+ Common functions of New Generation Entropy library
3
+ Copyright (C) 2016, Yann Collet.
4
+
5
+ BSD 2-Clause License (http://www.opensource.org/licenses/bsd-license.php)
6
+
7
+ Redistribution and use in source and binary forms, with or without
8
+ modification, are permitted provided that the following conditions are
9
+ met:
10
+
11
+ * Redistributions of source code must retain the above copyright
12
+ notice, this list of conditions and the following disclaimer.
13
+ * Redistributions in binary form must reproduce the above
14
+ copyright notice, this list of conditions and the following disclaimer
15
+ in the documentation and/or other materials provided with the
16
+ distribution.
17
+
18
+ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
19
+ "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
20
+ LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
21
+ A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
22
+ OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
23
+ SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
24
+ LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
25
+ DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
26
+ THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
27
+ (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
28
+ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
29
+
30
+ You can contact the author at :
31
+ - FSE+HUF source repository : https://github.com/Cyan4973/FiniteStateEntropy
32
+ - Public forum : https://groups.google.com/forum/#!forum/lz4c
33
+ *************************************************************************** */
34
+
35
+ /* *************************************
36
+ * Dependencies
37
+ ***************************************/
38
+ #include "mem.h"
39
+ #include "error_private.h" /* ERR_*, ERROR */
40
+ #define FSE_STATIC_LINKING_ONLY /* FSE_MIN_TABLELOG */
41
+ #include "fse.h"
42
+ #define HUF_STATIC_LINKING_ONLY /* HUF_TABLELOG_ABSOLUTEMAX */
43
+ #include "huf.h"
44
+
45
+
46
+ /*=== Version ===*/
47
+ unsigned FSE_versionNumber(void) { return FSE_VERSION_NUMBER; }
48
+
49
+
50
+ /*=== Error Management ===*/
51
+ unsigned FSE_isError(size_t code) { return ERR_isError(code); }
52
+ const char* FSE_getErrorName(size_t code) { return ERR_getErrorName(code); }
53
+
54
+ unsigned HUF_isError(size_t code) { return ERR_isError(code); }
55
+ const char* HUF_getErrorName(size_t code) { return ERR_getErrorName(code); }
56
+
57
+
58
+ /*-**************************************************************
59
+ * FSE NCount encoding-decoding
60
+ ****************************************************************/
61
+ size_t FSE_readNCount (short* normalizedCounter, unsigned* maxSVPtr, unsigned* tableLogPtr,
62
+ const void* headerBuffer, size_t hbSize)
63
+ {
64
+ const BYTE* const istart = (const BYTE*) headerBuffer;
65
+ const BYTE* const iend = istart + hbSize;
66
+ const BYTE* ip = istart;
67
+ int nbBits;
68
+ int remaining;
69
+ int threshold;
70
+ U32 bitStream;
71
+ int bitCount;
72
+ unsigned charnum = 0;
73
+ int previous0 = 0;
74
+
75
+ if (hbSize < 4) {
76
+ /* This function only works when hbSize >= 4 */
77
+ char buffer[4];
78
+ memset(buffer, 0, sizeof(buffer));
79
+ memcpy(buffer, headerBuffer, hbSize);
80
+ { size_t const countSize = FSE_readNCount(normalizedCounter, maxSVPtr, tableLogPtr,
81
+ buffer, sizeof(buffer));
82
+ if (FSE_isError(countSize)) return countSize;
83
+ if (countSize > hbSize) return ERROR(corruption_detected);
84
+ return countSize;
85
+ } }
86
+ assert(hbSize >= 4);
87
+
88
+ /* init */
89
+ memset(normalizedCounter, 0, (*maxSVPtr+1) * sizeof(normalizedCounter[0])); /* all symbols not present in NCount have a frequency of 0 */
90
+ bitStream = MEM_readLE32(ip);
91
+ nbBits = (bitStream & 0xF) + FSE_MIN_TABLELOG; /* extract tableLog */
92
+ if (nbBits > FSE_TABLELOG_ABSOLUTE_MAX) return ERROR(tableLog_tooLarge);
93
+ bitStream >>= 4;
94
+ bitCount = 4;
95
+ *tableLogPtr = nbBits;
96
+ remaining = (1<<nbBits)+1;
97
+ threshold = 1<<nbBits;
98
+ nbBits++;
99
+
100
+ while ((remaining>1) & (charnum<=*maxSVPtr)) {
101
+ if (previous0) {
102
+ unsigned n0 = charnum;
103
+ while ((bitStream & 0xFFFF) == 0xFFFF) {
104
+ n0 += 24;
105
+ if (ip < iend-5) {
106
+ ip += 2;
107
+ bitStream = MEM_readLE32(ip) >> bitCount;
108
+ } else {
109
+ bitStream >>= 16;
110
+ bitCount += 16;
111
+ } }
112
+ while ((bitStream & 3) == 3) {
113
+ n0 += 3;
114
+ bitStream >>= 2;
115
+ bitCount += 2;
116
+ }
117
+ n0 += bitStream & 3;
118
+ bitCount += 2;
119
+ if (n0 > *maxSVPtr) return ERROR(maxSymbolValue_tooSmall);
120
+ while (charnum < n0) normalizedCounter[charnum++] = 0;
121
+ if ((ip <= iend-7) || (ip + (bitCount>>3) <= iend-4)) {
122
+ assert((bitCount >> 3) <= 3); /* For first condition to work */
123
+ ip += bitCount>>3;
124
+ bitCount &= 7;
125
+ bitStream = MEM_readLE32(ip) >> bitCount;
126
+ } else {
127
+ bitStream >>= 2;
128
+ } }
129
+ { int const max = (2*threshold-1) - remaining;
130
+ int count;
131
+
132
+ if ((bitStream & (threshold-1)) < (U32)max) {
133
+ count = bitStream & (threshold-1);
134
+ bitCount += nbBits-1;
135
+ } else {
136
+ count = bitStream & (2*threshold-1);
137
+ if (count >= threshold) count -= max;
138
+ bitCount += nbBits;
139
+ }
140
+
141
+ count--; /* extra accuracy */
142
+ remaining -= count < 0 ? -count : count; /* -1 means +1 */
143
+ normalizedCounter[charnum++] = (short)count;
144
+ previous0 = !count;
145
+ while (remaining < threshold) {
146
+ nbBits--;
147
+ threshold >>= 1;
148
+ }
149
+
150
+ if ((ip <= iend-7) || (ip + (bitCount>>3) <= iend-4)) {
151
+ ip += bitCount>>3;
152
+ bitCount &= 7;
153
+ } else {
154
+ bitCount -= (int)(8 * (iend - 4 - ip));
155
+ ip = iend - 4;
156
+ }
157
+ bitStream = MEM_readLE32(ip) >> (bitCount & 31);
158
+ } } /* while ((remaining>1) & (charnum<=*maxSVPtr)) */
159
+ if (remaining != 1) return ERROR(corruption_detected);
160
+ if (bitCount > 32) return ERROR(corruption_detected);
161
+ *maxSVPtr = charnum-1;
162
+
163
+ ip += (bitCount+7)>>3;
164
+ return ip-istart;
165
+ }
166
+
167
+
168
+ /*! HUF_readStats() :
169
+ Read compact Huffman tree, saved by HUF_writeCTable().
170
+ `huffWeight` is destination buffer.
171
+ `rankStats` is assumed to be a table of at least HUF_TABLELOG_MAX U32.
172
+ @return : size read from `src` , or an error Code .
173
+ Note : Needed by HUF_readCTable() and HUF_readDTableX?() .
174
+ */
175
+ size_t HUF_readStats(BYTE* huffWeight, size_t hwSize, U32* rankStats,
176
+ U32* nbSymbolsPtr, U32* tableLogPtr,
177
+ const void* src, size_t srcSize)
178
+ {
179
+ U32 weightTotal;
180
+ const BYTE* ip = (const BYTE*) src;
181
+ size_t iSize;
182
+ size_t oSize;
183
+
184
+ if (!srcSize) return ERROR(srcSize_wrong);
185
+ iSize = ip[0];
186
+ /* memset(huffWeight, 0, hwSize); *//* is not necessary, even though some analyzer complain ... */
187
+
188
+ if (iSize >= 128) { /* special header */
189
+ oSize = iSize - 127;
190
+ iSize = ((oSize+1)/2);
191
+ if (iSize+1 > srcSize) return ERROR(srcSize_wrong);
192
+ if (oSize >= hwSize) return ERROR(corruption_detected);
193
+ ip += 1;
194
+ { U32 n;
195
+ for (n=0; n<oSize; n+=2) {
196
+ huffWeight[n] = ip[n/2] >> 4;
197
+ huffWeight[n+1] = ip[n/2] & 15;
198
+ } } }
199
+ else { /* header compressed with FSE (normal case) */
200
+ FSE_DTable fseWorkspace[FSE_DTABLE_SIZE_U32(6)]; /* 6 is max possible tableLog for HUF header (maybe even 5, to be tested) */
201
+ if (iSize+1 > srcSize) return ERROR(srcSize_wrong);
202
+ oSize = FSE_decompress_wksp(huffWeight, hwSize-1, ip+1, iSize, fseWorkspace, 6); /* max (hwSize-1) values decoded, as last one is implied */
203
+ if (FSE_isError(oSize)) return oSize;
204
+ }
205
+
206
+ /* collect weight stats */
207
+ memset(rankStats, 0, (HUF_TABLELOG_MAX + 1) * sizeof(U32));
208
+ weightTotal = 0;
209
+ { U32 n; for (n=0; n<oSize; n++) {
210
+ if (huffWeight[n] >= HUF_TABLELOG_MAX) return ERROR(corruption_detected);
211
+ rankStats[huffWeight[n]]++;
212
+ weightTotal += (1 << huffWeight[n]) >> 1;
213
+ } }
214
+ if (weightTotal == 0) return ERROR(corruption_detected);
215
+
216
+ /* get last non-null symbol weight (implied, total must be 2^n) */
217
+ { U32 const tableLog = BIT_highbit32(weightTotal) + 1;
218
+ if (tableLog > HUF_TABLELOG_MAX) return ERROR(corruption_detected);
219
+ *tableLogPtr = tableLog;
220
+ /* determine last weight */
221
+ { U32 const total = 1 << tableLog;
222
+ U32 const rest = total - weightTotal;
223
+ U32 const verif = 1 << BIT_highbit32(rest);
224
+ U32 const lastWeight = BIT_highbit32(rest) + 1;
225
+ if (verif != rest) return ERROR(corruption_detected); /* last value must be a clean power of 2 */
226
+ huffWeight[oSize] = (BYTE)lastWeight;
227
+ rankStats[lastWeight]++;
228
+ } }
229
+
230
+ /* check tree construction validity */
231
+ if ((rankStats[1] < 2) || (rankStats[1] & 1)) return ERROR(corruption_detected); /* by construction : at least 2 elts of rank 1, must be even */
232
+
233
+ /* results */
234
+ *nbSymbolsPtr = (U32)(oSize+1);
235
+ return iSize+1;
236
+ }
@@ -0,0 +1,54 @@
1
+ /*
2
+ * Copyright (c) 2016-present, Yann Collet, Facebook, Inc.
3
+ * All rights reserved.
4
+ *
5
+ * This source code is licensed under both the BSD-style license (found in the
6
+ * LICENSE file in the root directory of this source tree) and the GPLv2 (found
7
+ * in the COPYING file in the root directory of this source tree).
8
+ * You may select, at your option, one of the above-listed licenses.
9
+ */
10
+
11
+ /* The purpose of this file is to have a single list of error strings embedded in binary */
12
+
13
+ #include "error_private.h"
14
+
15
+ const char* ERR_getErrorString(ERR_enum code)
16
+ {
17
+ #ifdef ZSTD_STRIP_ERROR_STRINGS
18
+ (void)code;
19
+ return "Error strings stripped";
20
+ #else
21
+ static const char* const notErrorCode = "Unspecified error code";
22
+ switch( code )
23
+ {
24
+ case PREFIX(no_error): return "No error detected";
25
+ case PREFIX(GENERIC): return "Error (generic)";
26
+ case PREFIX(prefix_unknown): return "Unknown frame descriptor";
27
+ case PREFIX(version_unsupported): return "Version not supported";
28
+ case PREFIX(frameParameter_unsupported): return "Unsupported frame parameter";
29
+ case PREFIX(frameParameter_windowTooLarge): return "Frame requires too much memory for decoding";
30
+ case PREFIX(corruption_detected): return "Corrupted block detected";
31
+ case PREFIX(checksum_wrong): return "Restored data doesn't match checksum";
32
+ case PREFIX(parameter_unsupported): return "Unsupported parameter";
33
+ case PREFIX(parameter_outOfBound): return "Parameter is out of bound";
34
+ case PREFIX(init_missing): return "Context should be init first";
35
+ case PREFIX(memory_allocation): return "Allocation error : not enough memory";
36
+ case PREFIX(workSpace_tooSmall): return "workSpace buffer is not large enough";
37
+ case PREFIX(stage_wrong): return "Operation not authorized at current processing stage";
38
+ case PREFIX(tableLog_tooLarge): return "tableLog requires too much memory : unsupported";
39
+ case PREFIX(maxSymbolValue_tooLarge): return "Unsupported max Symbol Value : too large";
40
+ case PREFIX(maxSymbolValue_tooSmall): return "Specified maxSymbolValue is too small";
41
+ case PREFIX(dictionary_corrupted): return "Dictionary is corrupted";
42
+ case PREFIX(dictionary_wrong): return "Dictionary mismatch";
43
+ case PREFIX(dictionaryCreation_failed): return "Cannot create Dictionary from provided samples";
44
+ case PREFIX(dstSize_tooSmall): return "Destination buffer is too small";
45
+ case PREFIX(srcSize_wrong): return "Src size is incorrect";
46
+ case PREFIX(dstBuffer_null): return "Operation on NULL destination buffer";
47
+ /* following error codes are not stable and may be removed or changed in a future version */
48
+ case PREFIX(frameIndex_tooLarge): return "Frame index is too large";
49
+ case PREFIX(seekableIO): return "An I/O error occurred when reading/seeking";
50
+ case PREFIX(maxCode):
51
+ default: return notErrorCode;
52
+ }
53
+ #endif
54
+ }
@@ -0,0 +1,76 @@
1
+ /*
2
+ * Copyright (c) 2016-present, Yann Collet, Facebook, Inc.
3
+ * All rights reserved.
4
+ *
5
+ * This source code is licensed under both the BSD-style license (found in the
6
+ * LICENSE file in the root directory of this source tree) and the GPLv2 (found
7
+ * in the COPYING file in the root directory of this source tree).
8
+ * You may select, at your option, one of the above-listed licenses.
9
+ */
10
+
11
+ /* Note : this module is expected to remain private, do not expose it */
12
+
13
+ #ifndef ERROR_H_MODULE
14
+ #define ERROR_H_MODULE
15
+
16
+ #if defined (__cplusplus)
17
+ extern "C" {
18
+ #endif
19
+
20
+
21
+ /* ****************************************
22
+ * Dependencies
23
+ ******************************************/
24
+ #include <stddef.h> /* size_t */
25
+ #include "zstd_errors.h" /* enum list */
26
+
27
+
28
+ /* ****************************************
29
+ * Compiler-specific
30
+ ******************************************/
31
+ #if defined(__GNUC__)
32
+ # define ERR_STATIC static __attribute__((unused))
33
+ #elif defined (__cplusplus) || (defined (__STDC_VERSION__) && (__STDC_VERSION__ >= 199901L) /* C99 */)
34
+ # define ERR_STATIC static inline
35
+ #elif defined(_MSC_VER)
36
+ # define ERR_STATIC static __inline
37
+ #else
38
+ # define ERR_STATIC static /* this version may generate warnings for unused static functions; disable the relevant warning */
39
+ #endif
40
+
41
+
42
+ /*-****************************************
43
+ * Customization (error_public.h)
44
+ ******************************************/
45
+ typedef ZSTD_ErrorCode ERR_enum;
46
+ #define PREFIX(name) ZSTD_error_##name
47
+
48
+
49
+ /*-****************************************
50
+ * Error codes handling
51
+ ******************************************/
52
+ #undef ERROR /* reported already defined on VS 2015 (Rich Geldreich) */
53
+ #define ERROR(name) ZSTD_ERROR(name)
54
+ #define ZSTD_ERROR(name) ((size_t)-PREFIX(name))
55
+
56
+ ERR_STATIC unsigned ERR_isError(size_t code) { return (code > ERROR(maxCode)); }
57
+
58
+ ERR_STATIC ERR_enum ERR_getErrorCode(size_t code) { if (!ERR_isError(code)) return (ERR_enum)0; return (ERR_enum) (0-code); }
59
+
60
+
61
+ /*-****************************************
62
+ * Error Strings
63
+ ******************************************/
64
+
65
+ const char* ERR_getErrorString(ERR_enum code); /* error_private.c */
66
+
67
+ ERR_STATIC const char* ERR_getErrorName(size_t code)
68
+ {
69
+ return ERR_getErrorString(ERR_getErrorCode(code));
70
+ }
71
+
72
+ #if defined (__cplusplus)
73
+ }
74
+ #endif
75
+
76
+ #endif /* ERROR_H_MODULE */
@@ -0,0 +1,708 @@
1
+ /* ******************************************************************
2
+ FSE : Finite State Entropy codec
3
+ Public Prototypes declaration
4
+ Copyright (C) 2013-2016, Yann Collet.
5
+
6
+ BSD 2-Clause License (http://www.opensource.org/licenses/bsd-license.php)
7
+
8
+ Redistribution and use in source and binary forms, with or without
9
+ modification, are permitted provided that the following conditions are
10
+ met:
11
+
12
+ * Redistributions of source code must retain the above copyright
13
+ notice, this list of conditions and the following disclaimer.
14
+ * Redistributions in binary form must reproduce the above
15
+ copyright notice, this list of conditions and the following disclaimer
16
+ in the documentation and/or other materials provided with the
17
+ distribution.
18
+
19
+ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
20
+ "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
21
+ LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
22
+ A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
23
+ OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
24
+ SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
25
+ LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
26
+ DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
27
+ THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
28
+ (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
29
+ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
30
+
31
+ You can contact the author at :
32
+ - Source repository : https://github.com/Cyan4973/FiniteStateEntropy
33
+ ****************************************************************** */
34
+
35
+ #if defined (__cplusplus)
36
+ extern "C" {
37
+ #endif
38
+
39
+ #ifndef FSE_H
40
+ #define FSE_H
41
+
42
+
43
+ /*-*****************************************
44
+ * Dependencies
45
+ ******************************************/
46
+ #include <stddef.h> /* size_t, ptrdiff_t */
47
+
48
+
49
+ /*-*****************************************
50
+ * FSE_PUBLIC_API : control library symbols visibility
51
+ ******************************************/
52
+ #if defined(FSE_DLL_EXPORT) && (FSE_DLL_EXPORT==1) && defined(__GNUC__) && (__GNUC__ >= 4)
53
+ # define FSE_PUBLIC_API __attribute__ ((visibility ("default")))
54
+ #elif defined(FSE_DLL_EXPORT) && (FSE_DLL_EXPORT==1) /* Visual expected */
55
+ # define FSE_PUBLIC_API __declspec(dllexport)
56
+ #elif defined(FSE_DLL_IMPORT) && (FSE_DLL_IMPORT==1)
57
+ # define FSE_PUBLIC_API __declspec(dllimport) /* It isn't required but allows to generate better code, saving a function pointer load from the IAT and an indirect jump.*/
58
+ #else
59
+ # define FSE_PUBLIC_API
60
+ #endif
61
+
62
+ /*------ Version ------*/
63
+ #define FSE_VERSION_MAJOR 0
64
+ #define FSE_VERSION_MINOR 9
65
+ #define FSE_VERSION_RELEASE 0
66
+
67
+ #define FSE_LIB_VERSION FSE_VERSION_MAJOR.FSE_VERSION_MINOR.FSE_VERSION_RELEASE
68
+ #define FSE_QUOTE(str) #str
69
+ #define FSE_EXPAND_AND_QUOTE(str) FSE_QUOTE(str)
70
+ #define FSE_VERSION_STRING FSE_EXPAND_AND_QUOTE(FSE_LIB_VERSION)
71
+
72
+ #define FSE_VERSION_NUMBER (FSE_VERSION_MAJOR *100*100 + FSE_VERSION_MINOR *100 + FSE_VERSION_RELEASE)
73
+ FSE_PUBLIC_API unsigned FSE_versionNumber(void); /**< library version number; to be used when checking dll version */
74
+
75
+
76
+ /*-****************************************
77
+ * FSE simple functions
78
+ ******************************************/
79
+ /*! FSE_compress() :
80
+ Compress content of buffer 'src', of size 'srcSize', into destination buffer 'dst'.
81
+ 'dst' buffer must be already allocated. Compression runs faster is dstCapacity >= FSE_compressBound(srcSize).
82
+ @return : size of compressed data (<= dstCapacity).
83
+ Special values : if return == 0, srcData is not compressible => Nothing is stored within dst !!!
84
+ if return == 1, srcData is a single byte symbol * srcSize times. Use RLE compression instead.
85
+ if FSE_isError(return), compression failed (more details using FSE_getErrorName())
86
+ */
87
+ FSE_PUBLIC_API size_t FSE_compress(void* dst, size_t dstCapacity,
88
+ const void* src, size_t srcSize);
89
+
90
+ /*! FSE_decompress():
91
+ Decompress FSE data from buffer 'cSrc', of size 'cSrcSize',
92
+ into already allocated destination buffer 'dst', of size 'dstCapacity'.
93
+ @return : size of regenerated data (<= maxDstSize),
94
+ or an error code, which can be tested using FSE_isError() .
95
+
96
+ ** Important ** : FSE_decompress() does not decompress non-compressible nor RLE data !!!
97
+ Why ? : making this distinction requires a header.
98
+ Header management is intentionally delegated to the user layer, which can better manage special cases.
99
+ */
100
+ FSE_PUBLIC_API size_t FSE_decompress(void* dst, size_t dstCapacity,
101
+ const void* cSrc, size_t cSrcSize);
102
+
103
+
104
+ /*-*****************************************
105
+ * Tool functions
106
+ ******************************************/
107
+ FSE_PUBLIC_API size_t FSE_compressBound(size_t size); /* maximum compressed size */
108
+
109
+ /* Error Management */
110
+ FSE_PUBLIC_API unsigned FSE_isError(size_t code); /* tells if a return value is an error code */
111
+ FSE_PUBLIC_API const char* FSE_getErrorName(size_t code); /* provides error code string (useful for debugging) */
112
+
113
+
114
+ /*-*****************************************
115
+ * FSE advanced functions
116
+ ******************************************/
117
+ /*! FSE_compress2() :
118
+ Same as FSE_compress(), but allows the selection of 'maxSymbolValue' and 'tableLog'
119
+ Both parameters can be defined as '0' to mean : use default value
120
+ @return : size of compressed data
121
+ Special values : if return == 0, srcData is not compressible => Nothing is stored within cSrc !!!
122
+ if return == 1, srcData is a single byte symbol * srcSize times. Use RLE compression.
123
+ if FSE_isError(return), it's an error code.
124
+ */
125
+ FSE_PUBLIC_API size_t FSE_compress2 (void* dst, size_t dstSize, const void* src, size_t srcSize, unsigned maxSymbolValue, unsigned tableLog);
126
+
127
+
128
+ /*-*****************************************
129
+ * FSE detailed API
130
+ ******************************************/
131
+ /*!
132
+ FSE_compress() does the following:
133
+ 1. count symbol occurrence from source[] into table count[] (see hist.h)
134
+ 2. normalize counters so that sum(count[]) == Power_of_2 (2^tableLog)
135
+ 3. save normalized counters to memory buffer using writeNCount()
136
+ 4. build encoding table 'CTable' from normalized counters
137
+ 5. encode the data stream using encoding table 'CTable'
138
+
139
+ FSE_decompress() does the following:
140
+ 1. read normalized counters with readNCount()
141
+ 2. build decoding table 'DTable' from normalized counters
142
+ 3. decode the data stream using decoding table 'DTable'
143
+
144
+ The following API allows targeting specific sub-functions for advanced tasks.
145
+ For example, it's possible to compress several blocks using the same 'CTable',
146
+ or to save and provide normalized distribution using external method.
147
+ */
148
+
149
+ /* *** COMPRESSION *** */
150
+
151
+ /*! FSE_optimalTableLog():
152
+ dynamically downsize 'tableLog' when conditions are met.
153
+ It saves CPU time, by using smaller tables, while preserving or even improving compression ratio.
154
+ @return : recommended tableLog (necessarily <= 'maxTableLog') */
155
+ FSE_PUBLIC_API unsigned FSE_optimalTableLog(unsigned maxTableLog, size_t srcSize, unsigned maxSymbolValue);
156
+
157
+ /*! FSE_normalizeCount():
158
+ normalize counts so that sum(count[]) == Power_of_2 (2^tableLog)
159
+ 'normalizedCounter' is a table of short, of minimum size (maxSymbolValue+1).
160
+ @return : tableLog,
161
+ or an errorCode, which can be tested using FSE_isError() */
162
+ FSE_PUBLIC_API size_t FSE_normalizeCount(short* normalizedCounter, unsigned tableLog,
163
+ const unsigned* count, size_t srcSize, unsigned maxSymbolValue);
164
+
165
+ /*! FSE_NCountWriteBound():
166
+ Provides the maximum possible size of an FSE normalized table, given 'maxSymbolValue' and 'tableLog'.
167
+ Typically useful for allocation purpose. */
168
+ FSE_PUBLIC_API size_t FSE_NCountWriteBound(unsigned maxSymbolValue, unsigned tableLog);
169
+
170
+ /*! FSE_writeNCount():
171
+ Compactly save 'normalizedCounter' into 'buffer'.
172
+ @return : size of the compressed table,
173
+ or an errorCode, which can be tested using FSE_isError(). */
174
+ FSE_PUBLIC_API size_t FSE_writeNCount (void* buffer, size_t bufferSize,
175
+ const short* normalizedCounter,
176
+ unsigned maxSymbolValue, unsigned tableLog);
177
+
178
+ /*! Constructor and Destructor of FSE_CTable.
179
+ Note that FSE_CTable size depends on 'tableLog' and 'maxSymbolValue' */
180
+ typedef unsigned FSE_CTable; /* don't allocate that. It's only meant to be more restrictive than void* */
181
+ FSE_PUBLIC_API FSE_CTable* FSE_createCTable (unsigned maxSymbolValue, unsigned tableLog);
182
+ FSE_PUBLIC_API void FSE_freeCTable (FSE_CTable* ct);
183
+
184
+ /*! FSE_buildCTable():
185
+ Builds `ct`, which must be already allocated, using FSE_createCTable().
186
+ @return : 0, or an errorCode, which can be tested using FSE_isError() */
187
+ FSE_PUBLIC_API size_t FSE_buildCTable(FSE_CTable* ct, const short* normalizedCounter, unsigned maxSymbolValue, unsigned tableLog);
188
+
189
+ /*! FSE_compress_usingCTable():
190
+ Compress `src` using `ct` into `dst` which must be already allocated.
191
+ @return : size of compressed data (<= `dstCapacity`),
192
+ or 0 if compressed data could not fit into `dst`,
193
+ or an errorCode, which can be tested using FSE_isError() */
194
+ FSE_PUBLIC_API size_t FSE_compress_usingCTable (void* dst, size_t dstCapacity, const void* src, size_t srcSize, const FSE_CTable* ct);
195
+
196
+ /*!
197
+ Tutorial :
198
+ ----------
199
+ The first step is to count all symbols. FSE_count() does this job very fast.
200
+ Result will be saved into 'count', a table of unsigned int, which must be already allocated, and have 'maxSymbolValuePtr[0]+1' cells.
201
+ 'src' is a table of bytes of size 'srcSize'. All values within 'src' MUST be <= maxSymbolValuePtr[0]
202
+ maxSymbolValuePtr[0] will be updated, with its real value (necessarily <= original value)
203
+ FSE_count() will return the number of occurrence of the most frequent symbol.
204
+ This can be used to know if there is a single symbol within 'src', and to quickly evaluate its compressibility.
205
+ If there is an error, the function will return an ErrorCode (which can be tested using FSE_isError()).
206
+
207
+ The next step is to normalize the frequencies.
208
+ FSE_normalizeCount() will ensure that sum of frequencies is == 2 ^'tableLog'.
209
+ It also guarantees a minimum of 1 to any Symbol with frequency >= 1.
210
+ You can use 'tableLog'==0 to mean "use default tableLog value".
211
+ If you are unsure of which tableLog value to use, you can ask FSE_optimalTableLog(),
212
+ which will provide the optimal valid tableLog given sourceSize, maxSymbolValue, and a user-defined maximum (0 means "default").
213
+
214
+ The result of FSE_normalizeCount() will be saved into a table,
215
+ called 'normalizedCounter', which is a table of signed short.
216
+ 'normalizedCounter' must be already allocated, and have at least 'maxSymbolValue+1' cells.
217
+ The return value is tableLog if everything proceeded as expected.
218
+ It is 0 if there is a single symbol within distribution.
219
+ If there is an error (ex: invalid tableLog value), the function will return an ErrorCode (which can be tested using FSE_isError()).
220
+
221
+ 'normalizedCounter' can be saved in a compact manner to a memory area using FSE_writeNCount().
222
+ 'buffer' must be already allocated.
223
+ For guaranteed success, buffer size must be at least FSE_headerBound().
224
+ The result of the function is the number of bytes written into 'buffer'.
225
+ If there is an error, the function will return an ErrorCode (which can be tested using FSE_isError(); ex : buffer size too small).
226
+
227
+ 'normalizedCounter' can then be used to create the compression table 'CTable'.
228
+ The space required by 'CTable' must be already allocated, using FSE_createCTable().
229
+ You can then use FSE_buildCTable() to fill 'CTable'.
230
+ If there is an error, both functions will return an ErrorCode (which can be tested using FSE_isError()).
231
+
232
+ 'CTable' can then be used to compress 'src', with FSE_compress_usingCTable().
233
+ Similar to FSE_count(), the convention is that 'src' is assumed to be a table of char of size 'srcSize'
234
+ The function returns the size of compressed data (without header), necessarily <= `dstCapacity`.
235
+ If it returns '0', compressed data could not fit into 'dst'.
236
+ If there is an error, the function will return an ErrorCode (which can be tested using FSE_isError()).
237
+ */
238
+
239
+
240
+ /* *** DECOMPRESSION *** */
241
+
242
+ /*! FSE_readNCount():
243
+ Read compactly saved 'normalizedCounter' from 'rBuffer'.
244
+ @return : size read from 'rBuffer',
245
+ or an errorCode, which can be tested using FSE_isError().
246
+ maxSymbolValuePtr[0] and tableLogPtr[0] will also be updated with their respective values */
247
+ FSE_PUBLIC_API size_t FSE_readNCount (short* normalizedCounter,
248
+ unsigned* maxSymbolValuePtr, unsigned* tableLogPtr,
249
+ const void* rBuffer, size_t rBuffSize);
250
+
251
+ /*! Constructor and Destructor of FSE_DTable.
252
+ Note that its size depends on 'tableLog' */
253
+ typedef unsigned FSE_DTable; /* don't allocate that. It's just a way to be more restrictive than void* */
254
+ FSE_PUBLIC_API FSE_DTable* FSE_createDTable(unsigned tableLog);
255
+ FSE_PUBLIC_API void FSE_freeDTable(FSE_DTable* dt);
256
+
257
+ /*! FSE_buildDTable():
258
+ Builds 'dt', which must be already allocated, using FSE_createDTable().
259
+ return : 0, or an errorCode, which can be tested using FSE_isError() */
260
+ FSE_PUBLIC_API size_t FSE_buildDTable (FSE_DTable* dt, const short* normalizedCounter, unsigned maxSymbolValue, unsigned tableLog);
261
+
262
+ /*! FSE_decompress_usingDTable():
263
+ Decompress compressed source `cSrc` of size `cSrcSize` using `dt`
264
+ into `dst` which must be already allocated.
265
+ @return : size of regenerated data (necessarily <= `dstCapacity`),
266
+ or an errorCode, which can be tested using FSE_isError() */
267
+ FSE_PUBLIC_API size_t FSE_decompress_usingDTable(void* dst, size_t dstCapacity, const void* cSrc, size_t cSrcSize, const FSE_DTable* dt);
268
+
269
+ /*!
270
+ Tutorial :
271
+ ----------
272
+ (Note : these functions only decompress FSE-compressed blocks.
273
+ If block is uncompressed, use memcpy() instead
274
+ If block is a single repeated byte, use memset() instead )
275
+
276
+ The first step is to obtain the normalized frequencies of symbols.
277
+ This can be performed by FSE_readNCount() if it was saved using FSE_writeNCount().
278
+ 'normalizedCounter' must be already allocated, and have at least 'maxSymbolValuePtr[0]+1' cells of signed short.
279
+ In practice, that means it's necessary to know 'maxSymbolValue' beforehand,
280
+ or size the table to handle worst case situations (typically 256).
281
+ FSE_readNCount() will provide 'tableLog' and 'maxSymbolValue'.
282
+ The result of FSE_readNCount() is the number of bytes read from 'rBuffer'.
283
+ Note that 'rBufferSize' must be at least 4 bytes, even if useful information is less than that.
284
+ If there is an error, the function will return an error code, which can be tested using FSE_isError().
285
+
286
+ The next step is to build the decompression tables 'FSE_DTable' from 'normalizedCounter'.
287
+ This is performed by the function FSE_buildDTable().
288
+ The space required by 'FSE_DTable' must be already allocated using FSE_createDTable().
289
+ If there is an error, the function will return an error code, which can be tested using FSE_isError().
290
+
291
+ `FSE_DTable` can then be used to decompress `cSrc`, with FSE_decompress_usingDTable().
292
+ `cSrcSize` must be strictly correct, otherwise decompression will fail.
293
+ FSE_decompress_usingDTable() result will tell how many bytes were regenerated (<=`dstCapacity`).
294
+ If there is an error, the function will return an error code, which can be tested using FSE_isError(). (ex: dst buffer too small)
295
+ */
296
+
297
+ #endif /* FSE_H */
298
+
299
+ #if defined(FSE_STATIC_LINKING_ONLY) && !defined(FSE_H_FSE_STATIC_LINKING_ONLY)
300
+ #define FSE_H_FSE_STATIC_LINKING_ONLY
301
+
302
+ /* *** Dependency *** */
303
+ #include "bitstream.h"
304
+
305
+
306
+ /* *****************************************
307
+ * Static allocation
308
+ *******************************************/
309
+ /* FSE buffer bounds */
310
+ #define FSE_NCOUNTBOUND 512
311
+ #define FSE_BLOCKBOUND(size) (size + (size>>7))
312
+ #define FSE_COMPRESSBOUND(size) (FSE_NCOUNTBOUND + FSE_BLOCKBOUND(size)) /* Macro version, useful for static allocation */
313
+
314
+ /* It is possible to statically allocate FSE CTable/DTable as a table of FSE_CTable/FSE_DTable using below macros */
315
+ #define FSE_CTABLE_SIZE_U32(maxTableLog, maxSymbolValue) (1 + (1<<(maxTableLog-1)) + ((maxSymbolValue+1)*2))
316
+ #define FSE_DTABLE_SIZE_U32(maxTableLog) (1 + (1<<maxTableLog))
317
+
318
+ /* or use the size to malloc() space directly. Pay attention to alignment restrictions though */
319
+ #define FSE_CTABLE_SIZE(maxTableLog, maxSymbolValue) (FSE_CTABLE_SIZE_U32(maxTableLog, maxSymbolValue) * sizeof(FSE_CTable))
320
+ #define FSE_DTABLE_SIZE(maxTableLog) (FSE_DTABLE_SIZE_U32(maxTableLog) * sizeof(FSE_DTable))
321
+
322
+
323
+ /* *****************************************
324
+ * FSE advanced API
325
+ ***************************************** */
326
+
327
+ unsigned FSE_optimalTableLog_internal(unsigned maxTableLog, size_t srcSize, unsigned maxSymbolValue, unsigned minus);
328
+ /**< same as FSE_optimalTableLog(), which used `minus==2` */
329
+
330
+ /* FSE_compress_wksp() :
331
+ * Same as FSE_compress2(), but using an externally allocated scratch buffer (`workSpace`).
332
+ * FSE_WKSP_SIZE_U32() provides the minimum size required for `workSpace` as a table of FSE_CTable.
333
+ */
334
+ #define FSE_WKSP_SIZE_U32(maxTableLog, maxSymbolValue) ( FSE_CTABLE_SIZE_U32(maxTableLog, maxSymbolValue) + ((maxTableLog > 12) ? (1 << (maxTableLog - 2)) : 1024) )
335
+ size_t FSE_compress_wksp (void* dst, size_t dstSize, const void* src, size_t srcSize, unsigned maxSymbolValue, unsigned tableLog, void* workSpace, size_t wkspSize);
336
+
337
+ size_t FSE_buildCTable_raw (FSE_CTable* ct, unsigned nbBits);
338
+ /**< build a fake FSE_CTable, designed for a flat distribution, where each symbol uses nbBits */
339
+
340
+ size_t FSE_buildCTable_rle (FSE_CTable* ct, unsigned char symbolValue);
341
+ /**< build a fake FSE_CTable, designed to compress always the same symbolValue */
342
+
343
+ /* FSE_buildCTable_wksp() :
344
+ * Same as FSE_buildCTable(), but using an externally allocated scratch buffer (`workSpace`).
345
+ * `wkspSize` must be >= `(1<<tableLog)`.
346
+ */
347
+ size_t FSE_buildCTable_wksp(FSE_CTable* ct, const short* normalizedCounter, unsigned maxSymbolValue, unsigned tableLog, void* workSpace, size_t wkspSize);
348
+
349
+ size_t FSE_buildDTable_raw (FSE_DTable* dt, unsigned nbBits);
350
+ /**< build a fake FSE_DTable, designed to read a flat distribution where each symbol uses nbBits */
351
+
352
+ size_t FSE_buildDTable_rle (FSE_DTable* dt, unsigned char symbolValue);
353
+ /**< build a fake FSE_DTable, designed to always generate the same symbolValue */
354
+
355
+ size_t FSE_decompress_wksp(void* dst, size_t dstCapacity, const void* cSrc, size_t cSrcSize, FSE_DTable* workSpace, unsigned maxLog);
356
+ /**< same as FSE_decompress(), using an externally allocated `workSpace` produced with `FSE_DTABLE_SIZE_U32(maxLog)` */
357
+
358
+ typedef enum {
359
+ FSE_repeat_none, /**< Cannot use the previous table */
360
+ FSE_repeat_check, /**< Can use the previous table but it must be checked */
361
+ FSE_repeat_valid /**< Can use the previous table and it is asumed to be valid */
362
+ } FSE_repeat;
363
+
364
+ /* *****************************************
365
+ * FSE symbol compression API
366
+ *******************************************/
367
+ /*!
368
+ This API consists of small unitary functions, which highly benefit from being inlined.
369
+ Hence their body are included in next section.
370
+ */
371
+ typedef struct {
372
+ ptrdiff_t value;
373
+ const void* stateTable;
374
+ const void* symbolTT;
375
+ unsigned stateLog;
376
+ } FSE_CState_t;
377
+
378
+ static void FSE_initCState(FSE_CState_t* CStatePtr, const FSE_CTable* ct);
379
+
380
+ static void FSE_encodeSymbol(BIT_CStream_t* bitC, FSE_CState_t* CStatePtr, unsigned symbol);
381
+
382
+ static void FSE_flushCState(BIT_CStream_t* bitC, const FSE_CState_t* CStatePtr);
383
+
384
+ /**<
385
+ These functions are inner components of FSE_compress_usingCTable().
386
+ They allow the creation of custom streams, mixing multiple tables and bit sources.
387
+
388
+ A key property to keep in mind is that encoding and decoding are done **in reverse direction**.
389
+ So the first symbol you will encode is the last you will decode, like a LIFO stack.
390
+
391
+ You will need a few variables to track your CStream. They are :
392
+
393
+ FSE_CTable ct; // Provided by FSE_buildCTable()
394
+ BIT_CStream_t bitStream; // bitStream tracking structure
395
+ FSE_CState_t state; // State tracking structure (can have several)
396
+
397
+
398
+ The first thing to do is to init bitStream and state.
399
+ size_t errorCode = BIT_initCStream(&bitStream, dstBuffer, maxDstSize);
400
+ FSE_initCState(&state, ct);
401
+
402
+ Note that BIT_initCStream() can produce an error code, so its result should be tested, using FSE_isError();
403
+ You can then encode your input data, byte after byte.
404
+ FSE_encodeSymbol() outputs a maximum of 'tableLog' bits at a time.
405
+ Remember decoding will be done in reverse direction.
406
+ FSE_encodeByte(&bitStream, &state, symbol);
407
+
408
+ At any time, you can also add any bit sequence.
409
+ Note : maximum allowed nbBits is 25, for compatibility with 32-bits decoders
410
+ BIT_addBits(&bitStream, bitField, nbBits);
411
+
412
+ The above methods don't commit data to memory, they just store it into local register, for speed.
413
+ Local register size is 64-bits on 64-bits systems, 32-bits on 32-bits systems (size_t).
414
+ Writing data to memory is a manual operation, performed by the flushBits function.
415
+ BIT_flushBits(&bitStream);
416
+
417
+ Your last FSE encoding operation shall be to flush your last state value(s).
418
+ FSE_flushState(&bitStream, &state);
419
+
420
+ Finally, you must close the bitStream.
421
+ The function returns the size of CStream in bytes.
422
+ If data couldn't fit into dstBuffer, it will return a 0 ( == not compressible)
423
+ If there is an error, it returns an errorCode (which can be tested using FSE_isError()).
424
+ size_t size = BIT_closeCStream(&bitStream);
425
+ */
426
+
427
+
428
+ /* *****************************************
429
+ * FSE symbol decompression API
430
+ *******************************************/
431
+ typedef struct {
432
+ size_t state;
433
+ const void* table; /* precise table may vary, depending on U16 */
434
+ } FSE_DState_t;
435
+
436
+
437
+ static void FSE_initDState(FSE_DState_t* DStatePtr, BIT_DStream_t* bitD, const FSE_DTable* dt);
438
+
439
+ static unsigned char FSE_decodeSymbol(FSE_DState_t* DStatePtr, BIT_DStream_t* bitD);
440
+
441
+ static unsigned FSE_endOfDState(const FSE_DState_t* DStatePtr);
442
+
443
+ /**<
444
+ Let's now decompose FSE_decompress_usingDTable() into its unitary components.
445
+ You will decode FSE-encoded symbols from the bitStream,
446
+ and also any other bitFields you put in, **in reverse order**.
447
+
448
+ You will need a few variables to track your bitStream. They are :
449
+
450
+ BIT_DStream_t DStream; // Stream context
451
+ FSE_DState_t DState; // State context. Multiple ones are possible
452
+ FSE_DTable* DTablePtr; // Decoding table, provided by FSE_buildDTable()
453
+
454
+ The first thing to do is to init the bitStream.
455
+ errorCode = BIT_initDStream(&DStream, srcBuffer, srcSize);
456
+
457
+ You should then retrieve your initial state(s)
458
+ (in reverse flushing order if you have several ones) :
459
+ errorCode = FSE_initDState(&DState, &DStream, DTablePtr);
460
+
461
+ You can then decode your data, symbol after symbol.
462
+ For information the maximum number of bits read by FSE_decodeSymbol() is 'tableLog'.
463
+ Keep in mind that symbols are decoded in reverse order, like a LIFO stack (last in, first out).
464
+ unsigned char symbol = FSE_decodeSymbol(&DState, &DStream);
465
+
466
+ You can retrieve any bitfield you eventually stored into the bitStream (in reverse order)
467
+ Note : maximum allowed nbBits is 25, for 32-bits compatibility
468
+ size_t bitField = BIT_readBits(&DStream, nbBits);
469
+
470
+ All above operations only read from local register (which size depends on size_t).
471
+ Refueling the register from memory is manually performed by the reload method.
472
+ endSignal = FSE_reloadDStream(&DStream);
473
+
474
+ BIT_reloadDStream() result tells if there is still some more data to read from DStream.
475
+ BIT_DStream_unfinished : there is still some data left into the DStream.
476
+ BIT_DStream_endOfBuffer : Dstream reached end of buffer. Its container may no longer be completely filled.
477
+ BIT_DStream_completed : Dstream reached its exact end, corresponding in general to decompression completed.
478
+ BIT_DStream_tooFar : Dstream went too far. Decompression result is corrupted.
479
+
480
+ When reaching end of buffer (BIT_DStream_endOfBuffer), progress slowly, notably if you decode multiple symbols per loop,
481
+ to properly detect the exact end of stream.
482
+ After each decoded symbol, check if DStream is fully consumed using this simple test :
483
+ BIT_reloadDStream(&DStream) >= BIT_DStream_completed
484
+
485
+ When it's done, verify decompression is fully completed, by checking both DStream and the relevant states.
486
+ Checking if DStream has reached its end is performed by :
487
+ BIT_endOfDStream(&DStream);
488
+ Check also the states. There might be some symbols left there, if some high probability ones (>50%) are possible.
489
+ FSE_endOfDState(&DState);
490
+ */
491
+
492
+
493
+ /* *****************************************
494
+ * FSE unsafe API
495
+ *******************************************/
496
+ static unsigned char FSE_decodeSymbolFast(FSE_DState_t* DStatePtr, BIT_DStream_t* bitD);
497
+ /* faster, but works only if nbBits is always >= 1 (otherwise, result will be corrupted) */
498
+
499
+
500
+ /* *****************************************
501
+ * Implementation of inlined functions
502
+ *******************************************/
503
+ typedef struct {
504
+ int deltaFindState;
505
+ U32 deltaNbBits;
506
+ } FSE_symbolCompressionTransform; /* total 8 bytes */
507
+
508
+ MEM_STATIC void FSE_initCState(FSE_CState_t* statePtr, const FSE_CTable* ct)
509
+ {
510
+ const void* ptr = ct;
511
+ const U16* u16ptr = (const U16*) ptr;
512
+ const U32 tableLog = MEM_read16(ptr);
513
+ statePtr->value = (ptrdiff_t)1<<tableLog;
514
+ statePtr->stateTable = u16ptr+2;
515
+ statePtr->symbolTT = ct + 1 + (tableLog ? (1<<(tableLog-1)) : 1);
516
+ statePtr->stateLog = tableLog;
517
+ }
518
+
519
+
520
+ /*! FSE_initCState2() :
521
+ * Same as FSE_initCState(), but the first symbol to include (which will be the last to be read)
522
+ * uses the smallest state value possible, saving the cost of this symbol */
523
+ MEM_STATIC void FSE_initCState2(FSE_CState_t* statePtr, const FSE_CTable* ct, U32 symbol)
524
+ {
525
+ FSE_initCState(statePtr, ct);
526
+ { const FSE_symbolCompressionTransform symbolTT = ((const FSE_symbolCompressionTransform*)(statePtr->symbolTT))[symbol];
527
+ const U16* stateTable = (const U16*)(statePtr->stateTable);
528
+ U32 nbBitsOut = (U32)((symbolTT.deltaNbBits + (1<<15)) >> 16);
529
+ statePtr->value = (nbBitsOut << 16) - symbolTT.deltaNbBits;
530
+ statePtr->value = stateTable[(statePtr->value >> nbBitsOut) + symbolTT.deltaFindState];
531
+ }
532
+ }
533
+
534
+ MEM_STATIC void FSE_encodeSymbol(BIT_CStream_t* bitC, FSE_CState_t* statePtr, unsigned symbol)
535
+ {
536
+ FSE_symbolCompressionTransform const symbolTT = ((const FSE_symbolCompressionTransform*)(statePtr->symbolTT))[symbol];
537
+ const U16* const stateTable = (const U16*)(statePtr->stateTable);
538
+ U32 const nbBitsOut = (U32)((statePtr->value + symbolTT.deltaNbBits) >> 16);
539
+ BIT_addBits(bitC, statePtr->value, nbBitsOut);
540
+ statePtr->value = stateTable[ (statePtr->value >> nbBitsOut) + symbolTT.deltaFindState];
541
+ }
542
+
543
+ MEM_STATIC void FSE_flushCState(BIT_CStream_t* bitC, const FSE_CState_t* statePtr)
544
+ {
545
+ BIT_addBits(bitC, statePtr->value, statePtr->stateLog);
546
+ BIT_flushBits(bitC);
547
+ }
548
+
549
+
550
+ /* FSE_getMaxNbBits() :
551
+ * Approximate maximum cost of a symbol, in bits.
552
+ * Fractional get rounded up (i.e : a symbol with a normalized frequency of 3 gives the same result as a frequency of 2)
553
+ * note 1 : assume symbolValue is valid (<= maxSymbolValue)
554
+ * note 2 : if freq[symbolValue]==0, @return a fake cost of tableLog+1 bits */
555
+ MEM_STATIC U32 FSE_getMaxNbBits(const void* symbolTTPtr, U32 symbolValue)
556
+ {
557
+ const FSE_symbolCompressionTransform* symbolTT = (const FSE_symbolCompressionTransform*) symbolTTPtr;
558
+ return (symbolTT[symbolValue].deltaNbBits + ((1<<16)-1)) >> 16;
559
+ }
560
+
561
+ /* FSE_bitCost() :
562
+ * Approximate symbol cost, as fractional value, using fixed-point format (accuracyLog fractional bits)
563
+ * note 1 : assume symbolValue is valid (<= maxSymbolValue)
564
+ * note 2 : if freq[symbolValue]==0, @return a fake cost of tableLog+1 bits */
565
+ MEM_STATIC U32 FSE_bitCost(const void* symbolTTPtr, U32 tableLog, U32 symbolValue, U32 accuracyLog)
566
+ {
567
+ const FSE_symbolCompressionTransform* symbolTT = (const FSE_symbolCompressionTransform*) symbolTTPtr;
568
+ U32 const minNbBits = symbolTT[symbolValue].deltaNbBits >> 16;
569
+ U32 const threshold = (minNbBits+1) << 16;
570
+ assert(tableLog < 16);
571
+ assert(accuracyLog < 31-tableLog); /* ensure enough room for renormalization double shift */
572
+ { U32 const tableSize = 1 << tableLog;
573
+ U32 const deltaFromThreshold = threshold - (symbolTT[symbolValue].deltaNbBits + tableSize);
574
+ U32 const normalizedDeltaFromThreshold = (deltaFromThreshold << accuracyLog) >> tableLog; /* linear interpolation (very approximate) */
575
+ U32 const bitMultiplier = 1 << accuracyLog;
576
+ assert(symbolTT[symbolValue].deltaNbBits + tableSize <= threshold);
577
+ assert(normalizedDeltaFromThreshold <= bitMultiplier);
578
+ return (minNbBits+1)*bitMultiplier - normalizedDeltaFromThreshold;
579
+ }
580
+ }
581
+
582
+
583
+ /* ====== Decompression ====== */
584
+
585
+ typedef struct {
586
+ U16 tableLog;
587
+ U16 fastMode;
588
+ } FSE_DTableHeader; /* sizeof U32 */
589
+
590
+ typedef struct
591
+ {
592
+ unsigned short newState;
593
+ unsigned char symbol;
594
+ unsigned char nbBits;
595
+ } FSE_decode_t; /* size == U32 */
596
+
597
+ MEM_STATIC void FSE_initDState(FSE_DState_t* DStatePtr, BIT_DStream_t* bitD, const FSE_DTable* dt)
598
+ {
599
+ const void* ptr = dt;
600
+ const FSE_DTableHeader* const DTableH = (const FSE_DTableHeader*)ptr;
601
+ DStatePtr->state = BIT_readBits(bitD, DTableH->tableLog);
602
+ BIT_reloadDStream(bitD);
603
+ DStatePtr->table = dt + 1;
604
+ }
605
+
606
+ MEM_STATIC BYTE FSE_peekSymbol(const FSE_DState_t* DStatePtr)
607
+ {
608
+ FSE_decode_t const DInfo = ((const FSE_decode_t*)(DStatePtr->table))[DStatePtr->state];
609
+ return DInfo.symbol;
610
+ }
611
+
612
+ MEM_STATIC void FSE_updateState(FSE_DState_t* DStatePtr, BIT_DStream_t* bitD)
613
+ {
614
+ FSE_decode_t const DInfo = ((const FSE_decode_t*)(DStatePtr->table))[DStatePtr->state];
615
+ U32 const nbBits = DInfo.nbBits;
616
+ size_t const lowBits = BIT_readBits(bitD, nbBits);
617
+ DStatePtr->state = DInfo.newState + lowBits;
618
+ }
619
+
620
+ MEM_STATIC BYTE FSE_decodeSymbol(FSE_DState_t* DStatePtr, BIT_DStream_t* bitD)
621
+ {
622
+ FSE_decode_t const DInfo = ((const FSE_decode_t*)(DStatePtr->table))[DStatePtr->state];
623
+ U32 const nbBits = DInfo.nbBits;
624
+ BYTE const symbol = DInfo.symbol;
625
+ size_t const lowBits = BIT_readBits(bitD, nbBits);
626
+
627
+ DStatePtr->state = DInfo.newState + lowBits;
628
+ return symbol;
629
+ }
630
+
631
+ /*! FSE_decodeSymbolFast() :
632
+ unsafe, only works if no symbol has a probability > 50% */
633
+ MEM_STATIC BYTE FSE_decodeSymbolFast(FSE_DState_t* DStatePtr, BIT_DStream_t* bitD)
634
+ {
635
+ FSE_decode_t const DInfo = ((const FSE_decode_t*)(DStatePtr->table))[DStatePtr->state];
636
+ U32 const nbBits = DInfo.nbBits;
637
+ BYTE const symbol = DInfo.symbol;
638
+ size_t const lowBits = BIT_readBitsFast(bitD, nbBits);
639
+
640
+ DStatePtr->state = DInfo.newState + lowBits;
641
+ return symbol;
642
+ }
643
+
644
+ MEM_STATIC unsigned FSE_endOfDState(const FSE_DState_t* DStatePtr)
645
+ {
646
+ return DStatePtr->state == 0;
647
+ }
648
+
649
+
650
+
651
+ #ifndef FSE_COMMONDEFS_ONLY
652
+
653
+ /* **************************************************************
654
+ * Tuning parameters
655
+ ****************************************************************/
656
+ /*!MEMORY_USAGE :
657
+ * Memory usage formula : N->2^N Bytes (examples : 10 -> 1KB; 12 -> 4KB ; 16 -> 64KB; 20 -> 1MB; etc.)
658
+ * Increasing memory usage improves compression ratio
659
+ * Reduced memory usage can improve speed, due to cache effect
660
+ * Recommended max value is 14, for 16KB, which nicely fits into Intel x86 L1 cache */
661
+ #ifndef FSE_MAX_MEMORY_USAGE
662
+ # define FSE_MAX_MEMORY_USAGE 14
663
+ #endif
664
+ #ifndef FSE_DEFAULT_MEMORY_USAGE
665
+ # define FSE_DEFAULT_MEMORY_USAGE 13
666
+ #endif
667
+
668
+ /*!FSE_MAX_SYMBOL_VALUE :
669
+ * Maximum symbol value authorized.
670
+ * Required for proper stack allocation */
671
+ #ifndef FSE_MAX_SYMBOL_VALUE
672
+ # define FSE_MAX_SYMBOL_VALUE 255
673
+ #endif
674
+
675
+ /* **************************************************************
676
+ * template functions type & suffix
677
+ ****************************************************************/
678
+ #define FSE_FUNCTION_TYPE BYTE
679
+ #define FSE_FUNCTION_EXTENSION
680
+ #define FSE_DECODE_TYPE FSE_decode_t
681
+
682
+
683
+ #endif /* !FSE_COMMONDEFS_ONLY */
684
+
685
+
686
+ /* ***************************************************************
687
+ * Constants
688
+ *****************************************************************/
689
+ #define FSE_MAX_TABLELOG (FSE_MAX_MEMORY_USAGE-2)
690
+ #define FSE_MAX_TABLESIZE (1U<<FSE_MAX_TABLELOG)
691
+ #define FSE_MAXTABLESIZE_MASK (FSE_MAX_TABLESIZE-1)
692
+ #define FSE_DEFAULT_TABLELOG (FSE_DEFAULT_MEMORY_USAGE-2)
693
+ #define FSE_MIN_TABLELOG 5
694
+
695
+ #define FSE_TABLELOG_ABSOLUTE_MAX 15
696
+ #if FSE_MAX_TABLELOG > FSE_TABLELOG_ABSOLUTE_MAX
697
+ # error "FSE_MAX_TABLELOG > FSE_TABLELOG_ABSOLUTE_MAX is not supported"
698
+ #endif
699
+
700
+ #define FSE_TABLESTEP(tableSize) ((tableSize>>1) + (tableSize>>3) + 3)
701
+
702
+
703
+ #endif /* FSE_STATIC_LINKING_ONLY */
704
+
705
+
706
+ #if defined (__cplusplus)
707
+ }
708
+ #endif