]> git.ipfire.org Git - thirdparty/libarchive.git/commitdiff
Modify ppmd7 code to minimize symbols leaked into the global name space.
authorAndres Mejia <amejia004@gmail.com>
Tue, 9 Aug 2011 03:27:24 +0000 (23:27 -0400)
committerAndres Mejia <amejia004@gmail.com>
Tue, 9 Aug 2011 03:27:24 +0000 (23:27 -0400)
Only one extra symbol is add, __archive_ppmd7_functions, which is a global
struct carrying function pointers to ppmd7 functions.

SVN-Revision: 3573

Makefile.am
libarchive/CMakeLists.txt
libarchive/archive_ppmd7.c
libarchive/archive_ppmd7_private.h
libarchive/archive_ppmd7dec.c [deleted file]
libarchive/archive_read_support_format_rar.c

index 92d7211b3f93dcdf6d3f1b81e8e4ee17db54a494..a322cdae3e1e5cb0e671047047811c57bf2334c7 100644 (file)
@@ -107,7 +107,6 @@ libarchive_la_SOURCES=                                              \
        libarchive/archive_ppmd_private.h                       \
        libarchive/archive_ppmd7.c                              \
        libarchive/archive_ppmd7_private.h                      \
-       libarchive/archive_ppmd7dec.c                           \
        libarchive/archive_private.h                            \
        libarchive/archive_rb.c                                 \
        libarchive/archive_rb.h                                 \
