zstdlib 0.11.0-arm64-darwin → 0.13.0-arm64-darwin

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 (111) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGES.md +16 -0
  3. data/Rakefile +1 -1
  4. data/ext/zstdlib_c/extconf.rb +9 -4
  5. data/ext/zstdlib_c/ruby/zlib-3.3/zstdlib.c +5090 -0
  6. data/ext/zstdlib_c/{zlib-1.2.12 → zlib-1.3.1}/adler32.c +5 -27
  7. data/ext/zstdlib_c/{zlib-1.2.12 → zlib-1.3.1}/compress.c +5 -16
  8. data/ext/zstdlib_c/{zlib-1.2.12 → zlib-1.3.1}/crc32.c +94 -161
  9. data/ext/zstdlib_c/{zlib-1.2.12 → zlib-1.3.1}/deflate.c +362 -434
  10. data/ext/zstdlib_c/{zlib-1.2.12 → zlib-1.3.1}/deflate.h +43 -12
  11. data/ext/zstdlib_c/{zlib-1.2.12 → zlib-1.3.1}/gzclose.c +1 -3
  12. data/ext/zstdlib_c/{zlib-1.2.12 → zlib-1.3.1}/gzguts.h +13 -18
  13. data/ext/zstdlib_c/{zlib-1.2.12 → zlib-1.3.1}/gzlib.c +28 -85
  14. data/ext/zstdlib_c/{zlib-1.2.12 → zlib-1.3.1}/gzread.c +23 -73
  15. data/ext/zstdlib_c/{zlib-1.2.12 → zlib-1.3.1}/gzwrite.c +19 -65
  16. data/ext/zstdlib_c/{zlib-1.2.12 → zlib-1.3.1}/infback.c +17 -30
  17. data/ext/zstdlib_c/{zlib-1.2.12 → zlib-1.3.1}/inffast.c +1 -4
  18. data/ext/zstdlib_c/{zlib-1.2.12 → zlib-1.3.1}/inffast.h +1 -1
  19. data/ext/zstdlib_c/{zlib-1.2.12 → zlib-1.3.1}/inflate.c +36 -102
  20. data/ext/zstdlib_c/{zlib-1.2.12 → zlib-1.3.1}/inftrees.c +6 -11
  21. data/ext/zstdlib_c/{zlib-1.2.12 → zlib-1.3.1}/inftrees.h +6 -6
  22. data/ext/zstdlib_c/{zlib-1.2.12 → zlib-1.3.1}/trees.c +290 -355
  23. data/ext/zstdlib_c/{zlib-1.2.12 → zlib-1.3.1}/uncompr.c +4 -12
  24. data/ext/zstdlib_c/{zlib-1.2.12 → zlib-1.3.1}/zconf.h +23 -14
  25. data/ext/zstdlib_c/{zlib-1.2.12 → zlib-1.3.1}/zlib.h +202 -199
  26. data/ext/zstdlib_c/{zlib-1.2.12 → zlib-1.3.1}/zutil.c +18 -44
  27. data/ext/zstdlib_c/{zlib-1.2.12 → zlib-1.3.1}/zutil.h +13 -33
  28. data/ext/zstdlib_c/{zstd-1.5.5 → zstd-1.5.6}/lib/common/allocations.h +1 -1
  29. data/ext/zstdlib_c/{zstd-1.5.5 → zstd-1.5.6}/lib/common/bitstream.h +49 -29
  30. data/ext/zstdlib_c/{zstd-1.5.5 → zstd-1.5.6}/lib/common/compiler.h +114 -22
  31. data/ext/zstdlib_c/{zstd-1.5.5 → zstd-1.5.6}/lib/common/cpu.h +36 -0
  32. data/ext/zstdlib_c/{zstd-1.5.5 → zstd-1.5.6}/lib/common/debug.c +6 -0
  33. data/ext/zstdlib_c/{zstd-1.5.5 → zstd-1.5.6}/lib/common/debug.h +20 -11
  34. data/ext/zstdlib_c/{zstd-1.5.5 → zstd-1.5.6}/lib/common/error_private.h +45 -36
  35. data/ext/zstdlib_c/{zstd-1.5.5 → zstd-1.5.6}/lib/common/fse.h +3 -2
  36. data/ext/zstdlib_c/{zstd-1.5.5 → zstd-1.5.6}/lib/common/fse_decompress.c +19 -17
  37. data/ext/zstdlib_c/{zstd-1.5.5 → zstd-1.5.6}/lib/common/huf.h +14 -1
  38. data/ext/zstdlib_c/{zstd-1.5.5 → zstd-1.5.6}/lib/common/mem.h +0 -9
  39. data/ext/zstdlib_c/{zstd-1.5.5 → zstd-1.5.6}/lib/common/pool.c +1 -1
  40. data/ext/zstdlib_c/{zstd-1.5.5 → zstd-1.5.6}/lib/common/pool.h +1 -1
  41. data/ext/zstdlib_c/{zstd-1.5.5 → zstd-1.5.6}/lib/common/portability_macros.h +2 -0
  42. data/ext/zstdlib_c/{zstd-1.5.5 → zstd-1.5.6}/lib/common/threading.c +8 -2
  43. data/ext/zstdlib_c/{zstd-1.5.5 → zstd-1.5.6}/lib/common/xxhash.c +5 -11
  44. data/ext/zstdlib_c/{zstd-1.5.5 → zstd-1.5.6}/lib/common/xxhash.h +2341 -1007
  45. data/ext/zstdlib_c/{zstd-1.5.5 → zstd-1.5.6}/lib/common/zstd_internal.h +5 -5
  46. data/ext/zstdlib_c/{zstd-1.5.5 → zstd-1.5.6}/lib/compress/fse_compress.c +8 -7
  47. data/ext/zstdlib_c/{zstd-1.5.5 → zstd-1.5.6}/lib/compress/huf_compress.c +54 -25
  48. data/ext/zstdlib_c/{zstd-1.5.5 → zstd-1.5.6}/lib/compress/zstd_compress.c +282 -161
  49. data/ext/zstdlib_c/{zstd-1.5.5 → zstd-1.5.6}/lib/compress/zstd_compress_internal.h +29 -27
  50. data/ext/zstdlib_c/{zstd-1.5.5 → zstd-1.5.6}/lib/compress/zstd_compress_superblock.c +224 -113
  51. data/ext/zstdlib_c/{zstd-1.5.5 → zstd-1.5.6}/lib/compress/zstd_cwksp.h +19 -13
  52. data/ext/zstdlib_c/{zstd-1.5.5 → zstd-1.5.6}/lib/compress/zstd_double_fast.c +17 -5
  53. data/ext/zstdlib_c/{zstd-1.5.5 → zstd-1.5.6}/lib/compress/zstd_double_fast.h +11 -0
  54. data/ext/zstdlib_c/{zstd-1.5.5 → zstd-1.5.6}/lib/compress/zstd_fast.c +14 -6
  55. data/ext/zstdlib_c/{zstd-1.5.5 → zstd-1.5.6}/lib/compress/zstd_lazy.c +129 -87
  56. data/ext/zstdlib_c/{zstd-1.5.5 → zstd-1.5.6}/lib/compress/zstd_lazy.h +103 -28
  57. data/ext/zstdlib_c/{zstd-1.5.5 → zstd-1.5.6}/lib/compress/zstd_ldm.c +8 -2
  58. data/ext/zstdlib_c/{zstd-1.5.5 → zstd-1.5.6}/lib/compress/zstd_opt.c +216 -112
  59. data/ext/zstdlib_c/{zstd-1.5.5 → zstd-1.5.6}/lib/compress/zstd_opt.h +31 -7
  60. data/ext/zstdlib_c/{zstd-1.5.5 → zstd-1.5.6}/lib/compress/zstdmt_compress.c +94 -79
  61. data/ext/zstdlib_c/{zstd-1.5.5 → zstd-1.5.6}/lib/decompress/huf_decompress.c +188 -126
  62. data/ext/zstdlib_c/{zstd-1.5.5 → zstd-1.5.6}/lib/decompress/huf_decompress_amd64.S +38 -19
  63. data/ext/zstdlib_c/{zstd-1.5.5 → zstd-1.5.6}/lib/decompress/zstd_decompress.c +84 -32
  64. data/ext/zstdlib_c/{zstd-1.5.5 → zstd-1.5.6}/lib/decompress/zstd_decompress_block.c +231 -208
  65. data/ext/zstdlib_c/{zstd-1.5.5 → zstd-1.5.6}/lib/decompress/zstd_decompress_block.h +1 -1
  66. data/ext/zstdlib_c/{zstd-1.5.5 → zstd-1.5.6}/lib/decompress/zstd_decompress_internal.h +2 -0
  67. data/ext/zstdlib_c/{zstd-1.5.5 → zstd-1.5.6}/lib/zstd.h +129 -60
  68. data/ext/zstdlib_c/{zstd-1.5.5 → zstd-1.5.6}/zlibWrapper/gzclose.c +1 -3
  69. data/ext/zstdlib_c/{zstd-1.5.5 → zstd-1.5.6}/zlibWrapper/gzlib.c +20 -73
  70. data/ext/zstdlib_c/{zstd-1.5.5 → zstd-1.5.6}/zlibWrapper/gzread.c +17 -58
  71. data/ext/zstdlib_c/{zstd-1.5.5 → zstd-1.5.6}/zlibWrapper/gzwrite.c +18 -58
  72. data/lib/2.4/zstdlib_c.bundle +0 -0
  73. data/lib/2.5/zstdlib_c.bundle +0 -0
  74. data/lib/2.6/zstdlib_c.bundle +0 -0
  75. data/lib/2.7/zstdlib_c.bundle +0 -0
  76. data/lib/3.0/zstdlib_c.bundle +0 -0
  77. data/lib/3.1/zstdlib_c.bundle +0 -0
  78. data/lib/3.2/zstdlib_c.bundle +0 -0
  79. data/lib/3.3/zstdlib_c.bundle +0 -0
  80. metadata +105 -103
  81. /data/ext/zstdlib_c/{zlib-1.2.12 → zlib-1.3.1}/crc32.h +0 -0
  82. /data/ext/zstdlib_c/{zlib-1.2.12 → zlib-1.3.1}/inffixed.h +0 -0
  83. /data/ext/zstdlib_c/{zlib-1.2.12 → zlib-1.3.1}/inflate.h +0 -0
  84. /data/ext/zstdlib_c/{zlib-1.2.12 → zlib-1.3.1}/trees.h +0 -0
  85. /data/ext/zstdlib_c/{zstd-1.5.5 → zstd-1.5.6}/lib/common/bits.h +0 -0
  86. /data/ext/zstdlib_c/{zstd-1.5.5 → zstd-1.5.6}/lib/common/entropy_common.c +0 -0
  87. /data/ext/zstdlib_c/{zstd-1.5.5 → zstd-1.5.6}/lib/common/error_private.c +0 -0
  88. /data/ext/zstdlib_c/{zstd-1.5.5 → zstd-1.5.6}/lib/common/threading.h +0 -0
  89. /data/ext/zstdlib_c/{zstd-1.5.5 → zstd-1.5.6}/lib/common/zstd_common.c +0 -0
  90. /data/ext/zstdlib_c/{zstd-1.5.5 → zstd-1.5.6}/lib/common/zstd_deps.h +0 -0
  91. /data/ext/zstdlib_c/{zstd-1.5.5 → zstd-1.5.6}/lib/common/zstd_trace.h +0 -0
  92. /data/ext/zstdlib_c/{zstd-1.5.5 → zstd-1.5.6}/lib/compress/clevels.h +0 -0
  93. /data/ext/zstdlib_c/{zstd-1.5.5 → zstd-1.5.6}/lib/compress/hist.c +0 -0
  94. /data/ext/zstdlib_c/{zstd-1.5.5 → zstd-1.5.6}/lib/compress/hist.h +0 -0
  95. /data/ext/zstdlib_c/{zstd-1.5.5 → zstd-1.5.6}/lib/compress/zstd_compress_literals.c +0 -0
  96. /data/ext/zstdlib_c/{zstd-1.5.5 → zstd-1.5.6}/lib/compress/zstd_compress_literals.h +0 -0
  97. /data/ext/zstdlib_c/{zstd-1.5.5 → zstd-1.5.6}/lib/compress/zstd_compress_sequences.c +0 -0
  98. /data/ext/zstdlib_c/{zstd-1.5.5 → zstd-1.5.6}/lib/compress/zstd_compress_sequences.h +0 -0
  99. /data/ext/zstdlib_c/{zstd-1.5.5 → zstd-1.5.6}/lib/compress/zstd_compress_superblock.h +0 -0
  100. /data/ext/zstdlib_c/{zstd-1.5.5 → zstd-1.5.6}/lib/compress/zstd_fast.h +0 -0
  101. /data/ext/zstdlib_c/{zstd-1.5.5 → zstd-1.5.6}/lib/compress/zstd_ldm.h +0 -0
  102. /data/ext/zstdlib_c/{zstd-1.5.5 → zstd-1.5.6}/lib/compress/zstd_ldm_geartab.h +0 -0
  103. /data/ext/zstdlib_c/{zstd-1.5.5 → zstd-1.5.6}/lib/compress/zstdmt_compress.h +0 -0
  104. /data/ext/zstdlib_c/{zstd-1.5.5 → zstd-1.5.6}/lib/decompress/zstd_ddict.c +0 -0
  105. /data/ext/zstdlib_c/{zstd-1.5.5 → zstd-1.5.6}/lib/decompress/zstd_ddict.h +0 -0
  106. /data/ext/zstdlib_c/{zstd-1.5.5 → zstd-1.5.6}/lib/zdict.h +0 -0
  107. /data/ext/zstdlib_c/{zstd-1.5.5 → zstd-1.5.6}/lib/zstd_errors.h +0 -0
  108. /data/ext/zstdlib_c/{zstd-1.5.5 → zstd-1.5.6}/zlibWrapper/gzcompatibility.h +0 -0
  109. /data/ext/zstdlib_c/{zstd-1.5.5 → zstd-1.5.6}/zlibWrapper/gzguts.h +0 -0
  110. /data/ext/zstdlib_c/{zstd-1.5.5 → zstd-1.5.6}/zlibWrapper/zstd_zlibwrapper.c +0 -0
  111. /data/ext/zstdlib_c/{zstd-1.5.5 → zstd-1.5.6}/zlibWrapper/zstd_zlibwrapper.h +0 -0
