1231200Smm/* Ppmd.h -- PPMD codec common code 2231200Smm2010-03-12 : Igor Pavlov : Public domain 3231200SmmThis code is based on PPMd var.H (2001): Dmitry Shkarin : Public domain */ 4231200Smm 5358088Smm#ifndef ARCHIVE_PPMD_PRIVATE_H_INCLUDED 6358088Smm#define ARCHIVE_PPMD_PRIVATE_H_INCLUDED 7358088Smm 8231200Smm#ifndef __LIBARCHIVE_BUILD 9231200Smm#error This header is only to be used internally to libarchive. 10231200Smm#endif 11231200Smm 12231200Smm#include <stddef.h> 13231200Smm 14231200Smm#include "archive_read_private.h" 15231200Smm 16231200Smm/*** Begin defined in Types.h ***/ 17231200Smm 18231200Smm#if !defined(ZCONF_H) 19231200Smmtypedef unsigned char Byte; 20231200Smm#endif 21231200Smmtypedef short Int16; 22231200Smmtypedef unsigned short UInt16; 23231200Smm 24231200Smm#ifdef _LZMA_UINT32_IS_ULONG 25231200Smmtypedef long Int32; 26231200Smmtypedef unsigned long UInt32; 27231200Smm#else 28231200Smmtypedef int Int32; 29231200Smmtypedef unsigned int UInt32; 30231200Smm#endif 31231200Smm 32231200Smm#ifdef _SZ_NO_INT_64 33231200Smm 34231200Smm/* define _SZ_NO_INT_64, if your compiler doesn't support 64-bit integers. 35231200Smm NOTES: Some code will work incorrectly in that case! */ 36231200Smm 37231200Smmtypedef long Int64; 38231200Smmtypedef unsigned long UInt64; 39231200Smm 40231200Smm#else 41231200Smm 42231200Smm#if defined(_MSC_VER) || defined(__BORLANDC__) 43231200Smmtypedef __int64 Int64; 44231200Smmtypedef unsigned __int64 UInt64; 45231200Smm#define UINT64_CONST(n) n 46231200Smm#else 47231200Smmtypedef long long int Int64; 48231200Smmtypedef unsigned long long int UInt64; 49231200Smm#define UINT64_CONST(n) n ## ULL 50231200Smm#endif 51231200Smm 52231200Smm#endif 53231200Smm 54231200Smmtypedef int Bool; 55231200Smm#define True 1 56231200Smm#define False 0 57231200Smm 58231200Smm/* The following interfaces use first parameter as pointer to structure */ 59231200Smm 60231200Smmtypedef struct 61231200Smm{ 62231200Smm struct archive_read *a; 63231200Smm Byte (*Read)(void *p); /* reads one byte, returns 0 in case of EOF or error */ 64231200Smm} IByteIn; 65231200Smm 66231200Smmtypedef struct 67231200Smm{ 68231200Smm struct archive_write *a; 69231200Smm void (*Write)(void *p, Byte b); 70231200Smm} IByteOut; 71231200Smm 72231200Smm/*** End defined in Types.h ***/ 73231200Smm/*** Begin defined in CpuArch.h ***/ 74231200Smm 75231200Smm#if defined(_M_IX86) || defined(__i386__) 76231200Smm#define MY_CPU_X86 77231200Smm#endif 78231200Smm 79231200Smm#if defined(MY_CPU_X86) || defined(_M_ARM) 80231200Smm#define MY_CPU_32BIT 81231200Smm#endif 82231200Smm 83231200Smm#ifdef MY_CPU_32BIT 84231200Smm#define PPMD_32BIT 85231200Smm#endif 86231200Smm 87231200Smm/*** End defined in CpuArch.h ***/ 88231200Smm 89231200Smm#define PPMD_INT_BITS 7 90231200Smm#define PPMD_PERIOD_BITS 7 91231200Smm#define PPMD_BIN_SCALE (1 << (PPMD_INT_BITS + PPMD_PERIOD_BITS)) 92231200Smm 93231200Smm#define PPMD_GET_MEAN_SPEC(summ, shift, round) (((summ) + (1 << ((shift) - (round)))) >> (shift)) 94231200Smm#define PPMD_GET_MEAN(summ) PPMD_GET_MEAN_SPEC((summ), PPMD_PERIOD_BITS, 2) 95231200Smm#define PPMD_UPDATE_PROB_0(prob) ((prob) + (1 << PPMD_INT_BITS) - PPMD_GET_MEAN(prob)) 96231200Smm#define PPMD_UPDATE_PROB_1(prob) ((prob) - PPMD_GET_MEAN(prob)) 97231200Smm 98231200Smm#define PPMD_N1 4 99231200Smm#define PPMD_N2 4 100231200Smm#define PPMD_N3 4 101231200Smm#define PPMD_N4 ((128 + 3 - 1 * PPMD_N1 - 2 * PPMD_N2 - 3 * PPMD_N3) / 4) 102231200Smm#define PPMD_NUM_INDEXES (PPMD_N1 + PPMD_N2 + PPMD_N3 + PPMD_N4) 103231200Smm 104231200Smm/* SEE-contexts for PPM-contexts with masked symbols */ 105231200Smmtypedef struct 106231200Smm{ 107231200Smm UInt16 Summ; /* Freq */ 108231200Smm Byte Shift; /* Speed of Freq change; low Shift is for fast change */ 109231200Smm Byte Count; /* Count to next change of Shift */ 110231200Smm} CPpmd_See; 111231200Smm 112231200Smm#define Ppmd_See_Update(p) if ((p)->Shift < PPMD_PERIOD_BITS && --(p)->Count == 0) \ 113231200Smm { (p)->Summ <<= 1; (p)->Count = (Byte)(3 << (p)->Shift++); } 114231200Smm 115231200Smmtypedef struct 116231200Smm{ 117231200Smm Byte Symbol; 118231200Smm Byte Freq; 119231200Smm UInt16 SuccessorLow; 120231200Smm UInt16 SuccessorHigh; 121231200Smm} CPpmd_State; 122231200Smm 123231200Smmtypedef 124231200Smm #ifdef PPMD_32BIT 125231200Smm CPpmd_State * 126231200Smm #else 127231200Smm UInt32 128231200Smm #endif 129231200Smm CPpmd_State_Ref; 130231200Smm 131231200Smmtypedef 132231200Smm #ifdef PPMD_32BIT 133231200Smm void * 134231200Smm #else 135231200Smm UInt32 136231200Smm #endif 137231200Smm CPpmd_Void_Ref; 138231200Smm 139231200Smmtypedef 140231200Smm #ifdef PPMD_32BIT 141231200Smm Byte * 142231200Smm #else 143231200Smm UInt32 144231200Smm #endif 145231200Smm CPpmd_Byte_Ref; 146231200Smm 147231200Smm#define PPMD_SetAllBitsIn256Bytes(p) \ 148232153Smm { unsigned j; for (j = 0; j < 256 / sizeof(p[0]); j += 8) { \ 149232153Smm p[j+7] = p[j+6] = p[j+5] = p[j+4] = p[j+3] = p[j+2] = p[j+1] = p[j+0] = ~(size_t)0; }} 150231200Smm 151231200Smm#endif 152