zstdlib 0.13.0-x86_64-linux

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 (129) hide show
  1. checksums.yaml +7 -0
  2. data/.yardopts +6 -0
  3. data/CHANGES.md +107 -0
  4. data/Gemfile +3 -0
  5. data/README.md +107 -0
  6. data/Rakefile +59 -0
  7. data/ext/zstdlib_c/extconf.rb +59 -0
  8. data/ext/zstdlib_c/ruby/zlib-2.2/zstdlib.c +4675 -0
  9. data/ext/zstdlib_c/ruby/zlib-2.3/zstdlib.c +4702 -0
  10. data/ext/zstdlib_c/ruby/zlib-2.4/zstdlib.c +4859 -0
  11. data/ext/zstdlib_c/ruby/zlib-2.5/zstdlib.c +4864 -0
  12. data/ext/zstdlib_c/ruby/zlib-2.6/zstdlib.c +4906 -0
  13. data/ext/zstdlib_c/ruby/zlib-2.7/zstdlib.c +4895 -0
  14. data/ext/zstdlib_c/ruby/zlib-3.0/zstdlib.c +4994 -0
  15. data/ext/zstdlib_c/ruby/zlib-3.1/zstdlib.c +5076 -0
  16. data/ext/zstdlib_c/ruby/zlib-3.2/zstdlib.c +5090 -0
  17. data/ext/zstdlib_c/ruby/zlib-3.3/zstdlib.c +5090 -0
  18. data/ext/zstdlib_c/zlib-1.3.1/adler32.c +164 -0
  19. data/ext/zstdlib_c/zlib-1.3.1/compress.c +75 -0
  20. data/ext/zstdlib_c/zlib-1.3.1/crc32.c +1049 -0
  21. data/ext/zstdlib_c/zlib-1.3.1/crc32.h +9446 -0
  22. data/ext/zstdlib_c/zlib-1.3.1/deflate.c +2139 -0
  23. data/ext/zstdlib_c/zlib-1.3.1/deflate.h +377 -0
  24. data/ext/zstdlib_c/zlib-1.3.1/gzclose.c +23 -0
  25. data/ext/zstdlib_c/zlib-1.3.1/gzguts.h +214 -0
  26. data/ext/zstdlib_c/zlib-1.3.1/gzlib.c +582 -0
  27. data/ext/zstdlib_c/zlib-1.3.1/gzread.c +602 -0
  28. data/ext/zstdlib_c/zlib-1.3.1/gzwrite.c +631 -0
  29. data/ext/zstdlib_c/zlib-1.3.1/infback.c +628 -0
  30. data/ext/zstdlib_c/zlib-1.3.1/inffast.c +320 -0
  31. data/ext/zstdlib_c/zlib-1.3.1/inffast.h +11 -0
  32. data/ext/zstdlib_c/zlib-1.3.1/inffixed.h +94 -0
  33. data/ext/zstdlib_c/zlib-1.3.1/inflate.c +1526 -0
  34. data/ext/zstdlib_c/zlib-1.3.1/inflate.h +126 -0
  35. data/ext/zstdlib_c/zlib-1.3.1/inftrees.c +299 -0
  36. data/ext/zstdlib_c/zlib-1.3.1/inftrees.h +62 -0
  37. data/ext/zstdlib_c/zlib-1.3.1/trees.c +1117 -0
  38. data/ext/zstdlib_c/zlib-1.3.1/trees.h +128 -0
  39. data/ext/zstdlib_c/zlib-1.3.1/uncompr.c +85 -0
  40. data/ext/zstdlib_c/zlib-1.3.1/zconf.h +543 -0
  41. data/ext/zstdlib_c/zlib-1.3.1/zlib.h +1938 -0
  42. data/ext/zstdlib_c/zlib-1.3.1/zutil.c +299 -0
  43. data/ext/zstdlib_c/zlib-1.3.1/zutil.h +254 -0
  44. data/ext/zstdlib_c/zlib.mk +14 -0
  45. data/ext/zstdlib_c/zlibwrapper/zlibwrapper.c +10 -0
  46. data/ext/zstdlib_c/zlibwrapper.mk +14 -0
  47. data/ext/zstdlib_c/zstd-1.5.6/lib/common/allocations.h +55 -0
  48. data/ext/zstdlib_c/zstd-1.5.6/lib/common/bits.h +200 -0
  49. data/ext/zstdlib_c/zstd-1.5.6/lib/common/bitstream.h +457 -0
  50. data/ext/zstdlib_c/zstd-1.5.6/lib/common/compiler.h +450 -0
  51. data/ext/zstdlib_c/zstd-1.5.6/lib/common/cpu.h +249 -0
  52. data/ext/zstdlib_c/zstd-1.5.6/lib/common/debug.c +30 -0
  53. data/ext/zstdlib_c/zstd-1.5.6/lib/common/debug.h +116 -0
  54. data/ext/zstdlib_c/zstd-1.5.6/lib/common/entropy_common.c +340 -0
  55. data/ext/zstdlib_c/zstd-1.5.6/lib/common/error_private.c +63 -0
  56. data/ext/zstdlib_c/zstd-1.5.6/lib/common/error_private.h +168 -0
  57. data/ext/zstdlib_c/zstd-1.5.6/lib/common/fse.h +640 -0
  58. data/ext/zstdlib_c/zstd-1.5.6/lib/common/fse_decompress.c +313 -0
  59. data/ext/zstdlib_c/zstd-1.5.6/lib/common/huf.h +286 -0
  60. data/ext/zstdlib_c/zstd-1.5.6/lib/common/mem.h +426 -0
  61. data/ext/zstdlib_c/zstd-1.5.6/lib/common/pool.c +371 -0
  62. data/ext/zstdlib_c/zstd-1.5.6/lib/common/pool.h +90 -0
  63. data/ext/zstdlib_c/zstd-1.5.6/lib/common/portability_macros.h +158 -0
  64. data/ext/zstdlib_c/zstd-1.5.6/lib/common/threading.c +182 -0
  65. data/ext/zstdlib_c/zstd-1.5.6/lib/common/threading.h +150 -0
  66. data/ext/zstdlib_c/zstd-1.5.6/lib/common/xxhash.c +18 -0
  67. data/ext/zstdlib_c/zstd-1.5.6/lib/common/xxhash.h +7020 -0
  68. data/ext/zstdlib_c/zstd-1.5.6/lib/common/zstd_common.c +48 -0
  69. data/ext/zstdlib_c/zstd-1.5.6/lib/common/zstd_deps.h +111 -0
  70. data/ext/zstdlib_c/zstd-1.5.6/lib/common/zstd_internal.h +392 -0
  71. data/ext/zstdlib_c/zstd-1.5.6/lib/common/zstd_trace.h +163 -0
  72. data/ext/zstdlib_c/zstd-1.5.6/lib/compress/clevels.h +134 -0
  73. data/ext/zstdlib_c/zstd-1.5.6/lib/compress/fse_compress.c +625 -0
  74. data/ext/zstdlib_c/zstd-1.5.6/lib/compress/hist.c +181 -0
  75. data/ext/zstdlib_c/zstd-1.5.6/lib/compress/hist.h +75 -0
  76. data/ext/zstdlib_c/zstd-1.5.6/lib/compress/huf_compress.c +1464 -0
  77. data/ext/zstdlib_c/zstd-1.5.6/lib/compress/zstd_compress.c +7153 -0
  78. data/ext/zstdlib_c/zstd-1.5.6/lib/compress/zstd_compress_internal.h +1534 -0
  79. data/ext/zstdlib_c/zstd-1.5.6/lib/compress/zstd_compress_literals.c +235 -0
  80. data/ext/zstdlib_c/zstd-1.5.6/lib/compress/zstd_compress_literals.h +39 -0
  81. data/ext/zstdlib_c/zstd-1.5.6/lib/compress/zstd_compress_sequences.c +442 -0
  82. data/ext/zstdlib_c/zstd-1.5.6/lib/compress/zstd_compress_sequences.h +54 -0
  83. data/ext/zstdlib_c/zstd-1.5.6/lib/compress/zstd_compress_superblock.c +688 -0
  84. data/ext/zstdlib_c/zstd-1.5.6/lib/compress/zstd_compress_superblock.h +32 -0
  85. data/ext/zstdlib_c/zstd-1.5.6/lib/compress/zstd_cwksp.h +748 -0
  86. data/ext/zstdlib_c/zstd-1.5.6/lib/compress/zstd_double_fast.c +770 -0
  87. data/ext/zstdlib_c/zstd-1.5.6/lib/compress/zstd_double_fast.h +50 -0
  88. data/ext/zstdlib_c/zstd-1.5.6/lib/compress/zstd_fast.c +968 -0
  89. data/ext/zstdlib_c/zstd-1.5.6/lib/compress/zstd_fast.h +38 -0
  90. data/ext/zstdlib_c/zstd-1.5.6/lib/compress/zstd_lazy.c +2199 -0
  91. data/ext/zstdlib_c/zstd-1.5.6/lib/compress/zstd_lazy.h +202 -0
  92. data/ext/zstdlib_c/zstd-1.5.6/lib/compress/zstd_ldm.c +730 -0
  93. data/ext/zstdlib_c/zstd-1.5.6/lib/compress/zstd_ldm.h +117 -0
  94. data/ext/zstdlib_c/zstd-1.5.6/lib/compress/zstd_ldm_geartab.h +106 -0
  95. data/ext/zstdlib_c/zstd-1.5.6/lib/compress/zstd_opt.c +1576 -0
  96. data/ext/zstdlib_c/zstd-1.5.6/lib/compress/zstd_opt.h +80 -0
  97. data/ext/zstdlib_c/zstd-1.5.6/lib/compress/zstdmt_compress.c +1882 -0
  98. data/ext/zstdlib_c/zstd-1.5.6/lib/compress/zstdmt_compress.h +113 -0
  99. data/ext/zstdlib_c/zstd-1.5.6/lib/decompress/huf_decompress.c +1944 -0
  100. data/ext/zstdlib_c/zstd-1.5.6/lib/decompress/huf_decompress_amd64.S +595 -0
  101. data/ext/zstdlib_c/zstd-1.5.6/lib/decompress/zstd_ddict.c +244 -0
  102. data/ext/zstdlib_c/zstd-1.5.6/lib/decompress/zstd_ddict.h +44 -0
  103. data/ext/zstdlib_c/zstd-1.5.6/lib/decompress/zstd_decompress.c +2407 -0
  104. data/ext/zstdlib_c/zstd-1.5.6/lib/decompress/zstd_decompress_block.c +2215 -0
  105. data/ext/zstdlib_c/zstd-1.5.6/lib/decompress/zstd_decompress_block.h +73 -0
  106. data/ext/zstdlib_c/zstd-1.5.6/lib/decompress/zstd_decompress_internal.h +240 -0
  107. data/ext/zstdlib_c/zstd-1.5.6/lib/zdict.h +474 -0
  108. data/ext/zstdlib_c/zstd-1.5.6/lib/zstd.h +3089 -0
  109. data/ext/zstdlib_c/zstd-1.5.6/lib/zstd_errors.h +114 -0
  110. data/ext/zstdlib_c/zstd-1.5.6/zlibWrapper/gzclose.c +26 -0
  111. data/ext/zstdlib_c/zstd-1.5.6/zlibWrapper/gzcompatibility.h +68 -0
  112. data/ext/zstdlib_c/zstd-1.5.6/zlibWrapper/gzguts.h +229 -0
  113. data/ext/zstdlib_c/zstd-1.5.6/zlibWrapper/gzlib.c +587 -0
  114. data/ext/zstdlib_c/zstd-1.5.6/zlibWrapper/gzread.c +637 -0
  115. data/ext/zstdlib_c/zstd-1.5.6/zlibWrapper/gzwrite.c +631 -0
  116. data/ext/zstdlib_c/zstd-1.5.6/zlibWrapper/zstd_zlibwrapper.c +1200 -0
  117. data/ext/zstdlib_c/zstd-1.5.6/zlibWrapper/zstd_zlibwrapper.h +91 -0
  118. data/ext/zstdlib_c/zstd.mk +15 -0
  119. data/lib/2.4/zstdlib_c.so +0 -0
  120. data/lib/2.5/zstdlib_c.so +0 -0
  121. data/lib/2.6/zstdlib_c.so +0 -0
  122. data/lib/2.7/zstdlib_c.so +0 -0
  123. data/lib/3.0/zstdlib_c.so +0 -0
  124. data/lib/3.1/zstdlib_c.so +0 -0
  125. data/lib/3.2/zstdlib_c.so +0 -0
  126. data/lib/3.3/zstdlib_c.so +0 -0
  127. data/lib/zstdlib.rb +6 -0
  128. data/test/zstdlib_test.rb +21 -0
  129. metadata +243 -0
