extzstd 0.3.3 → 0.4

Sign up to get free protection for your applications and to get access to all the features.
Files changed (69) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +4 -3
  3. data/contrib/zstd/CHANGELOG +39 -2
  4. data/contrib/zstd/CONTRIBUTING.md +3 -3
  5. data/contrib/zstd/Makefile +34 -20
  6. data/contrib/zstd/README.md +6 -2
  7. data/contrib/zstd/SECURITY.md +15 -0
  8. data/contrib/zstd/lib/Makefile +40 -28
  9. data/contrib/zstd/lib/README.md +14 -1
  10. data/contrib/zstd/lib/common/allocations.h +1 -1
  11. data/contrib/zstd/lib/common/bitstream.h +49 -29
  12. data/contrib/zstd/lib/common/compiler.h +114 -22
  13. data/contrib/zstd/lib/common/cpu.h +36 -0
  14. data/contrib/zstd/lib/common/debug.c +6 -0
  15. data/contrib/zstd/lib/common/debug.h +20 -11
  16. data/contrib/zstd/lib/common/error_private.h +45 -36
  17. data/contrib/zstd/lib/common/fse.h +3 -2
  18. data/contrib/zstd/lib/common/fse_decompress.c +19 -17
  19. data/contrib/zstd/lib/common/huf.h +14 -1
  20. data/contrib/zstd/lib/common/mem.h +0 -9
  21. data/contrib/zstd/lib/common/pool.c +1 -1
  22. data/contrib/zstd/lib/common/pool.h +1 -1
  23. data/contrib/zstd/lib/common/portability_macros.h +2 -0
  24. data/contrib/zstd/lib/common/threading.c +8 -2
  25. data/contrib/zstd/lib/common/xxhash.c +5 -11
  26. data/contrib/zstd/lib/common/xxhash.h +2341 -1007
  27. data/contrib/zstd/lib/common/zstd_internal.h +5 -5
  28. data/contrib/zstd/lib/compress/fse_compress.c +8 -7
  29. data/contrib/zstd/lib/compress/huf_compress.c +54 -25
  30. data/contrib/zstd/lib/compress/zstd_compress.c +282 -161
  31. data/contrib/zstd/lib/compress/zstd_compress_internal.h +29 -27
  32. data/contrib/zstd/lib/compress/zstd_compress_superblock.c +224 -113
  33. data/contrib/zstd/lib/compress/zstd_cwksp.h +19 -13
  34. data/contrib/zstd/lib/compress/zstd_double_fast.c +17 -5
  35. data/contrib/zstd/lib/compress/zstd_double_fast.h +11 -0
  36. data/contrib/zstd/lib/compress/zstd_fast.c +14 -6
  37. data/contrib/zstd/lib/compress/zstd_lazy.c +129 -87
  38. data/contrib/zstd/lib/compress/zstd_lazy.h +103 -28
  39. data/contrib/zstd/lib/compress/zstd_ldm.c +8 -2
  40. data/contrib/zstd/lib/compress/zstd_opt.c +216 -112
  41. data/contrib/zstd/lib/compress/zstd_opt.h +31 -7
  42. data/contrib/zstd/lib/compress/zstdmt_compress.c +94 -79
  43. data/contrib/zstd/lib/decompress/huf_decompress.c +188 -126
  44. data/contrib/zstd/lib/decompress/huf_decompress_amd64.S +38 -19
  45. data/contrib/zstd/lib/decompress/zstd_decompress.c +84 -32
  46. data/contrib/zstd/lib/decompress/zstd_decompress_block.c +231 -208
  47. data/contrib/zstd/lib/decompress/zstd_decompress_block.h +1 -1
  48. data/contrib/zstd/lib/decompress/zstd_decompress_internal.h +2 -0
  49. data/contrib/zstd/lib/dictBuilder/cover.c +16 -12
  50. data/contrib/zstd/lib/dictBuilder/cover.h +2 -8
  51. data/contrib/zstd/lib/dictBuilder/fastcover.c +2 -2
  52. data/contrib/zstd/lib/dictBuilder/zdict.c +12 -6
  53. data/contrib/zstd/lib/legacy/zstd_legacy.h +30 -0
  54. data/contrib/zstd/lib/legacy/zstd_v01.c +2 -0
  55. data/contrib/zstd/lib/legacy/zstd_v02.c +4 -16
  56. data/contrib/zstd/lib/legacy/zstd_v03.c +4 -16
  57. data/contrib/zstd/lib/legacy/zstd_v04.c +4 -11
  58. data/contrib/zstd/lib/legacy/zstd_v05.c +1 -0
  59. data/contrib/zstd/lib/legacy/zstd_v06.c +2 -9
  60. data/contrib/zstd/lib/legacy/zstd_v07.c +2 -10
  61. data/contrib/zstd/lib/libzstd.mk +34 -11
  62. data/contrib/zstd/lib/zstd.h +129 -60
  63. data/ext/extconf.rb +19 -1
  64. data/ext/extzstd.c +38 -14
  65. data/ext/extzstd.h +33 -6
  66. data/ext/extzstd_stream.c +74 -31
  67. metadata +4 -5
  68. data/contrib/zstd/appveyor.yml +0 -205
  69. data/ext/depend +0 -2
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 7b151f382c2d8980326dae78c9681514161711c9358c44a19729042c07ae2260
4
- data.tar.gz: 8a1c6b3d7f9ee12b145c285167c3e4e0a0f52d6d4fe56c1f4623d55010be7e02
3
+ metadata.gz: 5f3831b1c8cc5c106619c27d9d1136868050e35d5cb997d8a06f66bcf9106070
4
+ data.tar.gz: c8824b400e0706d073553eb9a90bb445b1af9d624672d5020acf87d58fcb4524
5
5
  SHA512:
