zstd-ruby 1.4.4.0 → 1.5.5.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (115) hide show
  1. checksums.yaml +4 -4
  2. data/.gitignore +2 -0
  3. data/README.md +78 -5
  4. data/Rakefile +8 -2
  5. data/ext/zstdruby/common.h +15 -0
  6. data/ext/zstdruby/extconf.rb +3 -2
  7. data/ext/zstdruby/libzstd/common/allocations.h +55 -0
  8. data/ext/zstdruby/libzstd/common/bits.h +200 -0
  9. data/ext/zstdruby/libzstd/common/bitstream.h +74 -97
  10. data/ext/zstdruby/libzstd/common/compiler.h +219 -20
  11. data/ext/zstdruby/libzstd/common/cpu.h +1 -3
  12. data/ext/zstdruby/libzstd/common/debug.c +11 -31
  13. data/ext/zstdruby/libzstd/common/debug.h +22 -49
  14. data/ext/zstdruby/libzstd/common/entropy_common.c +184 -80
  15. data/ext/zstdruby/libzstd/common/error_private.c +11 -2
  16. data/ext/zstdruby/libzstd/common/error_private.h +87 -4
  17. data/ext/zstdruby/libzstd/common/fse.h +47 -116
  18. data/ext/zstdruby/libzstd/common/fse_decompress.c +127 -127
  19. data/ext/zstdruby/libzstd/common/huf.h +112 -197
  20. data/ext/zstdruby/libzstd/common/mem.h +124 -142
  21. data/ext/zstdruby/libzstd/common/pool.c +54 -27
  22. data/ext/zstdruby/libzstd/common/pool.h +11 -5
  23. data/ext/zstdruby/libzstd/common/portability_macros.h +156 -0
  24. data/ext/zstdruby/libzstd/common/threading.c +78 -22
  25. data/ext/zstdruby/libzstd/common/threading.h +9 -13
  26. data/ext/zstdruby/libzstd/common/xxhash.c +15 -873
  27. data/ext/zstdruby/libzstd/common/xxhash.h +5572 -191
  28. data/ext/zstdruby/libzstd/common/zstd_common.c +2 -37
  29. data/ext/zstdruby/libzstd/common/zstd_deps.h +111 -0
  30. data/ext/zstdruby/libzstd/common/zstd_internal.h +186 -144
  31. data/ext/zstdruby/libzstd/common/zstd_trace.h +163 -0
  32. data/ext/zstdruby/libzstd/compress/clevels.h +134 -0
  33. data/ext/zstdruby/libzstd/compress/fse_compress.c +99 -196
  34. data/ext/zstdruby/libzstd/compress/hist.c +41 -63
  35. data/ext/zstdruby/libzstd/compress/hist.h +13 -33
  36. data/ext/zstdruby/libzstd/compress/huf_compress.c +968 -331
  37. data/ext/zstdruby/libzstd/compress/zstd_compress.c +4120 -1191
  38. data/ext/zstdruby/libzstd/compress/zstd_compress_internal.h +688 -159
  39. data/ext/zstdruby/libzstd/compress/zstd_compress_literals.c +121 -40
  40. data/ext/zstdruby/libzstd/compress/zstd_compress_literals.h +16 -6
  41. data/ext/zstdruby/libzstd/compress/zstd_compress_sequences.c +62 -35
  42. data/ext/zstdruby/libzstd/compress/zstd_compress_sequences.h +10 -3
  43. data/ext/zstdruby/libzstd/compress/zstd_compress_superblock.c +577 -0
  44. data/ext/zstdruby/libzstd/compress/zstd_compress_superblock.h +32 -0
  45. data/ext/zstdruby/libzstd/compress/zstd_cwksp.h +322 -115
  46. data/ext/zstdruby/libzstd/compress/zstd_double_fast.c +394 -154
  47. data/ext/zstdruby/libzstd/compress/zstd_double_fast.h +4 -3
  48. data/ext/zstdruby/libzstd/compress/zstd_fast.c +729 -253
  49. data/ext/zstdruby/libzstd/compress/zstd_fast.h +4 -3
  50. data/ext/zstdruby/libzstd/compress/zstd_lazy.c +1289 -247
  51. data/ext/zstdruby/libzstd/compress/zstd_lazy.h +61 -1
  52. data/ext/zstdruby/libzstd/compress/zstd_ldm.c +339 -212
  53. data/ext/zstdruby/libzstd/compress/zstd_ldm.h +15 -3
  54. data/ext/zstdruby/libzstd/compress/zstd_ldm_geartab.h +106 -0
  55. data/ext/zstdruby/libzstd/compress/zstd_opt.c +508 -282
  56. data/ext/zstdruby/libzstd/compress/zstd_opt.h +1 -1
  57. data/ext/zstdruby/libzstd/compress/zstdmt_compress.c +217 -466
  58. data/ext/zstdruby/libzstd/compress/zstdmt_compress.h +35 -114
  59. data/ext/zstdruby/libzstd/decompress/huf_decompress.c +1220 -572
  60. data/ext/zstdruby/libzstd/decompress/huf_decompress_amd64.S +576 -0
  61. data/ext/zstdruby/libzstd/decompress/zstd_ddict.c +23 -19
  62. data/ext/zstdruby/libzstd/decompress/zstd_ddict.h +3 -3
  63. data/ext/zstdruby/libzstd/decompress/zstd_decompress.c +859 -273
  64. data/ext/zstdruby/libzstd/decompress/zstd_decompress_block.c +1244 -375
  65. data/ext/zstdruby/libzstd/decompress/zstd_decompress_block.h +21 -7
  66. data/ext/zstdruby/libzstd/decompress/zstd_decompress_internal.h +74 -11
  67. data/ext/zstdruby/libzstd/dictBuilder/cover.c +75 -54
  68. data/ext/zstdruby/libzstd/dictBuilder/cover.h +20 -9
  69. data/ext/zstdruby/libzstd/dictBuilder/divsufsort.c +1 -1
  70. data/ext/zstdruby/libzstd/dictBuilder/fastcover.c +55 -36
  71. data/ext/zstdruby/libzstd/dictBuilder/zdict.c +126 -110
  72. data/ext/zstdruby/libzstd/{dictBuilder/zdict.h → zdict.h} +248 -56
  73. data/ext/zstdruby/libzstd/zstd.h +1277 -306
  74. data/ext/zstdruby/libzstd/{common/zstd_errors.h → zstd_errors.h} +29 -8
  75. data/ext/zstdruby/main.c +20 -0
  76. data/ext/zstdruby/skippable_frame.c +63 -0
  77. data/ext/zstdruby/streaming_compress.c +177 -0
  78. data/ext/zstdruby/streaming_compress.h +5 -0
  79. data/ext/zstdruby/streaming_decompress.c +123 -0
  80. data/ext/zstdruby/zstdruby.c +114 -32
  81. data/lib/zstd-ruby/version.rb +1 -1
  82. data/lib/zstd-ruby.rb +0 -1
  83. data/zstd-ruby.gemspec +1 -1
  84. metadata +24 -39
  85. data/.travis.yml +0 -14
  86. data/ext/zstdruby/libzstd/.gitignore +0 -3
  87. data/ext/zstdruby/libzstd/BUCK +0 -234
  88. data/ext/zstdruby/libzstd/Makefile +0 -289
  89. data/ext/zstdruby/libzstd/README.md +0 -159
  90. data/ext/zstdruby/libzstd/deprecated/zbuff.h +0 -214
  91. data/ext/zstdruby/libzstd/deprecated/zbuff_common.c +0 -26
  92. data/ext/zstdruby/libzstd/deprecated/zbuff_compress.c +0 -147
  93. data/ext/zstdruby/libzstd/deprecated/zbuff_decompress.c +0 -75
  94. data/ext/zstdruby/libzstd/dll/example/Makefile +0 -47
  95. data/ext/zstdruby/libzstd/dll/example/README.md +0 -69
  96. data/ext/zstdruby/libzstd/dll/example/build_package.bat +0 -20
  97. data/ext/zstdruby/libzstd/dll/example/fullbench-dll.sln +0 -25
  98. data/ext/zstdruby/libzstd/dll/example/fullbench-dll.vcxproj +0 -181
  99. data/ext/zstdruby/libzstd/legacy/zstd_legacy.h +0 -415
  100. data/ext/zstdruby/libzstd/legacy/zstd_v01.c +0 -2152
  101. data/ext/zstdruby/libzstd/legacy/zstd_v01.h +0 -94
  102. data/ext/zstdruby/libzstd/legacy/zstd_v02.c +0 -3514
  103. data/ext/zstdruby/libzstd/legacy/zstd_v02.h +0 -93
  104. data/ext/zstdruby/libzstd/legacy/zstd_v03.c +0 -3156
  105. data/ext/zstdruby/libzstd/legacy/zstd_v03.h +0 -93
  106. data/ext/zstdruby/libzstd/legacy/zstd_v04.c +0 -3641
  107. data/ext/zstdruby/libzstd/legacy/zstd_v04.h +0 -142
  108. data/ext/zstdruby/libzstd/legacy/zstd_v05.c +0 -4046
  109. data/ext/zstdruby/libzstd/legacy/zstd_v05.h +0 -162
  110. data/ext/zstdruby/libzstd/legacy/zstd_v06.c +0 -4150
  111. data/ext/zstdruby/libzstd/legacy/zstd_v06.h +0 -172
  112. data/ext/zstdruby/libzstd/legacy/zstd_v07.c +0 -4533
  113. data/ext/zstdruby/libzstd/legacy/zstd_v07.h +0 -187
  114. data/ext/zstdruby/libzstd/libzstd.pc.in +0 -15
  115. data/ext/zstdruby/zstdruby.h +0 -6
