extzstd 0.2 → 0.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (88) hide show
  1. checksums.yaml +4 -4
  2. data/HISTORY.ja.md +13 -0
  3. data/README.md +17 -14
  4. data/contrib/zstd/{NEWS → CHANGELOG} +115 -2
  5. data/contrib/zstd/CODE_OF_CONDUCT.md +5 -0
  6. data/contrib/zstd/Makefile +99 -53
  7. data/contrib/zstd/README.md +59 -39
  8. data/contrib/zstd/TESTING.md +1 -1
  9. data/contrib/zstd/appveyor.yml +17 -6
  10. data/contrib/zstd/lib/BUCK +29 -2
  11. data/contrib/zstd/lib/Makefile +118 -21
  12. data/contrib/zstd/lib/README.md +84 -44
  13. data/contrib/zstd/lib/common/bitstream.h +17 -33
  14. data/contrib/zstd/lib/common/compiler.h +62 -8
  15. data/contrib/zstd/lib/common/cpu.h +215 -0
  16. data/contrib/zstd/lib/common/debug.c +44 -0
  17. data/contrib/zstd/lib/common/debug.h +134 -0
  18. data/contrib/zstd/lib/common/entropy_common.c +16 -1
  19. data/contrib/zstd/lib/common/error_private.c +7 -0
  20. data/contrib/zstd/lib/common/fse.h +48 -44
  21. data/contrib/zstd/lib/common/fse_decompress.c +3 -3
  22. data/contrib/zstd/lib/common/huf.h +169 -113
  23. data/contrib/zstd/lib/common/mem.h +20 -2
  24. data/contrib/zstd/lib/common/pool.c +135 -49
  25. data/contrib/zstd/lib/common/pool.h +40 -21
  26. data/contrib/zstd/lib/common/threading.c +2 -2
  27. data/contrib/zstd/lib/common/threading.h +12 -12
  28. data/contrib/zstd/lib/common/xxhash.c +3 -2
  29. data/contrib/zstd/lib/common/zstd_common.c +3 -6
  30. data/contrib/zstd/lib/common/zstd_errors.h +17 -7
  31. data/contrib/zstd/lib/common/zstd_internal.h +76 -48
  32. data/contrib/zstd/lib/compress/fse_compress.c +89 -209
  33. data/contrib/zstd/lib/compress/hist.c +203 -0
  34. data/contrib/zstd/lib/compress/hist.h +95 -0
  35. data/contrib/zstd/lib/compress/huf_compress.c +188 -80
  36. data/contrib/zstd/lib/compress/zstd_compress.c +2500 -1203
  37. data/contrib/zstd/lib/compress/zstd_compress_internal.h +463 -62
  38. data/contrib/zstd/lib/compress/zstd_double_fast.c +321 -131
  39. data/contrib/zstd/lib/compress/zstd_double_fast.h +13 -4
  40. data/contrib/zstd/lib/compress/zstd_fast.c +335 -108
  41. data/contrib/zstd/lib/compress/zstd_fast.h +12 -6
  42. data/contrib/zstd/lib/compress/zstd_lazy.c +654 -313
  43. data/contrib/zstd/lib/compress/zstd_lazy.h +44 -16
  44. data/contrib/zstd/lib/compress/zstd_ldm.c +310 -420
  45. data/contrib/zstd/lib/compress/zstd_ldm.h +63 -26
  46. data/contrib/zstd/lib/compress/zstd_opt.c +773 -325
  47. data/contrib/zstd/lib/compress/zstd_opt.h +31 -5
  48. data/contrib/zstd/lib/compress/zstdmt_compress.c +1468 -518
  49. data/contrib/zstd/lib/compress/zstdmt_compress.h +96 -45
  50. data/contrib/zstd/lib/decompress/huf_decompress.c +518 -282
  51. data/contrib/zstd/lib/decompress/zstd_ddict.c +240 -0
  52. data/contrib/zstd/lib/decompress/zstd_ddict.h +44 -0
  53. data/contrib/zstd/lib/decompress/zstd_decompress.c +613 -1513
  54. data/contrib/zstd/lib/decompress/zstd_decompress_block.c +1311 -0
  55. data/contrib/zstd/lib/decompress/zstd_decompress_block.h +59 -0
  56. data/contrib/zstd/lib/decompress/zstd_decompress_internal.h +175 -0
  57. data/contrib/zstd/lib/dictBuilder/cover.c +194 -113
  58. data/contrib/zstd/lib/dictBuilder/cover.h +112 -0
  59. data/contrib/zstd/lib/dictBuilder/divsufsort.c +3 -3
  60. data/contrib/zstd/lib/dictBuilder/fastcover.c +740 -0
  61. data/contrib/zstd/lib/dictBuilder/zdict.c +142 -106
  62. data/contrib/zstd/lib/dictBuilder/zdict.h +115 -49
  63. data/contrib/zstd/lib/legacy/zstd_legacy.h +44 -12
  64. data/contrib/zstd/lib/legacy/zstd_v01.c +41 -10
  65. data/contrib/zstd/lib/legacy/zstd_v01.h +12 -7
  66. data/contrib/zstd/lib/legacy/zstd_v02.c +37 -12
  67. data/contrib/zstd/lib/legacy/zstd_v02.h +12 -7
  68. data/contrib/zstd/lib/legacy/zstd_v03.c +38 -12
  69. data/contrib/zstd/lib/legacy/zstd_v03.h +12 -7
  70. data/contrib/zstd/lib/legacy/zstd_v04.c +55 -174
  71. data/contrib/zstd/lib/legacy/zstd_v04.h +12 -7
  72. data/contrib/zstd/lib/legacy/zstd_v05.c +59 -31
  73. data/contrib/zstd/lib/legacy/zstd_v05.h +12 -7
  74. data/contrib/zstd/lib/legacy/zstd_v06.c +48 -20
  75. data/contrib/zstd/lib/legacy/zstd_v06.h +10 -5
  76. data/contrib/zstd/lib/legacy/zstd_v07.c +62 -29
  77. data/contrib/zstd/lib/legacy/zstd_v07.h +10 -5
  78. data/contrib/zstd/lib/zstd.h +1346 -832
  79. data/ext/extzstd.c +27 -19
  80. data/ext/extzstd_stream.c +20 -4
  81. data/ext/zstd_compress.c +1 -0
  82. data/ext/zstd_decompress.c +4 -0
  83. data/ext/zstd_dictbuilder.c +4 -0
  84. data/ext/zstd_dictbuilder_fastcover.c +5 -0
  85. data/lib/extzstd.rb +52 -220
  86. data/lib/extzstd/version.rb +1 -1
  87. metadata +21 -7
  88. data/contrib/zstd/circle.yml +0 -63