index 1b87f2132812606ac8370d8da8f1775d9eeab715..7701547a83e635d20cf91f733d727cd0bde51d98 100644 (file)
@@ -33,7 +33,6 @@ SET(libarchive_SOURCES
   archive_ppmd_private.h
   archive_ppmd7.c
   archive_ppmd7_private.h
-  archive_ppmd7dec.c
   archive_private.h
   archive_rb.c
   archive_rb.h
index 6d878c4345556393215badcc385f02840cf578d7..8aa492e3e995fca20b8c389eb36c826fc109d746 100644 (file)
@@ -8,8 +8,24 @@ This code is based on PPMd var.H (2001): Dmitry Shkarin : Public domain */
 
 #include "archive_ppmd7_private.h"
 
-static const UInt16 kInitBinEsc[] = { 0x3CDD, 0x1F3F, 0x59BF, 0x48F3, 0x64A1, 0x5ABC, 0x6632, 0x6051};
+#ifdef PPMD_32BIT
+  #define Ppmd7_GetPtr(p, ptr) (ptr)
+  #define Ppmd7_GetContext(p, ptr) (ptr)
+  #define Ppmd7_GetStats(p, ctx) ((ctx)->Stats)
+#else
+  #define Ppmd7_GetPtr(p, offs) ((void *)((p)->Base + (offs)))
+  #define Ppmd7_GetContext(p, offs) ((CPpmd7_Context *)Ppmd7_GetPtr((p), (offs)))
+  #define Ppmd7_GetStats(p, ctx) ((CPpmd_State *)Ppmd7_GetPtr((p), ((ctx)->Stats)))
+#endif
+
+#define Ppmd7_GetBinSumm(p) \
+    &p->BinSumm[Ppmd7Context_OneState(p->MinContext)->Freq - 1][p->PrevSuccess + \
+    p->NS2BSIndx[Ppmd7_GetContext(p, p->MinContext->Suffix)->NumStats - 1] + \
+    (p->HiBitsFlag = p->HB2Flag[p->FoundState->Symbol]) + \
+    2 * p->HB2Flag[Ppmd7Context_OneState(p->MinContext)->Symbol] + \
+    ((p->RunLength >> 26) & 0x20)]
 
+#define kTopValue (1 << 24)
 #define MAX_FREQ 124
 #define UNIT_SIZE 12
 
@@ -30,6 +46,9 @@ static const UInt16 kInitBinEsc[] = { 0x3CDD, 0x1F3F, 0x59BF, 0x48F3, 0x64A1, 0x
 #define ONE_STATE(ctx) Ppmd7Context_OneState(ctx)
 #define SUFFIX(ctx) CTX((ctx)->Suffix)
 
+static const UInt16 kInitBinEsc[] = { 0x3CDD, 0x1F3F, 0x59BF, 0x48F3, 0x64A1, 0x5ABC, 0x6632, 0x6051};
+static const Byte PPMD7_kExpEscape[16] = { 25, 14, 9, 7, 5, 5, 4, 4, 4, 3, 3, 3, 2, 2, 2, 2 };
+
 typedef CPpmd7_Context * CTX_PTR;
 
 struct CPpmd7_Node_;
@@ -56,7 +75,16 @@ typedef struct CPpmd7_Node_
   #define NODE(offs) ((CPpmd7_Node *)(p->Base + (offs)))
 #endif
 
-void Ppmd7_Construct(CPpmd7 *p)
+static void Ppmd7_Update1(CPpmd7 *p);
+static void Ppmd7_Update1_0(CPpmd7 *p);
+static void Ppmd7_Update2(CPpmd7 *p);
+static void Ppmd7_UpdateBin(CPpmd7 *p);
+static CPpmd_See *Ppmd7_MakeEscFreq(CPpmd7 *p, unsigned numMasked,
+                                    UInt32 *scale);
+
+/* ----------- Base ----------- */
+
+static void Ppmd7_Construct(CPpmd7 *p)
 {
   unsigned i, k, m;
 
@@ -87,14 +115,14 @@ void Ppmd7_Construct(CPpmd7 *p)
   memset(p->HB2Flag + 0x40, 8, 0x100 - 0x40);
 }
 
-void Ppmd7_Free(CPpmd7 *p, ISzAlloc *alloc)
+static void Ppmd7_Free(CPpmd7 *p, ISzAlloc *alloc)
 {
   alloc->Free(alloc, p->Base);
   p->Size = 0;
   p->Base = 0;
 }
 
-Bool Ppmd7_Alloc(CPpmd7 *p, UInt32 size, ISzAlloc *alloc)
+static Bool Ppmd7_Alloc(CPpmd7 *p, UInt32 size, ISzAlloc *alloc)
 {
   if (p->Base == 0 || p->Size != size)
   {
@@ -330,7 +358,7 @@ static void RestartModel(CPpmd7 *p)
     }
 }
 
-void Ppmd7_Init(CPpmd7 *p, unsigned maxOrder)
+static void Ppmd7_Init(CPpmd7 *p, unsigned maxOrder)
 {
   p->MaxOrder = maxOrder;
   RestartModel(p);
@@ -632,7 +660,7 @@ static void Rescale(CPpmd7 *p)
   p->FoundState = STATS(p->MinContext);
 }
 
-CPpmd_See *Ppmd7_MakeEscFreq(CPpmd7 *p, unsigned numMasked, UInt32 *escFreq)
+static CPpmd_See *Ppmd7_MakeEscFreq(CPpmd7 *p, unsigned numMasked, UInt32 *escFreq)
 {
   CPpmd_See *see;
   unsigned nonMasked = p->MinContext->NumStats - numMasked;
@@ -666,7 +694,7 @@ static void NextContext(CPpmd7 *p)
     UpdateModel(p);
 }
 
-void Ppmd7_Update1(CPpmd7 *p)
+static void Ppmd7_Update1(CPpmd7 *p)
 {
   CPpmd_State *s = p->FoundState;
   s->Freq += 4;
@@ -681,7 +709,7 @@ void Ppmd7_Update1(CPpmd7 *p)
   NextContext(p);
 }
 
-void Ppmd7_Update1_0(CPpmd7 *p)
+static void Ppmd7_Update1_0(CPpmd7 *p)
 {
   p->PrevSuccess = (2 * p->FoundState->Freq > p->MinContext->SummFreq);
   p->RunLength += p->PrevSuccess;
@@ -691,7 +719,7 @@ void Ppmd7_Update1_0(CPpmd7 *p)
   NextContext(p);
 }
 
-void Ppmd7_UpdateBin(CPpmd7 *p)
+static void Ppmd7_UpdateBin(CPpmd7 *p)
 {
   p->FoundState->Freq = (Byte)(p->FoundState->Freq + (p->FoundState->Freq < 128 ? 1: 0));
   p->PrevSuccess = 1;
@@ -699,7 +727,7 @@ void Ppmd7_UpdateBin(CPpmd7 *p)
   NextContext(p);
 }
 
-void Ppmd7_Update2(CPpmd7 *p)
+static void Ppmd7_Update2(CPpmd7 *p)
 {
   p->MinContext->SummFreq += 4;
   if ((p->FoundState->Freq += 4) > MAX_FREQ)
@@ -707,3 +735,245 @@ void Ppmd7_Update2(CPpmd7 *p)
   p->RunLength = p->InitRL;
   UpdateModel(p);
 }
+
+/* ---------- Decode ---------- */
+
+static Bool Ppmd_RangeDec_Init(CPpmd7z_RangeDec *p)
+{
+  unsigned i;
+  p->Low = p->Bottom = 0;
+  p->Range = 0xFFFFFFFF;
+  for (i = 0; i < 4; i++)
+    p->Code = (p->Code << 8) | p->Stream->Read((void *)p->Stream);
+  return (p->Code < 0xFFFFFFFF);
+}
+
+static Bool Ppmd7z_RangeDec_Init(CPpmd7z_RangeDec *p)
+{
+  if (p->Stream->Read((void *)p->Stream) != 0)
+    return False;
+  return Ppmd_RangeDec_Init(p);
+}
+
+static Bool PpmdRAR_RangeDec_Init(CPpmd7z_RangeDec *p)
+{
+  if (!Ppmd_RangeDec_Init(p))
+    return False;
+  p->Bottom = 0x8000;
+  return True;
+}
+
+static UInt32 Range_GetThreshold(void *pp, UInt32 total)
+{
+  CPpmd7z_RangeDec *p = (CPpmd7z_RangeDec *)pp;
+  return (p->Code - p->Low) / (p->Range /= total);
+}
+
+static void Range_Normalize(CPpmd7z_RangeDec *p)
+{
+  while (1)
+  {
+    if((p->Low ^ (p->Low + p->Range)) >= kTopValue)
+    {
+      if(p->Range >= p->Bottom)
+        break;
+      else
+        p->Range = -p->Low & (p->Bottom - 1);
+    }
+    p->Code = (p->Code << 8) | p->Stream->Read((void *)p->Stream);
+    p->Range <<= 8;
+    p->Low <<= 8;
+  }
+}
+
+static void Range_Decode_7z(void *pp, UInt32 start, UInt32 size)
+{
+  CPpmd7z_RangeDec *p = (CPpmd7z_RangeDec *)pp;
+  p->Code -= start * p->Range;
+  p->Range *= size;
+  Range_Normalize(p);
+}
+
+static void Range_Decode_RAR(void *pp, UInt32 start, UInt32 size)
+{
+  CPpmd7z_RangeDec *p = (CPpmd7z_RangeDec *)pp;
+  p->Low += start * p->Range;
+  p->Range *= size;
+  Range_Normalize(p);
+}
+
+static UInt32 Range_DecodeBit_7z(void *pp, UInt32 size0)
+{
+  CPpmd7z_RangeDec *p = (CPpmd7z_RangeDec *)pp;
+  UInt32 newBound = (p->Range >> 14) * size0;
+  UInt32 symbol;
+  if (p->Code < newBound)
+  {
+    symbol = 0;
+    p->Range = newBound;
+  }
+  else
+  {
+    symbol = 1;
+    p->Code -= newBound;
+    p->Range -= newBound;
+  }
+  Range_Normalize(p);
+  return symbol;
+}
+
+static UInt32 Range_DecodeBit_RAR(void *pp, UInt32 size0)
+{
+  CPpmd7z_RangeDec *p = (CPpmd7z_RangeDec *)pp;
+  UInt32 bit, value = p->p.GetThreshold(p, PPMD_BIN_SCALE);
+  if(value < size0)
+  {
+    bit = 0;
+    p->p.Decode(p, 0, size0);
+  }
+  else
+  {
+    bit = 1;
+    p->p.Decode(p, size0, PPMD_BIN_SCALE - size0);
+  }
+  return bit;
+}
+
+static void Ppmd7z_RangeDec_CreateVTable(CPpmd7z_RangeDec *p)
+{
+  p->p.GetThreshold = Range_GetThreshold;
+  p->p.Decode = Range_Decode_7z;
+  p->p.DecodeBit = Range_DecodeBit_7z;
+}
+
+static void PpmdRAR_RangeDec_CreateVTable(CPpmd7z_RangeDec *p)
+{
+  p->p.GetThreshold = Range_GetThreshold;
+  p->p.Decode = Range_Decode_RAR;
+  p->p.DecodeBit = Range_DecodeBit_RAR;
+}
+
+#define MASK(sym) ((signed char *)charMask)[sym]
+
+static int Ppmd7_DecodeSymbol(CPpmd7 *p, IPpmd7_RangeDec *rc)
+{
+  size_t charMask[256 / sizeof(size_t)];
+  if (p->MinContext->NumStats != 1)
+  {
+    CPpmd_State *s = Ppmd7_GetStats(p, p->MinContext);
+    unsigned i;
+    UInt32 count, hiCnt;
+    if ((count = rc->GetThreshold(rc, p->MinContext->SummFreq)) < (hiCnt = s->Freq))
+    {
+      Byte symbol;
+      rc->Decode(rc, 0, s->Freq);
+      p->FoundState = s;
+      symbol = s->Symbol;
+      Ppmd7_Update1_0(p);
+      return symbol;
+    }
+    p->PrevSuccess = 0;
+    i = p->MinContext->NumStats - 1;
+    do
+    {
+      if ((hiCnt += (++s)->Freq) > count)
+      {
+        Byte symbol;
+        rc->Decode(rc, hiCnt - s->Freq, s->Freq);
+        p->FoundState = s;
+        symbol = s->Symbol;
+        Ppmd7_Update1(p);
+        return symbol;
+      }
+    }
+    while (--i);
+    if (count >= p->MinContext->SummFreq)
+      return -2;
+    p->HiBitsFlag = p->HB2Flag[p->FoundState->Symbol];
+    rc->Decode(rc, hiCnt, p->MinContext->SummFreq - hiCnt);
+    PPMD_SetAllBitsIn256Bytes(charMask);
+    MASK(s->Symbol) = 0;
+    i = p->MinContext->NumStats - 1;
+    do { MASK((--s)->Symbol) = 0; } while (--i);
+  }
+  else
+  {
+    UInt16 *prob = Ppmd7_GetBinSumm(p);
+    if (rc->DecodeBit(rc, *prob) == 0)
+    {
+      Byte symbol;
+      *prob = (UInt16)PPMD_UPDATE_PROB_0(*prob);
+      symbol = (p->FoundState = Ppmd7Context_OneState(p->MinContext))->Symbol;
+      Ppmd7_UpdateBin(p);
+      return symbol;
+    }
+    *prob = (UInt16)PPMD_UPDATE_PROB_1(*prob);
+    p->InitEsc = PPMD7_kExpEscape[*prob >> 10];
+    PPMD_SetAllBitsIn256Bytes(charMask);
+    MASK(Ppmd7Context_OneState(p->MinContext)->Symbol) = 0;
+    p->PrevSuccess = 0;
+  }
+  for (;;)
+  {
+    CPpmd_State *ps[256], *s;
+    UInt32 freqSum, count, hiCnt;
+    CPpmd_See *see;
+    unsigned i, num, numMasked = p->MinContext->NumStats;
+    do
+    {
+      p->OrderFall++;
+      if (!p->MinContext->Suffix)
+        return -1;
+      p->MinContext = Ppmd7_GetContext(p, p->MinContext->Suffix);
+    }
+    while (p->MinContext->NumStats == numMasked);
+    hiCnt = 0;
+    s = Ppmd7_GetStats(p, p->MinContext);
+    i = 0;
+    num = p->MinContext->NumStats - numMasked;
+    do
+    {
+      int k = (int)(MASK(s->Symbol));
+      hiCnt += (s->Freq & k);
+      ps[i] = s++;
+      i -= k;
+    }
+    while (i != num);
+
+    see = Ppmd7_MakeEscFreq(p, numMasked, &freqSum);
+    freqSum += hiCnt;
+    count = rc->GetThreshold(rc, freqSum);
+
+    if (count < hiCnt)
+    {
+      Byte symbol;
+      CPpmd_State **pps = ps;
+      for (hiCnt = 0; (hiCnt += (*pps)->Freq) <= count; pps++);
+      s = *pps;
+      rc->Decode(rc, hiCnt - s->Freq, s->Freq);
+      Ppmd_See_Update(see);
+      p->FoundState = s;
+      symbol = s->Symbol;
+      Ppmd7_Update2(p);
+      return symbol;
+    }
+    if (count >= freqSum)
+      return -2;
+    rc->Decode(rc, hiCnt, freqSum - hiCnt);
+    see->Summ = (UInt16)(see->Summ + freqSum);
+    do { MASK(ps[--i]->Symbol) = 0; } while (i != 0);
+  }
+}
+
+const IPpmd7 __archive_ppmd7_functions =
+{
+  &Ppmd7_Construct,
+  &Ppmd7_Alloc,
+  &Ppmd7_Free,
+  &Ppmd7_Init,
+  &Ppmd7z_RangeDec_CreateVTable,
+  &PpmdRAR_RangeDec_CreateVTable,
+  &Ppmd7z_RangeDec_Init,
+  &PpmdRAR_RangeDec_Init,
+  &Ppmd7_DecodeSymbol
+};
index 19583f67644860fb0b28d3ffcc9c14fb28b3c386..e9915f34aba66693a74a2e6415fc5dee7be35d90 100644 (file)
@@ -61,40 +61,6 @@ typedef struct
   UInt16 BinSumm[128][64];
 } CPpmd7;
 
-void Ppmd7_Construct(CPpmd7 *p);
-Bool Ppmd7_Alloc(CPpmd7 *p, UInt32 size, ISzAlloc *alloc);
-void Ppmd7_Free(CPpmd7 *p, ISzAlloc *alloc);
-void Ppmd7_Init(CPpmd7 *p, unsigned maxOrder);
-#define Ppmd7_WasAllocated(p) ((p)->Base != NULL)
-
-
-/* ---------- Internal Functions ---------- */
-
-#ifdef PPMD_32BIT
-  #define Ppmd7_GetPtr(p, ptr) (ptr)
-  #define Ppmd7_GetContext(p, ptr) (ptr)
-  #define Ppmd7_GetStats(p, ctx) ((ctx)->Stats)
-#else
-  #define Ppmd7_GetPtr(p, offs) ((void *)((p)->Base + (offs)))
-  #define Ppmd7_GetContext(p, offs) ((CPpmd7_Context *)Ppmd7_GetPtr((p), (offs)))
-  #define Ppmd7_GetStats(p, ctx) ((CPpmd_State *)Ppmd7_GetPtr((p), ((ctx)->Stats)))
-#endif
-
-void Ppmd7_Update1(CPpmd7 *p);
-void Ppmd7_Update1_0(CPpmd7 *p);
-void Ppmd7_Update2(CPpmd7 *p);
-void Ppmd7_UpdateBin(CPpmd7 *p);
-
-#define Ppmd7_GetBinSumm(p) \
-    &p->BinSumm[Ppmd7Context_OneState(p->MinContext)->Freq - 1][p->PrevSuccess + \
-    p->NS2BSIndx[Ppmd7_GetContext(p, p->MinContext->Suffix)->NumStats - 1] + \
-    (p->HiBitsFlag = p->HB2Flag[p->FoundState->Symbol]) + \
-    2 * p->HB2Flag[Ppmd7Context_OneState(p->MinContext)->Symbol] + \
-    ((p->RunLength >> 26) & 0x20)]
-
-CPpmd_See *Ppmd7_MakeEscFreq(CPpmd7 *p, unsigned numMasked, UInt32 *scale);
-
-
 /* ---------- Decode ---------- */
 
 typedef struct
@@ -114,15 +80,6 @@ typedef struct
   IByteIn *Stream;
 } CPpmd7z_RangeDec;
 