@@ -1,5 +1,5 @@
1
1
  /*
2
- * Copyright (c) 2016-present, Yann Collet, Facebook, Inc.
2
+ * Copyright (c) Meta Platforms, Inc. and affiliates.
3
3
  * All rights reserved.
4
4
  *
5
5
  * This source code is licensed under both the BSD-style license (found in the
@@ -13,8 +13,7 @@
13
13
  /*-*************************************
14
14
  * Dependencies
15
15
  ***************************************/
16
- #include <stdlib.h> /* malloc, calloc, free */
17
- #include <string.h> /* memset */
16
+ #define ZSTD_DEPS_NEED_MALLOC
18
17
  #include "error_private.h"
19
18
  #include "zstd_internal.h"
20
19
 
@@ -47,37 +46,3 @@ ZSTD_ErrorCode ZSTD_getErrorCode(size_t code) { return ERR_getErrorCode(code); }
47
46
  /*! ZSTD_getErrorString() :
48
47
  * provides error code string from enum */
49
48
  const char* ZSTD_getErrorString(ZSTD_ErrorCode code) { return ERR_getErrorString(code); }
50
-
51
-
52
-
53
- /*=**************************************************************
54
- * Custom allocator
55
- ****************************************************************/
56
- void* ZSTD_malloc(size_t size, ZSTD_customMem customMem)
57
- {
58
- if (customMem.customAlloc)
59
- return customMem.customAlloc(customMem.opaque, size);
60
- return malloc(size);
61
- }
62
-
63
- void* ZSTD_calloc(size_t size, ZSTD_customMem customMem)
64
- {
65
- if (customMem.customAlloc) {
66
- /* calloc implemented as malloc+memset;
67
- * not as efficient as calloc, but next best guess for custom malloc */
68
- void* const ptr = customMem.customAlloc(customMem.opaque, size);
69
- memset(ptr, 0, size);
70
- return ptr;
71
- }
72
- return calloc(1, size);
73
- }
74
-
75
- void ZSTD_free(void* ptr, ZSTD_customMem customMem)
76
- {
77
- if (ptr!=NULL) {
78
- if (customMem.customFree)
79
- customMem.customFree(customMem.opaque, ptr);
80
- else
81
- free(ptr);
82
- }
83
- }
@@ -0,0 +1,111 @@
1
+ /*
2
+ * Copyright (c) Meta Platforms, Inc. and affiliates.
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
+ /* This file provides common libc dependencies that zstd requires.
12
+ * The purpose is to allow replacing this file with a custom implementation
13
+ * to compile zstd without libc support.
14
+ */
15
+
16
+ /* Need:
17
+ * NULL
18
+ * INT_MAX
19
+ * UINT_MAX
20
+ * ZSTD_memcpy()
21
+ * ZSTD_memset()
22
+ * ZSTD_memmove()
23
+ */
24
+ #ifndef ZSTD_DEPS_COMMON
25
+ #define ZSTD_DEPS_COMMON
26
+
27
+ #include <limits.h>
28
+ #include <stddef.h>
29
+ #include <string.h>
30
+
31
+ #if defined(__GNUC__) && __GNUC__ >= 4
32
+ # define ZSTD_memcpy(d,s,l) __builtin_memcpy((d),(s),(l))
33
+ # define ZSTD_memmove(d,s,l) __builtin_memmove((d),(s),(l))
34
+ # define ZSTD_memset(p,v,l) __builtin_memset((p),(v),(l))
35
+ #else
36
+ # define ZSTD_memcpy(d,s,l) memcpy((d),(s),(l))
37
+ # define ZSTD_memmove(d,s,l) memmove((d),(s),(l))
38
+ # define ZSTD_memset(p,v,l) memset((p),(v),(l))
39
+ #endif
40
+
41
+ #endif /* ZSTD_DEPS_COMMON */
42
+
43
+ /* Need:
44
+ * ZSTD_malloc()
45
+ * ZSTD_free()
46
+ * ZSTD_calloc()
47
+ */
48
+ #ifdef ZSTD_DEPS_NEED_MALLOC
49
+ #ifndef ZSTD_DEPS_MALLOC
50
+ #define ZSTD_DEPS_MALLOC
51
+
52
+ #include <stdlib.h>
53
+
54
+ #define ZSTD_malloc(s) malloc(s)
55
+ #define ZSTD_calloc(n,s) calloc((n), (s))
56
+ #define ZSTD_free(p) free((p))
57
+
58
+ #endif /* ZSTD_DEPS_MALLOC */
59
+ #endif /* ZSTD_DEPS_NEED_MALLOC */
60
+
61
+ /*
62
+ * Provides 64-bit math support.
63
+ * Need:
64
+ * U64 ZSTD_div64(U64 dividend, U32 divisor)
65
+ */
66
+ #ifdef ZSTD_DEPS_NEED_MATH64
67
+ #ifndef ZSTD_DEPS_MATH64
68
+ #define ZSTD_DEPS_MATH64
69
+
70
+ #define ZSTD_div64(dividend, divisor) ((dividend) / (divisor))
71
+
72
+ #endif /* ZSTD_DEPS_MATH64 */
73
+ #endif /* ZSTD_DEPS_NEED_MATH64 */
74
+
75
+ /* Need:
76
+ * assert()
77
+ */
78
+ #ifdef ZSTD_DEPS_NEED_ASSERT
79
+ #ifndef ZSTD_DEPS_ASSERT
80
+ #define ZSTD_DEPS_ASSERT
81
+
82
+ #include <assert.h>
83
+
84
+ #endif /* ZSTD_DEPS_ASSERT */
85
+ #endif /* ZSTD_DEPS_NEED_ASSERT */
86
+
87
+ /* Need:
88
+ * ZSTD_DEBUG_PRINT()
89
+ */
90
+ #ifdef ZSTD_DEPS_NEED_IO
91
+ #ifndef ZSTD_DEPS_IO
92
+ #define ZSTD_DEPS_IO
93
+
94
+ #include <stdio.h>
95
+ #define ZSTD_DEBUG_PRINT(...) fprintf(stderr, __VA_ARGS__)
96
+
97
+ #endif /* ZSTD_DEPS_IO */
98
+ #endif /* ZSTD_DEPS_NEED_IO */
99
+
100
+ /* Only requested when <stdint.h> is known to be present.
101
+ * Need:
102
+ * intptr_t
103
+ */
104
+ #ifdef ZSTD_DEPS_NEED_STDINT
105
+ #ifndef ZSTD_DEPS_STDINT
106
+ #define ZSTD_DEPS_STDINT
107
+
108
+ #include <stdint.h>
109
+
110
+ #endif /* ZSTD_DEPS_STDINT */
111
+ #endif /* ZSTD_DEPS_NEED_STDINT */
@@ -1,5 +1,5 @@
1
1
  /*
2
- * Copyright (c) 2016-present, Yann Collet, Facebook, Inc.
2
+ * Copyright (c) Meta Platforms, Inc. and affiliates.
3
3
  * All rights reserved.
4
4
  *
5
5
  * This source code is licensed under both the BSD-style license (found in the
@@ -20,19 +20,24 @@
20
20
  * Dependencies
21
21
  ***************************************/
