0001
0002
0003
0004
0005
0006
0007
0008
0009
0010
0011
0012
0013
0014
0015
0016 #ifndef HUF_H_298734234
0017 #define HUF_H_298734234
0018
0019
0020 #include "zstd_deps.h" /* size_t */
0021
0022
0023
0024
0025
0026
0027 #if defined(FSE_DLL_EXPORT) && (FSE_DLL_EXPORT==1) && defined(__GNUC__) && (__GNUC__ >= 4)
0028 # define HUF_PUBLIC_API __attribute__ ((visibility ("default")))
0029 #elif defined(FSE_DLL_EXPORT) && (FSE_DLL_EXPORT==1)
0030 # define HUF_PUBLIC_API __declspec(dllexport)
0031 #elif defined(FSE_DLL_IMPORT) && (FSE_DLL_IMPORT==1)
0032 # define HUF_PUBLIC_API __declspec(dllimport)
0033 #else
0034 # define HUF_PUBLIC_API
0035 #endif
0036
0037
0038
0039
0040
0041
0042
0043
0044
0045
0046
0047
0048
0049
0050
0051 HUF_PUBLIC_API size_t HUF_compress(void* dst, size_t dstCapacity,
0052 const void* src, size_t srcSize);
0053
0054
0055
0056
0057
0058
0059
0060
0061
0062
0063
0064 HUF_PUBLIC_API size_t HUF_decompress(void* dst, size_t originalSize,
0065 const void* cSrc, size_t cSrcSize);
0066
0067
0068
0069 #define HUF_BLOCKSIZE_MAX (128 * 1024)
0070 HUF_PUBLIC_API size_t HUF_compressBound(size_t size);
0071
0072
0073 HUF_PUBLIC_API unsigned HUF_isError(size_t code);
0074 HUF_PUBLIC_API const char* HUF_getErrorName(size_t code);
0075
0076
0077
0078
0079
0080
0081
0082
0083 HUF_PUBLIC_API size_t HUF_compress2 (void* dst, size_t dstCapacity,
0084 const void* src, size_t srcSize,
0085 unsigned maxSymbolValue, unsigned tableLog);
0086
0087
0088
0089
0090 #define HUF_WORKSPACE_SIZE ((6 << 10) + 256)
0091 #define HUF_WORKSPACE_SIZE_U32 (HUF_WORKSPACE_SIZE / sizeof(U32))
0092 HUF_PUBLIC_API size_t HUF_compress4X_wksp (void* dst, size_t dstCapacity,
0093 const void* src, size_t srcSize,
0094 unsigned maxSymbolValue, unsigned tableLog,
0095 void* workSpace, size_t wkspSize);
0096
0097 #endif
0098
0099
0100
0101
0102
0103
0104
0105
0106 #if !defined(HUF_H_HUF_STATIC_LINKING_ONLY)
0107 #define HUF_H_HUF_STATIC_LINKING_ONLY
0108
0109
0110 #include "mem.h" /* U32 */
0111 #define FSE_STATIC_LINKING_ONLY
0112 #include "fse.h"
0113
0114
0115
0116 #define HUF_TABLELOG_MAX 12
0117 #define HUF_TABLELOG_DEFAULT 11
0118 #define HUF_SYMBOLVALUE_MAX 255
0119
0120 #define HUF_TABLELOG_ABSOLUTEMAX 15
0121 #if (HUF_TABLELOG_MAX > HUF_TABLELOG_ABSOLUTEMAX)
0122 # error "HUF_TABLELOG_MAX is too large !"
0123 #endif
0124
0125
0126
0127
0128
0129
0130 #define HUF_CTABLEBOUND 129
0131 #define HUF_BLOCKBOUND(size) (size + (size>>8) + 8)
0132 #define HUF_COMPRESSBOUND(size) (HUF_CTABLEBOUND + HUF_BLOCKBOUND(size))
0133
0134
0135
0136 struct HUF_CElt_s {
0137 U16 val;
0138 BYTE nbBits;
0139 };
0140 typedef struct HUF_CElt_s HUF_CElt;
0141 #define HUF_CTABLE_SIZE_U32(maxSymbolValue) ((maxSymbolValue)+1)
0142 #define HUF_CTABLE_SIZE(maxSymbolValue) (HUF_CTABLE_SIZE_U32(maxSymbolValue) * sizeof(U32))
0143 #define HUF_CREATE_STATIC_CTABLE(name, maxSymbolValue) \
0144 HUF_CElt name[HUF_CTABLE_SIZE_U32(maxSymbolValue)]
0145
0146
0147 typedef U32 HUF_DTable;
0148 #define HUF_DTABLE_SIZE(maxTableLog) (1 + (1<<(maxTableLog)))
0149 #define HUF_CREATE_STATIC_DTABLEX1(DTable, maxTableLog) \
0150 HUF_DTable DTable[HUF_DTABLE_SIZE((maxTableLog)-1)] = { ((U32)((maxTableLog)-1) * 0x01000001) }
0151 #define HUF_CREATE_STATIC_DTABLEX2(DTable, maxTableLog) \
0152 HUF_DTable DTable[HUF_DTABLE_SIZE(maxTableLog)] = { ((U32)(maxTableLog) * 0x01000001) }
0153
0154
0155
0156
0157
0158 size_t HUF_decompress4X1 (void* dst, size_t dstSize, const void* cSrc, size_t cSrcSize);
0159 #ifndef HUF_FORCE_DECOMPRESS_X1
0160 size_t HUF_decompress4X2 (void* dst, size_t dstSize, const void* cSrc, size_t cSrcSize);
0161 #endif
0162
0163 size_t HUF_decompress4X_DCtx (HUF_DTable* dctx, void* dst, size_t dstSize, const void* cSrc, size_t cSrcSize);
0164 size_t HUF_decompress4X_hufOnly(HUF_DTable* dctx, void* dst, size_t dstSize, const void* cSrc, size_t cSrcSize);
0165 size_t HUF_decompress4X_hufOnly_wksp(HUF_DTable* dctx, void* dst, size_t dstSize, const void* cSrc, size_t cSrcSize, void* workSpace, size_t wkspSize);
0166 size_t HUF_decompress4X1_DCtx(HUF_DTable* dctx, void* dst, size_t dstSize, const void* cSrc, size_t cSrcSize);
0167 size_t HUF_decompress4X1_DCtx_wksp(HUF_DTable* dctx, void* dst, size_t dstSize, const void* cSrc, size_t cSrcSize, void* workSpace, size_t wkspSize);
0168 #ifndef HUF_FORCE_DECOMPRESS_X1
0169 size_t HUF_decompress4X2_DCtx(HUF_DTable* dctx, void* dst, size_t dstSize, const void* cSrc, size_t cSrcSize);
0170 size_t HUF_decompress4X2_DCtx_wksp(HUF_DTable* dctx, void* dst, size_t dstSize, const void* cSrc, size_t cSrcSize, void* workSpace, size_t wkspSize);
0171 #endif
0172
0173
0174
0175
0176
0177
0178
0179
0180
0181
0182
0183
0184
0185
0186
0187
0188
0189 unsigned HUF_optimalTableLog(unsigned maxTableLog, size_t srcSize, unsigned maxSymbolValue);
0190 size_t HUF_buildCTable (HUF_CElt* CTable, const unsigned* count, unsigned maxSymbolValue, unsigned maxNbBits);
0191 size_t HUF_writeCTable (void* dst, size_t maxDstSize, const HUF_CElt* CTable, unsigned maxSymbolValue, unsigned huffLog);
0192 size_t HUF_writeCTable_wksp(void* dst, size_t maxDstSize, const HUF_CElt* CTable, unsigned maxSymbolValue, unsigned huffLog, void* workspace, size_t workspaceSize);
0193 size_t HUF_compress4X_usingCTable(void* dst, size_t dstSize, const void* src, size_t srcSize, const HUF_CElt* CTable);
0194 size_t HUF_estimateCompressedSize(const HUF_CElt* CTable, const unsigned* count, unsigned maxSymbolValue);
0195 int HUF_validateCTable(const HUF_CElt* CTable, const unsigned* count, unsigned maxSymbolValue);
0196
0197 typedef enum {
0198 HUF_repeat_none,
0199 HUF_repeat_check,
0200 HUF_repeat_valid
0201 } HUF_repeat;
0202
0203
0204
0205
0206
0207 size_t HUF_compress4X_repeat(void* dst, size_t dstSize,
0208 const void* src, size_t srcSize,
0209 unsigned maxSymbolValue, unsigned tableLog,
0210 void* workSpace, size_t wkspSize,
0211 HUF_CElt* hufTable, HUF_repeat* repeat, int preferRepeat, int bmi2);
0212
0213
0214
0215
0216
0217 #define HUF_CTABLE_WORKSPACE_SIZE_U32 (2*HUF_SYMBOLVALUE_MAX +1 +1)
0218 #define HUF_CTABLE_WORKSPACE_SIZE (HUF_CTABLE_WORKSPACE_SIZE_U32 * sizeof(unsigned))
0219 size_t HUF_buildCTable_wksp (HUF_CElt* tree,
0220 const unsigned* count, U32 maxSymbolValue, U32 maxNbBits,
0221 void* workSpace, size_t wkspSize);
0222
0223
0224
0225
0226
0227
0228 size_t HUF_readStats(BYTE* huffWeight, size_t hwSize,
0229 U32* rankStats, U32* nbSymbolsPtr, U32* tableLogPtr,
0230 const void* src, size_t srcSize);
0231
0232
0233
0234
0235
0236
0237 #define HUF_READ_STATS_WORKSPACE_SIZE_U32 FSE_DECOMPRESS_WKSP_SIZE_U32(6, HUF_TABLELOG_MAX-1)
0238 #define HUF_READ_STATS_WORKSPACE_SIZE (HUF_READ_STATS_WORKSPACE_SIZE_U32 * sizeof(unsigned))
0239 size_t HUF_readStats_wksp(BYTE* huffWeight, size_t hwSize,
0240 U32* rankStats, U32* nbSymbolsPtr, U32* tableLogPtr,
0241 const void* src, size_t srcSize,
0242 void* workspace, size_t wkspSize,
0243 int bmi2);
0244
0245
0246
0247 size_t HUF_readCTable (HUF_CElt* CTable, unsigned* maxSymbolValuePtr, const void* src, size_t srcSize, unsigned *hasZeroWeights);
0248
0249
0250
0251
0252
0253 U32 HUF_getNbBits(const void* symbolTable, U32 symbolValue);
0254
0255
0256
0257
0258
0259
0260
0261
0262
0263
0264
0265
0266
0267 U32 HUF_selectDecoder (size_t dstSize, size_t cSrcSize);
0268
0269
0270
0271
0272
0273
0274
0275
0276
0277
0278
0279 #define HUF_DECOMPRESS_WORKSPACE_SIZE ((2 << 10) + (1 << 9))
0280 #define HUF_DECOMPRESS_WORKSPACE_SIZE_U32 (HUF_DECOMPRESS_WORKSPACE_SIZE / sizeof(U32))
0281
0282 #ifndef HUF_FORCE_DECOMPRESS_X2
0283 size_t HUF_readDTableX1 (HUF_DTable* DTable, const void* src, size_t srcSize);
0284 size_t HUF_readDTableX1_wksp (HUF_DTable* DTable, const void* src, size_t srcSize, void* workSpace, size_t wkspSize);
0285 #endif
0286 #ifndef HUF_FORCE_DECOMPRESS_X1
0287 size_t HUF_readDTableX2 (HUF_DTable* DTable, const void* src, size_t srcSize);
0288 size_t HUF_readDTableX2_wksp (HUF_DTable* DTable, const void* src, size_t srcSize, void* workSpace, size_t wkspSize);
0289 #endif
0290
0291 size_t HUF_decompress4X_usingDTable(void* dst, size_t maxDstSize, const void* cSrc, size_t cSrcSize, const HUF_DTable* DTable);
0292 #ifndef HUF_FORCE_DECOMPRESS_X2
0293 size_t HUF_decompress4X1_usingDTable(void* dst, size_t maxDstSize, const void* cSrc, size_t cSrcSize, const HUF_DTable* DTable);
0294 #endif
0295 #ifndef HUF_FORCE_DECOMPRESS_X1
0296 size_t HUF_decompress4X2_usingDTable(void* dst, size_t maxDstSize, const void* cSrc, size_t cSrcSize, const HUF_DTable* DTable);
0297 #endif
0298
0299
0300
0301
0302
0303
0304 size_t HUF_compress1X (void* dst, size_t dstSize, const void* src, size_t srcSize, unsigned maxSymbolValue, unsigned tableLog);
0305 size_t HUF_compress1X_wksp (void* dst, size_t dstSize, const void* src, size_t srcSize, unsigned maxSymbolValue, unsigned tableLog, void* workSpace, size_t wkspSize);
0306 size_t HUF_compress1X_usingCTable(void* dst, size_t dstSize, const void* src, size_t srcSize, const HUF_CElt* CTable);
0307
0308
0309
0310
0311
0312 size_t HUF_compress1X_repeat(void* dst, size_t dstSize,
0313 const void* src, size_t srcSize,
0314 unsigned maxSymbolValue, unsigned tableLog,
0315 void* workSpace, size_t wkspSize,
0316 HUF_CElt* hufTable, HUF_repeat* repeat, int preferRepeat, int bmi2);
0317
0318 size_t HUF_decompress1X1 (void* dst, size_t dstSize, const void* cSrc, size_t cSrcSize);
0319 #ifndef HUF_FORCE_DECOMPRESS_X1
0320 size_t HUF_decompress1X2 (void* dst, size_t dstSize, const void* cSrc, size_t cSrcSize);
0321 #endif
0322
0323 size_t HUF_decompress1X_DCtx (HUF_DTable* dctx, void* dst, size_t dstSize, const void* cSrc, size_t cSrcSize);
0324 size_t HUF_decompress1X_DCtx_wksp (HUF_DTable* dctx, void* dst, size_t dstSize, const void* cSrc, size_t cSrcSize, void* workSpace, size_t wkspSize);
0325 #ifndef HUF_FORCE_DECOMPRESS_X2
0326 size_t HUF_decompress1X1_DCtx(HUF_DTable* dctx, void* dst, size_t dstSize, const void* cSrc, size_t cSrcSize);
0327 size_t HUF_decompress1X1_DCtx_wksp(HUF_DTable* dctx, void* dst, size_t dstSize, const void* cSrc, size_t cSrcSize, void* workSpace, size_t wkspSize);
0328 #endif
0329 #ifndef HUF_FORCE_DECOMPRESS_X1
0330 size_t HUF_decompress1X2_DCtx(HUF_DTable* dctx, void* dst, size_t dstSize, const void* cSrc, size_t cSrcSize);
0331 size_t HUF_decompress1X2_DCtx_wksp(HUF_DTable* dctx, void* dst, size_t dstSize, const void* cSrc, size_t cSrcSize, void* workSpace, size_t wkspSize);
0332 #endif
0333
0334 size_t HUF_decompress1X_usingDTable(void* dst, size_t maxDstSize, const void* cSrc, size_t cSrcSize, const HUF_DTable* DTable);
0335 #ifndef HUF_FORCE_DECOMPRESS_X2
0336 size_t HUF_decompress1X1_usingDTable(void* dst, size_t maxDstSize, const void* cSrc, size_t cSrcSize, const HUF_DTable* DTable);
0337 #endif
0338 #ifndef HUF_FORCE_DECOMPRESS_X1
0339 size_t HUF_decompress1X2_usingDTable(void* dst, size_t maxDstSize, const void* cSrc, size_t cSrcSize, const HUF_DTable* DTable);
0340 #endif
0341
0342
0343
0344
0345 size_t HUF_decompress1X_usingDTable_bmi2(void* dst, size_t maxDstSize, const void* cSrc, size_t cSrcSize, const HUF_DTable* DTable, int bmi2);
0346 #ifndef HUF_FORCE_DECOMPRESS_X2
0347 size_t HUF_decompress1X1_DCtx_wksp_bmi2(HUF_DTable* dctx, void* dst, size_t dstSize, const void* cSrc, size_t cSrcSize, void* workSpace, size_t wkspSize, int bmi2);
0348 #endif
0349 size_t HUF_decompress4X_usingDTable_bmi2(void* dst, size_t maxDstSize, const void* cSrc, size_t cSrcSize, const HUF_DTable* DTable, int bmi2);
0350 size_t HUF_decompress4X_hufOnly_wksp_bmi2(HUF_DTable* dctx, void* dst, size_t dstSize, const void* cSrc, size_t cSrcSize, void* workSpace, size_t wkspSize, int bmi2);
0351 #ifndef HUF_FORCE_DECOMPRESS_X2
0352 size_t HUF_readDTableX1_wksp_bmi2(HUF_DTable* DTable, const void* src, size_t srcSize, void* workSpace, size_t wkspSize, int bmi2);
0353 #endif
0354
0355 #endif
0356