#pragma once
#include "bitknit.h"
#include "bitreader.h"
#include "huffman.h"
#include "kraken.h"
#include "leviathan.h"
#include "lzna.h"
#include "mermaid.h"
#include "stdafx.h"
#include "tans.h"
#include "oozle/src/lib.rs.h"
#include "rust/cxx.h"
#include <memory>
#define ALIGN_POINTER(p, align) \
((uint8_t *)(((uintptr_t)(p) + (align - 1)) & ~(align - 1)))
#define ALIGN_16(x) (((x) + 15) & ~15)
#define COPY_64(d, s) \
{ \
*(uint64_t *)(d) = *(uint64_t *)(s); \
}
#define COPY_64_BYTES(d, s) \
{ \
_mm_storeu_si128 ((__m128i *)d + 0, _mm_loadu_si128 ((__m128i *)s + 0)); \
_mm_storeu_si128 ((__m128i *)d + 1, _mm_loadu_si128 ((__m128i *)s + 1)); \
_mm_storeu_si128 ((__m128i *)d + 2, _mm_loadu_si128 ((__m128i *)s + 2)); \
_mm_storeu_si128 ((__m128i *)d + 3, _mm_loadu_si128 ((__m128i *)s + 3)); \
}
#define COPY_64_ADD(d, s, t) \
_mm_storel_epi64 ((__m128i *)(d), \
_mm_add_epi8 (_mm_loadl_epi64 ((__m128i *)(s)), \
_mm_loadl_epi64 ((__m128i *)(t))))
static const uint32_t kRiceCodeBits2Value[256] = {
0x80000000, 0x00000007, 0x10000006, 0x00000006, 0x20000005, 0x00000105,
0x10000005, 0x00000005, 0x30000004, 0x00000204, 0x10000104, 0x00000104,
0x20000004, 0x00010004, 0x10000004, 0x00000004, 0x40000003, 0x00000303,
0x10000203, 0x00000203, 0x20000103, 0x00010103, 0x10000103, 0x00000103,
0x30000003, 0x00020003, 0x10010003, 0x00010003, 0x20000003, 0x01000003,
0x10000003, 0x00000003, 0x50000002, 0x00000402, 0x10000302, 0x00000302,
0x20000202, 0x00010202, 0x10000202, 0x00000202, 0x30000102, 0x00020102,
0x10010102, 0x00010102, 0x20000102, 0x01000102, 0x10000102, 0x00000102,
0x40000002, 0x00030002, 0x10020002, 0x00020002, 0x20010002, 0x01010002,
0x10010002, 0x00010002, 0x30000002, 0x02000002, 0x11000002, 0x01000002,
0x20000002, 0x00000012, 0x10000002, 0x00000002, 0x60000001, 0x00000501,
0x10000401, 0x00000401, 0x20000301, 0x00010301, 0x10000301, 0x00000301,
0x30000201, 0x00020201, 0x10010201, 0x00010201, 0x20000201, 0x01000201,
0x10000201, 0x00000201, 0x40000101, 0x00030101, 0x10020101, 0x00020101,
0x20010101, 0x01010101, 0x10010101, 0x00010101, 0x30000101, 0x02000101,
0x11000101, 0x01000101, 0x20000101, 0x00000111, 0x10000101, 0x00000101,
0x50000001, 0x00040001, 0x10030001, 0x00030001, 0x20020001, 0x01020001,
0x10020001, 0x00020001, 0x30010001, 0x02010001, 0x11010001, 0x01010001,
0x20010001, 0x00010011, 0x10010001, 0x00010001, 0x40000001, 0x03000001,
0x12000001, 0x02000001, 0x21000001, 0x01000011, 0x11000001, 0x01000001,
0x30000001, 0x00000021, 0x10000011, 0x00000011, 0x20000001, 0x00001001,
0x10000001, 0x00000001, 0x70000000, 0x00000600, 0x10000500, 0x00000500,
0x20000400, 0x00010400, 0x10000400, 0x00000400, 0x30000300, 0x00020300,
0x10010300, 0x00010300, 0x20000300, 0x01000300, 0x10000300, 0x00000300,
0x40000200, 0x00030200, 0x10020200, 0x00020200, 0x20010200, 0x01010200,
0x10010200, 0x00010200, 0x30000200, 0x02000200, 0x11000200, 0x01000200,
0x20000200, 0x00000210, 0x10000200, 0x00000200, 0x50000100, 0x00040100,
0x10030100, 0x00030100, 0x20020100, 0x01020100, 0x10020100, 0x00020100,
0x30010100, 0x02010100, 0x11010100, 0x01010100, 0x20010100, 0x00010110,
0x10010100, 0x00010100, 0x40000100, 0x03000100, 0x12000100, 0x02000100,
0x21000100, 0x01000110, 0x11000100, 0x01000100, 0x30000100, 0x00000120,
0x10000110, 0x00000110, 0x20000100, 0x00001100, 0x10000100, 0x00000100,
0x60000000, 0x00050000, 0x10040000, 0x00040000, 0x20030000, 0x01030000,
0x10030000, 0x00030000, 0x30020000, 0x02020000, 0x11020000, 0x01020000,
0x20020000, 0x00020010, 0x10020000, 0x00020000, 0x40010000, 0x03010000,
0x12010000, 0x02010000, 0x21010000, 0x01010010, 0x11010000, 0x01010000,
0x30010000, 0x00010020, 0x10010010, 0x00010010, 0x20010000, 0x00011000,
0x10010000, 0x00010000, 0x50000000, 0x04000000, 0x13000000, 0x03000000,
0x22000000, 0x02000010, 0x12000000, 0x02000000, 0x31000000, 0x01000020,
0x11000010, 0x01000010, 0x21000000, 0x01001000, 0x11000000, 0x01000000,
0x40000000, 0x00000030, 0x10000020, 0x00000020, 0x20000010, 0x00001010,
0x10000010, 0x00000010, 0x30000000, 0x00002000, 0x10001000, 0x00001000,
0x20000000, 0x00100000, 0x10000000, 0x00000000,
};
static const uint8_t kRiceCodeBits2Len[256] = {
0, 1, 1, 2, 1, 2, 2, 3, 1, 2, 2, 3, 2, 3, 3, 4, 1, 2, 2, 3, 2, 3, 3, 4, 2, 3,
3, 4, 3, 4, 4, 5, 1, 2, 2, 3, 2, 3, 3, 4, 2, 3, 3, 4, 3, 4, 4, 5, 2, 3, 3, 4,
3, 4, 4, 5, 3, 4, 4, 5, 4, 5, 5, 6, 1, 2, 2, 3, 2, 3, 3, 4, 2, 3, 3, 4, 3, 4,
4, 5, 2, 3, 3, 4, 3, 4, 4, 5, 3, 4, 4, 5, 4, 5, 5, 6, 2, 3, 3, 4, 3, 4, 4, 5,
3, 4, 4, 5, 4, 5, 5, 6, 3, 4, 4, 5, 4, 5, 5, 6, 4, 5, 5, 6, 5, 6, 6, 7, 1, 2,
2, 3, 2, 3, 3, 4, 2, 3, 3, 4, 3, 4, 4, 5, 2, 3, 3, 4, 3, 4, 4, 5, 3, 4, 4, 5,
4, 5, 5, 6, 2, 3, 3, 4, 3, 4, 4, 5, 3, 4, 4, 5, 4, 5, 5, 6, 3, 4, 4, 5, 4, 5,
5, 6, 4, 5, 5, 6, 5, 6, 6, 7, 2, 3, 3, 4, 3, 4, 4, 5, 3, 4, 4, 5, 4, 5, 5, 6,
3, 4, 4, 5, 4, 5, 5, 6, 4, 5, 5, 6, 5, 6, 6, 7, 3, 4, 4, 5, 4, 5, 5, 6, 4, 5,
5, 6, 5, 6, 6, 7, 4, 5, 5, 6, 5, 6, 6, 7, 5, 6, 6, 7, 6, 7, 7, 8,
};
static uint32_t bitmasks[32]
= { 0x1, 0x3, 0x7, 0xf, 0x1f, 0x3f,
0x7f, 0xff, 0x1ff, 0x3ff, 0x7ff, 0xfff,
0x1fff, 0x3fff, 0x7fff, 0xffff, 0x1ffff, 0x3ffff,
0x7ffff, 0xfffff, 0x1fffff, 0x3fffff, 0x7fffff, 0xffffff,
0x1ffffff, 0x3ffffff, 0x7ffffff, 0xfffffff, 0x1fffffff, 0x3fffffff,
0x7fffffff, 0xffffffff };
uint32_t BSR (uint32_t x); uint32_t BSF (uint32_t x);
int32_t CountLeadingZeros (uint32_t bits);
int32_t Log2RoundUp (uint32_t v);
bool Oozle_DecodeBytesCore (HuffReader *hr, HuffRevLut *lut);
bool DecodeGolombRiceLengths (uint8_t *dst, size_t size, BitReader2 *br);
bool DecodeGolombRiceBits (uint8_t *dst, uint32_t size, uint32_t bitcount,
BitReader2 *br);
void FillByteOverflow16 (uint8_t *dst, uint8_t v, size_t n);
int32_t Oozle_DecodeBytes_Type12 (const uint8_t *src, size_t src_size,
uint8_t *output, int32_t output_size,
int32_t type);
int32_t Oozle_DecodeMultiArray (const uint8_t *src, const uint8_t *src_end,
uint8_t *dst, uint8_t *dst_end,
uint8_t **array_data, int32_t *array_lens,
int32_t array_count, int32_t *total_size_out,
bool force_memmove, uint8_t *scratch,
uint8_t *scratch_end);
int32_t Oozle_DecodeRecursive (const uint8_t *src, size_t src_size,
uint8_t *output, int32_t output_size,
uint8_t *scratch, uint8_t *scratch_end);
int32_t Oozle_DecodeRLE (const uint8_t *src, size_t src_size, uint8_t *dst,
int32_t dst_size, uint8_t *scratch,
uint8_t *scratch_end);
int32_t Oozle_DecodeTans (const uint8_t *src, size_t src_size, uint8_t *dst,
int32_t dst_size, uint8_t *scratch,
uint8_t *scratch_end);
int32_t Oozle_GetBlockSize (const uint8_t *src, const uint8_t *src_end,
int32_t *dest_size, int32_t dest_capacity);
int32_t Oozle_DecodeBytes (uint8_t **output, const uint8_t *src,
const uint8_t *src_end, int32_t *decoded_size,
size_t output_size, bool force_memmove,
uint8_t *scratch, uint8_t *scratch_end);
void CombineScaledOffsetArrays (int32_t *offs_stream, size_t offs_stream_size,
int32_t scale, const uint8_t *low_bits);