@@ -24,13 +24,11 @@ z_const char * const z_errmsg[10] = {
24
24
  };
25
25
 
26
26
 
27
- const char * ZEXPORT zlibVersion()
28
- {
27
+ const char * ZEXPORT zlibVersion(void) {
29
28
  return ZLIB_VERSION;
30
29
  }
31
30
 
32
- uLong ZEXPORT zlibCompileFlags()
33
- {
31
+ uLong ZEXPORT zlibCompileFlags(void) {
34
32
  uLong flags;
35
33
 
36
34
  flags = 0;
@@ -61,9 +59,11 @@ uLong ZEXPORT zlibCompileFlags()
61
59
  #ifdef ZLIB_DEBUG
62
60
  flags += 1 << 8;
63
61
  #endif
62
+ /*
64
63
  #if defined(ASMV) || defined(ASMINF)
65
64
  flags += 1 << 9;
66
65
  #endif
66
+ */
67
67
  #ifdef ZLIB_WINAPI
68
68
  flags += 1 << 10;
69
69
  #endif
@@ -119,9 +119,7 @@ uLong ZEXPORT zlibCompileFlags()
119
119
  # endif
120
120
  int ZLIB_INTERNAL z_verbose = verbose;
121
121
 
122
- void ZLIB_INTERNAL z_error (m)
123
- char *m;
124
- {
122
+ void ZLIB_INTERNAL z_error(char *m) {
125
123
  fprintf(stderr, "%s\n", m);
126
124
  exit(1);
127
125
  }
@@ -130,9 +128,7 @@ void ZLIB_INTERNAL z_error (m)
130
128
  /* exported to allow conversion of error code to string for compress() and
131
129
  * uncompress()
132
130
  */
133
- const char * ZEXPORT zError(err)
134
- int err;
135
- {
131
+ const char * ZEXPORT zError(int err) {
136
132
  return ERR_MSG(err);
137
133
  }
138
134
 
@@ -146,22 +142,14 @@ const char * ZEXPORT zError(err)
146
142
 
147
143
  #ifndef HAVE_MEMCPY
148
144
 
149
- void ZLIB_INTERNAL zmemcpy(dest, source, len)
150
- Bytef* dest;
151
- const Bytef* source;
152
- uInt len;
153
- {
145
+ void ZLIB_INTERNAL zmemcpy(Bytef* dest, const Bytef* source, uInt len) {
154
146
  if (len == 0) return;
155
147
  do {
156
148
  *dest++ = *source++; /* ??? to be unrolled */
157
149
  } while (--len != 0);
158
150
  }
159
151
 
160
- int ZLIB_INTERNAL zmemcmp(s1, s2, len)
161
- const Bytef* s1;
162
- const Bytef* s2;
163
- uInt len;
164
- {
152
+ int ZLIB_INTERNAL zmemcmp(const Bytef* s1, const Bytef* s2, uInt len) {
165
153
  uInt j;
166
154
 
167
155
  for (j = 0; j < len; j++) {
@@ -170,10 +158,7 @@ int ZLIB_INTERNAL zmemcmp(s1, s2, len)
170
158
  return 0;
171
159
  }
172
160
 
173
- void ZLIB_INTERNAL zmemzero(dest, len)
174
- Bytef* dest;
175
- uInt len;
176
- {
161
+ void ZLIB_INTERNAL zmemzero(Bytef* dest, uInt len) {
177
162
  if (len == 0) return;
178
163
  do {
179
164
  *dest++ = 0; /* ??? to be unrolled */
@@ -214,8 +199,7 @@ local ptr_table table[MAX_PTR];
214
199
  * a protected system like OS/2. Use Microsoft C instead.
215
200
  */
216
201
 
217
- voidpf ZLIB_INTERNAL zcalloc (voidpf opaque, unsigned items, unsigned size)
218
- {
202
+ voidpf ZLIB_INTERNAL zcalloc(voidpf opaque, unsigned items, unsigned size) {
219
203
  voidpf buf;
220
204
  ulg bsize = (ulg)items*size;
221
205
 
@@ -240,8 +224,7 @@ voidpf ZLIB_INTERNAL zcalloc (voidpf opaque, unsigned items, unsigned size)
240
224
  return buf;
241
225
  }
242
226
 
243
- void ZLIB_INTERNAL zcfree (voidpf opaque, voidpf ptr)
244
- {
227
+ void ZLIB_INTERNAL zcfree(voidpf opaque, voidpf ptr) {
245
228
  int n;
246
229
 
247
230
  (void)opaque;
@@ -277,14 +260,12 @@ void ZLIB_INTERNAL zcfree (voidpf opaque, voidpf ptr)
277
260
  # define _hfree hfree
278
261
  #endif
279
262
 
280
- voidpf ZLIB_INTERNAL zcalloc (voidpf opaque, uInt items, uInt size)
281
- {
263
+ voidpf ZLIB_INTERNAL zcalloc(voidpf opaque, uInt items, uInt size) {
282
264
  (void)opaque;
283
265
  return _halloc((long)items, size);
284
266
  }
285
267
 
286
- void ZLIB_INTERNAL zcfree (voidpf opaque, voidpf ptr)
287
- {
268
+ void ZLIB_INTERNAL zcfree(voidpf opaque, voidpf ptr) {
288
269
  (void)opaque;
289
270
  _hfree(ptr);
290
271
  }
@@ -297,25 +278,18 @@ void ZLIB_INTERNAL zcfree (voidpf opaque, voidpf ptr)
297
278
  #ifndef MY_ZCALLOC /* Any system without a special alloc function */
298
279
 
299
280
  #ifndef STDC
300
- extern voidp malloc OF((uInt size));
301
- extern voidp calloc OF((uInt items, uInt size));
302
- extern void free OF((voidpf ptr));
281
+ extern voidp malloc(uInt size);
282
+ extern voidp calloc(uInt items, uInt size);
283
+ extern void free(voidpf ptr);
303
284
  #endif
304
285
 
305
- voidpf ZLIB_INTERNAL zcalloc (opaque, items, size)
306
- voidpf opaque;
307
- unsigned items;
308
- unsigned size;
309
- {
286
+ voidpf ZLIB_INTERNAL zcalloc(voidpf opaque, unsigned items, unsigned size) {
310
287
  (void)opaque;
311
288
  return sizeof(uInt) > 2 ? (voidpf)malloc(items * size) :
312
289
  (voidpf)calloc(items, size);
313
290
  }
314
291
 
315
- void ZLIB_INTERNAL zcfree (opaque, ptr)
316
- voidpf opaque;
317
- voidpf ptr;
318
- {
292
+ void ZLIB_INTERNAL zcfree(voidpf opaque, voidpf ptr) {
319
293
  (void)opaque;
320
294
  free(ptr);
321
295
  }
@@ -1,5 +1,5 @@
1
1
  /* zutil.h -- internal interface and configuration of the compression library
2
- * Copyright (C) 1995-2022 Jean-loup Gailly, Mark Adler
2
+ * Copyright (C) 1995-2024 Jean-loup Gailly, Mark Adler
3
3
  * For conditions of distribution and use, see copyright notice in zlib.h
4
4
  */
5
5
 
@@ -56,7 +56,7 @@ typedef unsigned long ulg;
56
56
  extern z_const char * const z_errmsg[10]; /* indexed by 2-zlib_error */
57
57
  /* (size given to avoid silly warnings with Visual C++) */
58
58
 
59
- #define ERR_MSG(err) z_errmsg[Z_NEED_DICT-(err)]
59
+ #define ERR_MSG(err) z_errmsg[(err) < -6 || (err) > 2 ? 9 : 2 - (err)]
60
60
 
61
61
  #define ERR_RETURN(strm,err) \
62
62
  return (strm->msg = ERR_MSG(err), (err))
@@ -137,17 +137,8 @@ extern z_const char * const z_errmsg[10]; /* indexed by 2-zlib_error */
137
137
  # endif
138
138
  #endif
139
139
 
140
- #if defined(MACOS) || defined(TARGET_OS_MAC)
140
+ #if defined(MACOS)
141
141
  # define OS_CODE 7
142
- # ifndef Z_SOLO
143
- # if defined(__MWERKS__) && __dest_os != __be_os && __dest_os != __win32_os
144
- # include <unix.h> /* for fdopen */
145
- # else
146
- # ifndef fdopen
147
- # define fdopen(fd,mode) NULL /* No fdopen() */
148
- # endif
149
- # endif
150
- # endif
151
142
  #endif
152
143
 
153
144
  #ifdef __acorn
@@ -170,18 +161,6 @@ extern z_const char * const z_errmsg[10]; /* indexed by 2-zlib_error */
170
161
  # define OS_CODE 19
171
162
  #endif
172
163
 
173
- #if defined(_BEOS_) || defined(RISCOS)
174
- # define fdopen(fd,mode) NULL /* No fdopen() */
175
- #endif
176
-
177
- #if (defined(_MSC_VER) && (_MSC_VER > 600)) && !defined __INTERIX
178
- # if defined(_WIN32_WCE)
179
- # define fdopen(fd,mode) NULL /* No fdopen() */
180
- # else
181
- # define fdopen(fd,type) _fdopen(fd,type)
182
- # endif
183
- #endif
184
-
185
164
  #if defined(__BORLANDC__) && !defined(MSDOS)
186
165
  #pragma warn -8004
187
166
  #pragma warn -8008
@@ -191,8 +170,9 @@ extern z_const char * const z_errmsg[10]; /* indexed by 2-zlib_error */
191
170
  /* provide prototypes for these when building zlib without LFS */
192
171
  #if !defined(_WIN32) && \
193
172
  (!defined(_LARGEFILE64_SOURCE) || _LFS64_LARGEFILE-0 == 0)
194
- ZEXTERN uLong ZEXPORT adler32_combine64 OF((uLong, uLong, z_off_t));
195
- ZEXTERN uLong ZEXPORT crc32_combine64 OF((uLong, uLong, z_off_t));
173
+ ZEXTERN uLong ZEXPORT adler32_combine64(uLong, uLong, z_off_t);
174
+ ZEXTERN uLong ZEXPORT crc32_combine64(uLong, uLong, z_off_t);
175
+ ZEXTERN uLong ZEXPORT crc32_combine_gen64(z_off_t);
196
176
  #endif
197
177
 
198
178
  /* common defaults */
@@ -231,16 +211,16 @@ extern z_const char * const z_errmsg[10]; /* indexed by 2-zlib_error */
231
211
  # define zmemzero(dest, len) memset(dest, 0, len)
232
212
  # endif
233
213
  #else
234
- void ZLIB_INTERNAL zmemcpy OF((Bytef* dest, const Bytef* source, uInt len));
235
- int ZLIB_INTERNAL zmemcmp OF((const Bytef* s1, const Bytef* s2, uInt len));
236
- void ZLIB_INTERNAL zmemzero OF((Bytef* dest, uInt len));
214
+ void ZLIB_INTERNAL zmemcpy(Bytef* dest, const Bytef* source, uInt len);
215
+ int ZLIB_INTERNAL zmemcmp(const Bytef* s1, const Bytef* s2, uInt len);
216
+ void ZLIB_INTERNAL zmemzero(Bytef* dest, uInt len);
237
217
  #endif
238
218
 
239
219
  /* Diagnostic functions */
240
220
  #ifdef ZLIB_DEBUG
241
221
  # include <stdio.h>
242
222
  extern int ZLIB_INTERNAL z_verbose;
243
- extern void ZLIB_INTERNAL z_error OF((char *m));
223
+ extern void ZLIB_INTERNAL z_error(char *m);
244
224
  # define Assert(cond,msg) {if(!(cond)) z_error(msg);}
245
225
  # define Trace(x) {if (z_verbose>=0) fprintf x ;}
246
226
  # define Tracev(x) {if (z_verbose>0) fprintf x ;}
@@ -257,9 +237,9 @@ extern z_const char * const z_errmsg[10]; /* indexed by 2-zlib_error */
257
237
  #endif
258
238
 
259
239
  #ifndef Z_SOLO
260
- voidpf ZLIB_INTERNAL zcalloc OF((voidpf opaque, unsigned items,
261
- unsigned size));
262
- void ZLIB_INTERNAL zcfree OF((voidpf opaque, voidpf ptr));
240
+ voidpf ZLIB_INTERNAL zcalloc(voidpf opaque, unsigned items,
241
+ unsigned size);
242
+ void ZLIB_INTERNAL zcfree(voidpf opaque, voidpf ptr);
263
243
  #endif
264
244
 
265
245
  #define ZALLOC(strm, items, size) \
@@ -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) {
@@ -11,6 +11,8 @@
11
11
  #ifndef ZSTD_COMPILER_H
12
12
  #define ZSTD_COMPILER_H
13
13
 
14
+ #include <stddef.h>
15
+
14
16
  #include "portability_macros.h"
15
17
 
16
18
  /*-*******************************************************
@@ -51,12 +53,19 @@
51
53
  # define WIN_CDECL
52
54
  #endif
53
55
 
56
+ /* UNUSED_ATTR tells the compiler it is okay if the function is unused. */
57
+ #if defined(__GNUC__)
58
+ # define UNUSED_ATTR __attribute__((unused))
59
+ #else
60
+ # define UNUSED_ATTR
61
+ #endif
62
+
54
63
  /**
55
64
  * FORCE_INLINE_TEMPLATE is used to define C "templates", which take constant
56
65
  * parameters. They must be inlined for the compiler to eliminate the constant
57
66
  * branches.
58
67
  */
59
- #define FORCE_INLINE_TEMPLATE static INLINE_KEYWORD FORCE_INLINE_ATTR
68
+ #define FORCE_INLINE_TEMPLATE static INLINE_KEYWORD FORCE_INLINE_ATTR UNUSED_ATTR
60
69
  /**
61
70
  * HINT_INLINE is used to help the compiler generate better code. It is *not*
62
71
  * used for "templates", so it can be tweaked based on the compilers
@@ -71,14 +80,28 @@
71
80
  #if !defined(__clang__) && defined(__GNUC__) && __GNUC__ >= 4 && __GNUC_MINOR__ >= 8 && __GNUC__ < 5
72
81
  # define HINT_INLINE static INLINE_KEYWORD
73
82
  #else
74
- # define HINT_INLINE static INLINE_KEYWORD FORCE_INLINE_ATTR
83
+ # define HINT_INLINE FORCE_INLINE_TEMPLATE
75
84
  #endif
76
85
 
77
- /* UNUSED_ATTR tells the compiler it is okay if the function is unused. */
86
+ /* "soft" inline :
87
+ * The compiler is free to select if it's a good idea to inline or not.
88
+ * The main objective is to silence compiler warnings
89
+ * when a defined function in included but not used.
90
+ *
91
+ * Note : this macro is prefixed `MEM_` because it used to be provided by `mem.h` unit.
92
+ * Updating the prefix is probably preferable, but requires a fairly large codemod,
93
+ * since this name is used everywhere.
94
+ */
95
+ #ifndef MEM_STATIC /* already defined in Linux Kernel mem.h */
78
96
  #if defined(__GNUC__)
79
- # define UNUSED_ATTR __attribute__((unused))
97
+ # define MEM_STATIC static __inline UNUSED_ATTR
98
+ #elif defined (__cplusplus) || (defined (__STDC_VERSION__) && (__STDC_VERSION__ >= 199901L) /* C99 */)
99
+ # define MEM_STATIC static inline
100
+ #elif defined(_MSC_VER)
101
+ # define MEM_STATIC static __inline
80
102
  #else
81
- # define UNUSED_ATTR
103
+ # define MEM_STATIC static /* this version may generate warnings for unused static functions; disable the relevant warning */
104
+ #endif
82
105
  #endif
83
106
 
84
107
  /* force no inlining */
@@ -109,10 +132,10 @@
109
132
  /* prefetch
110
133
  * can be disabled, by declaring NO_PREFETCH build macro */
111
134
  #if defined(NO_PREFETCH)
112
- # define PREFETCH_L1(ptr) (void)(ptr) /* disabled */
113
- # define PREFETCH_L2(ptr) (void)(ptr) /* disabled */
135
+ # define PREFETCH_L1(ptr) do { (void)(ptr); } while (0) /* disabled */
136
+ # define PREFETCH_L2(ptr) do { (void)(ptr); } while (0) /* disabled */
114
137
  #else
115
- # if defined(_MSC_VER) && (defined(_M_X64) || defined(_M_I86)) /* _mm_prefetch() is not defined outside of x86/x64 */
138
+ # if defined(_MSC_VER) && (defined(_M_X64) || defined(_M_I86)) && !defined(_M_ARM64EC) /* _mm_prefetch() is not defined outside of x86/x64 */
116
139
  # include <mmintrin.h> /* https://msdn.microsoft.com/fr-fr/library/84szxsww(v=vs.90).aspx */
117
140
  # define PREFETCH_L1(ptr) _mm_prefetch((const char*)(ptr), _MM_HINT_T0)
118
141
  # define PREFETCH_L2(ptr) _mm_prefetch((const char*)(ptr), _MM_HINT_T1)
@@ -120,24 +143,25 @@
120
143
  # define PREFETCH_L1(ptr) __builtin_prefetch((ptr), 0 /* rw==read */, 3 /* locality */)
121
144
  # define PREFETCH_L2(ptr) __builtin_prefetch((ptr), 0 /* rw==read */, 2 /* locality */)
122
145
  # elif defined(__aarch64__)
123
- # define PREFETCH_L1(ptr) __asm__ __volatile__("prfm pldl1keep, %0" ::"Q"(*(ptr)))
124
- # define PREFETCH_L2(ptr) __asm__ __volatile__("prfm pldl2keep, %0" ::"Q"(*(ptr)))
146
+ # define PREFETCH_L1(ptr) do { __asm__ __volatile__("prfm pldl1keep, %0" ::"Q"(*(ptr))); } while (0)
147
+ # define PREFETCH_L2(ptr) do { __asm__ __volatile__("prfm pldl2keep, %0" ::"Q"(*(ptr))); } while (0)
125
148
  # else
126
- # define PREFETCH_L1(ptr) (void)(ptr) /* disabled */
127
- # define PREFETCH_L2(ptr) (void)(ptr) /* disabled */
149
+ # define PREFETCH_L1(ptr) do { (void)(ptr); } while (0) /* disabled */
150
+ # define PREFETCH_L2(ptr) do { (void)(ptr); } while (0) /* disabled */
128
151
  # endif
129
152
  #endif /* NO_PREFETCH */
130
153
 
131
154
  #define CACHELINE_SIZE 64
132
155
 
133
- #define PREFETCH_AREA(p, s) { \
134
- const char* const _ptr = (const char*)(p); \
135
- size_t const _size = (size_t)(s); \
136
- size_t _pos; \
137
- for (_pos=0; _pos<_size; _pos+=CACHELINE_SIZE) { \
138
- PREFETCH_L2(_ptr + _pos); \
139
- } \
140
- }
156
+ #define PREFETCH_AREA(p, s) \
157
+ do { \
158
+ const char* const _ptr = (const char*)(p); \
159
+ size_t const _size = (size_t)(s); \
160
+ size_t _pos; \
161
+ for (_pos=0; _pos<_size; _pos+=CACHELINE_SIZE) { \
162
+ PREFETCH_L2(_ptr + _pos); \
163
+ } \
164
+ } while (0)
141
165
 
142
166
  /* vectorization
143
167
  * older GCC (pre gcc-4.3 picked as the cutoff) uses a different syntax,
@@ -166,9 +190,9 @@
166
190
  #endif
167
191
 
168
192
  #if __has_builtin(__builtin_unreachable) || (defined(__GNUC__) && (__GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 5)))
169
- # define ZSTD_UNREACHABLE { assert(0), __builtin_unreachable(); }
193
+ # define ZSTD_UNREACHABLE do { assert(0), __builtin_unreachable(); } while (0)
170
194
  #else
171
- # define ZSTD_UNREACHABLE { assert(0); }
195
+ # define ZSTD_UNREACHABLE do { assert(0); } while (0)
172
196
  #endif
173
197
 
174
198
  /* disable warnings */
@@ -281,6 +305,74 @@
281
305
  * Sanitizer
282
306
  *****************************************************************/
283
307
 
308
+ /**
309
+ * Zstd relies on pointer overflow in its decompressor.
310
+ * We add this attribute to functions that rely on pointer overflow.
311
+ */
312
+ #ifndef ZSTD_ALLOW_POINTER_OVERFLOW_ATTR
313
+ # if __has_attribute(no_sanitize)
314
+ # if !defined(__clang__) && defined(__GNUC__) && __GNUC__ < 8
315
+ /* gcc < 8 only has signed-integer-overlow which triggers on pointer overflow */
316
+ # define ZSTD_ALLOW_POINTER_OVERFLOW_ATTR __attribute__((no_sanitize("signed-integer-overflow")))
317
+ # else
318
+ /* older versions of clang [3.7, 5.0) will warn that pointer-overflow is ignored. */
319
+ # define ZSTD_ALLOW_POINTER_OVERFLOW_ATTR __attribute__((no_sanitize("pointer-overflow")))
320
+ # endif
321
+ # else
322
+ # define ZSTD_ALLOW_POINTER_OVERFLOW_ATTR
323
+ # endif
324
+ #endif
325
+
326
+ /**
327
+ * Helper function to perform a wrapped pointer difference without trigging
328
+ * UBSAN.
329
+ *
330
+ * @returns lhs - rhs with wrapping
331
+ */
332
+ MEM_STATIC
333
+ ZSTD_ALLOW_POINTER_OVERFLOW_ATTR
334
+ ptrdiff_t ZSTD_wrappedPtrDiff(unsigned char const* lhs, unsigned char const* rhs)
335
+ {
336
+ return lhs - rhs;
337
+ }
338
+
339
+ /**
340
+ * Helper function to perform a wrapped pointer add without triggering UBSAN.
341
+ *
342
+ * @return ptr + add with wrapping
343
+ */
344
+ MEM_STATIC
345
+ ZSTD_ALLOW_POINTER_OVERFLOW_ATTR
346
+ unsigned char const* ZSTD_wrappedPtrAdd(unsigned char const* ptr, ptrdiff_t add)
347
+ {
348
+ return ptr + add;
349
+ }
350
+
351
+ /**
352
+ * Helper function to perform a wrapped pointer subtraction without triggering
353
+ * UBSAN.
354
+ *
355
+ * @return ptr - sub with wrapping
356
+ */
357
+ MEM_STATIC
358
+ ZSTD_ALLOW_POINTER_OVERFLOW_ATTR
359
+ unsigned char const* ZSTD_wrappedPtrSub(unsigned char const* ptr, ptrdiff_t sub)
360
+ {
361
+ return ptr - sub;
362
+ }
363
+
364
+ /**
365
+ * Helper function to add to a pointer that works around C's undefined behavior
366
+ * of adding 0 to NULL.
367
+ *
368
+ * @returns `ptr + add` except it defines `NULL + 0 == NULL`.
369
+ */
370
+ MEM_STATIC
371
+ unsigned char* ZSTD_maybeNullPtrAdd(unsigned char* ptr, ptrdiff_t add)
372
+ {
373
+ return add > 0 ? ptr + add : ptr;
374
+ }
375
+
284
376
  /* Issue #3240 reports an ASAN failure on an llvm-mingw build. Out of an
285
377
  * abundance of caution, disable our custom poisoning on mingw. */
286
378
  #ifdef __MINGW32__