@@ -0,0 +1,426 @@
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
+ #ifndef MEM_H_MODULE
12
+ #define MEM_H_MODULE
13
+
14
+ #if defined (__cplusplus)
15
+ extern "C" {
16
+ #endif
17
+
18
+ /*-****************************************
19
+ * Dependencies
20
+ ******************************************/
21
+ #include <stddef.h> /* size_t, ptrdiff_t */
22
+ #include "compiler.h" /* __has_builtin */
23
+ #include "debug.h" /* DEBUG_STATIC_ASSERT */
24
+ #include "zstd_deps.h" /* ZSTD_memcpy */
25
+
26
+
27
+ /*-****************************************
28
+ * Compiler specifics
29
+ ******************************************/
30
+ #if defined(_MSC_VER) /* Visual Studio */
31
+ # include <stdlib.h> /* _byteswap_ulong */
32
+ # include <intrin.h> /* _byteswap_* */
33
+ #endif
34
+
35
+ /*-**************************************************************
36
+ * Basic Types
37
+ *****************************************************************/
38
+ #if !defined (__VMS) && (defined (__cplusplus) || (defined (__STDC_VERSION__) && (__STDC_VERSION__ >= 199901L) /* C99 */) )
39
+ # if defined(_AIX)
40
+ # include <inttypes.h>
41
+ # else
42
+ # include <stdint.h> /* intptr_t */
43
+ # endif
44
+ typedef uint8_t BYTE;
45
+ typedef uint8_t U8;
46
+ typedef int8_t S8;
47
+ typedef uint16_t U16;
48
+ typedef int16_t S16;
49
+ typedef uint32_t U32;
50
+ typedef int32_t S32;
51
+ typedef uint64_t U64;
52
+ typedef int64_t S64;
53
+ #else
54
+ # include <limits.h>
55
+ #if CHAR_BIT != 8
56
+ # error "this implementation requires char to be exactly 8-bit type"
57
+ #endif
58
+ typedef unsigned char BYTE;
59
+ typedef unsigned char U8;
60
+ typedef signed char S8;
61
+ #if USHRT_MAX != 65535
62
+ # error "this implementation requires short to be exactly 16-bit type"
63
+ #endif
64
+ typedef unsigned short U16;
65
+ typedef signed short S16;
66
+ #if UINT_MAX != 4294967295
67
+ # error "this implementation requires int to be exactly 32-bit type"
68
+ #endif
69
+ typedef unsigned int U32;
70
+ typedef signed int S32;
71
+ /* note : there are no limits defined for long long type in C90.
72
+ * limits exist in C99, however, in such case, <stdint.h> is preferred */
73
+ typedef unsigned long long U64;
74
+ typedef signed long long S64;
75
+ #endif
76
+
77
+
78
+ /*-**************************************************************
79
+ * Memory I/O API
80
+ *****************************************************************/
81
+ /*=== Static platform detection ===*/
82
+ MEM_STATIC unsigned MEM_32bits(void);
83
+ MEM_STATIC unsigned MEM_64bits(void);
84
+ MEM_STATIC unsigned MEM_isLittleEndian(void);
85
+
86
+ /*=== Native unaligned read/write ===*/
87
+ MEM_STATIC U16 MEM_read16(const void* memPtr);
88
+ MEM_STATIC U32 MEM_read32(const void* memPtr);
89
+ MEM_STATIC U64 MEM_read64(const void* memPtr);
90
+ MEM_STATIC size_t MEM_readST(const void* memPtr);
91
+
92
+ MEM_STATIC void MEM_write16(void* memPtr, U16 value);
93
+ MEM_STATIC void MEM_write32(void* memPtr, U32 value);
94
+ MEM_STATIC void MEM_write64(void* memPtr, U64 value);
95
+
96
+ /*=== Little endian unaligned read/write ===*/
97
+ MEM_STATIC U16 MEM_readLE16(const void* memPtr);
98
+ MEM_STATIC U32 MEM_readLE24(const void* memPtr);
99
+ MEM_STATIC U32 MEM_readLE32(const void* memPtr);
100
+ MEM_STATIC U64 MEM_readLE64(const void* memPtr);
101
+ MEM_STATIC size_t MEM_readLEST(const void* memPtr);
102
+
103
+ MEM_STATIC void MEM_writeLE16(void* memPtr, U16 val);
104
+ MEM_STATIC void MEM_writeLE24(void* memPtr, U32 val);
105
+ MEM_STATIC void MEM_writeLE32(void* memPtr, U32 val32);
106
+ MEM_STATIC void MEM_writeLE64(void* memPtr, U64 val64);
107
+ MEM_STATIC void MEM_writeLEST(void* memPtr, size_t val);
108
+
109
+ /*=== Big endian unaligned read/write ===*/
110
+ MEM_STATIC U32 MEM_readBE32(const void* memPtr);
111
+ MEM_STATIC U64 MEM_readBE64(const void* memPtr);
112
+ MEM_STATIC size_t MEM_readBEST(const void* memPtr);
113
+
114
+ MEM_STATIC void MEM_writeBE32(void* memPtr, U32 val32);
115
+ MEM_STATIC void MEM_writeBE64(void* memPtr, U64 val64);
116
+ MEM_STATIC void MEM_writeBEST(void* memPtr, size_t val);
117
+
118
+ /*=== Byteswap ===*/
119
+ MEM_STATIC U32 MEM_swap32(U32 in);
120
+ MEM_STATIC U64 MEM_swap64(U64 in);
121
+ MEM_STATIC size_t MEM_swapST(size_t in);
122
+
123
+
124
+ /*-**************************************************************
125
+ * Memory I/O Implementation
126
+ *****************************************************************/
127
+ /* MEM_FORCE_MEMORY_ACCESS : For accessing unaligned memory:
128
+ * Method 0 : always use `memcpy()`. Safe and portable.
129
+ * Method 1 : Use compiler extension to set unaligned access.
130
+ * Method 2 : direct access. This method is portable but violate C standard.
131
+ * It can generate buggy code on targets depending on alignment.
132
+ * Default : method 1 if supported, else method 0
133
+ */
134
+ #ifndef MEM_FORCE_MEMORY_ACCESS /* can be defined externally, on command line for example */
135
+ # ifdef __GNUC__
136
+ # define MEM_FORCE_MEMORY_ACCESS 1
137
+ # endif
138
+ #endif
139
+
140
+ MEM_STATIC unsigned MEM_32bits(void) { return sizeof(size_t)==4; }
141
+ MEM_STATIC unsigned MEM_64bits(void) { return sizeof(size_t)==8; }
142
+
143
+ MEM_STATIC unsigned MEM_isLittleEndian(void)
144
+ {
145
+ #if defined(__BYTE_ORDER__) && defined(__ORDER_LITTLE_ENDIAN__) && (__BYTE_ORDER__ == __ORDER_LITTLE_ENDIAN__)
146
+ return 1;
147
+ #elif defined(__BYTE_ORDER__) && defined(__ORDER_BIG_ENDIAN__) && (__BYTE_ORDER__ == __ORDER_BIG_ENDIAN__)
148
+ return 0;
149
+ #elif defined(__clang__) && __LITTLE_ENDIAN__
150
+ return 1;
151
+ #elif defined(__clang__) && __BIG_ENDIAN__
152
+ return 0;
153
+ #elif defined(_MSC_VER) && (_M_AMD64 || _M_IX86)
154
+ return 1;
155
+ #elif defined(__DMC__) && defined(_M_IX86)
156
+ return 1;
157
+ #else
158
+ const union { U32 u; BYTE c[4]; } one = { 1 }; /* don't use static : performance detrimental */
159
+ return one.c[0];
160
+ #endif
161
+ }
162
+
163
+ #if defined(MEM_FORCE_MEMORY_ACCESS) && (MEM_FORCE_MEMORY_ACCESS==2)
164
+
165
+ /* violates C standard, by lying on structure alignment.
166
+ Only use if no other choice to achieve best performance on target platform */
167
+ MEM_STATIC U16 MEM_read16(const void* memPtr) { return *(const U16*) memPtr; }
168
+ MEM_STATIC U32 MEM_read32(const void* memPtr) { return *(const U32*) memPtr; }
169
+ MEM_STATIC U64 MEM_read64(const void* memPtr) { return *(const U64*) memPtr; }
170
+ MEM_STATIC size_t MEM_readST(const void* memPtr) { return *(const size_t*) memPtr; }
171
+
172
+ MEM_STATIC void MEM_write16(void* memPtr, U16 value) { *(U16*)memPtr = value; }
173
+ MEM_STATIC void MEM_write32(void* memPtr, U32 value) { *(U32*)memPtr = value; }
174
+ MEM_STATIC void MEM_write64(void* memPtr, U64 value) { *(U64*)memPtr = value; }
175
+
176
+ #elif defined(MEM_FORCE_MEMORY_ACCESS) && (MEM_FORCE_MEMORY_ACCESS==1)
177
+
178
+ typedef __attribute__((aligned(1))) U16 unalign16;
179
+ typedef __attribute__((aligned(1))) U32 unalign32;
180
+ typedef __attribute__((aligned(1))) U64 unalign64;
181
+ typedef __attribute__((aligned(1))) size_t unalignArch;
182
+
183
+ MEM_STATIC U16 MEM_read16(const void* ptr) { return *(const unalign16*)ptr; }
184
+ MEM_STATIC U32 MEM_read32(const void* ptr) { return *(const unalign32*)ptr; }
185
+ MEM_STATIC U64 MEM_read64(const void* ptr) { return *(const unalign64*)ptr; }
186
+ MEM_STATIC size_t MEM_readST(const void* ptr) { return *(const unalignArch*)ptr; }
187
+
188
+ MEM_STATIC void MEM_write16(void* memPtr, U16 value) { *(unalign16*)memPtr = value; }
189
+ MEM_STATIC void MEM_write32(void* memPtr, U32 value) { *(unalign32*)memPtr = value; }
190
+ MEM_STATIC void MEM_write64(void* memPtr, U64 value) { *(unalign64*)memPtr = value; }
191
+
192
+ #else
193
+
194
+ /* default method, safe and standard.
195
+ can sometimes prove slower */
196
+
197
+ MEM_STATIC U16 MEM_read16(const void* memPtr)
198
+ {
199
+ U16 val; ZSTD_memcpy(&val, memPtr, sizeof(val)); return val;
200
+ }
201
+
202
+ MEM_STATIC U32 MEM_read32(const void* memPtr)
203
+ {
204
+ U32 val; ZSTD_memcpy(&val, memPtr, sizeof(val)); return val;
205
+ }
206
+
207
+ MEM_STATIC U64 MEM_read64(const void* memPtr)
208
+ {
209
+ U64 val; ZSTD_memcpy(&val, memPtr, sizeof(val)); return val;
210
+ }
211
+
212
+ MEM_STATIC size_t MEM_readST(const void* memPtr)
213
+ {
214
+ size_t val; ZSTD_memcpy(&val, memPtr, sizeof(val)); return val;
215
+ }
216
+
217
+ MEM_STATIC void MEM_write16(void* memPtr, U16 value)
218
+ {
219
+ ZSTD_memcpy(memPtr, &value, sizeof(value));
220
+ }
221
+
222
+ MEM_STATIC void MEM_write32(void* memPtr, U32 value)
223
+ {
224
+ ZSTD_memcpy(memPtr, &value, sizeof(value));
225
+ }
226
+
227
+ MEM_STATIC void MEM_write64(void* memPtr, U64 value)
228
+ {
229
+ ZSTD_memcpy(memPtr, &value, sizeof(value));
230
+ }
231
+
232
+ #endif /* MEM_FORCE_MEMORY_ACCESS */
233
+
234
+ MEM_STATIC U32 MEM_swap32_fallback(U32 in)
235
+ {
236
+ return ((in << 24) & 0xff000000 ) |
237
+ ((in << 8) & 0x00ff0000 ) |
238
+ ((in >> 8) & 0x0000ff00 ) |
239
+ ((in >> 24) & 0x000000ff );
240
+ }
241
+
242
+ MEM_STATIC U32 MEM_swap32(U32 in)
243
+ {
244
+ #if defined(_MSC_VER) /* Visual Studio */
245
+ return _byteswap_ulong(in);
246
+ #elif (defined (__GNUC__) && (__GNUC__ * 100 + __GNUC_MINOR__ >= 403)) \
247
+ || (defined(__clang__) && __has_builtin(__builtin_bswap32))
248
+ return __builtin_bswap32(in);
249
+ #else
250
+ return MEM_swap32_fallback(in);
251
+ #endif
252
+ }
253
+
254
+ MEM_STATIC U64 MEM_swap64_fallback(U64 in)
255
+ {
256
+ return ((in << 56) & 0xff00000000000000ULL) |
257
+ ((in << 40) & 0x00ff000000000000ULL) |
258
+ ((in << 24) & 0x0000ff0000000000ULL) |
259
+ ((in << 8) & 0x000000ff00000000ULL) |
260
+ ((in >> 8) & 0x00000000ff000000ULL) |
261
+ ((in >> 24) & 0x0000000000ff0000ULL) |
262
+ ((in >> 40) & 0x000000000000ff00ULL) |
263
+ ((in >> 56) & 0x00000000000000ffULL);
264
+ }
265
+
266
+ MEM_STATIC U64 MEM_swap64(U64 in)
267
+ {
268
+ #if defined(_MSC_VER) /* Visual Studio */
269
+ return _byteswap_uint64(in);
270
+ #elif (defined (__GNUC__) && (__GNUC__ * 100 + __GNUC_MINOR__ >= 403)) \
271
+ || (defined(__clang__) && __has_builtin(__builtin_bswap64))
272
+ return __builtin_bswap64(in);
273
+ #else
274
+ return MEM_swap64_fallback(in);
275
+ #endif
276
+ }
277
+
278
+ MEM_STATIC size_t MEM_swapST(size_t in)
279
+ {
280
+ if (MEM_32bits())
281
+ return (size_t)MEM_swap32((U32)in);
282
+ else
283
+ return (size_t)MEM_swap64((U64)in);
284
+ }
285
+
286
+ /*=== Little endian r/w ===*/
287
+
288
+ MEM_STATIC U16 MEM_readLE16(const void* memPtr)
289
+ {
290
+ if (MEM_isLittleEndian())
291
+ return MEM_read16(memPtr);
292
+ else {
293
+ const BYTE* p = (const BYTE*)memPtr;
294
+ return (U16)(p[0] + (p[1]<<8));
295
+ }
296
+ }
297
+
298
+ MEM_STATIC void MEM_writeLE16(void* memPtr, U16 val)
299
+ {
300
+ if (MEM_isLittleEndian()) {
301
+ MEM_write16(memPtr, val);
302
+ } else {
303
+ BYTE* p = (BYTE*)memPtr;
304
+ p[0] = (BYTE)val;
305
+ p[1] = (BYTE)(val>>8);
306
+ }
307
+ }
308
+
309
+ MEM_STATIC U32 MEM_readLE24(const void* memPtr)
310
+ {
311
+ return (U32)MEM_readLE16(memPtr) + ((U32)(((const BYTE*)memPtr)[2]) << 16);
312
+ }
313
+
314
+ MEM_STATIC void MEM_writeLE24(void* memPtr, U32 val)
315
+ {
316
+ MEM_writeLE16(memPtr, (U16)val);
317
+ ((BYTE*)memPtr)[2] = (BYTE)(val>>16);
318
+ }
319
+
320
+ MEM_STATIC U32 MEM_readLE32(const void* memPtr)
321
+ {
322
+ if (MEM_isLittleEndian())
323
+ return MEM_read32(memPtr);
324
+ else
325
+ return MEM_swap32(MEM_read32(memPtr));
326
+ }
327
+
328
+ MEM_STATIC void MEM_writeLE32(void* memPtr, U32 val32)
329
+ {
330
+ if (MEM_isLittleEndian())
331
+ MEM_write32(memPtr, val32);
332
+ else
333
+ MEM_write32(memPtr, MEM_swap32(val32));
334
+ }
335
+
336
+ MEM_STATIC U64 MEM_readLE64(const void* memPtr)
337
+ {
338
+ if (MEM_isLittleEndian())
339
+ return MEM_read64(memPtr);
340
+ else
341
+ return MEM_swap64(MEM_read64(memPtr));
342
+ }
343
+
344
+ MEM_STATIC void MEM_writeLE64(void* memPtr, U64 val64)
345
+ {
346
+ if (MEM_isLittleEndian())
347
+ MEM_write64(memPtr, val64);
348
+ else
349
+ MEM_write64(memPtr, MEM_swap64(val64));
350
+ }
351
+
352
+ MEM_STATIC size_t MEM_readLEST(const void* memPtr)
353
+ {
354
+ if (MEM_32bits())
355
+ return (size_t)MEM_readLE32(memPtr);
356
+ else
357
+ return (size_t)MEM_readLE64(memPtr);
358
+ }
359
+
360
+ MEM_STATIC void MEM_writeLEST(void* memPtr, size_t val)
361
+ {
362
+ if (MEM_32bits())
363
+ MEM_writeLE32(memPtr, (U32)val);
364
+ else
365
+ MEM_writeLE64(memPtr, (U64)val);
366
+ }
367
+
368
+ /*=== Big endian r/w ===*/
369
+
370
+ MEM_STATIC U32 MEM_readBE32(const void* memPtr)
371
+ {
372
+ if (MEM_isLittleEndian())
373
+ return MEM_swap32(MEM_read32(memPtr));
374
+ else
375
+ return MEM_read32(memPtr);
376
+ }
377
+
378
+ MEM_STATIC void MEM_writeBE32(void* memPtr, U32 val32)
379
+ {
380
+ if (MEM_isLittleEndian())
381
+ MEM_write32(memPtr, MEM_swap32(val32));
382
+ else
383
+ MEM_write32(memPtr, val32);
384
+ }
385
+
386
+ MEM_STATIC U64 MEM_readBE64(const void* memPtr)
387
+ {
388
+ if (MEM_isLittleEndian())
389
+ return MEM_swap64(MEM_read64(memPtr));
390
+ else
391
+ return MEM_read64(memPtr);
392
+ }
393
+
394
+ MEM_STATIC void MEM_writeBE64(void* memPtr, U64 val64)
395
+ {
396
+ if (MEM_isLittleEndian())
397
+ MEM_write64(memPtr, MEM_swap64(val64));
398
+ else
399
+ MEM_write64(memPtr, val64);
400
+ }
401
+
402
+ MEM_STATIC size_t MEM_readBEST(const void* memPtr)
403
+ {
404
+ if (MEM_32bits())
405
+ return (size_t)MEM_readBE32(memPtr);
406
+ else
407
+ return (size_t)MEM_readBE64(memPtr);
408
+ }
409
+
410
+ MEM_STATIC void MEM_writeBEST(void* memPtr, size_t val)
411
+ {
412
+ if (MEM_32bits())
413
+ MEM_writeBE32(memPtr, (U32)val);
414
+ else
415
+ MEM_writeBE64(memPtr, (U64)val);
416
+ }
417
+
418
+ /* code only tested on 32 and 64 bits systems */
419
+ MEM_STATIC void MEM_check(void) { DEBUG_STATIC_ASSERT((sizeof(size_t)==4) || (sizeof(size_t)==8)); }
420
+
421
+
422
+ #if defined (__cplusplus)
423
+ }
424
+ #endif
425
+
426
+ #endif /* MEM_H_MODULE */