Files
Aerofoil/unpacktool/StuffItArsenicDecompressor.h
Diomendius 1b18a87495 Normalize line endings
This commit contains only the result of `git add --renormalize .`

`git show --ignore-space-change` can verify that this commit only
changes whitespace.
2024-07-31 20:21:47 +12:00

66 lines
1.6 KiB
C++

#pragma once
#include "IDecompressor.h"
#include "BWT.h"
class StuffItArsenicDecompressor : public IDecompressor
{
public:
StuffItArsenicDecompressor();
~StuffItArsenicDecompressor() override;
bool Reset(CSInputBuffer *reader, size_t compressedSize, size_t decompressedSize) override;
bool ReadBytes(void *dest, size_t numBytes) override;
private:
struct ArithmeticSymbol
{
int symbol;
int frequency;
};
struct ArithmeticModel
{
int totalfrequency;
int increment;
int frequencylimit;
int numsymbols;
ArithmeticSymbol symbols[128];
};
struct ArithmeticDecoder
{
CSInputBuffer *input;
int range, code;
};
ArithmeticModel initialmodel, selectormodel, mtfmodel[7];
ArithmeticDecoder decoder;
MTFState mtf;
int blockbits, blocksize;
uint8_t *block;
bool endofblocks;
int numbytes, bytecount, transformindex;
uint32_t *transform;
int randomized, randcount, randindex;
int repeat, count, last;
uint32_t crc, compcrc;
static void ResetArithmeticModel(ArithmeticModel *model);
static void InitializeArithmeticModel(ArithmeticModel *model, int firstsymbol, int lastsymbol, int increment, int frequencylimit);
static void IncreaseArithmeticModelFrequency(ArithmeticModel *model, int symindex);
static bool InitializeArithmeticDecoder(ArithmeticDecoder *decoder, CSInputBuffer *input);
static bool ReadNextArithmeticCode(ArithmeticDecoder *decoder, int symlow, int symsize, int symtot);
static bool NextArithmeticSymbol(ArithmeticDecoder *decoder, ArithmeticModel *model, int &outSym);
static bool NextArithmeticBitString(ArithmeticDecoder *decoder, ArithmeticModel *model, int bits, int &outBitString);
bool ReadBlock();
};