1/* Ppmd7.h -- PPMdH compression codec 22010-03-12 : Igor Pavlov : Public domain 3This code is based on PPMd var.H (2001): Dmitry Shkarin : Public domain */ 4 5/* This code supports virtual RangeDecoder and includes the implementation 6of RangeCoder from 7z, instead of RangeCoder from original PPMd var.H. 7If you need the compatibility with original PPMd var.H, you can use external RangeDecoder */ 8 9#ifndef ARCHIVE_PPMD7_PRIVATE_H_INCLUDED 10#define ARCHIVE_PPMD7_PRIVATE_H_INCLUDED 11 12#ifndef __LIBARCHIVE_BUILD 13#error This header is only to be used internally to libarchive. 14#endif 15 16#include "archive_ppmd_private.h" 17 18#define PPMD7_MIN_ORDER 2 19#define PPMD7_MAX_ORDER 64 20 21#define PPMD7_MIN_MEM_SIZE (1 << 11) 22#define PPMD7_MAX_MEM_SIZE (0xFFFFFFFFu - 12 * 3) 23 24struct CPpmd7_Context_; 25 26typedef 27 #ifdef PPMD_32BIT 28 struct CPpmd7_Context_ * 29 #else 30 UInt32 31 #endif 32 CPpmd7_Context_Ref; 33 34typedef struct CPpmd7_Context_ 35{ 36 UInt16 NumStats; 37 UInt16 SummFreq; 38 CPpmd_State_Ref Stats; 39 CPpmd7_Context_Ref Suffix; 40} CPpmd7_Context; 41 42#define Ppmd7Context_OneState(p) ((CPpmd_State *)&(p)->SummFreq) 43 44typedef struct 45{ 46 CPpmd7_Context *MinContext, *MaxContext; 47 CPpmd_State *FoundState; 48 unsigned OrderFall, InitEsc, PrevSuccess, MaxOrder, HiBitsFlag; 49 Int32 RunLength, InitRL; /* must be 32-bit at least */ 50 51 UInt32 Size; 52 UInt32 GlueCount; 53 Byte *Base, *LoUnit, *HiUnit, *Text, *UnitsStart; 54 UInt32 AlignOffset; 55 56 Byte Indx2Units[PPMD_NUM_INDEXES]; 57 Byte Units2Indx[128]; 58 CPpmd_Void_Ref FreeList[PPMD_NUM_INDEXES]; 59 Byte NS2Indx[256], NS2BSIndx[256], HB2Flag[256]; 60 CPpmd_See DummySee, See[25][16]; 61 UInt16 BinSumm[128][64]; 62} CPpmd7; 63 64/* ---------- Decode ---------- */ 65 66typedef struct 67{ 68 UInt32 (*GetThreshold)(void *p, UInt32 total); 69 void (*Decode)(void *p, UInt32 start, UInt32 size); 70 UInt32 (*DecodeBit)(void *p, UInt32 size0); 71} IPpmd7_RangeDec; 72 73typedef struct 74{ 75 IPpmd7_RangeDec p; 76 UInt32 Range; 77 UInt32 Code; 78 UInt32 Low; 79 UInt32 Bottom; 80 IByteIn *Stream; 81} CPpmd7z_RangeDec; 82 83/* ---------- Encode ---------- */ 84 85typedef struct 86{ 87 UInt64 Low; 88 UInt32 Range; 89 Byte Cache; 90 UInt64 CacheSize; 91 IByteOut *Stream; 92} CPpmd7z_RangeEnc; 93 94typedef struct 95{ 96 /* Base Functions */ 97 void (*Ppmd7_Construct)(CPpmd7 *p); 98 Bool (*Ppmd7_Alloc)(CPpmd7 *p, UInt32 size); 99 void (*Ppmd7_Free)(CPpmd7 *p); 100 void (*Ppmd7_Init)(CPpmd7 *p, unsigned maxOrder); 101 #define Ppmd7_WasAllocated(p) ((p)->Base != NULL) 102 103 /* Decode Functions */ 104 void (*Ppmd7z_RangeDec_CreateVTable)(CPpmd7z_RangeDec *p); 105 void (*PpmdRAR_RangeDec_CreateVTable)(CPpmd7z_RangeDec *p); 106 Bool (*Ppmd7z_RangeDec_Init)(CPpmd7z_RangeDec *p); 107 Bool (*PpmdRAR_RangeDec_Init)(CPpmd7z_RangeDec *p); 108 #define Ppmd7z_RangeDec_IsFinishedOK(p) ((p)->Code == 0) 109 int (*Ppmd7_DecodeSymbol)(CPpmd7 *p, IPpmd7_RangeDec *rc); 110 111 /* Encode Functions */ 112 void (*Ppmd7z_RangeEnc_Init)(CPpmd7z_RangeEnc *p); 113 void (*Ppmd7z_RangeEnc_FlushData)(CPpmd7z_RangeEnc *p); 114 115 void (*Ppmd7_EncodeSymbol)(CPpmd7 *p, CPpmd7z_RangeEnc *rc, int symbol); 116} IPpmd7; 117 118extern const IPpmd7 __archive_ppmd7_functions; 119#endif 120