@@ -45,15 +45,15 @@ extern "C" {
45
45
 
46
46
  /* mutex */
47
47
  #define ZSTD_pthread_mutex_t CRITICAL_SECTION
48
- #define ZSTD_pthread_mutex_init(a, b) (InitializeCriticalSection((a)), 0)
48
+ #define ZSTD_pthread_mutex_init(a, b) ((void)(b), InitializeCriticalSection((a)), 0)
49
49
  #define ZSTD_pthread_mutex_destroy(a) DeleteCriticalSection((a))
50
50
  #define ZSTD_pthread_mutex_lock(a) EnterCriticalSection((a))
51
51
  #define ZSTD_pthread_mutex_unlock(a) LeaveCriticalSection((a))
52
52
 
53
53
  /* condition variable */
54
54
  #define ZSTD_pthread_cond_t CONDITION_VARIABLE
55
- #define ZSTD_pthread_cond_init(a, b) (InitializeConditionVariable((a)), 0)
56
- #define ZSTD_pthread_cond_destroy(a) /* No delete */
55
+ #define ZSTD_pthread_cond_init(a, b) ((void)(b), InitializeConditionVariable((a)), 0)
56
+ #define ZSTD_pthread_cond_destroy(a) ((void)(a))
57
57
  #define ZSTD_pthread_cond_wait(a, b) SleepConditionVariableCS((a), (b), INFINITE)
58
58
  #define ZSTD_pthread_cond_signal(a) WakeConditionVariable((a))
59
59
  #define ZSTD_pthread_cond_broadcast(a) WakeAllConditionVariable((a))
@@ -100,17 +100,17 @@ int ZSTD_pthread_join(ZSTD_pthread_t thread, void** value_ptr);
100
100
  /* No multithreading support */
101
101
 
102
102
  typedef int ZSTD_pthread_mutex_t;
103
- #define ZSTD_pthread_mutex_init(a, b) ((void)a, 0)
104
- #define ZSTD_pthread_mutex_destroy(a)
105
- #define ZSTD_pthread_mutex_lock(a)
106
- #define ZSTD_pthread_mutex_unlock(a)
103
+ #define ZSTD_pthread_mutex_init(a, b) ((void)(a), (void)(b), 0)
104
+ #define ZSTD_pthread_mutex_destroy(a) ((void)(a))
105
+ #define ZSTD_pthread_mutex_lock(a) ((void)(a))
106
+ #define ZSTD_pthread_mutex_unlock(a) ((void)(a))
107
107
 
108
108
  typedef int ZSTD_pthread_cond_t;
109
- #define ZSTD_pthread_cond_init(a, b) ((void)a, 0)
110
- #define ZSTD_pthread_cond_destroy(a)
111
- #define ZSTD_pthread_cond_wait(a, b)
112
- #define ZSTD_pthread_cond_signal(a)
113
- #define ZSTD_pthread_cond_broadcast(a)
109
+ #define ZSTD_pthread_cond_init(a, b) ((void)(a), (void)(b), 0)
110
+ #define ZSTD_pthread_cond_destroy(a) ((void)(a))
111
+ #define ZSTD_pthread_cond_wait(a, b) ((void)(a), (void)(b))
112
+ #define ZSTD_pthread_cond_signal(a) ((void)(a))
113
+ #define ZSTD_pthread_cond_broadcast(a) ((void)(a))
114
114
 
115
115
  /* do not use ZSTD_pthread_t */
116
116
 
@@ -66,10 +66,10 @@
66
66
  /* #define XXH_ACCEPT_NULL_INPUT_POINTER 1 */
67
67
 
68
68
  /*!XXH_FORCE_NATIVE_FORMAT :
69
- * By default, xxHash library provides endian-independant Hash values, based on little-endian convention.
69
+ * By default, xxHash library provides endian-independent Hash values, based on little-endian convention.
70
70
  * Results are therefore identical for little-endian and big-endian CPU.
71
71
  * This comes at a performance cost for big-endian CPU, since some swapping is required to emulate little-endian format.
72
- * Should endian-independance be of no importance for your application, you may set the #define below to 1,
72
+ * Should endian-independence be of no importance for your application, you may set the #define below to 1,
73
73
  * to improve speed for Big-endian CPU.
74
74
  * This option has no impact on Little_Endian CPU.
75
75
  */
@@ -98,6 +98,7 @@
98
98
  /* Modify the local functions below should you wish to use some other memory routines */
99
99
  /* for malloc(), free() */
100
100
  #include <stdlib.h>
101
+ #include <stddef.h> /* size_t */
101
102
  static void* XXH_malloc(size_t s) { return malloc(s); }
102
103
  static void XXH_free (void* p) { free(p); }
103
104
  /* for memcpy() */
@@ -30,8 +30,10 @@ const char* ZSTD_versionString(void) { return ZSTD_VERSION_STRING; }
30
30
  /*-****************************************
31
31
  * ZSTD Error Management
32
32
  ******************************************/
33
+ #undef ZSTD_isError /* defined within zstd_internal.h */
33
34
  /*! ZSTD_isError() :
34
- * tells if a return value is an error code */
35
+ * tells if a return value is an error code
36
+ * symbol is required for external callers */
35
37
  unsigned ZSTD_isError(size_t code) { return ERR_isError(code); }
36
38
 
37
39
  /*! ZSTD_getErrorName() :
@@ -46,11 +48,6 @@ ZSTD_ErrorCode ZSTD_getErrorCode(size_t code) { return ERR_getErrorCode(code); }
46
48
  * provides error code string from enum */
47
49
  const char* ZSTD_getErrorString(ZSTD_ErrorCode code) { return ERR_getErrorString(code); }
48
50
 
49
- /*! g_debuglog_enable :
50
- * turn on/off debug traces (global switch) */
51
- #if defined(ZSTD_DEBUG) && (ZSTD_DEBUG >= 2)
52
- int g_debuglog_enable = 1;
53
- #endif
54
51
 
55
52
 
56
53
  /*=**************************************************************
@@ -35,12 +35,20 @@ extern "C" {
35
35
  # define ZSTDERRORLIB_API ZSTDERRORLIB_VISIBILITY
36
36
  #endif
37
37
 
38
- /*-****************************************
39
- * error codes list
40
- * note : this API is still considered unstable
41
- * and shall not be used with a dynamic library.
42
- * only static linking is allowed
43
- ******************************************/
38
+ /*-*********************************************
39
+ * Error codes list
40
+ *-*********************************************
41
+ * Error codes _values_ are pinned down since v1.3.1 only.
42
+ * Therefore, don't rely on values if you may link to any version < v1.3.1.
43
+ *
44
+ * Only values < 100 are considered stable.
45
+ *
46
+ * note 1 : this API shall be used with static linking only.
47
+ * dynamic linking is not yet officially supported.
48
+ * note 2 : Prefer relying on the enum than on its value whenever possible
49
+ * This is the only supported way to use the error list < v1.3.1
50
+ * note 3 : ZSTD_isError() is always correct, whatever the library version.
51
+ **********************************************/
44
52
  typedef enum {
45
53
  ZSTD_error_no_error = 0,
46
54
  ZSTD_error_GENERIC = 1,
@@ -61,9 +69,11 @@ typedef enum {
61
69
  ZSTD_error_stage_wrong = 60,
62
70
  ZSTD_error_init_missing = 62,
63
71
  ZSTD_error_memory_allocation = 64,
72
+ ZSTD_error_workSpace_tooSmall= 66,
64
73
  ZSTD_error_dstSize_tooSmall = 70,
65
74
  ZSTD_error_srcSize_wrong = 72,
66
- /* following error codes are not stable and may be removed or changed in a future version */
75
+ ZSTD_error_dstBuffer_null = 74,
76
+ /* following error codes are __NOT STABLE__, they can be removed or changed in future versions */
67
77
  ZSTD_error_frameIndex_tooLarge = 100,
68
78
  ZSTD_error_seekableIO = 102,
69
79
  ZSTD_error_maxCode = 120 /* never EVER use this value directly, it can change in future versions! Use ZSTD_isError() instead */
@@ -21,6 +21,7 @@
21
21
  ***************************************/
22
22
  #include "compiler.h"
23
23
  #include "mem.h"
24
+ #include "debug.h" /* assert, DEBUGLOG, RAWLOG, g_debuglevel */
24
25
  #include "error_private.h"
25
26
  #define ZSTD_STATIC_LINKING_ONLY
26
27
  #include "zstd.h"
@@ -38,43 +39,11 @@
38
39
  extern "C" {
39
40
  #endif
40
41
 
41
-
42
- /*-*************************************
43
- * Debug
44
- ***************************************/
45
- #if defined(ZSTD_DEBUG) && (ZSTD_DEBUG>=1)
46
- # include <assert.h>
47
- #else
48
- # ifndef assert
49
- # define assert(condition) ((void)0)
50
- # endif
51
- #endif
52
-
53
- #define ZSTD_STATIC_ASSERT(c) { enum { ZSTD_static_assert = 1/(int)(!!(c)) }; }
54
-
55
- #if defined(ZSTD_DEBUG) && (ZSTD_DEBUG>=2)
56
- # include <stdio.h>
57
- extern int g_debuglog_enable;
58
- /* recommended values for ZSTD_DEBUG display levels :
59
- * 1 : no display, enables assert() only
60
- * 2 : reserved for currently active debug path
61
- * 3 : events once per object lifetime (CCtx, CDict, etc.)
62
- * 4 : events once per frame
63
- * 5 : events once per block
64
- * 6 : events once per sequence (*very* verbose) */
65
- # define RAWLOG(l, ...) { \
66
- if ((g_debuglog_enable) & (l<=ZSTD_DEBUG)) { \
67
- fprintf(stderr, __VA_ARGS__); \
68
- } }
69
- # define DEBUGLOG(l, ...) { \
70
- if ((g_debuglog_enable) & (l<=ZSTD_DEBUG)) { \
71
- fprintf(stderr, __FILE__ ": " __VA_ARGS__); \
72
- fprintf(stderr, " \n"); \
73
- } }
74
- #else
75
- # define RAWLOG(l, ...) {} /* disabled */
76
- # define DEBUGLOG(l, ...) {} /* disabled */
77
- #endif
42
+ /* ---- static assert (debug) --- */
43
+ #define ZSTD_STATIC_ASSERT(c) DEBUG_STATIC_ASSERT(c)
44
+ #define ZSTD_isError ERR_isError /* for inlining */
45
+ #define FSE_isError ERR_isError
46
+ #define HUF_isError ERR_isError
78
47
 
79
48
 
80
49
  /*-*************************************
@@ -84,8 +53,50 @@ extern int g_debuglog_enable;
84
53
  #undef MAX
85
54
  #define MIN(a,b) ((a)<(b) ? (a) : (b))
86
55
  #define MAX(a,b) ((a)>(b) ? (a) : (b))
87
- #define CHECK_F(f) { size_t const errcod = f; if (ERR_isError(errcod)) return errcod; } /* check and Forward error code */
88
- #define CHECK_E(f, e) { size_t const errcod = f; if (ERR_isError(errcod)) return ERROR(e); } /* check and send Error code */
56
+
57
+ /**
58
+ * Return the specified error if the condition evaluates to true.
59
+ *
60
+ * In debug modes, prints additional information. In order to do that
61
+ * (particularly, printing the conditional that failed), this can't just wrap
62
+ * RETURN_ERROR().
63
+ */
64
+ #define RETURN_ERROR_IF(cond, err, ...) \
65
+ if (cond) { \
66
+ RAWLOG(3, "%s:%d: ERROR!: check %s failed, returning %s", __FILE__, __LINE__, ZSTD_QUOTE(cond), ZSTD_QUOTE(ERROR(err))); \
67
+ RAWLOG(3, ": " __VA_ARGS__); \
68
+ RAWLOG(3, "\n"); \
69
+ return ERROR(err); \
70
+ }
71
+
72
+ /**
73
+ * Unconditionally return the specified error.
74
+ *
75
+ * In debug modes, prints additional information.
76
+ */
77
+ #define RETURN_ERROR(err, ...) \
78
+ do { \
79
+ RAWLOG(3, "%s:%d: ERROR!: unconditional check failed, returning %s", __FILE__, __LINE__, ZSTD_QUOTE(ERROR(err))); \
80
+ RAWLOG(3, ": " __VA_ARGS__); \
81
+ RAWLOG(3, "\n"); \
82
+ return ERROR(err); \
83
+ } while(0);
84
+
85
+ /**
86
+ * If the provided expression evaluates to an error code, returns that error code.
87
+ *
88
+ * In debug modes, prints additional information.
89
+ */
90
+ #define FORWARD_IF_ERROR(err, ...) \
91
+ do { \
92
+ size_t const err_code = (err); \
93
+ if (ERR_isError(err_code)) { \
94
+ RAWLOG(3, "%s:%d: ERROR!: forwarding error in %s: %s", __FILE__, __LINE__, ZSTD_QUOTE(err), ERR_getErrorName(err_code)); \
95
+ RAWLOG(3, ": " __VA_ARGS__); \
96
+ RAWLOG(3, "\n"); \
97
+ return err_code; \
98
+ } \
99
+ } while(0);
89
100
 
90
101
 
91
102
  /*-*************************************
@@ -109,12 +120,10 @@ static const U32 repStartValue[ZSTD_REP_NUM] = { 1, 4, 8 };
109
120
  #define BIT0 1
110
121
 
111
122
  #define ZSTD_WINDOWLOG_ABSOLUTEMIN 10
112
- #define ZSTD_WINDOWLOG_DEFAULTMAX 27 /* Default maximum allowed window log */
113
123
  static const size_t ZSTD_fcs_fieldSize[4] = { 0, 2, 4, 8 };
114
124
  static const size_t ZSTD_did_fieldSize[4] = { 0, 1, 2, 4 };
115
125
 
116
- #define ZSTD_FRAMEIDSIZE 4
117
- static const size_t ZSTD_frameIdSize = ZSTD_FRAMEIDSIZE; /* magic number size */
126
+ #define ZSTD_FRAMEIDSIZE 4 /* magic number size */
118
127
 
119
128
  #define ZSTD_BLOCKHEADERSIZE 3 /* C standard doesn't allow `static const` variable to be init using another `static const` variable */
120
129
  static const size_t ZSTD_blockHeaderSize = ZSTD_BLOCKHEADERSIZE;
@@ -132,14 +141,15 @@ typedef enum { set_basic, set_rle, set_compressed, set_repeat } symbolEncodingTy
132
141
 
133
142
  #define Litbits 8
134
143
  #define MaxLit ((1<<Litbits) - 1)
135
- #define MaxML 52
136
- #define MaxLL 35
144
+ #define MaxML 52
145
+ #define MaxLL 35
137
146
  #define DefaultMaxOff 28
138
- #define MaxOff 31
147
+ #define MaxOff 31
139
148
  #define MaxSeq MAX(MaxLL, MaxML) /* Assumption : MaxOff < MaxLL,MaxML */
140
149
  #define MLFSELog 9
141
150
  #define LLFSELog 9
142
151
  #define OffFSELog 8
152
+ #define MaxFSELog MAX(MAX(MLFSELog, LLFSELog), OffFSELog)
143
153
 
144
154
  static const U32 LL_bits[MaxLL+1] = { 0, 0, 0, 0, 0, 0, 0, 0,
145
155
  0, 0, 0, 0, 0, 0, 0, 0,
@@ -226,12 +236,23 @@ typedef struct {
226
236
  BYTE* llCode;
227
237
  BYTE* mlCode;
228
238
  BYTE* ofCode;
239
+ size_t maxNbSeq;
240
+ size_t maxNbLit;
229
241
  U32 longLengthID; /* 0 == no longLength; 1 == Lit.longLength; 2 == Match.longLength; */
230
242
  U32 longLengthPos;
231
- U32 rep[ZSTD_REP_NUM];
232
- U32 repToConfirm[ZSTD_REP_NUM];
233
243
  } seqStore_t;
234
244
 
245
+ /**
246
+ * Contains the compressed frame size and an upper-bound for the decompressed frame size.
247
+ * Note: before using `compressedSize`, check for errors using ZSTD_isError().
248
+ * similarly, before using `decompressedBound`, check for errors using:
249
+ * `decompressedBound != ZSTD_CONTENTSIZE_ERROR`
250
+ */
251
+ typedef struct {
252
+ size_t compressedSize;
253
+ unsigned long long decompressedBound;
254
+ } ZSTD_frameSizeInfo; /* decompress & legacy */
255
+
235
256
  const seqStore_t* ZSTD_getSeqStore(const ZSTD_CCtx* ctx); /* compress & dictBuilder */
236
257
  void ZSTD_seqToCodes(const seqStore_t* seqStorePtr); /* compress, dictBuilder, decodeCorpus (shouldn't get its definition from here) */
237
258
 
@@ -276,7 +297,7 @@ typedef struct {
276
297
  blockType_e blockType;
277
298
  U32 lastBlock;
278
299
  U32 origSize;
279
- } blockProperties_t;
300
+ } blockProperties_t; /* declared here for decompress and fullbench */
280
301
 
281
302
  /*! ZSTD_getcBlockSize() :
282
303
  * Provides the size of compressed block from block header `src` */
@@ -284,6 +305,13 @@ typedef struct {
284
305
  size_t ZSTD_getcBlockSize(const void* src, size_t srcSize,
285
306
  blockProperties_t* bpPtr);
286
307
 
308
+ /*! ZSTD_decodeSeqHeaders() :
309
+ * decode sequence header from src */
310
+ /* Used by: decompress, fullbench (does not get its definition from here) */
311
+ size_t ZSTD_decodeSeqHeaders(ZSTD_DCtx* dctx, int* nbSeqPtr,
312
+ const void* src, size_t srcSize);
313
+
314
+
287
315
  #if defined (__cplusplus)
288
316
  }
289
317
  #endif
@@ -1,6 +1,6 @@
1
1
  /* ******************************************************************
2
2
  FSE : Finite State Entropy encoder
3
- Copyright (C) 2013-2015, Yann Collet.
3
+ Copyright (C) 2013-present, Yann Collet.
4
4
 
5
5
  BSD 2-Clause License (http://www.opensource.org/licenses/bsd-license.php)
6
6
 
@@ -37,9 +37,11 @@
37
37
  ****************************************************************/
38
38
  #include <stdlib.h> /* malloc, free, qsort */
39
39
  #include <string.h> /* memcpy, memset */
40
- #include <stdio.h> /* printf (debug) */
41
- #include "bitstream.h"
42
40
  #include "compiler.h"
41
+ #include "mem.h" /* U32, U16, etc. */
42
+ #include "debug.h" /* assert, DEBUGLOG */
43
+ #include "hist.h" /* HIST_count_wksp */
44
+ #include "bitstream.h"
43
45
  #define FSE_STATIC_LINKING_ONLY
44
46
  #include "fse.h"
45
47
  #include "error_private.h"
@@ -49,7 +51,6 @@
49
51
  * Error Management
50
52
  ****************************************************************/
51
53
  #define FSE_isError ERR_isError
52
- #define FSE_STATIC_ASSERT(c) { enum { FSE_static_assert = 1/(int)(!!(c)) }; } /* use only *after* variable declarations */
53
54
 
54
55
 
55
56
  /* **************************************************************
@@ -82,7 +83,9 @@
82
83
  * wkspSize should be sized to handle worst case situation, which is `1<<max_tableLog * sizeof(FSE_FUNCTION_TYPE)`
83
84
  * workSpace must also be properly aligned with FSE_FUNCTION_TYPE requirements
84
85
  */
85
- size_t FSE_buildCTable_wksp(FSE_CTable* ct, const short* normalizedCounter, unsigned maxSymbolValue, unsigned tableLog, void* workSpace, size_t wkspSize)
86
+ size_t FSE_buildCTable_wksp(FSE_CTable* ct,
87
+ const short* normalizedCounter, unsigned maxSymbolValue, unsigned tableLog,
88
+ void* workSpace, size_t wkspSize)
86
89
  {
87
90
  U32 const tableSize = 1 << tableLog;
88
91
  U32 const tableMask = tableSize - 1;
@@ -100,14 +103,19 @@ size_t FSE_buildCTable_wksp(FSE_CTable* ct, const short* normalizedCounter, unsi
100
103
  if (((size_t)1 << tableLog) * sizeof(FSE_FUNCTION_TYPE) > wkspSize) return ERROR(tableLog_tooLarge);
101
104
  tableU16[-2] = (U16) tableLog;
102
105
  tableU16[-1] = (U16) maxSymbolValue;
106
+ assert(tableLog < 16); /* required for threshold strategy to work */
103
107
 
104
108
  /* For explanations on how to distribute symbol values over the table :
105
- * http://fastcompression.blogspot.fr/2014/02/fse-distributing-symbol-values.html */
109
+ * http://fastcompression.blogspot.fr/2014/02/fse-distributing-symbol-values.html */
110
+
111
+ #ifdef __clang_analyzer__
112
+ memset(tableSymbol, 0, sizeof(*tableSymbol) * tableSize); /* useless initialization, just to keep scan-build happy */
113
+ #endif
106
114
 
107
115
  /* symbol start positions */
108
116
  { U32 u;
109
117
  cumul[0] = 0;
110
- for (u=1; u<=maxSymbolValue+1; u++) {
118
+ for (u=1; u <= maxSymbolValue+1; u++) {
111
119
  if (normalizedCounter[u-1]==-1) { /* Low proba symbol */
112
120
  cumul[u] = cumul[u-1] + 1;
113
121
  tableSymbol[highThreshold--] = (FSE_FUNCTION_TYPE)(u-1);
@@ -121,14 +129,16 @@ size_t FSE_buildCTable_wksp(FSE_CTable* ct, const short* normalizedCounter, unsi
121
129
  { U32 position = 0;
122
130
  U32 symbol;
123
131
  for (symbol=0; symbol<=maxSymbolValue; symbol++) {
124
- int nbOccurences;
125
- for (nbOccurences=0; nbOccurences<normalizedCounter[symbol]; nbOccurences++) {
132
+ int nbOccurrences;
133
+ int const freq = normalizedCounter[symbol];
134
+ for (nbOccurrences=0; nbOccurrences<freq; nbOccurrences++) {
126
135
  tableSymbol[position] = (FSE_FUNCTION_TYPE)symbol;
127
136
  position = (position + step) & tableMask;
128
- while (position > highThreshold) position = (position + step) & tableMask; /* Low proba area */
137
+ while (position > highThreshold)
138
+ position = (position + step) & tableMask; /* Low proba area */
129
139
  } }
130
140
 
131
- if (position!=0) return ERROR(GENERIC); /* Must have gone through all positions */
141
+ assert(position==0); /* Must have initialized all positions */
132
142
  }
133
143
 
134
144
  /* Build table */
@@ -143,7 +153,10 @@ size_t FSE_buildCTable_wksp(FSE_CTable* ct, const short* normalizedCounter, unsi
143
153
  for (s=0; s<=maxSymbolValue; s++) {
144
154
  switch (normalizedCounter[s])
145
155
  {
146
- case 0: break;
156
+ case 0:
157
+ /* filling nonetheless, for compatibility with FSE_getMaxNbBits() */
158
+ symbolTT[s].deltaNbBits = ((tableLog+1) << 16) - (1<<tableLog);
159
+ break;
147
160
 
148
161
  case -1:
149
162
  case 1:
@@ -160,6 +173,18 @@ size_t FSE_buildCTable_wksp(FSE_CTable* ct, const short* normalizedCounter, unsi
160
173
  total += normalizedCounter[s];
161
174
  } } } }
162
175
 
176
+ #if 0 /* debug : symbol costs */
177
+ DEBUGLOG(5, "\n --- table statistics : ");
178
+ { U32 symbol;
179
+ for (symbol=0; symbol<=maxSymbolValue; symbol++) {
180
+ DEBUGLOG(5, "%3u: w=%3i, maxBits=%u, fracBits=%.2f",
181
+ symbol, normalizedCounter[symbol],
182
+ FSE_getMaxNbBits(symbolTT, symbol),
183
+ (double)FSE_bitCost(symbolTT, tableLog, symbol, 8) / 256);
184
+ }
185
+ }
186
+ #endif
187
+
163
188
  return 0;
164
189
  }
165
190
 
@@ -174,8 +199,9 @@ size_t FSE_buildCTable(FSE_CTable* ct, const short* normalizedCounter, unsigned
174
199
 
175
200
  #ifndef FSE_COMMONDEFS_ONLY
176
201
 
202
+
177
203
  /*-**************************************************************
178
- * FSE NCount encoding-decoding
204
+ * FSE NCount encoding
179
205
  ****************************************************************/
180
206
  size_t FSE_NCountWriteBound(unsigned maxSymbolValue, unsigned tableLog)
181
207
  {
@@ -183,9 +209,10 @@ size_t FSE_NCountWriteBound(unsigned maxSymbolValue, unsigned tableLog)
183
209
  return maxSymbolValue ? maxHeaderSize : FSE_NCOUNTBOUND; /* maxSymbolValue==0 ? use default */
184
210
  }
185
211
 
186
- static size_t FSE_writeNCount_generic (void* header, size_t headerBufferSize,
187
- const short* normalizedCounter, unsigned maxSymbolValue, unsigned tableLog,
188
- unsigned writeIsSafe)
212
+ static size_t
213
+ FSE_writeNCount_generic (void* header, size_t headerBufferSize,
214
+ const short* normalizedCounter, unsigned maxSymbolValue, unsigned tableLog,
215
+ unsigned writeIsSafe)
189
216
  {
190
217
  BYTE* const ostart = (BYTE*) header;
191
218
  BYTE* out = ostart;
@@ -194,13 +221,12 @@ static size_t FSE_writeNCount_generic (void* header, size_t headerBufferSize,
194
221
  const int tableSize = 1 << tableLog;
195
222
  int remaining;
196
223
  int threshold;
197
- U32 bitStream;
198
- int bitCount;
199
- unsigned charnum = 0;
200
- int previous0 = 0;
224
+ U32 bitStream = 0;
225
+ int bitCount = 0;
226
+ unsigned symbol = 0;
227
+ unsigned const alphabetSize = maxSymbolValue + 1;
228
+ int previousIs0 = 0;
201
229
 
202
- bitStream = 0;
203
- bitCount = 0;
204
230
  /* Table Size */
205
231
  bitStream += (tableLog-FSE_MIN_TABLELOG) << bitCount;
206
232
  bitCount += 4;
@@ -210,48 +236,53 @@ static size_t FSE_writeNCount_generic (void* header, size_t headerBufferSize,
210
236
  threshold = tableSize;
211
237
  nbBits = tableLog+1;
212
238
 
213
- while (remaining>1) { /* stops at 1 */
214
- if (previous0) {
215
- unsigned start = charnum;
216
- while (!normalizedCounter[charnum]) charnum++;
217
- while (charnum >= start+24) {
239
+ while ((symbol < alphabetSize) && (remaining>1)) { /* stops at 1 */
240
+ if (previousIs0) {
241
+ unsigned start = symbol;
242
+ while ((symbol < alphabetSize) && !normalizedCounter[symbol]) symbol++;
243
+ if (symbol == alphabetSize) break; /* incorrect distribution */
244
+ while (symbol >= start+24) {
218
245
  start+=24;
219
246
  bitStream += 0xFFFFU << bitCount;
220
- if ((!writeIsSafe) && (out > oend-2)) return ERROR(dstSize_tooSmall); /* Buffer overflow */
247
+ if ((!writeIsSafe) && (out > oend-2))
248
+ return ERROR(dstSize_tooSmall); /* Buffer overflow */
221
249
  out[0] = (BYTE) bitStream;
222
250
  out[1] = (BYTE)(bitStream>>8);
223
251
  out+=2;
224
252
  bitStream>>=16;
225
253
  }
226
- while (charnum >= start+3) {
254
+ while (symbol >= start+3) {
227
255
  start+=3;
228
256
  bitStream += 3 << bitCount;
229
257
  bitCount += 2;
230
258
  }
231
- bitStream += (charnum-start) << bitCount;
259
+ bitStream += (symbol-start) << bitCount;
232
260
  bitCount += 2;
233
261
  if (bitCount>16) {
234
- if ((!writeIsSafe) && (out > oend - 2)) return ERROR(dstSize_tooSmall); /* Buffer overflow */
262
+ if ((!writeIsSafe) && (out > oend - 2))
263
+ return ERROR(dstSize_tooSmall); /* Buffer overflow */
235
264
  out[0] = (BYTE)bitStream;
236
265
  out[1] = (BYTE)(bitStream>>8);
237
266
  out += 2;
238
267
  bitStream >>= 16;
239
268
  bitCount -= 16;
240
269
  } }
241
- { int count = normalizedCounter[charnum++];
242
- int const max = (2*threshold-1)-remaining;
270
+ { int count = normalizedCounter[symbol++];
271
+ int const max = (2*threshold-1) - remaining;
243
272
  remaining -= count < 0 ? -count : count;
244
273
  count++; /* +1 for extra accuracy */
245
- if (count>=threshold) count += max; /* [0..max[ [max..threshold[ (...) [threshold+max 2*threshold[ */
274
+ if (count>=threshold)
275
+ count += max; /* [0..max[ [max..threshold[ (...) [threshold+max 2*threshold[ */
246
276
  bitStream += count << bitCount;
247
277
  bitCount += nbBits;
248
278
  bitCount -= (count<max);
249
- previous0 = (count==1);
279
+ previousIs0 = (count==1);
250
280
  if (remaining<1) return ERROR(GENERIC);
251
- while (remaining<threshold) nbBits--, threshold>>=1;
281
+ while (remaining<threshold) { nbBits--; threshold>>=1; }
252
282
  }
253
283
  if (bitCount>16) {
254
- if ((!writeIsSafe) && (out > oend - 2)) return ERROR(dstSize_tooSmall); /* Buffer overflow */
284
+ if ((!writeIsSafe) && (out > oend - 2))
285
+ return ERROR(dstSize_tooSmall); /* Buffer overflow */
255
286
  out[0] = (BYTE)bitStream;
256
287
  out[1] = (BYTE)(bitStream>>8);
257
288
  out += 2;
@@ -259,19 +290,23 @@ static size_t FSE_writeNCount_generic (void* header, size_t headerBufferSize,
259
290
  bitCount -= 16;
260
291
  } }
261
292
 
293
+ if (remaining != 1)
294
+ return ERROR(GENERIC); /* incorrect normalized distribution */
295
+ assert(symbol <= alphabetSize);
296
+
262
297
  /* flush remaining bitStream */
263
- if ((!writeIsSafe) && (out > oend - 2)) return ERROR(dstSize_tooSmall); /* Buffer overflow */
298
+ if ((!writeIsSafe) && (out > oend - 2))
299
+ return ERROR(dstSize_tooSmall); /* Buffer overflow */
264
300
  out[0] = (BYTE)bitStream;
265
301
  out[1] = (BYTE)(bitStream>>8);
266
302
  out+= (bitCount+7) /8;
267
303
 
268
- if (charnum > maxSymbolValue + 1) return ERROR(GENERIC);
269
-
270
304
  return (out-ostart);
271
305
  }
272
306
 
273
307
 
274
- size_t FSE_writeNCount (void* buffer, size_t bufferSize, const short* normalizedCounter, unsigned maxSymbolValue, unsigned tableLog)
308
+ size_t FSE_writeNCount (void* buffer, size_t bufferSize,
309
+ const short* normalizedCounter, unsigned maxSymbolValue, unsigned tableLog)
275
310
  {
276
311
  if (tableLog > FSE_MAX_TABLELOG) return ERROR(tableLog_tooLarge); /* Unsupported */
277
312
  if (tableLog < FSE_MIN_TABLELOG) return ERROR(GENERIC); /* Unsupported */
@@ -279,171 +314,13 @@ size_t FSE_writeNCount (void* buffer, size_t bufferSize, const short* normalized
279
314
  if (bufferSize < FSE_NCountWriteBound(maxSymbolValue, tableLog))
280
315
  return FSE_writeNCount_generic(buffer, bufferSize, normalizedCounter, maxSymbolValue, tableLog, 0);
281
316
 
282
- return FSE_writeNCount_generic(buffer, bufferSize, normalizedCounter, maxSymbolValue, tableLog, 1);
283
- }
284
-
285
-
286
-
287
- /*-**************************************************************
288
- * Counting histogram
289
- ****************************************************************/
290
- /*! FSE_count_simple
291
- This function counts byte values within `src`, and store the histogram into table `count`.
292
- It doesn't use any additional memory.
293
- But this function is unsafe : it doesn't check that all values within `src` can fit into `count`.
294
- For this reason, prefer using a table `count` with 256 elements.
295
- @return : count of most numerous element
296
- */
297
- size_t FSE_count_simple(unsigned* count, unsigned* maxSymbolValuePtr,
298
- const void* src, size_t srcSize)
299
- {
300
- const BYTE* ip = (const BYTE*)src;
301
- const BYTE* const end = ip + srcSize;
302
- unsigned maxSymbolValue = *maxSymbolValuePtr;
303
- unsigned max=0;
304
-
305
- memset(count, 0, (maxSymbolValue+1)*sizeof(*count));
306
- if (srcSize==0) { *maxSymbolValuePtr = 0; return 0; }
307
-
308
- while (ip<end) count[*ip++]++;
309
-
310
- while (!count[maxSymbolValue]) maxSymbolValue--;
311
- *maxSymbolValuePtr = maxSymbolValue;
312
-
313
- { U32 s; for (s=0; s<=maxSymbolValue; s++) if (count[s] > max) max = count[s]; }
314
-
315
- return (size_t)max;
316
- }
317
-
318
-
319
- /* FSE_count_parallel_wksp() :
320
- * Same as FSE_count_parallel(), but using an externally provided scratch buffer.
321
- * `workSpace` size must be a minimum of `1024 * sizeof(unsigned)`` */
322
- static size_t FSE_count_parallel_wksp(
323
- unsigned* count, unsigned* maxSymbolValuePtr,
324
- const void* source, size_t sourceSize,
325
- unsigned checkMax, unsigned* const workSpace)
326
- {
327
- const BYTE* ip = (const BYTE*)source;
328
- const BYTE* const iend = ip+sourceSize;
329
- unsigned maxSymbolValue = *maxSymbolValuePtr;
330
- unsigned max=0;
331
- U32* const Counting1 = workSpace;
332
- U32* const Counting2 = Counting1 + 256;
333
- U32* const Counting3 = Counting2 + 256;
334
- U32* const Counting4 = Counting3 + 256;
335
-
336
- memset(Counting1, 0, 4*256*sizeof(unsigned));
337
-
338
- /* safety checks */
339
- if (!sourceSize) {
340
- memset(count, 0, maxSymbolValue + 1);
341
- *maxSymbolValuePtr = 0;
342
- return 0;
343
- }
344
- if (!maxSymbolValue) maxSymbolValue = 255; /* 0 == default */
345
-
346
- /* by stripes of 16 bytes */
347
- { U32 cached = MEM_read32(ip); ip += 4;
348
- while (ip < iend-15) {
349
- U32 c = cached; cached = MEM_read32(ip); ip += 4;
350
- Counting1[(BYTE) c ]++;
351
- Counting2[(BYTE)(c>>8) ]++;
352
- Counting3[(BYTE)(c>>16)]++;
353
- Counting4[ c>>24 ]++;
354
- c = cached; cached = MEM_read32(ip); ip += 4;
355
- Counting1[(BYTE) c ]++;
356
- Counting2[(BYTE)(c>>8) ]++;
357
- Counting3[(BYTE)(c>>16)]++;
358
- Counting4[ c>>24 ]++;
359
- c = cached; cached = MEM_read32(ip); ip += 4;
360
- Counting1[(BYTE) c ]++;
361
- Counting2[(BYTE)(c>>8) ]++;
362
- Counting3[(BYTE)(c>>16)]++;
363
- Counting4[ c>>24 ]++;
364
- c = cached; cached = MEM_read32(ip); ip += 4;
365
- Counting1[(BYTE) c ]++;
366
- Counting2[(BYTE)(c>>8) ]++;
367
- Counting3[(BYTE)(c>>16)]++;
368
- Counting4[ c>>24 ]++;
369
- }
370
- ip-=4;
371
- }
372
-
373
- /* finish last symbols */
374
- while (ip<iend) Counting1[*ip++]++;
375
-
376
- if (checkMax) { /* verify stats will fit into destination table */
377
- U32 s; for (s=255; s>maxSymbolValue; s--) {
378
- Counting1[s] += Counting2[s] + Counting3[s] + Counting4[s];
379
- if (Counting1[s]) return ERROR(maxSymbolValue_tooSmall);
380
- } }
381
-
382
- { U32 s; for (s=0; s<=maxSymbolValue; s++) {
383
- count[s] = Counting1[s] + Counting2[s] + Counting3[s] + Counting4[s];
384
- if (count[s] > max) max = count[s];
385
- } }
386
-
387
- while (!count[maxSymbolValue]) maxSymbolValue--;
388
- *maxSymbolValuePtr = maxSymbolValue;
389
- return (size_t)max;
317
+ return FSE_writeNCount_generic(buffer, bufferSize, normalizedCounter, maxSymbolValue, tableLog, 1 /* write in buffer is safe */);
390
318
  }
391
319
 
392
- /* FSE_countFast_wksp() :
393
- * Same as FSE_countFast(), but using an externally provided scratch buffer.
394
- * `workSpace` size must be table of >= `1024` unsigned */
395
- size_t FSE_countFast_wksp(unsigned* count, unsigned* maxSymbolValuePtr,
396
- const void* source, size_t sourceSize, unsigned* workSpace)
397
- {
398
- if (sourceSize < 1500) return FSE_count_simple(count, maxSymbolValuePtr, source, sourceSize);
399
- return FSE_count_parallel_wksp(count, maxSymbolValuePtr, source, sourceSize, 0, workSpace);
400
- }
401
-
402
- /* fast variant (unsafe : won't check if src contains values beyond count[] limit) */
403
- size_t FSE_countFast(unsigned* count, unsigned* maxSymbolValuePtr,
404
- const void* source, size_t sourceSize)
405
- {
406
- unsigned tmpCounters[1024];
407
- return FSE_countFast_wksp(count, maxSymbolValuePtr, source, sourceSize, tmpCounters);
408
- }
409
-
410
- /* FSE_count_wksp() :
411
- * Same as FSE_count(), but using an externally provided scratch buffer.
412
- * `workSpace` size must be table of >= `1024` unsigned */
413
- size_t FSE_count_wksp(unsigned* count, unsigned* maxSymbolValuePtr,
414
- const void* source, size_t sourceSize, unsigned* workSpace)
415
- {
416
- if (*maxSymbolValuePtr < 255)
417
- return FSE_count_parallel_wksp(count, maxSymbolValuePtr, source, sourceSize, 1, workSpace);
418
- *maxSymbolValuePtr = 255;
419
- return FSE_countFast_wksp(count, maxSymbolValuePtr, source, sourceSize, workSpace);
420
- }
421
-
422
- size_t FSE_count(unsigned* count, unsigned* maxSymbolValuePtr,
423
- const void* src, size_t srcSize)
424
- {
425
- unsigned tmpCounters[1024];
426
- return FSE_count_wksp(count, maxSymbolValuePtr, src, srcSize, tmpCounters);
427
- }
428
-
429
-
430
320
 
431
321
  /*-**************************************************************
432
322
  * FSE Compression Code
433
323
  ****************************************************************/
434
- /*! FSE_sizeof_CTable() :
435
- FSE_CTable is a variable size structure which contains :
436
- `U16 tableLog;`
437
- `U16 maxSymbolValue;`
438
- `U16 nextStateNumber[1 << tableLog];` // This size is variable
439
- `FSE_symbolCompressionTransform symbolTT[maxSymbolValue+1];` // This size is variable
440
- Allocation is manual (C standard does not support variable-size structures).
441
- */
442
- size_t FSE_sizeof_CTable (unsigned maxSymbolValue, unsigned tableLog)
443
- {
444
- if (tableLog > FSE_MAX_TABLELOG) return ERROR(tableLog_tooLarge);
445
- return FSE_CTABLE_SIZE_U32 (tableLog, maxSymbolValue) * sizeof(U32);
446
- }
447
324
 
448
325
  FSE_CTable* FSE_createCTable (unsigned maxSymbolValue, unsigned tableLog)
449
326
  {
@@ -458,7 +335,7 @@ void FSE_freeCTable (FSE_CTable* ct) { free(ct); }
458
335
  /* provides the minimum logSize to safely represent a distribution */
459
336
  static unsigned FSE_minTableLog(size_t srcSize, unsigned maxSymbolValue)
460
337
  {
461
- U32 minBitsSrc = BIT_highbit32((U32)(srcSize - 1)) + 1;
338
+ U32 minBitsSrc = BIT_highbit32((U32)(srcSize)) + 1;
462
339
  U32 minBitsSymbols = BIT_highbit32(maxSymbolValue) + 2;
463
340
  U32 minBits = minBitsSrc < minBitsSymbols ? minBitsSrc : minBitsSymbols;
464
341
  assert(srcSize > 1); /* Not supported, RLE should be used instead */
@@ -521,6 +398,9 @@ static size_t FSE_normalizeM2(short* norm, U32 tableLog, const unsigned* count,
521
398
  }
522
399
  ToDistribute = (1 << tableLog) - distributed;
523
400
 
401
+ if (ToDistribute == 0)
402
+ return 0;
403
+
524
404
  if ((total / ToDistribute) > lowOne) {
525
405
  /* risk of rounding to zero */
526
406
  lowOne = (U32)((total * 3) / (ToDistribute * 2));
@@ -540,7 +420,7 @@ static size_t FSE_normalizeM2(short* norm, U32 tableLog, const unsigned* count,
540
420
  find max, then give all remaining points to max */
541
421
  U32 maxV = 0, maxC = 0;
542
422
  for (s=0; s<=maxSymbolValue; s++)
543
- if (count[s] > maxC) maxV=s, maxC=count[s];
423
+ if (count[s] > maxC) { maxV=s; maxC=count[s]; }
544
424
  norm[maxV] += (short)ToDistribute;
545
425
  return 0;
546
426
  }
@@ -548,7 +428,7 @@ static size_t FSE_normalizeM2(short* norm, U32 tableLog, const unsigned* count,
548
428
  if (total == 0) {
549
429
  /* all of the symbols were low enough for the lowOne or lowThreshold */
550
430
  for (s=0; ToDistribute > 0; s = (s+1)%(maxSymbolValue+1))
551
- if (norm[s] > 0) ToDistribute--, norm[s]++;
431
+ if (norm[s] > 0) { ToDistribute--; norm[s]++; }
552
432
  return 0;
553
433
  }
554
434
 
@@ -604,7 +484,7 @@ size_t FSE_normalizeCount (short* normalizedCounter, unsigned tableLog,
604
484
  U64 restToBeat = vStep * rtbTable[proba];
605
485
  proba += (count[s]*step) - ((U64)proba<<scale) > restToBeat;
606
486
  }
607
- if (proba > largestP) largestP=proba, largest=s;
487
+ if (proba > largestP) { largestP=proba; largest=s; }
608
488
  normalizedCounter[s] = proba;
609
489
  stillToDistribute -= proba;
610
490
  } }
@@ -621,11 +501,11 @@ size_t FSE_normalizeCount (short* normalizedCounter, unsigned tableLog,
621
501
  U32 s;
622
502
  U32 nTotal = 0;
623
503
  for (s=0; s<=maxSymbolValue; s++)
624
- printf("%3i: %4i \n", s, normalizedCounter[s]);
504
+ RAWLOG(2, "%3i: %4i \n", s, normalizedCounter[s]);
625
505
  for (s=0; s<=maxSymbolValue; s++)
626
506
  nTotal += abs(normalizedCounter[s]);
627
507
  if (nTotal != (1U<<tableLog))
628
- printf("Warning !!! Total == %u != %u !!!", nTotal, 1U<<tableLog);
508
+ RAWLOG(2, "Warning !!! Total == %u != %u !!!", nTotal, 1U<<tableLog);
629
509
  getchar();
630
510
  }
631
511
  #endif
@@ -778,7 +658,7 @@ size_t FSE_compress_wksp (void* dst, size_t dstSize, const void* src, size_t src
778
658
  BYTE* op = ostart;
779
659
  BYTE* const oend = ostart + dstSize;
780
660
 
781
- U32 count[FSE_MAX_SYMBOL_VALUE+1];
661
+ unsigned count[FSE_MAX_SYMBOL_VALUE+1];
782
662
  S16 norm[FSE_MAX_SYMBOL_VALUE+1];
783
663
  FSE_CTable* CTable = (FSE_CTable*)workSpace;
784
664
  size_t const CTableSize = FSE_CTABLE_SIZE_U32(tableLog, maxSymbolValue);
@@ -792,7 +672,7 @@ size_t FSE_compress_wksp (void* dst, size_t dstSize, const void* src, size_t src
792
672
  if (!tableLog) tableLog = FSE_DEFAULT_TABLELOG;
793
673
 
794
674
  /* Scan input and build symbol stats */
795
- { CHECK_V_F(maxCount, FSE_count_wksp(count, &maxSymbolValue, src, srcSize, (unsigned*)scratchBuffer) );
675
+ { CHECK_V_F(maxCount, HIST_count_wksp(count, &maxSymbolValue, src, srcSize, scratchBuffer, scratchBufferSize) );
796
676
  if (maxCount == srcSize) return 1; /* only a single symbol in src : rle */
797
677
  if (maxCount == 1) return 0; /* each symbol present maximum once => not compressible */
798
678
  if (maxCount < (srcSize >> 7)) return 0; /* Heuristic : not compressible enough */
@@ -827,7 +707,7 @@ typedef struct {
827
707
  size_t FSE_compress2 (void* dst, size_t dstCapacity, const void* src, size_t srcSize, unsigned maxSymbolValue, unsigned tableLog)
828
708
  {
829
709
  fseWkspMax_t scratchBuffer;
830
- FSE_STATIC_ASSERT(sizeof(scratchBuffer) >= FSE_WKSP_SIZE_U32(FSE_MAX_TABLELOG, FSE_MAX_SYMBOL_VALUE)); /* compilation failures here means scratchBuffer is not large enough */
710
+ DEBUG_STATIC_ASSERT(sizeof(scratchBuffer) >= FSE_WKSP_SIZE_U32(FSE_MAX_TABLELOG, FSE_MAX_SYMBOL_VALUE)); /* compilation failures here means scratchBuffer is not large enough */
831
711
  if (tableLog > FSE_MAX_TABLELOG) return ERROR(tableLog_tooLarge);
832
712
  return FSE_compress_wksp(dst, dstCapacity, src, srcSize, maxSymbolValue, tableLog, &scratchBuffer, sizeof(scratchBuffer));
833
713
  }