6
- metadata.gz: 680168cf0f96af389033e0d113ab88212197fcd60e8a800b37f38ea68b1923e4316f8b105399e5a78b1b75215987ac72f421dfaf5f6af3991dab66dc974f17f6
7
- data.tar.gz: a83e205abfa822cce0b780fc9495996be4a45a079447353cc1ff45a362d3dc524ac8c0b8971020949f2451df6b601f59d8080e0453bb83b1118e038e4c237faa
6
+ metadata.gz: dd42f25011a7390206851eccb1e9c515a5245d6634844096bc35342d59d8f3c07f45564dc78efedaafd3846a9c39202ff18821e81bb1da124ace0bca88d7839f
7
+ data.tar.gz: c1f6c98bc5a1b48f4bfe5c17d3fcc04155741c90788d82ac1eec71c27b05177c02ad15bb38a2868b5194e40740e083a9133e1090dd1bb6a63910325d629204ad
data/README.md CHANGED
@@ -91,7 +91,7 @@ p Ractor.new {
91
91
 
92
92
  - package name: extzstd
93
93
  - project page: <https://github.com/dearblue/ruby-extzstd>
94
- - version: 0.3.3
94
+ - version: 0.4
95
95
  - product quality: TECHNICAL PREVIEW, UNSTABLE
96
96
  - license: [2 clause BSD License](LICENSE)
97
97
  - author: dearblue
@@ -99,6 +99,7 @@ p Ractor.new {
99
99
  - dependency ruby gems: (none)
100
100
  - dependency library: (none)
101
101
  - bundled external C library (git submodules):
102
- - [zstd-1.5.5](https://github.com/facebook/zstd/blob/v1.5.5)
103
- under selectable dual licensed ([3 clause BSD License](https://github.com/facebook/zstd/blob/v1.5.5/LICENSE) and [GNU General Public License, version 2](https://github.com/facebook/zstd/blob/v1.5.5/COPYING))
102
+ - [zstd-1.5.6](https://github.com/facebook/zstd/blob/v1.5.6)
103
+ under dual licensed ([3 clause BSD License](https://github.com/facebook/zstd/blob/v1.5.6/LICENSE)
104
+ or [GNU General Public License, version 2](https://github.com/facebook/zstd/blob/v1.5.6/COPYING))
104
105
  by [facebook](https://github.com/facebook)
@@ -1,3 +1,40 @@
1
+ V1.5.6 (Mar 2024)
2
+ api: Promote `ZSTD_c_targetCBlockSize` to Stable API by @felixhandte
3
+ api: new `ZSTD_d_maxBlockSize` experimental parameter, to reduce streaming decompression memory, by @terrelln
4
+ perf: improve performance of param `ZSTD_c_targetCBlockSize`, by @Cyan4973
5
+ perf: improved compression of arrays of integers at high compression, by @Cyan4973
6
+ lib: reduce binary size with selective built-time exclusion, by @felixhandte
7
+ lib: improved huffman speed on small data and linux kernel, by @terrelln
8
+ lib: accept dictionaries with partial literal tables, by @terrelln
9
+ lib: fix CCtx size estimation with external sequence producer, by @embg
10
+ lib: fix corner case decoder behaviors, by @Cyan4973 and @aimuz
11
+ lib: fix zdict prototype mismatch in static_only mode, by @ldv-alt
12
+ lib: fix several bugs in magicless-format decoding, by @embg
13
+ cli: add common compressed file types to `--exclude-compressed`` by @daniellerozenblit
14
+ cli: fix mixing `-c` and `-o` commands with `--rm`, by @Cyan4973
15
+ cli: fix erroneous exclusion of hidden files with `--output-dir-mirror` by @felixhandte
16
+ cli: improved time accuracy on BSD, by @felixhandte
17
+ cli: better errors on argument parsing, by @KapJI
18
+ tests: better compatibility with older versions of `grep`, by @Cyan4973
19
+ tests: lorem ipsum generator as default backup content, by @Cyan4973
20
+ build: cmake improvements by @terrelln, @sighingnow, @gjasny, @JohanMabille, @Saverio976, @gruenich, @teo-tsirpanis
21
+ build: bazel support, by @jondo2010
22
+ build: fix cross-compiling for AArch64 with lld by @jcelerier
23
+ build: fix Apple platform compatibility, by @nidhijaju
24
+ build: fix Visual 2012 and lower compatibility, by @Cyan4973
25
+ build: improve win32 support, by @DimitriPapadopoulos
26
+ build: better C90 compliance for zlibWrapper, by @emaste
27
+ port: make: fat binaries on macos, by @mredig
28
+ port: ARM64EC compatibility for Windows, by @dunhor
29
+ port: QNX support by @klausholstjacobsen
30
+ port: MSYS2 and Cygwin makefile installation and test support, by @QBos07
31
+ port: risc-v support validation in CI, by @Cyan4973
32
+ port: sparc64 support validation in CI, by @Cyan4973
33
+ port: AIX compatibility, by @likema
34
+ port: HP-UX compatibility, by @likema
35
+ doc: Improved specification accuracy, by @elasota
36
+ bug: Fix and deprecate ZSTD_generateSequences (#3981)
37
+
1
38
  v1.5.5 (Apr 2023)
2
39
  fix: fix rare corruption bug affecting the high compression mode, reported by @danlark1 (#3517, @terrelln)
3
40
  perf: improve mid-level compression speed (#3529, #3533, #3543, @yoniko and #3552, @terrelln)
@@ -98,7 +135,7 @@ build: support for m68k (Motorola 68000's), by @cyan4973
98
135
  build: improved AIX support, by @Helflym
99
136
  build: improved meson unofficial build, by @eli-schwartz
100
137
  cli : custom memory limit when training dictionary (#2925), by @embg
101
- cli : report advanced parameters information when compressing in very verbose mode (``-vv`), by @Svetlitski-FB
138
+ cli : report advanced parameters information when compressing in very verbose mode (`-vv`), by @Svetlitski-FB
102
139
 
103
140
  v1.5.0 (May 11, 2021)
104
141
  api: Various functions promoted from experimental to stable API: (#2579-2581, @senhuang42)
@@ -165,7 +202,7 @@ api: Add Function to Generate Skippable Frame (#2439, @senhuang42)
165
202
  perf: New Algorithms for the Long Distance Matcher (#2483, @mpu)
166
203
  perf: Performance Improvements for Long Distance Matcher (#2464, @mpu)
167
204
  perf: Don't Shrink Window Log when Streaming with a Dictionary (#2451, @terrelln)
168
- cli: Fix `--output-dir-mirror`'s Rejection of `..`-Containing Paths (#2512, @felixhandte)
205
+ cli: Fix `--output-dir-mirror` rejection of `..` -containing paths (#2512, @felixhandte)
169
206
  cli: Allow Input From Console When `-f`/`--force` is Passed (#2466, @felixhandte)
170
207
  cli: Improve Help Message (#2500, @senhuang42)
171
208
  tests: Remove Flaky Tests (#2455, #2486, #2445, @Cyan4973)
@@ -171,8 +171,8 @@ who want earlier signal.
171
171
  | Cirrus CI | Used for testing on FreeBSD | https://github.com/marketplace/cirrus-ci/ | `.cirrus.yml` |
172
172
  | Circle CI | Historically was used to provide faster signal,<br/> but we may be able to migrate these to Github Actions | https://circleci.com/docs/2.0/getting-started/#setting-up-circleci <br> https://youtu.be/Js3hMUsSZ2c <br> https://circleci.com/docs/2.0/enable-checks/ | `.circleci/config.yml` |
173
173
 
174
- Note: the instructions linked above mostly cover how to set up a repository with CI from scratch.
175
- The general idea should be the same for setting up CI on your fork of zstd, but you may have to
174
+ Note: the instructions linked above mostly cover how to set up a repository with CI from scratch.
175
+ The general idea should be the same for setting up CI on your fork of zstd, but you may have to
176
176
  follow slightly different steps. In particular, please ignore any instructions related to setting up
177
177
  config files (since zstd already has configs for each of these services).
178
178
 
@@ -216,7 +216,7 @@ will typically not be stable enough to obtain reliable benchmark results. If you
216
216
  hands on a desktop, this is usually a better scenario.
217
217
 
218
218
  Of course, benchmarking can be done on non-hyper-stable machines as well. You will just have to
219
- do a little more work to ensure that you are in fact measuring the changes you've made not and
219
+ do a little more work to ensure that you are in fact measuring the changes you've made and not
220
220
  noise. Here are some things you can do to make your benchmarks more stable:
221
221
 
222
222
  1. The most simple thing you can do to drastically improve the stability of your benchmark is
@@ -145,13 +145,13 @@ clean:
145
145
  $(Q)$(MAKE) -C contrib/largeNbDicts $@ > $(VOID)
146
146
  $(Q)$(MAKE) -C contrib/externalSequenceProducer $@ > $(VOID)
147
147
  $(Q)$(RM) zstd$(EXT) zstdmt$(EXT) tmp*
148
- $(Q)$(RM) -r lz4
148
+ $(Q)$(RM) -r lz4 cmakebuild install
149
149
  @echo Cleaning completed
150
150
 
151
151
  #------------------------------------------------------------------------------
152
152
  # make install is validated only for Linux, macOS, Hurd and some BSD targets
153
153
  #------------------------------------------------------------------------------
154
- ifneq (,$(filter $(shell uname),Linux Darwin GNU/kFreeBSD GNU OpenBSD FreeBSD DragonFly NetBSD MSYS_NT Haiku AIX))
154
+ ifneq (,$(filter $(shell uname),Linux Darwin GNU/kFreeBSD GNU OpenBSD FreeBSD DragonFly NetBSD MSYS_NT CYGWIN_NT Haiku AIX))
155
155
 
156
156
  HOST_OS = POSIX
157
157
 
@@ -197,6 +197,15 @@ uninstall:
197
197
  travis-install:
198
198
  $(MAKE) install PREFIX=~/install_test_dir
199
199
 
200
+ .PHONY: clangbuild-darwin-fat
201
+ clangbuild-darwin-fat: clean
202
+ clang -v
203
+ CXX=clang++ CC=clang CFLAGS="-Werror -Wconversion -Wno-sign-conversion -Wdocumentation -arch arm64" $(MAKE) zstd-release
204
+ mv programs/zstd programs/zstd_arm64
205
+ CXX=clang++ CC=clang CFLAGS="-Werror -Wconversion -Wno-sign-conversion -Wdocumentation -arch x86_64" $(MAKE) zstd-release
206
+ mv programs/zstd programs/zstd_x64
207
+ lipo -create programs/zstd_x64 programs/zstd_arm64 -output programs/zstd
208
+
200
209
  .PHONY: gcc5build gcc6build gcc7build clangbuild m32build armbuild aarch64build ppcbuild ppc64build
201
210
  gcc5build: clean
202
211
  gcc-5 -v
@@ -308,7 +317,7 @@ update_regressionResults:
308
317
  # run UBsan with -fsanitize-recover=pointer-overflow
309
318
  # this only works with recent compilers such as gcc 8+
310
319
  usan: clean
311
- $(MAKE) test CC=clang MOREFLAGS="-g -fno-sanitize-recover=all -fsanitize-recover=pointer-overflow -fsanitize=undefined -Werror $(MOREFLAGS)"
320
+ $(MAKE) test CC=clang MOREFLAGS="-g -fno-sanitize-recover=all -fsanitize=undefined -Werror $(MOREFLAGS)"
312
321
 
313
322
  asan: clean
314
323
  $(MAKE) test CC=clang MOREFLAGS="-g -fsanitize=address -Werror $(MOREFLAGS)"
@@ -319,17 +328,18 @@ asan-%: clean
319
328
  msan: clean
320
329
  $(MAKE) test CC=clang MOREFLAGS="-g -fsanitize=memory -fno-omit-frame-pointer -Werror $(MOREFLAGS)" HAVE_LZMA=0 # datagen.c fails this test for no obvious reason
321
330
 
322
- msan-%: clean
323
- LDFLAGS=-fuse-ld=gold MOREFLAGS="-g -fno-sanitize-recover=all -fsanitize=memory -fno-omit-frame-pointer -Werror $(MOREFLAGS)" FUZZER_FLAGS="--no-big-tests $(FUZZER_FLAGS)" $(MAKE) -C $(TESTDIR) HAVE_LZMA=0 $*
331
+ msan-%:
332
+ $(MAKE) clean
333
+ LDFLAGS=-fuse-ld=gold MOREFLAGS="-g -fno-sanitize-recover=all -fsanitize=memory -fno-omit-frame-pointer -Werror $(MOREFLAGS)" FUZZER_FLAGS="--no-big-tests $(FUZZER_FLAGS)" $(MAKE) -j -C $(TESTDIR) HAVE_LZMA=0 $*
324
334
 
325
335
  asan32: clean
326
336
  $(MAKE) -C $(TESTDIR) test32 CC=clang MOREFLAGS="-g -fsanitize=address $(MOREFLAGS)"
327
337
 
328
338
  uasan: clean
329
- $(MAKE) test CC=clang MOREFLAGS="-g -fno-sanitize-recover=all -fsanitize-recover=pointer-overflow -fsanitize=address,undefined -Werror $(MOREFLAGS)"
339
+ $(MAKE) test CC=clang MOREFLAGS="-g -fno-sanitize-recover=all -fsanitize=address,undefined -Werror $(MOREFLAGS)"
330
340
 
331
341
  uasan-%: clean
332
- LDFLAGS=-fuse-ld=gold MOREFLAGS="-g -fno-sanitize-recover=all -fsanitize-recover=pointer-overflow -fsanitize=address,undefined -Werror $(MOREFLAGS)" $(MAKE) -C $(TESTDIR) $*
342
+ LDFLAGS=-fuse-ld=gold MOREFLAGS="-g -fno-sanitize-recover=all -fsanitize=address,undefined -Werror $(MOREFLAGS)" $(MAKE) -C $(TESTDIR) $*
333
343
 
334
344
  tsan-%: clean
335
345
  LDFLAGS=-fuse-ld=gold MOREFLAGS="-g -fno-sanitize-recover=all -fsanitize=thread -Werror $(MOREFLAGS)" $(MAKE) -C $(TESTDIR) $* FUZZER_FLAGS="--no-big-tests $(FUZZER_FLAGS)"
@@ -380,28 +390,32 @@ lz4install:
380
390
  endif
381
391
 
382
392
 
383
- CMAKE_PARAMS = -DZSTD_BUILD_CONTRIB:BOOL=ON -DZSTD_BUILD_STATIC:BOOL=ON -DZSTD_BUILD_TESTS:BOOL=ON -DZSTD_ZLIB_SUPPORT:BOOL=ON -DZSTD_LZMA_SUPPORT:BOOL=ON -DCMAKE_BUILD_TYPE=Release
384
-
385
393
  ifneq (,$(filter MSYS%,$(shell uname)))
386
394
  HOST_OS = MSYS
387
- CMAKE_PARAMS = -G"MSYS Makefiles" -DCMAKE_BUILD_TYPE=Debug -DZSTD_MULTITHREAD_SUPPORT:BOOL=OFF -DZSTD_BUILD_STATIC:BOOL=ON -DZSTD_BUILD_TESTS:BOOL=ON
388
395
  endif
389
396
 
390
397
  #------------------------------------------------------------------------
391
398
  # target specific tests
392
399
  #------------------------------------------------------------------------
393
400
  ifneq (,$(filter $(HOST_OS),MSYS POSIX))
394
- .PHONY: cmakebuild c89build gnu90build c99build gnu99build c11build bmix64build bmix32build bmi32build staticAnalyze
395
- cmakebuild:
396
- cmake --version
397
- $(RM) -r $(BUILDIR)/cmake/build
398
- $(MKDIR) $(BUILDIR)/cmake/build
399
- cd $(BUILDIR)/cmake/build; cmake -DCMAKE_INSTALL_PREFIX:PATH=~/install_test_dir $(CMAKE_PARAMS) ..
400
- $(MAKE) -C $(BUILDIR)/cmake/build -j4;
401
- $(MAKE) -C $(BUILDIR)/cmake/build install;
402
- $(MAKE) -C $(BUILDIR)/cmake/build uninstall;
403
- cd $(BUILDIR)/cmake/build; ctest -V -L Medium
404
401
 
402
+ CMAKE ?= cmake
403
+ CMAKE_PARAMS = -DZSTD_BUILD_CONTRIB:BOOL=ON -DZSTD_BUILD_STATIC:BOOL=ON -DZSTD_BUILD_TESTS:BOOL=ON -DZSTD_ZLIB_SUPPORT:BOOL=ON -DZSTD_LZMA_SUPPORT:BOOL=ON
404
+
405
+ ifneq (,$(filter MSYS%,$(shell uname)))
406
+ CMAKE_PARAMS = -G"MSYS Makefiles" -DZSTD_MULTITHREAD_SUPPORT:BOOL=OFF -DZSTD_BUILD_STATIC:BOOL=ON -DZSTD_BUILD_TESTS:BOOL=ON
407
+ endif
408
+
409
+ .PHONY: cmakebuild
410
+ cmakebuild:
411
+ $(CMAKE) --version
412
+ $(RM) -r cmakebuild install
413
+ $(MKDIR) cmakebuild install
414
+ cd cmakebuild; $(CMAKE) -Wdev -DCMAKE_BUILD_TYPE=Debug -DCMAKE_C_FLAGS="-Werror -O0" -DCMAKE_INSTALL_PREFIX=install $(CMAKE_PARAMS) ../build/cmake
415
+ $(CMAKE) --build cmakebuild --target install -- -j V=1
416
+ cd cmakebuild; ctest -V -L Medium
417
+
418
+ .PHONY: c89build gnu90build c99build gnu99build c11build bmix64build bmix32build bmi32build staticAnalyze
405
419
  c89build: clean
406
420
  $(CC) -v
407
421
  CFLAGS="-std=c89 -Werror -Wno-attributes -Wpedantic -Wno-long-long -Wno-variadic-macros -O0" $(MAKE) lib zstd
@@ -5,7 +5,7 @@ targeting real-time compression scenarios at zlib-level and better compression r
5
5
  It's backed by a very fast entropy stage, provided by [Huff0 and FSE library](https://github.com/Cyan4973/FiniteStateEntropy).
6
6
 
7
7
  Zstandard's format is stable and documented in [RFC8878](https://datatracker.ietf.org/doc/html/rfc8878). Multiple independent implementations are already available.
8
- This repository represents the reference implementation, provided as an open-source dual [BSD](LICENSE) and [GPLv2](COPYING) licensed **C** library,
8
+ This repository represents the reference implementation, provided as an open-source dual [BSD](LICENSE) OR [GPLv2](COPYING) licensed **C** library,
9
9
  and a command line utility producing and decoding `.zst`, `.gz`, `.xz` and `.lz4` files.
10
10
  Should your project require another programming language,
11
11
  a list of known ports and bindings is provided on [Zstandard homepage](https://facebook.github.io/zstd/#other-languages).
@@ -198,6 +198,10 @@ Going into `build` directory, you will find additional possibilities:
198
198
  You can build the zstd binary via buck by executing: `buck build programs:zstd` from the root of the repo.
199
199
  The output binary will be in `buck-out/gen/programs/`.
200
200
 
201
+ ### Bazel
202
+
203
+ You easily can integrate zstd into your Bazel project by using the module hosted on the [Bazel Central Repository](https://registry.bazel.build/modules/zstd).
204
+
201
205
  ## Testing
202
206
 
203
207
  You can run quick local smoke tests by running `make check`.
@@ -213,7 +217,7 @@ Zstandard is considered safe for production environments.
213
217
 
214
218
  ## License
215
219
 
216
- Zstandard is dual-licensed under [BSD](LICENSE) and [GPLv2](COPYING).
220
+ Zstandard is dual-licensed under [BSD](LICENSE) OR [GPLv2](COPYING).
217
221
 
218
222
  ## Contributing
219
223
 
@@ -0,0 +1,15 @@
1
+ # Reporting and Fixing Security Issues
2
+
3
+ Please do not open GitHub issues or pull requests - this makes the problem immediately visible to everyone, including malicious actors. Security issues in this open source project can be safely reported via the Meta Bug Bounty program:
4
+
5
+ https://www.facebook.com/whitehat
6
+
7
+ Meta's security team will triage your report and determine whether or not is it eligible for a bounty under our program.
8
+
9
+ # Receiving Vulnerability Notifications
10
+
11
+ In the case that a significant security vulnerability is reported to us or discovered by us---without being publicly known---we will, at our discretion, notify high-profile, high-exposure users of Zstandard ahead of our public disclosure of the issue and associated fix.
12
+
13
+ If you believe your project would benefit from inclusion in this list, please reach out to one of the maintainers.
14
+
15
+ <!-- Note to maintainers: this list is kept [here](https://fburl.com/wiki/cgc1l62x). -->
@@ -8,6 +8,9 @@
8
8
  # You may select, at your option, one of the above-listed licenses.
9
9
  # ################################################################
10
10
 
11
+ # default target (when running `make` with no argument)
12
+ lib-release:
13
+
11
14
  # Modules
12
15
  ZSTD_LIB_COMPRESSION ?= 1
13
16
  ZSTD_LIB_DECOMPRESSION ?= 1
@@ -54,12 +57,11 @@ VERSION := $(ZSTD_VERSION)
54
57
  # Note: by default, the static library is built single-threaded and dynamic library is built
55
58
  # multi-threaded. It is possible to force multi or single threaded builds by appending
56
59
  # -mt or -nomt to the build target (like lib-mt for multi-threaded, lib-nomt for single-threaded).
57
- .PHONY: default
58
- default: lib-release
60
+
59
61
 
60
62
  CPPFLAGS_DYNLIB += -DZSTD_MULTITHREAD # dynamic library build defaults to multi-threaded
61
63
  LDFLAGS_DYNLIB += -pthread
62
- CPPFLAGS_STATLIB += # static library build defaults to single-threaded
64
+ CPPFLAGS_STATICLIB += # static library build defaults to single-threaded
63
65
 
64
66
 
65
67
  ifeq ($(findstring GCC,$(CCVER)),GCC)
@@ -91,7 +93,7 @@ all: lib
91
93
 
92
94
 
93
95
  .PHONY: libzstd.a # must be run every time
94
- libzstd.a: CPPFLAGS += $(CPPFLAGS_STATLIB)
96
+ libzstd.a: CPPFLAGS += $(CPPFLAGS_STATICLIB)
95
97
 
96
98
  SET_CACHE_DIRECTORY = \
97
99
  +$(MAKE) --no-print-directory $@ \
@@ -109,19 +111,19 @@ libzstd.a:
109
111
  else
110
112
  # BUILD_DIR is defined
111
113
 
112
- ZSTD_STATLIB_DIR := $(BUILD_DIR)/static
113
- ZSTD_STATLIB := $(ZSTD_STATLIB_DIR)/libzstd.a
114
- ZSTD_STATLIB_OBJ := $(addprefix $(ZSTD_STATLIB_DIR)/,$(ZSTD_LOCAL_OBJ))
115
- $(ZSTD_STATLIB): ARFLAGS = rcs
116
- $(ZSTD_STATLIB): | $(ZSTD_STATLIB_DIR)
117
- $(ZSTD_STATLIB): $(ZSTD_STATLIB_OBJ)
114
+ ZSTD_STATICLIB_DIR := $(BUILD_DIR)/static
115
+ ZSTD_STATICLIB := $(ZSTD_STATICLIB_DIR)/libzstd.a
116
+ ZSTD_STATICLIB_OBJ := $(addprefix $(ZSTD_STATICLIB_DIR)/,$(ZSTD_LOCAL_OBJ))
117
+ $(ZSTD_STATICLIB): ARFLAGS = rcs
118
+ $(ZSTD_STATICLIB): | $(ZSTD_STATICLIB_DIR)
119
+ $(ZSTD_STATICLIB): $(ZSTD_STATICLIB_OBJ)
118
120
  # Check for multithread flag at target execution time
119
121
  $(if $(filter -DZSTD_MULTITHREAD,$(CPPFLAGS)),\
120
122
  @echo compiling multi-threaded static library $(LIBVER),\
121
123
  @echo compiling single-threaded static library $(LIBVER))
122
124
  $(AR) $(ARFLAGS) $@ $^
123
125
 
124
- libzstd.a: $(ZSTD_STATLIB)
126
+ libzstd.a: $(ZSTD_STATICLIB)
125
127
  cp -f $< $@
126
128
 
127
129
  endif
@@ -182,14 +184,14 @@ lib : libzstd.a libzstd
182
184
  # make does not consider implicit pattern rule for .PHONY target
183
185
 
184
186
  %-mt : CPPFLAGS_DYNLIB := -DZSTD_MULTITHREAD
185
- %-mt : CPPFLAGS_STATLIB := -DZSTD_MULTITHREAD
187
+ %-mt : CPPFLAGS_STATICLIB := -DZSTD_MULTITHREAD
186
188
  %-mt : LDFLAGS_DYNLIB := -pthread
187
189
  %-mt : %
188
190
  @echo multi-threaded build completed
189
191
 
190
192
  %-nomt : CPPFLAGS_DYNLIB :=
191
193
  %-nomt : LDFLAGS_DYNLIB :=
192
- %-nomt : CPPFLAGS_STATLIB :=
194
+ %-nomt : CPPFLAGS_STATICLIB :=
193
195
  %-nomt : %
194
196
  @echo single-threaded build completed
195
197
 
@@ -200,42 +202,52 @@ lib : libzstd.a libzstd
200
202
 
201
203
  # Generate .h dependencies automatically
202
204
 
203
- DEPFLAGS = -MT $@ -MMD -MP -MF
205
+ # -MMD: compiler generates dependency information as a side-effect of compilation, without system headers
206
+ # -MP: adds phony target for each dependency other than main file.
207
+ DEPFLAGS = -MMD -MP
204
208
 
205
- $(ZSTD_DYNLIB_DIR)/%.o : %.c $(ZSTD_DYNLIB_DIR)/%.d | $(ZSTD_DYNLIB_DIR)
209
+ # ensure that ZSTD_DYNLIB_DIR exists prior to generating %.o
210
+ $(ZSTD_DYNLIB_DIR)/%.o : %.c | $(ZSTD_DYNLIB_DIR)
206
211
  @echo CC $@
207
- $(COMPILE.c) $(DEPFLAGS) $(ZSTD_DYNLIB_DIR)/$*.d $(OUTPUT_OPTION) $<
212
+ $(COMPILE.c) $(DEPFLAGS) $(OUTPUT_OPTION) $<
208
213
 
209
- $(ZSTD_STATLIB_DIR)/%.o : %.c $(ZSTD_STATLIB_DIR)/%.d | $(ZSTD_STATLIB_DIR)
214
+ $(ZSTD_STATICLIB_DIR)/%.o : %.c | $(ZSTD_STATICLIB_DIR)
210
215
  @echo CC $@
211
- $(COMPILE.c) $(DEPFLAGS) $(ZSTD_STATLIB_DIR)/$*.d $(OUTPUT_OPTION) $<
216
+ $(COMPILE.c) $(DEPFLAGS) $(OUTPUT_OPTION) $<
212
217
 
213
218
  $(ZSTD_DYNLIB_DIR)/%.o : %.S | $(ZSTD_DYNLIB_DIR)
214
219
  @echo AS $@
215
220
  $(COMPILE.S) $(OUTPUT_OPTION) $<
216
221
 
217
- $(ZSTD_STATLIB_DIR)/%.o : %.S | $(ZSTD_STATLIB_DIR)
222
+ $(ZSTD_STATICLIB_DIR)/%.o : %.S | $(ZSTD_STATICLIB_DIR)
218
223
  @echo AS $@
219
224
  $(COMPILE.S) $(OUTPUT_OPTION) $<
220
225
 
221
- MKDIR ?= mkdir
222
- $(BUILD_DIR) $(ZSTD_DYNLIB_DIR) $(ZSTD_STATLIB_DIR):
223
- $(MKDIR) -p $@
226
+ MKDIR ?= mkdir -p
227
+ $(BUILD_DIR) $(ZSTD_DYNLIB_DIR) $(ZSTD_STATICLIB_DIR):
228
+ $(MKDIR) $@
224
229
 
225
- DEPFILES := $(ZSTD_DYNLIB_OBJ:.o=.d) $(ZSTD_STATLIB_OBJ:.o=.d)
230
+ DEPFILES := $(ZSTD_DYNLIB_OBJ:.o=.d) $(ZSTD_STATICLIB_OBJ:.o=.d)
226
231
  $(DEPFILES):
227
232
 
228
- include $(wildcard $(DEPFILES))
233
+ # The leading '-' means: do not fail is include fails (ex: directory does not exist yet)
234
+ -include $(wildcard $(DEPFILES))
229
235
 
230
236
 
231
- # Special case : building library in single-thread mode _and_ without zstdmt_compress.c
232
- ZSTDMT_FILES = compress/zstdmt_compress.c
233
- ZSTD_NOMT_FILES = $(filter-out $(ZSTDMT_FILES),$(ZSTD_FILES))
237
+ # Special case : build library in single-thread mode _and_ without zstdmt_compress.c
238
+ # Note : we still need threading.c and pool.c for the dictionary builder,
239
+ # but they will correctly behave single-threaded.
240
+ ZSTDMT_FILES = zstdmt_compress.c
241
+ ZSTD_NOMT_FILES = $(filter-out $(ZSTDMT_FILES),$(notdir $(ZSTD_FILES)))
234
242
  libzstd-nomt: CFLAGS += -fPIC -fvisibility=hidden
235
243
  libzstd-nomt: LDFLAGS += -shared
236
244
  libzstd-nomt: $(ZSTD_NOMT_FILES)
237
245
  @echo compiling single-thread dynamic library $(LIBVER)
238
246
  @echo files : $(ZSTD_NOMT_FILES)
247
+ @if echo "$(ZSTD_NOMT_FILES)" | tr ' ' '\n' | $(GREP) -q zstdmt; then \
248
+ echo "Error: Found zstdmt in list."; \
249
+ exit 1; \
250
+ fi
239
251
  $(CC) $(FLAGS) $^ $(LDFLAGS) $(SONAME_FLAGS) -o $@
240
252
 
241
253
  .PHONY: clean
@@ -249,7 +261,7 @@ clean:
249
261
  #-----------------------------------------------------------------------------
250
262
  # make install is validated only for below listed environments
251
263
  #-----------------------------------------------------------------------------
252
- ifneq (,$(filter $(UNAME),Linux Darwin GNU/kFreeBSD GNU OpenBSD FreeBSD NetBSD DragonFly SunOS Haiku AIX))
264
+ ifneq (,$(filter $(UNAME),Linux Darwin GNU/kFreeBSD GNU OpenBSD FreeBSD NetBSD DragonFly SunOS Haiku AIX MSYS_NT CYGWIN_NT))
253
265
 
254
266
  lib: libzstd.pc
255
267
 
@@ -88,7 +88,7 @@ The file structure is designed to make this selection manually achievable for an
88
88
  For example, advanced API for version `v0.4` is exposed in `lib/legacy/zstd_v04.h` .
89
89
 
90
90
  - While invoking `make libzstd`, it's possible to define build macros
91
- `ZSTD_LIB_COMPRESSION, ZSTD_LIB_DECOMPRESSION`, `ZSTD_LIB_DICTBUILDER`,
91
+ `ZSTD_LIB_COMPRESSION`, `ZSTD_LIB_DECOMPRESSION`, `ZSTD_LIB_DICTBUILDER`,
92
92
  and `ZSTD_LIB_DEPRECATED` as `0` to forgo compilation of the
93
93
  corresponding features. This will also disable compilation of all
94
94
  dependencies (e.g. `ZSTD_LIB_COMPRESSION=0` will also disable
@@ -119,6 +119,15 @@ The file structure is designed to make this selection manually achievable for an
119
119
  binary is achieved by using `HUF_FORCE_DECOMPRESS_X1` and
120
120
  `ZSTD_FORCE_DECOMPRESS_SEQUENCES_SHORT` (implied by `ZSTD_LIB_MINIFY`).
121
121
 
122
+ On the compressor side, Zstd's compression levels map to several internal
123
+ strategies. In environments where the higher compression levels aren't used,
124
+ it is possible to exclude all but the fastest strategy with
125
+ `ZSTD_LIB_EXCLUDE_COMPRESSORS_DFAST_AND_UP=1`. (Note that this will change
126
+ the behavior of the default compression level.) Or if you want to retain the
127
+ default compressor as well, you can set
128
+ `ZSTD_LIB_EXCLUDE_COMPRESSORS_GREEDY_AND_UP=1`, at the cost of an additional
129
+ ~20KB or so.
130
+
122
131
  For squeezing the last ounce of size out, you can also define
123
132
  `ZSTD_NO_INLINE`, which disables inlining, and `ZSTD_STRIP_ERROR_STRINGS`,
124
133
  which removes the error messages that are otherwise returned by
@@ -169,6 +178,10 @@ The file structure is designed to make this selection manually achievable for an
169
178
  `ZSTDERRORLIB_VSIBILITY`, and `ZDICTLIB_VISIBILITY` if unset, for backwards compatibility
170
179
  with the old macro names.
171
180
 
181
+ - The C compiler macro `HUF_DISABLE_FAST_DECODE` disables the newer Huffman fast C
182
+ and assembly decoding loops. You may want to use this macro if these loops are
183
+ slower on your platform.
184
+
172
185
  #### Windows : using MinGW+MSYS to create DLL
173
186
 
174
187
  DLL can be created using MinGW+MSYS with the `make libzstd` command.
@@ -14,7 +14,7 @@
14
14
  #define ZSTD_DEPS_NEED_MALLOC
15
15
  #include "zstd_deps.h" /* ZSTD_malloc, ZSTD_calloc, ZSTD_free, ZSTD_memset */
16
16
 
17
- #include "mem.h" /* MEM_STATIC */
17
+ #include "compiler.h" /* MEM_STATIC */
18
18
  #define ZSTD_STATIC_LINKING_ONLY
19
19
  #include "../zstd.h" /* ZSTD_customMem */
20
20
 
@@ -90,19 +90,20 @@ MEM_STATIC size_t BIT_closeCStream(BIT_CStream_t* bitC);
90
90
  /*-********************************************
91
91
  * bitStream decoding API (read backward)
92
92
  **********************************************/
93
+ typedef size_t BitContainerType;
93
94
  typedef struct {
94
- size_t bitContainer;
95
+ BitContainerType bitContainer;
95
96
  unsigned bitsConsumed;
96
97
  const char* ptr;
97
98
  const char* start;
98
99
  const char* limitPtr;
99
100
  } BIT_DStream_t;
100
101
 
101
- typedef enum { BIT_DStream_unfinished = 0,
102
- BIT_DStream_endOfBuffer = 1,
103
- BIT_DStream_completed = 2,
104
- BIT_DStream_overflow = 3 } BIT_DStream_status; /* result of BIT_reloadDStream() */
105
- /* 1,2,4,8 would be better for bitmap combinations, but slows down performance a bit ... :( */
102
+ typedef enum { BIT_DStream_unfinished = 0, /* fully refilled */
103
+ BIT_DStream_endOfBuffer = 1, /* still some bits left in bitstream */
104
+ BIT_DStream_completed = 2, /* bitstream entirely consumed, bit-exact */
105
+ BIT_DStream_overflow = 3 /* user requested more bits than present in bitstream */
106
+ } BIT_DStream_status; /* result of BIT_reloadDStream() */
106
107
 
107
108
  MEM_STATIC size_t BIT_initDStream(BIT_DStream_t* bitD, const void* srcBuffer, size_t srcSize);
108
109
  MEM_STATIC size_t BIT_readBits(BIT_DStream_t* bitD, unsigned nbBits);
@@ -112,7 +113,7 @@ MEM_STATIC unsigned BIT_endOfDStream(const BIT_DStream_t* bitD);
112
113
 
113
114
  /* Start by invoking BIT_initDStream().
114
115
  * A chunk of the bitStream is then stored into a local register.
115
- * Local register size is 64-bits on 64-bits systems, 32-bits on 32-bits systems (size_t).
116
+ * Local register size is 64-bits on 64-bits systems, 32-bits on 32-bits systems (BitContainerType).
116
117
  * You can then retrieve bitFields stored into the local register, **in reverse order**.
117
118
  * Local register is explicitly reloaded from memory by the BIT_reloadDStream() method.
118
119
  * A reload guarantee a minimum of ((8*sizeof(bitD->bitContainer))-7) bits when its result is BIT_DStream_unfinished.
@@ -162,7 +163,7 @@ MEM_STATIC size_t BIT_initCStream(BIT_CStream_t* bitC,
162
163
  return 0;
163
164
  }
164
165
 
165
- MEM_STATIC FORCE_INLINE_ATTR size_t BIT_getLowerBits(size_t bitContainer, U32 const nbBits)
166
+ FORCE_INLINE_TEMPLATE size_t BIT_getLowerBits(size_t bitContainer, U32 const nbBits)
166
167
  {
167
168
  #if defined(STATIC_BMI2) && STATIC_BMI2 == 1 && !defined(ZSTD_NO_INTRINSICS)
168
169
  return _bzhi_u64(bitContainer, nbBits);
@@ -267,22 +268,22 @@ MEM_STATIC size_t BIT_initDStream(BIT_DStream_t* bitD, const void* srcBuffer, si
267
268
  bitD->bitContainer = *(const BYTE*)(bitD->start);
268
269
  switch(srcSize)
269
270
  {
270
- case 7: bitD->bitContainer += (size_t)(((const BYTE*)(srcBuffer))[6]) << (sizeof(bitD->bitContainer)*8 - 16);
271
+ case 7: bitD->bitContainer += (BitContainerType)(((const BYTE*)(srcBuffer))[6]) << (sizeof(bitD->bitContainer)*8 - 16);
271
272
  ZSTD_FALLTHROUGH;
272
273
 
273
- case 6: bitD->bitContainer += (size_t)(((const BYTE*)(srcBuffer))[5]) << (sizeof(bitD->bitContainer)*8 - 24);
274
+ case 6: bitD->bitContainer += (BitContainerType)(((const BYTE*)(srcBuffer))[5]) << (sizeof(bitD->bitContainer)*8 - 24);
274
275
  ZSTD_FALLTHROUGH;
275
276
 
276
- case 5: bitD->bitContainer += (size_t)(((const BYTE*)(srcBuffer))[4]) << (sizeof(bitD->bitContainer)*8 - 32);
277
+ case 5: bitD->bitContainer += (BitContainerType)(((const BYTE*)(srcBuffer))[4]) << (sizeof(bitD->bitContainer)*8 - 32);
277
278
  ZSTD_FALLTHROUGH;
278
279
 
279
- case 4: bitD->bitContainer += (size_t)(((const BYTE*)(srcBuffer))[3]) << 24;
280
+ case 4: bitD->bitContainer += (BitContainerType)(((const BYTE*)(srcBuffer))[3]) << 24;
280
281
  ZSTD_FALLTHROUGH;
281
282
 
282
- case 3: bitD->bitContainer += (size_t)(((const BYTE*)(srcBuffer))[2]) << 16;
283
+ case 3: bitD->bitContainer += (BitContainerType)(((const BYTE*)(srcBuffer))[2]) << 16;
283
284
  ZSTD_FALLTHROUGH;
284
285
 
285
- case 2: bitD->bitContainer += (size_t)(((const BYTE*)(srcBuffer))[1]) << 8;
286
+ case 2: bitD->bitContainer += (BitContainerType)(((const BYTE*)(srcBuffer))[1]) << 8;
286
287
  ZSTD_FALLTHROUGH;
287
288
 
288
289
  default: break;
@@ -297,12 +298,12 @@ MEM_STATIC size_t BIT_initDStream(BIT_DStream_t* bitD, const void* srcBuffer, si
297
298
  return srcSize;
298
299
  }
299
300
 
300
- MEM_STATIC FORCE_INLINE_ATTR size_t BIT_getUpperBits(size_t bitContainer, U32 const start)
301
+ FORCE_INLINE_TEMPLATE size_t BIT_getUpperBits(BitContainerType bitContainer, U32 const start)
301
302
  {
302
303
  return bitContainer >> start;
303
304
  }
304
305
 
305
- MEM_STATIC FORCE_INLINE_ATTR size_t BIT_getMiddleBits(size_t bitContainer, U32 const start, U32 const nbBits)
306
+ FORCE_INLINE_TEMPLATE size_t BIT_getMiddleBits(BitContainerType bitContainer, U32 const start, U32 const nbBits)
306
307
  {
307
308
  U32 const regMask = sizeof(bitContainer)*8 - 1;
308
309
  /* if start > regMask, bitstream is corrupted, and result is undefined */
@@ -325,7 +326,7 @@ MEM_STATIC FORCE_INLINE_ATTR size_t BIT_getMiddleBits(size_t bitContainer, U32 c
325
326
  * On 32-bits, maxNbBits==24.
326
327
  * On 64-bits, maxNbBits==56.
327
328
  * @return : value extracted */
328
- MEM_STATIC FORCE_INLINE_ATTR size_t BIT_lookBits(const BIT_DStream_t* bitD, U32 nbBits)
329
+ FORCE_INLINE_TEMPLATE size_t BIT_lookBits(const BIT_DStream_t* bitD, U32 nbBits)
329
330
  {
330
331
  /* arbitrate between double-shift and shift+mask */
331
332
  #if 1
@@ -348,7 +349,7 @@ MEM_STATIC size_t BIT_lookBitsFast(const BIT_DStream_t* bitD, U32 nbBits)
348
349
  return (bitD->bitContainer << (bitD->bitsConsumed & regMask)) >> (((regMask+1)-nbBits) & regMask);
349
350
  }
350
351
 
351
- MEM_STATIC FORCE_INLINE_ATTR void BIT_skipBits(BIT_DStream_t* bitD, U32 nbBits)
352
+ FORCE_INLINE_TEMPLATE void BIT_skipBits(BIT_DStream_t* bitD, U32 nbBits)
352
353
  {
353
354
  bitD->bitsConsumed += nbBits;
354
355
  }
@@ -357,7 +358,7 @@ MEM_STATIC FORCE_INLINE_ATTR void BIT_skipBits(BIT_DStream_t* bitD, U32 nbBits)
357
358
  * Read (consume) next n bits from local register and update.
358
359
  * Pay attention to not read more than nbBits contained into local register.
359
360
  * @return : extracted value. */
360
- MEM_STATIC FORCE_INLINE_ATTR size_t BIT_readBits(BIT_DStream_t* bitD, unsigned nbBits)
361
+ FORCE_INLINE_TEMPLATE size_t BIT_readBits(BIT_DStream_t* bitD, unsigned nbBits)
361
362
  {
362
363
  size_t const value = BIT_lookBits(bitD, nbBits);
363
364
  BIT_skipBits(bitD, nbBits);
@@ -374,6 +375,21 @@ MEM_STATIC size_t BIT_readBitsFast(BIT_DStream_t* bitD, unsigned nbBits)
374
375
  return value;
375
376
  }
376
377
 
378
+ /*! BIT_reloadDStream_internal() :
379
+ * Simple variant of BIT_reloadDStream(), with two conditions:
380
+ * 1. bitstream is valid : bitsConsumed <= sizeof(bitD->bitContainer)*8
381
+ * 2. look window is valid after shifted down : bitD->ptr >= bitD->start
382
+ */
383
+ MEM_STATIC BIT_DStream_status BIT_reloadDStream_internal(BIT_DStream_t* bitD)
384
+ {
385
+ assert(bitD->bitsConsumed <= sizeof(bitD->bitContainer)*8);
386
+ bitD->ptr -= bitD->bitsConsumed >> 3;
387
+ assert(bitD->ptr >= bitD->start);
388
+ bitD->bitsConsumed &= 7;
389
+ bitD->bitContainer = MEM_readLEST(bitD->ptr);
390
+ return BIT_DStream_unfinished;
391
+ }
392
+
377
393
  /*! BIT_reloadDStreamFast() :
378
394
  * Similar to BIT_reloadDStream(), but with two differences:
379
395
  * 1. bitsConsumed <= sizeof(bitD->bitContainer)*8 must hold!
@@ -384,31 +400,35 @@ MEM_STATIC BIT_DStream_status BIT_reloadDStreamFast(BIT_DStream_t* bitD)
384
400
  {
385
401
  if (UNLIKELY(bitD->ptr < bitD->limitPtr))
386
402
  return BIT_DStream_overflow;
387
- assert(bitD->bitsConsumed <= sizeof(bitD->bitContainer)*8);
388
- bitD->ptr -= bitD->bitsConsumed >> 3;
389
- bitD->bitsConsumed &= 7;
390
- bitD->bitContainer = MEM_readLEST(bitD->ptr);
391
- return BIT_DStream_unfinished;
403
+ return BIT_reloadDStream_internal(bitD);
392
404
  }
393
405
 
394
406
  /*! BIT_reloadDStream() :
395
407
  * Refill `bitD` from buffer previously set in BIT_initDStream() .
396
- * This function is safe, it guarantees it will not read beyond src buffer.
408
+ * This function is safe, it guarantees it will not never beyond src buffer.
397
409
  * @return : status of `BIT_DStream_t` internal register.
398
410
  * when status == BIT_DStream_unfinished, internal register is filled with at least 25 or 57 bits */
399
- MEM_STATIC FORCE_INLINE_ATTR BIT_DStream_status BIT_reloadDStream(BIT_DStream_t* bitD)
411
+ FORCE_INLINE_TEMPLATE BIT_DStream_status BIT_reloadDStream(BIT_DStream_t* bitD)
400
412
  {
401
- if (bitD->bitsConsumed > (sizeof(bitD->bitContainer)*8)) /* overflow detected, like end of stream */
413
+ /* note : once in overflow mode, a bitstream remains in this mode until it's reset */
414
+ if (UNLIKELY(bitD->bitsConsumed > (sizeof(bitD->bitContainer)*8))) {
415
+ static const BitContainerType zeroFilled = 0;
416
+ bitD->ptr = (const char*)&zeroFilled; /* aliasing is allowed for char */
417
+ /* overflow detected, erroneous scenario or end of stream: no update */
402
418
  return BIT_DStream_overflow;
419
+ }
420
+
421
+ assert(bitD->ptr >= bitD->start);
403
422
 
404
423
  if (bitD->ptr >= bitD->limitPtr) {
405
- return BIT_reloadDStreamFast(bitD);
424
+ return BIT_reloadDStream_internal(bitD);
406
425
  }
407
426
  if (bitD->ptr == bitD->start) {
427
+ /* reached end of bitStream => no update */
408
428
  if (bitD->bitsConsumed < sizeof(bitD->bitContainer)*8) return BIT_DStream_endOfBuffer;
409
429
  return BIT_DStream_completed;
410
430
  }
411
- /* start < ptr < limitPtr */
431
+ /* start < ptr < limitPtr => cautious update */
412
432
  { U32 nbBytes = bitD->bitsConsumed >> 3;
413
433
  BIT_DStream_status result = BIT_DStream_unfinished;
414
434
  if (bitD->ptr - nbBytes < bitD->start) {