-void Ppmd7z_RangeDec_CreateVTable(CPpmd7z_RangeDec *p);
-void PpmdRAR_RangeDec_CreateVTable(CPpmd7z_RangeDec *p);
-Bool Ppmd7z_RangeDec_Init(CPpmd7z_RangeDec *p);
-Bool PpmdRAR_RangeDec_Init(CPpmd7z_RangeDec *p);
-#define Ppmd7z_RangeDec_IsFinishedOK(p) ((p)->Code == 0)
-
-int Ppmd7_DecodeSymbol(CPpmd7 *p, IPpmd7_RangeDec *rc);
-
-
 /* ---------- Encode ---------- */
 
 /*typedef struct
@@ -132,11 +89,31 @@ int Ppmd7_DecodeSymbol(CPpmd7 *p, IPpmd7_RangeDec *rc);
   Byte Cache;
   UInt64 CacheSize;
   IByteOut *Stream;
-} CPpmd7z_RangeEnc;
+} CPpmd7z_RangeEnc;*/
 
-void Ppmd7z_RangeEnc_Init(CPpmd7z_RangeEnc *p);
-void Ppmd7z_RangeEnc_FlushData(CPpmd7z_RangeEnc *p);
-
-void Ppmd7_EncodeSymbol(CPpmd7 *p, CPpmd7z_RangeEnc *rc, int symbol);
-*/
+typedef struct
+{
+  /* Base Functions */
+  void (*Ppmd7_Construct)(CPpmd7 *p);
+  Bool (*Ppmd7_Alloc)(CPpmd7 *p, UInt32 size, ISzAlloc *alloc);
+  void (*Ppmd7_Free)(CPpmd7 *p, ISzAlloc *alloc);
+  void (*Ppmd7_Init)(CPpmd7 *p, unsigned maxOrder);
+  #define Ppmd7_WasAllocated(p) ((p)->Base != NULL)
+
+  /* Decode Functions */
+  void (*Ppmd7z_RangeDec_CreateVTable)(CPpmd7z_RangeDec *p);
+  void (*PpmdRAR_RangeDec_CreateVTable)(CPpmd7z_RangeDec *p);
+  Bool (*Ppmd7z_RangeDec_Init)(CPpmd7z_RangeDec *p);
+  Bool (*PpmdRAR_RangeDec_Init)(CPpmd7z_RangeDec *p);
+  #define Ppmd7z_RangeDec_IsFinishedOK(p) ((p)->Code == 0)
+  int (*Ppmd7_DecodeSymbol)(CPpmd7 *p, IPpmd7_RangeDec *rc);
+
+  /* Encode Functions */
+  /*void (*Ppmd7z_RangeEnc_Init)(CPpmd7z_RangeEnc *p);
+  void (*Ppmd7z_RangeEnc_FlushData)(CPpmd7z_RangeEnc *p);
+
+  void (*Ppmd7_EncodeSymbol)(CPpmd7 *p, CPpmd7z_RangeEnc *rc, int symbol);*/
+} IPpmd7;
+
+extern const IPpmd7 __archive_ppmd7_functions;
 #endif