22
22
  #include "compiler.h"
23
+ #include "cpu.h"
23
24
  #include "mem.h"
24
25
  #include "debug.h" /* assert, DEBUGLOG, RAWLOG, g_debuglevel */
25
26
  #include "error_private.h"
26
27
  #define ZSTD_STATIC_LINKING_ONLY
27
- #include "zstd.h"
28
+ #include "../zstd.h"
28
29
  #define FSE_STATIC_LINKING_ONLY
29
30
  #include "fse.h"
30
- #define HUF_STATIC_LINKING_ONLY
31
31
  #include "huf.h"
32
32
  #ifndef XXH_STATIC_LINKING_ONLY
33
33
  # define XXH_STATIC_LINKING_ONLY /* XXH64_state_t */
34
34
  #endif
35
35
  #include "xxhash.h" /* XXH_reset, update, digest */
36
+ #ifndef ZSTD_NO_TRACE
37
+ # include "zstd_trace.h"
38
+ #else
39
+ # define ZSTD_TRACE 0
40
+ #endif
36
41
 
37
42
  #if defined (__cplusplus)
38
43
  extern "C" {
@@ -52,50 +57,7 @@ extern "C" {
52
57
  #undef MAX
53
58
  #define MIN(a,b) ((a)<(b) ? (a) : (b))
54
59
  #define MAX(a,b) ((a)>(b) ? (a) : (b))
55
-
56
- /**
57
- * Return the specified error if the condition evaluates to true.
58
- *
59
- * In debug modes, prints additional information.
60
- * In order to do that (particularly, printing the conditional that failed),
61
- * this can't just wrap RETURN_ERROR().
62
- */
63
- #define RETURN_ERROR_IF(cond, err, ...) \
64
- if (cond) { \
65
- RAWLOG(3, "%s:%d: ERROR!: check %s failed, returning %s", __FILE__, __LINE__, ZSTD_QUOTE(cond), ZSTD_QUOTE(ERROR(err))); \
66
- RAWLOG(3, ": " __VA_ARGS__); \
67
- RAWLOG(3, "\n"); \
68
- return ERROR(err); \
69
- }
70
-
71
- /**
72
- * Unconditionally return the specified error.
73
- *
74
- * In debug modes, prints additional information.
75
- */
76
- #define RETURN_ERROR(err, ...) \
77
- do { \
78
- RAWLOG(3, "%s:%d: ERROR!: unconditional check failed, returning %s", __FILE__, __LINE__, ZSTD_QUOTE(ERROR(err))); \
79
- RAWLOG(3, ": " __VA_ARGS__); \
80
- RAWLOG(3, "\n"); \
81
- return ERROR(err); \
82
- } while(0);
83
-
84
- /**
85
- * If the provided expression evaluates to an error code, returns that error code.
86
- *
87
- * In debug modes, prints additional information.
88
- */
89
- #define FORWARD_IF_ERROR(err, ...) \
90
- do { \
91
- size_t const err_code = (err); \
92
- if (ERR_isError(err_code)) { \
93
- RAWLOG(3, "%s:%d: ERROR!: forwarding error in %s: %s", __FILE__, __LINE__, ZSTD_QUOTE(err), ERR_getErrorName(err_code)); \
94
- RAWLOG(3, ": " __VA_ARGS__); \
95
- RAWLOG(3, "\n"); \
96
- return err_code; \
97
- } \
98
- } while(0);
60
+ #define BOUNDED(min,val,max) (MAX(min,MIN(val,max)))
99
61
 
100
62
 
101
63
  /*-*************************************
@@ -104,8 +66,7 @@ extern "C" {
104
66
  #define ZSTD_OPT_NUM (1<<12)
105
67
 
106
68
  #define ZSTD_REP_NUM 3 /* number of repcodes */
107
- #define ZSTD_REP_MOVE (ZSTD_REP_NUM-1)
108
- static const U32 repStartValue[ZSTD_REP_NUM] = { 1, 4, 8 };
69
+ static UNUSED_ATTR const U32 repStartValue[ZSTD_REP_NUM] = { 1, 4, 8 };
109
70
 
110
71
  #define KB *(1 <<10)
111
72
  #define MB *(1 <<20)
@@ -119,19 +80,21 @@ static const U32 repStartValue[ZSTD_REP_NUM] = { 1, 4, 8 };
119
80
  #define BIT0 1
120
81
 
121
82
  #define ZSTD_WINDOWLOG_ABSOLUTEMIN 10
122
- static const size_t ZSTD_fcs_fieldSize[4] = { 0, 2, 4, 8 };
123
- static const size_t ZSTD_did_fieldSize[4] = { 0, 1, 2, 4 };
83
+ static UNUSED_ATTR const size_t ZSTD_fcs_fieldSize[4] = { 0, 2, 4, 8 };
84
+ static UNUSED_ATTR const size_t ZSTD_did_fieldSize[4] = { 0, 1, 2, 4 };
124
85
 
125
86
  #define ZSTD_FRAMEIDSIZE 4 /* magic number size */
126
87
 
127
88
  #define ZSTD_BLOCKHEADERSIZE 3 /* C standard doesn't allow `static const` variable to be init using another `static const` variable */
128
- static const size_t ZSTD_blockHeaderSize = ZSTD_BLOCKHEADERSIZE;
89
+ static UNUSED_ATTR const size_t ZSTD_blockHeaderSize = ZSTD_BLOCKHEADERSIZE;
129
90
  typedef enum { bt_raw, bt_rle, bt_compressed, bt_reserved } blockType_e;
130
91
 
92
+ #define ZSTD_FRAMECHECKSUMSIZE 4
93
+
131
94
  #define MIN_SEQUENCES_SIZE 1 /* nbSeq==0 */
132
- #define MIN_CBLOCK_SIZE (1 /*litCSize*/ + 1 /* RLE or RAW */ + MIN_SEQUENCES_SIZE /* nbSeq==0 */) /* for a non-null block */
95
+ #define MIN_CBLOCK_SIZE (1 /*litCSize*/ + 1 /* RLE or RAW */) /* for a non-null block */
96
+ #define MIN_LITERALS_FOR_4_STREAMS 6
133
97
 
134
- #define HufLog 12
135
98
  typedef enum { set_basic, set_rle, set_compressed, set_repeat } symbolEncodingType_e;
136
99
 
137
100
  #define LONGNBSEQ 0x7F00
@@ -139,6 +102,7 @@ typedef enum { set_basic, set_rle, set_compressed, set_repeat } symbolEncodingTy
139
102
  #define MINMATCH 3
140
103
 
141
104
  #define Litbits 8
105
+ #define LitHufLog 11
142
106
  #define MaxLit ((1<<Litbits) - 1)
143
107
  #define MaxML 52
144
108
  #define MaxLL 35
@@ -149,52 +113,91 @@ typedef enum { set_basic, set_rle, set_compressed, set_repeat } symbolEncodingTy
149
113
  #define LLFSELog 9
150
114
  #define OffFSELog 8
151
115
  #define MaxFSELog MAX(MAX(MLFSELog, LLFSELog), OffFSELog)
152
-
153
- static const U32 LL_bits[MaxLL+1] = { 0, 0, 0, 0, 0, 0, 0, 0,
154
- 0, 0, 0, 0, 0, 0, 0, 0,
155
- 1, 1, 1, 1, 2, 2, 3, 3,
156
- 4, 6, 7, 8, 9,10,11,12,
157
- 13,14,15,16 };
158
- static const S16 LL_defaultNorm[MaxLL+1] = { 4, 3, 2, 2, 2, 2, 2, 2,
159
- 2, 2, 2, 2, 2, 1, 1, 1,
160
- 2, 2, 2, 2, 2, 2, 2, 2,
161
- 2, 3, 2, 1, 1, 1, 1, 1,
162
- -1,-1,-1,-1 };
116
+ #define MaxMLBits 16
117
+ #define MaxLLBits 16
118
+
119
+ #define ZSTD_MAX_HUF_HEADER_SIZE 128 /* header + <= 127 byte tree description */
120
+ /* Each table cannot take more than #symbols * FSELog bits */
121
+ #define ZSTD_MAX_FSE_HEADERS_SIZE (((MaxML + 1) * MLFSELog + (MaxLL + 1) * LLFSELog + (MaxOff + 1) * OffFSELog + 7) / 8)
122
+
123
+ static UNUSED_ATTR const U8 LL_bits[MaxLL+1] = {
124
+ 0, 0, 0, 0, 0, 0, 0, 0,
125
+ 0, 0, 0, 0, 0, 0, 0, 0,
126
+ 1, 1, 1, 1, 2, 2, 3, 3,
127
+ 4, 6, 7, 8, 9,10,11,12,
128
+ 13,14,15,16
129
+ };
130
+ static UNUSED_ATTR const S16 LL_defaultNorm[MaxLL+1] = {
131
+ 4, 3, 2, 2, 2, 2, 2, 2,
132
+ 2, 2, 2, 2, 2, 1, 1, 1,
133
+ 2, 2, 2, 2, 2, 2, 2, 2,
134
+ 2, 3, 2, 1, 1, 1, 1, 1,
135
+ -1,-1,-1,-1
136
+ };
163
137
  #define LL_DEFAULTNORMLOG 6 /* for static allocation */
164
- static const U32 LL_defaultNormLog = LL_DEFAULTNORMLOG;
165
-
166
- static const U32 ML_bits[MaxML+1] = { 0, 0, 0, 0, 0, 0, 0, 0,
167
- 0, 0, 0, 0, 0, 0, 0, 0,
168
- 0, 0, 0, 0, 0, 0, 0, 0,
169
- 0, 0, 0, 0, 0, 0, 0, 0,
170
- 1, 1, 1, 1, 2, 2, 3, 3,
171
- 4, 4, 5, 7, 8, 9,10,11,
172
- 12,13,14,15,16 };
173
- static const S16 ML_defaultNorm[MaxML+1] = { 1, 4, 3, 2, 2, 2, 2, 2,
174
- 2, 1, 1, 1, 1, 1, 1, 1,
175
- 1, 1, 1, 1, 1, 1, 1, 1,
176
- 1, 1, 1, 1, 1, 1, 1, 1,
177
- 1, 1, 1, 1, 1, 1, 1, 1,
178
- 1, 1, 1, 1, 1, 1,-1,-1,
179
- -1,-1,-1,-1,-1 };
138
+ static UNUSED_ATTR const U32 LL_defaultNormLog = LL_DEFAULTNORMLOG;
139
+
140
+ static UNUSED_ATTR const U8 ML_bits[MaxML+1] = {
141
+ 0, 0, 0, 0, 0, 0, 0, 0,
142
+ 0, 0, 0, 0, 0, 0, 0, 0,
143
+ 0, 0, 0, 0, 0, 0, 0, 0,
144
+ 0, 0, 0, 0, 0, 0, 0, 0,
145
+ 1, 1, 1, 1, 2, 2, 3, 3,
146
+ 4, 4, 5, 7, 8, 9,10,11,
147
+ 12,13,14,15,16
148
+ };
149
+ static UNUSED_ATTR const S16 ML_defaultNorm[MaxML+1] = {
150
+ 1, 4, 3, 2, 2, 2, 2, 2,
151
+ 2, 1, 1, 1, 1, 1, 1, 1,
152
+ 1, 1, 1, 1, 1, 1, 1, 1,
153
+ 1, 1, 1, 1, 1, 1, 1, 1,
154
+ 1, 1, 1, 1, 1, 1, 1, 1,
155
+ 1, 1, 1, 1, 1, 1,-1,-1,
156
+ -1,-1,-1,-1,-1
157
+ };
180
158
  #define ML_DEFAULTNORMLOG 6 /* for static allocation */
181
- static const U32 ML_defaultNormLog = ML_DEFAULTNORMLOG;
182
-
183
- static const S16 OF_defaultNorm[DefaultMaxOff+1] = { 1, 1, 1, 1, 1, 1, 2, 2,
184
- 2, 1, 1, 1, 1, 1, 1, 1,
185
- 1, 1, 1, 1, 1, 1, 1, 1,
186
- -1,-1,-1,-1,-1 };
159
+ static UNUSED_ATTR const U32 ML_defaultNormLog = ML_DEFAULTNORMLOG;
160
+
161
+ static UNUSED_ATTR const S16 OF_defaultNorm[DefaultMaxOff+1] = {
162
+ 1, 1, 1, 1, 1, 1, 2, 2,
163
+ 2, 1, 1, 1, 1, 1, 1, 1,
164
+ 1, 1, 1, 1, 1, 1, 1, 1,
165
+ -1,-1,-1,-1,-1
166
+ };
187
167
  #define OF_DEFAULTNORMLOG 5 /* for static allocation */
188
- static const U32 OF_defaultNormLog = OF_DEFAULTNORMLOG;
168
+ static UNUSED_ATTR const U32 OF_defaultNormLog = OF_DEFAULTNORMLOG;
189
169
 
190
170
 
191
171
  /*-*******************************************
192
172
  * Shared functions to include for inlining
193
173
  *********************************************/
194
- static void ZSTD_copy8(void* dst, const void* src) { memcpy(dst, src, 8); }
195
-
174
+ static void ZSTD_copy8(void* dst, const void* src) {
175
+ #if defined(ZSTD_ARCH_ARM_NEON)
176
+ vst1_u8((uint8_t*)dst, vld1_u8((const uint8_t*)src));
177
+ #else
178
+ ZSTD_memcpy(dst, src, 8);
179
+ #endif
180
+ }
196
181
  #define COPY8(d,s) { ZSTD_copy8(d,s); d+=8; s+=8; }
197
- static void ZSTD_copy16(void* dst, const void* src) { memcpy(dst, src, 16); }
182
+
183
+ /* Need to use memmove here since the literal buffer can now be located within
184
+ the dst buffer. In circumstances where the op "catches up" to where the
185
+ literal buffer is, there can be partial overlaps in this call on the final
186
+ copy if the literal is being shifted by less than 16 bytes. */
187
+ static void ZSTD_copy16(void* dst, const void* src) {
188
+ #if defined(ZSTD_ARCH_ARM_NEON)
189
+ vst1q_u8((uint8_t*)dst, vld1q_u8((const uint8_t*)src));
190
+ #elif defined(ZSTD_ARCH_X86_SSE2)
191
+ _mm_storeu_si128((__m128i*)dst, _mm_loadu_si128((const __m128i*)src));
192
+ #elif defined(__clang__)
193
+ ZSTD_memmove(dst, src, 16);
194
+ #else
195
+ /* ZSTD_memmove is not inlined properly by gcc */
196
+ BYTE copy16_buf[16];
197
+ ZSTD_memcpy(copy16_buf, src, 16);
198
+ ZSTD_memcpy(dst, copy16_buf, 16);
199
+ #endif
200
+ }
198
201
  #define COPY16(d,s) { ZSTD_copy16(d,s); d+=16; s+=16; }
199
202
 
200
203
  #define WILDCOPY_OVERLENGTH 32
@@ -207,13 +210,13 @@ typedef enum {
207
210
  } ZSTD_overlap_e;
208
211
 
209
212
  /*! ZSTD_wildcopy() :
210
- * Custom version of memcpy(), can over read/write up to WILDCOPY_OVERLENGTH bytes (if length==0)
213
+ * Custom version of ZSTD_memcpy(), can over read/write up to WILDCOPY_OVERLENGTH bytes (if length==0)
211
214
  * @param ovtype controls the overlap detection
212
215
  * - ZSTD_no_overlap: The source and destination are guaranteed to be at least WILDCOPY_VECLEN bytes apart.
213
216
  * - ZSTD_overlap_src_before_dst: The src and dst may overlap, but they MUST be at least 8 bytes apart.
214
217
  * The src buffer must be before the dst buffer.
215
218
  */
216
- MEM_STATIC FORCE_INLINE_ATTR DONT_VECTORIZE
219
+ MEM_STATIC FORCE_INLINE_ATTR
217
220
  void ZSTD_wildcopy(void* dst, const void* src, ptrdiff_t length, ZSTD_overlap_e const ovtype)
218
221
  {
219
222
  ptrdiff_t diff = (BYTE*)dst - (const BYTE*)src;
@@ -221,8 +224,6 @@ void ZSTD_wildcopy(void* dst, const void* src, ptrdiff_t length, ZSTD_overlap_e
221
224
  BYTE* op = (BYTE*)dst;
222
225
  BYTE* const oend = op + length;
223
226
 
224
- assert(diff >= 8 || (ovtype == ZSTD_no_overlap && diff <= -WILDCOPY_VECLEN));
225
-
226
227
  if (ovtype == ZSTD_overlap_src_before_dst && diff < WILDCOPY_VECLEN) {
227
228
  /* Handle short offset copies. */
228
229
  do {
@@ -230,15 +231,16 @@ void ZSTD_wildcopy(void* dst, const void* src, ptrdiff_t length, ZSTD_overlap_e
230
231
  } while (op < oend);
231
232
  } else {
232
233
  assert(diff >= WILDCOPY_VECLEN || diff <= -WILDCOPY_VECLEN);
233
- /* Separate out the first two COPY16() calls because the copy length is
234
+ /* Separate out the first COPY16() call because the copy length is
234
235
  * almost certain to be short, so the branches have different
235
- * probabilities.
236
- * On gcc-9 unrolling once is +1.6%, twice is +2%, thrice is +1.8%.
237
- * On clang-8 unrolling once is +1.4%, twice is +3.3%, thrice is +3%.
236
+ * probabilities. Since it is almost certain to be short, only do
237
+ * one COPY16() in the first call. Then, do two calls per loop since
238
+ * at that point it is more likely to have a high trip count.
238
239
  */
239
- COPY16(op, ip);
240
- COPY16(op, ip);
241
- if (op >= oend) return;
240
+ ZSTD_copy16(op, ip);
241
+ if (16 >= length) return;
242
+ op += 16;
243
+ ip += 16;
242
244
  do {
243
245
  COPY16(op, ip);
244
246
  COPY16(op, ip);
@@ -247,30 +249,92 @@ void ZSTD_wildcopy(void* dst, const void* src, ptrdiff_t length, ZSTD_overlap_e
247
249
  }
248
250
  }
249
251
 
252
+ MEM_STATIC size_t ZSTD_limitCopy(void* dst, size_t dstCapacity, const void* src, size_t srcSize)
253
+ {
254
+ size_t const length = MIN(dstCapacity, srcSize);
255
+ if (length > 0) {
256
+ ZSTD_memcpy(dst, src, length);
257
+ }
258
+ return length;
259
+ }
260
+
261
+ /* define "workspace is too large" as this number of times larger than needed */
262
+ #define ZSTD_WORKSPACETOOLARGE_FACTOR 3
263
+
264
+ /* when workspace is continuously too large
265
+ * during at least this number of times,
266
+ * context's memory usage is considered wasteful,
267
+ * because it's sized to handle a worst case scenario which rarely happens.
268
+ * In which case, resize it down to free some memory */
269
+ #define ZSTD_WORKSPACETOOLARGE_MAXDURATION 128
270
+
271
+ /* Controls whether the input/output buffer is buffered or stable. */
272
+ typedef enum {
273
+ ZSTD_bm_buffered = 0, /* Buffer the input/output */
274
+ ZSTD_bm_stable = 1 /* ZSTD_inBuffer/ZSTD_outBuffer is stable */
275
+ } ZSTD_bufferMode_e;
276
+
250
277
 
251
278
  /*-*******************************************
252
279
  * Private declarations
253
280
  *********************************************/
254
281
  typedef struct seqDef_s {
255
- U32 offset;
282
+ U32 offBase; /* offBase == Offset + ZSTD_REP_NUM, or repcode 1,2,3 */
256
283
  U16 litLength;
257
- U16 matchLength;
284
+ U16 mlBase; /* mlBase == matchLength - MINMATCH */
258
285
  } seqDef;
259
286
 
287
+ /* Controls whether seqStore has a single "long" litLength or matchLength. See seqStore_t. */
288
+ typedef enum {
289
+ ZSTD_llt_none = 0, /* no longLengthType */
290
+ ZSTD_llt_literalLength = 1, /* represents a long literal */
291
+ ZSTD_llt_matchLength = 2 /* represents a long match */
292
+ } ZSTD_longLengthType_e;
293
+
260
294
  typedef struct {
261
295
  seqDef* sequencesStart;
262
- seqDef* sequences;
263
- BYTE* litStart;
264
- BYTE* lit;
265
- BYTE* llCode;
266
- BYTE* mlCode;
267
- BYTE* ofCode;
296
+ seqDef* sequences; /* ptr to end of sequences */
297
+ BYTE* litStart;
298
+ BYTE* lit; /* ptr to end of literals */
299
+ BYTE* llCode;
300
+ BYTE* mlCode;
301
+ BYTE* ofCode;
268
302
  size_t maxNbSeq;
269
303
  size_t maxNbLit;
270
- U32 longLengthID; /* 0 == no longLength; 1 == Lit.longLength; 2 == Match.longLength; */
271
- U32 longLengthPos;
304
+
305
+ /* longLengthPos and longLengthType to allow us to represent either a single litLength or matchLength
306
+ * in the seqStore that has a value larger than U16 (if it exists). To do so, we increment
307
+ * the existing value of the litLength or matchLength by 0x10000.
308
+ */
309
+ ZSTD_longLengthType_e longLengthType;
310
+ U32 longLengthPos; /* Index of the sequence to apply long length modification to */
272
311
  } seqStore_t;
273
312
 
313
+ typedef struct {
314
+ U32 litLength;
315
+ U32 matchLength;
316
+ } ZSTD_sequenceLength;
317
+
318
+ /**
319
+ * Returns the ZSTD_sequenceLength for the given sequences. It handles the decoding of long sequences
320
+ * indicated by longLengthPos and longLengthType, and adds MINMATCH back to matchLength.
321
+ */
322
+ MEM_STATIC ZSTD_sequenceLength ZSTD_getSequenceLength(seqStore_t const* seqStore, seqDef const* seq)
323
+ {
324
+ ZSTD_sequenceLength seqLen;
325
+ seqLen.litLength = seq->litLength;
326
+ seqLen.matchLength = seq->mlBase + MINMATCH;
327
+ if (seqStore->longLengthPos == (U32)(seq - seqStore->sequencesStart)) {
328
+ if (seqStore->longLengthType == ZSTD_llt_literalLength) {
329
+ seqLen.litLength += 0x10000;
330
+ }
331
+ if (seqStore->longLengthType == ZSTD_llt_matchLength) {
332
+ seqLen.matchLength += 0x10000;
333
+ }
334
+ }
335
+ return seqLen;
336
+ }
337
+
274
338
  /**
275
339
  * Contains the compressed frame size and an upper-bound for the decompressed frame size.
276
340
  * Note: before using `compressedSize`, check for errors using ZSTD_isError().
@@ -278,43 +342,13 @@ typedef struct {
278
342
  * `decompressedBound != ZSTD_CONTENTSIZE_ERROR`
279
343
  */
280
344
  typedef struct {
345
+ size_t nbBlocks;
281
346
  size_t compressedSize;
282
347
  unsigned long long decompressedBound;
283
348
  } ZSTD_frameSizeInfo; /* decompress & legacy */
284
349
 
285
350
  const seqStore_t* ZSTD_getSeqStore(const ZSTD_CCtx* ctx); /* compress & dictBuilder */
286
- void ZSTD_seqToCodes(const seqStore_t* seqStorePtr); /* compress, dictBuilder, decodeCorpus (shouldn't get its definition from here) */
287
-
288
- /* custom memory allocation functions */
289
- void* ZSTD_malloc(size_t size, ZSTD_customMem customMem);
290
- void* ZSTD_calloc(size_t size, ZSTD_customMem customMem);
291
- void ZSTD_free(void* ptr, ZSTD_customMem customMem);
292
-
293
-
294
- MEM_STATIC U32 ZSTD_highbit32(U32 val) /* compress, dictBuilder, decodeCorpus */
295
- {
296
- assert(val != 0);
297
- {
298
- # if defined(_MSC_VER) /* Visual */
299
- unsigned long r=0;
300
- _BitScanReverse(&r, val);
301
- return (unsigned)r;
302
- # elif defined(__GNUC__) && (__GNUC__ >= 3) /* GCC Intrinsic */
303
- return __builtin_clz (val) ^ 31;
304
- # elif defined(__ICCARM__) /* IAR Intrinsic */
305
- return 31 - __CLZ(val);
306
- # else /* Software version */
307
- static const U32 DeBruijnClz[32] = { 0, 9, 1, 10, 13, 21, 2, 29, 11, 14, 16, 18, 22, 25, 3, 30, 8, 12, 20, 28, 15, 17, 24, 7, 19, 27, 23, 6, 26, 5, 4, 31 };
308
- U32 v = val;
309
- v |= v >> 1;
310
- v |= v >> 2;
311
- v |= v >> 4;
312
- v |= v >> 8;
313
- v |= v >> 16;
314
- return DeBruijnClz[(v * 0x07C4ACDDU) >> 27];
315
- # endif
316
- }
317
- }
351
+ int ZSTD_seqToCodes(const seqStore_t* seqStorePtr); /* compress, dictBuilder, decodeCorpus (shouldn't get its definition from here) */
318
352
 
319
353
 
320
354
  /* ZSTD_invalidateRepCodes() :
@@ -342,6 +376,14 @@ size_t ZSTD_getcBlockSize(const void* src, size_t srcSize,
342
376
  size_t ZSTD_decodeSeqHeaders(ZSTD_DCtx* dctx, int* nbSeqPtr,
343
377
  const void* src, size_t srcSize);
344
378
 
379
+ /**
380
+ * @returns true iff the CPU supports dynamic BMI2 dispatch.
381
+ */
382
+ MEM_STATIC int ZSTD_cpuSupportsBmi2(void)
383
+ {
384
+ ZSTD_cpuid_t cpuid = ZSTD_cpuid();
385
+ return ZSTD_cpuid_bmi1(cpuid) && ZSTD_cpuid_bmi2(cpuid);
386
+ }
345
387
 
346
388
  #if defined (__cplusplus)
347
389
  }