diff --git a/libarchive/archive_ppmd7dec.c b/libarchive/archive_ppmd7dec.c
deleted file mode 100644 (file)
index 48ba165..0000000
+++ /dev/null
@@ -1,238 +0,0 @@
-/* Ppmd7Dec.c -- PPMdH Decoder
-2010-03-12 : Igor Pavlov : Public domain
-This code is based on PPMd var.H (2001): Dmitry Shkarin : Public domain */
-
-#include "archive_platform.h"
-
-#include "archive_ppmd7_private.h"
-
-#define kTopValue (1 << 24)
-
-static const Byte PPMD7_kExpEscape[16] = { 25, 14, 9, 7, 5, 5, 4, 4, 4, 3, 3, 3, 2, 2, 2, 2 };
-
-static Bool Ppmd_RangeDec_Init(CPpmd7z_RangeDec *p)
-{
-  unsigned i;
-  p->Low = p->Bottom = 0;
-  p->Range = 0xFFFFFFFF;
-  for (i = 0; i < 4; i++)
-    p->Code = (p->Code << 8) | p->Stream->Read((void *)p->Stream);
-  return (p->Code < 0xFFFFFFFF);
-}
-
-Bool Ppmd7z_RangeDec_Init(CPpmd7z_RangeDec *p)
-{
-  if (p->Stream->Read((void *)p->Stream) != 0)
-    return False;
-  return Ppmd_RangeDec_Init(p);
-}
-
-Bool PpmdRAR_RangeDec_Init(CPpmd7z_RangeDec *p)
-{
-  if (!Ppmd_RangeDec_Init(p))
-    return False;
-  p->Bottom = 0x8000;
-  return True;
-}
-
-static UInt32 Range_GetThreshold(void *pp, UInt32 total)
-{
-  CPpmd7z_RangeDec *p = (CPpmd7z_RangeDec *)pp;
-  return (p->Code - p->Low) / (p->Range /= total);
-}
-
-static void Range_Normalize(CPpmd7z_RangeDec *p)
-{
-  while (1)
-  {
-    if((p->Low ^ (p->Low + p->Range)) >= kTopValue)
-    {
-      if(p->Range >= p->Bottom)
-        break;
-      else
-        p->Range = -p->Low & (p->Bottom - 1);
-    }
-    p->Code = (p->Code << 8) | p->Stream->Read((void *)p->Stream);
-    p->Range <<= 8;
-    p->Low <<= 8;
-  }
-}
-
-static void Range_Decode_7z(void *pp, UInt32 start, UInt32 size)
-{
-  CPpmd7z_RangeDec *p = (CPpmd7z_RangeDec *)pp;
-  p->Code -= start * p->Range;
-  p->Range *= size;
-  Range_Normalize(p);
-}
-
-static void Range_Decode_RAR(void *pp, UInt32 start, UInt32 size)
-{
-  CPpmd7z_RangeDec *p = (CPpmd7z_RangeDec *)pp;
-  p->Low += start * p->Range;
-  p->Range *= size;
-  Range_Normalize(p);
-}
-
-static UInt32 Range_DecodeBit_7z(void *pp, UInt32 size0)
-{
-  CPpmd7z_RangeDec *p = (CPpmd7z_RangeDec *)pp;
-  UInt32 newBound = (p->Range >> 14) * size0;
-  UInt32 symbol;
-  if (p->Code < newBound)
-  {
-    symbol = 0;
-    p->Range = newBound;
-  }
-  else
-  {
-    symbol = 1;
-    p->Code -= newBound;
-    p->Range -= newBound;
-  }
-  Range_Normalize(p);
-  return symbol;
-}
-
-static UInt32 Range_DecodeBit_RAR(void *pp, UInt32 size0)
-{
-  CPpmd7z_RangeDec *p = (CPpmd7z_RangeDec *)pp;
-  UInt32 bit, value = p->p.GetThreshold(p, PPMD_BIN_SCALE);
-  if(value < size0)
-  {
-    bit = 0;
-    p->p.Decode(p, 0, size0);
-  }
-  else
-  {
-    bit = 1;
-    p->p.Decode(p, size0, PPMD_BIN_SCALE - size0);
-  }
-  return bit;
-}
-
-void Ppmd7z_RangeDec_CreateVTable(CPpmd7z_RangeDec *p)
-{
-  p->p.GetThreshold = Range_GetThreshold;
-  p->p.Decode = Range_Decode_7z;
-  p->p.DecodeBit = Range_DecodeBit_7z;
-}
-
-void PpmdRAR_RangeDec_CreateVTable(CPpmd7z_RangeDec *p)
-{
-  p->p.GetThreshold = Range_GetThreshold;
-  p->p.Decode = Range_Decode_RAR;
-  p->p.DecodeBit = Range_DecodeBit_RAR;
-}
-
-#define MASK(sym) ((signed char *)charMask)[sym]
-
-int Ppmd7_DecodeSymbol(CPpmd7 *p, IPpmd7_RangeDec *rc)
-{
-  size_t charMask[256 / sizeof(size_t)];
-  if (p->MinContext->NumStats != 1)
-  {
-    CPpmd_State *s = Ppmd7_GetStats(p, p->MinContext);
-    unsigned i;
-    UInt32 count, hiCnt;
-    if ((count = rc->GetThreshold(rc, p->MinContext->SummFreq)) < (hiCnt = s->Freq))
-    {
-      Byte symbol;
-      rc->Decode(rc, 0, s->Freq);
-      p->FoundState = s;
-      symbol = s->Symbol;
-      Ppmd7_Update1_0(p);
-      return symbol;
-    }
-    p->PrevSuccess = 0;
-    i = p->MinContext->NumStats - 1;
-    do
-    {
-      if ((hiCnt += (++s)->Freq) > count)
-      {
-        Byte symbol;
-        rc->Decode(rc, hiCnt - s->Freq, s->Freq);
-        p->FoundState = s;
-        symbol = s->Symbol;
-        Ppmd7_Update1(p);
-        return symbol;
-      }
-    }
-    while (--i);
-    if (count >= p->MinContext->SummFreq)
-      return -2;
-    p->HiBitsFlag = p->HB2Flag[p->FoundState->Symbol];
-    rc->Decode(rc, hiCnt, p->MinContext->SummFreq - hiCnt);
-    PPMD_SetAllBitsIn256Bytes(charMask);
-    MASK(s->Symbol) = 0;
-    i = p->MinContext->NumStats - 1;
-    do { MASK((--s)->Symbol) = 0; } while (--i);
-  }
-  else
-  {
-    UInt16 *prob = Ppmd7_GetBinSumm(p);
-    if (rc->DecodeBit(rc, *prob) == 0)
-    {
-      Byte symbol;
-      *prob = (UInt16)PPMD_UPDATE_PROB_0(*prob);
-      symbol = (p->FoundState = Ppmd7Context_OneState(p->MinContext))->Symbol;
-      Ppmd7_UpdateBin(p);
-      return symbol;
-    }
-    *prob = (UInt16)PPMD_UPDATE_PROB_1(*prob);
-    p->InitEsc = PPMD7_kExpEscape[*prob >> 10];
-    PPMD_SetAllBitsIn256Bytes(charMask);
-    MASK(Ppmd7Context_OneState(p->MinContext)->Symbol) = 0;
-    p->PrevSuccess = 0;
-  }
-  for (;;)
-  {
-    CPpmd_State *ps[256], *s;
-    UInt32 freqSum, count, hiCnt;
-    CPpmd_See *see;
-    unsigned i, num, numMasked = p->MinContext->NumStats;
-    do
-    {
-      p->OrderFall++;
-      if (!p->MinContext->Suffix)
-        return -1;
-      p->MinContext = Ppmd7_GetContext(p, p->MinContext->Suffix);
-    }
-    while (p->MinContext->NumStats == numMasked);
-    hiCnt = 0;
-    s = Ppmd7_GetStats(p, p->MinContext);
-    i = 0;
-    num = p->MinContext->NumStats - numMasked;
-    do
-    {
-      int k = (int)(MASK(s->Symbol));
-      hiCnt += (s->Freq & k);
-      ps[i] = s++;
-      i -= k;
-    }
-    while (i != num);
-    
-    see = Ppmd7_MakeEscFreq(p, numMasked, &freqSum);
-    freqSum += hiCnt;
-    count = rc->GetThreshold(rc, freqSum);
-    
-    if (count < hiCnt)
-    {
-      Byte symbol;
-      CPpmd_State **pps = ps;
-      for (hiCnt = 0; (hiCnt += (*pps)->Freq) <= count; pps++);
-      s = *pps;
-      rc->Decode(rc, hiCnt - s->Freq, s->Freq);
-      Ppmd_See_Update(see);
-      p->FoundState = s;
-      symbol = s->Symbol;
-      Ppmd7_Update2(p);
-      return symbol;
-    }
-    if (count >= freqSum)
-      return -2;
-    rc->Decode(rc, hiCnt, freqSum - hiCnt);
-    see->Summ = (UInt16)(see->Summ + freqSum);
-    do { MASK(ps[--i]->Symbol) = 0; } while (i != 0);
-  }
-}
index 58487052d406ae7246870b7dbcd188b2a2e1e3a4..6d1296780b5d8ca6e6da579bd8ce360d91ca089d 100644 (file)
@@ -818,7 +818,7 @@ archive_read_format_rar_cleanup(struct archive_read *a)
   free_codes(a);
   free(rar->unp_buffer);
   free(rar->lzss.window);
-  Ppmd7_Free(&rar->ppmd7_context, &g_szalloc);
+  __archive_ppmd7_functions.Ppmd7_Free(&rar->ppmd7_context, &g_szalloc);
   free(rar);
   (a->format->data) = NULL;
   return (ARCHIVE_OK);
@@ -1113,7 +1113,7 @@ read_header(struct archive_read *a, struct archive_entry *entry,
   free(rar->unp_buffer);
   rar->unp_buffer = NULL;
   memset(rar->lengthtable, 0, sizeof(rar->lengthtable));
-  Ppmd7_Free(&rar->ppmd7_context, &g_szalloc);
+  __archive_ppmd7_functions.Ppmd7_Free(&rar->ppmd7_context, &g_szalloc);
   rar->ppmd_valid = 0;
 
   /* Don't set any archive entries for non-file header types */
@@ -1324,7 +1324,7 @@ read_data_compressed(struct archive_read *a, const void **buff, size_t *size,
     *buff = NULL;
     *size = 0;
     *offset = rar->offset;
-    Ppmd7_Free(&rar->ppmd7_context, &g_szalloc);
+    __archive_ppmd7_functions.Ppmd7_Free(&rar->ppmd7_context, &g_szalloc);
     return (ARCHIVE_EOF);
   }
 
@@ -1349,7 +1349,8 @@ read_data_compressed(struct archive_read *a, const void **buff, size_t *size,
 
   if (rar->is_ppmd_block)
   {
-    if ((sym = Ppmd7_DecodeSymbol(&rar->ppmd7_context, &rar->range_dec.p)) < 0)
+    if ((sym = __archive_ppmd7_functions.Ppmd7_DecodeSymbol(&rar->ppmd7_context,
+      &rar->range_dec.p)) < 0)
     {
       archive_set_error(&a->archive, ARCHIVE_ERRNO_FILE_FORMAT,
                         "Invalid symbol");
@@ -1362,7 +1363,8 @@ read_data_compressed(struct archive_read *a, const void **buff, size_t *size,
     }
     else
     {
-      if ((code = Ppmd7_DecodeSymbol(&rar->ppmd7_context, &rar->range_dec.p)) < 0)
+      if ((code = __archive_ppmd7_functions.Ppmd7_DecodeSymbol(
+        &rar->ppmd7_context, &rar->range_dec.p)) < 0)
       {
         archive_set_error(&a->archive, ARCHIVE_ERRNO_FILE_FORMAT,
                           "Invalid symbol");
@@ -1379,7 +1381,7 @@ read_data_compressed(struct archive_read *a, const void **buff, size_t *size,
           *buff = NULL;
           *size = 0;
           *offset = rar->offset;
-          Ppmd7_Free(&rar->ppmd7_context, &g_szalloc);
+          __archive_ppmd7_functions.Ppmd7_Free(&rar->ppmd7_context, &g_szalloc);
           return (ARCHIVE_EOF);
 
         case 3:
@@ -1391,8 +1393,8 @@ read_data_compressed(struct archive_read *a, const void **buff, size_t *size,
           lzss_offset = 0;
           for (i = 2; i >= 0; i--)
           {
-            if ((code = Ppmd7_DecodeSymbol(&rar->ppmd7_context,
-              &rar->range_dec.p)) < 0)
+            if ((code = __archive_ppmd7_functions.Ppmd7_DecodeSymbol(
+              &rar->ppmd7_context, &rar->range_dec.p)) < 0)
             {
               archive_set_error(&a->archive, ARCHIVE_ERRNO_FILE_FORMAT,
                                 "Invalid symbol");
@@ -1400,8 +1402,8 @@ read_data_compressed(struct archive_read *a, const void **buff, size_t *size,
             }
             lzss_offset |= code << (i * 8);
           }
-          if ((length = Ppmd7_DecodeSymbol(&rar->ppmd7_context,
-            &rar->range_dec.p)) < 0)
+          if ((length = __archive_ppmd7_functions.Ppmd7_DecodeSymbol(
+            &rar->ppmd7_context, &rar->range_dec.p)) < 0)
           {
             archive_set_error(&a->archive, ARCHIVE_ERRNO_FILE_FORMAT,
                               "Invalid symbol");
@@ -1412,8 +1414,8 @@ read_data_compressed(struct archive_read *a, const void **buff, size_t *size,
           break;
 
         case 5:
-          if ((length = Ppmd7_DecodeSymbol(&rar->ppmd7_context,
-            &rar->range_dec.p)) < 0)
+          if ((length = __archive_ppmd7_functions.Ppmd7_DecodeSymbol(
+            &rar->ppmd7_context, &rar->range_dec.p)) < 0)
           {
             archive_set_error(&a->archive, ARCHIVE_ERRNO_FILE_FORMAT,
                               "Invalid symbol");
@@ -1520,23 +1522,24 @@ parse_codes(struct archive_read *a)
 
       rar->bytein.a = a;
       rar->bytein.Read = &ppmd_read;
-      PpmdRAR_RangeDec_CreateVTable(&rar->range_dec);
+      __archive_ppmd7_functions.PpmdRAR_RangeDec_CreateVTable(&rar->range_dec);
       rar->range_dec.Stream = &rar->bytein;
-      Ppmd7_Construct(&rar->ppmd7_context);
+      __archive_ppmd7_functions.Ppmd7_Construct(&rar->ppmd7_context);
 
-      if (!Ppmd7_Alloc(&rar->ppmd7_context, rar->dictionary_size, &g_szalloc))
+      if (!__archive_ppmd7_functions.Ppmd7_Alloc(&rar->ppmd7_context,
+        rar->dictionary_size, &g_szalloc))
       {
         archive_set_error(&a->archive, ENOMEM,
                           "Out of memory");
         return (ARCHIVE_FATAL);
       }
-      if (!PpmdRAR_RangeDec_Init(&rar->range_dec))
+      if (!__archive_ppmd7_functions.PpmdRAR_RangeDec_Init(&rar->range_dec))
       {
         archive_set_error(&a->archive, ARCHIVE_ERRNO_FILE_FORMAT,
                           "Unable to initialize PPMd range decoder");
         return (ARCHIVE_FATAL);
       }
-      Ppmd7_Init(&rar->ppmd7_context, maxorder);
+      __archive_ppmd7_functions.Ppmd7_Init(&rar->ppmd7_context, maxorder);
       rar->ppmd_valid = 1;
     }
     else
@@ -1546,7 +1549,7 @@ parse_codes(struct archive_read *a)
                           "Invalid PPMd sequence");
         return (ARCHIVE_FAILED);
       }
-      if (!PpmdRAR_RangeDec_Init(&rar->range_dec))
+      if (!__archive_ppmd7_functions.PpmdRAR_RangeDec_Init(&rar->range_dec))
       {
         archive_set_error(&a->archive, ARCHIVE_ERRNO_FILE_FORMAT,
                           "Unable to initialize PPMd range decoder");