(OSX) Bake in 7zip support - some compatibility/build fixes

for OSX
This commit is contained in:
Twinaphex 2014-09-02 20:09:14 +02:00
parent 5422d761a5
commit 4942d268e7
7 changed files with 77 additions and 66 deletions

View File

@ -347,6 +347,9 @@
"-DHAVE_THREADS",
"-DHAVE_DYLIB",
"-DHAVE_CG",
"-DHAVE_COMPRESSION",
"-D_7ZIP_ST",
"-DHAVE_7ZIP",
);
PRODUCT_NAME = "$(TARGET_NAME)";
SDKROOT = macosx;
@ -413,6 +416,10 @@
"-DHAVE_THREADS",
"-DHAVE_DYLIB",
"-DHAVE_CG",
"-D_7ZIP_ST",
"-DHAVE_COMPRESSION",
"-DHAVE_7ZIP",
"-DHAVE_7ZIP",
);
PRODUCT_NAME = "$(TARGET_NAME)";
SDKROOT = macosx;

View File

@ -43,7 +43,7 @@ typedef struct
typedef struct
{
Byte Symbol;
Byte Freq;
Byte freq;
UInt16 SuccessorLow;
UInt16 SuccessorHigh;
} CPpmd_State;

View File

@ -307,7 +307,7 @@ static void RestartModel(CPpmd7 *p)
{
CPpmd_State *s = &p->FoundState[i];
s->Symbol = (Byte)i;
s->Freq = 1;
s->freq = 1;
SetSuccessor(s, 0);
}
@ -375,15 +375,15 @@ static CTX_PTR CreateSuccessors(CPpmd7 *p, Bool skip)
SetSuccessor(&upState, upBranch + 1);
if (c->NumStats == 1)
upState.Freq = ONE_STATE(c)->Freq;
upState.freq = ONE_STATE(c)->freq;
else
{
UInt32 cf, s0;
CPpmd_State *s;
for (s = STATS(c); s->Symbol != upState.Symbol; s++);
cf = s->Freq - 1;
cf = s->freq - 1;
s0 = c->SummFreq - c->NumStats - cf;
upState.Freq = (Byte)(1 + ((2 * cf <= s0) ? (5 * cf > s0) : ((2 * cf + 3 * s0 - 1) / (2 * s0))));
upState.freq = (Byte)(1 + ((2 * cf <= s0) ? (5 * cf > s0) : ((2 * cf + 3 * s0 - 1) / (2 * s0))));
}
do
@ -424,15 +424,15 @@ static void UpdateModel(CPpmd7 *p)
CTX_PTR c;
unsigned s0, ns;
if (p->FoundState->Freq < MAX_FREQ / 4 && p->MinContext->Suffix != 0)
if (p->FoundState->freq < MAX_FREQ / 4 && p->MinContext->Suffix != 0)
{
c = SUFFIX(p->MinContext);
if (c->NumStats == 1)
{
CPpmd_State *s = ONE_STATE(c);
if (s->Freq < 32)
s->Freq++;
if (s->freq < 32)
s->freq++;
}
else
{
@ -440,15 +440,15 @@ static void UpdateModel(CPpmd7 *p)
if (s->Symbol != p->FoundState->Symbol)
{
do { s++; } while (s->Symbol != p->FoundState->Symbol);
if (s[0].Freq >= s[-1].Freq)
if (s[0].freq >= s[-1].freq)
{
SwapStates(&s[0], &s[-1]);
s--;
}
}
if (s->Freq < MAX_FREQ - 9)
if (s->freq < MAX_FREQ - 9)
{
s->Freq += 2;
s->freq += 2;
c->SummFreq += 2;
}
}
@ -498,7 +498,7 @@ static void UpdateModel(CPpmd7 *p)
fSuccessor = REF(p->MinContext);
}
s0 = p->MinContext->SummFreq - (ns = p->MinContext->NumStats) - (p->FoundState->Freq - 1);
s0 = p->MinContext->SummFreq - (ns = p->MinContext->NumStats) - (p->FoundState->freq - 1);
for (c = p->MaxContext; c != p->MinContext; c = SUFFIX(c))
{
@ -538,13 +538,13 @@ static void UpdateModel(CPpmd7 *p)
}
*s = *ONE_STATE(c);
c->Stats = REF(s);
if (s->Freq < MAX_FREQ / 4 - 1)
s->Freq <<= 1;
if (s->freq < MAX_FREQ / 4 - 1)
s->freq <<= 1;
else
s->Freq = MAX_FREQ - 4;
c->SummFreq = (UInt16)(s->Freq + p->InitEsc + (ns > 3));
s->freq = MAX_FREQ - 4;
c->SummFreq = (UInt16)(s->freq + p->InitEsc + (ns > 3));
}
cf = 2 * (UInt32)p->FoundState->Freq * (c->SummFreq + 6);
cf = 2 * (UInt32)p->FoundState->freq * (c->SummFreq + 6);
sf = (UInt32)s0 + c->SummFreq;
if (cf < 6 * sf)
{
@ -560,7 +560,7 @@ static void UpdateModel(CPpmd7 *p)
CPpmd_State *s = STATS(c) + ns1;
SetSuccessor(s, successor);
s->Symbol = p->FoundState->Symbol;
s->Freq = (Byte)cf;
s->freq = (Byte)cf;
c->NumStats = (UInt16)(ns1 + 1);
}
}
@ -578,35 +578,35 @@ static void Rescale(CPpmd7 *p)
s[0] = s[-1];
*s = tmp;
}
escFreq = p->MinContext->SummFreq - s->Freq;
s->Freq += 4;
escFreq = p->MinContext->SummFreq - s->freq;
s->freq += 4;
adder = (p->OrderFall != 0);
s->Freq = (Byte)((s->Freq + adder) >> 1);
sumFreq = s->Freq;
s->freq = (Byte)((s->freq + adder) >> 1);
sumFreq = s->freq;
i = p->MinContext->NumStats - 1;
do
{
escFreq -= (++s)->Freq;
s->Freq = (Byte)((s->Freq + adder) >> 1);
sumFreq += s->Freq;
if (s[0].Freq > s[-1].Freq)
escFreq -= (++s)->freq;
s->freq = (Byte)((s->freq + adder) >> 1);
sumFreq += s->freq;
if (s[0].freq > s[-1].freq)
{
CPpmd_State *s1 = s;
CPpmd_State tmp = *s1;
do
s1[0] = s1[-1];
while (--s1 != stats && tmp.Freq > s1[-1].Freq);
while (--s1 != stats && tmp.freq > s1[-1].freq);
*s1 = tmp;
}
}
while (--i);
if (s->Freq == 0)
if (s->freq == 0)
{
unsigned numStats = p->MinContext->NumStats;
unsigned n0, n1;
do { i++; } while ((--s)->Freq == 0);
do { i++; } while ((--s)->freq == 0);
escFreq += i;
p->MinContext->NumStats = (UInt16)(p->MinContext->NumStats - i);
if (p->MinContext->NumStats == 1)
@ -614,7 +614,7 @@ static void Rescale(CPpmd7 *p)
CPpmd_State tmp = *stats;
do
{
tmp.Freq = (Byte)(tmp.Freq - (tmp.Freq >> 1));
tmp.freq = (Byte)(tmp.freq - (tmp.freq >> 1));
escFreq >>= 1;
}
while (escFreq > 1);
@ -668,13 +668,13 @@ static void NextContext(CPpmd7 *p)
void Ppmd7_Update1(CPpmd7 *p)
{
CPpmd_State *s = p->FoundState;
s->Freq += 4;
s->freq += 4;
p->MinContext->SummFreq += 4;
if (s[0].Freq > s[-1].Freq)
if (s[0].freq > s[-1].freq)
{
SwapStates(&s[0], &s[-1]);
p->FoundState = --s;
if (s->Freq > MAX_FREQ)
if (s->freq > MAX_FREQ)
Rescale(p);
}
NextContext(p);
@ -682,17 +682,17 @@ void Ppmd7_Update1(CPpmd7 *p)
void Ppmd7_Update1_0(CPpmd7 *p)
{
p->PrevSuccess = (2 * p->FoundState->Freq > p->MinContext->SummFreq);
p->PrevSuccess = (2 * p->FoundState->freq > p->MinContext->SummFreq);
p->RunLength += p->PrevSuccess;
p->MinContext->SummFreq += 4;
if ((p->FoundState->Freq += 4) > MAX_FREQ)
if ((p->FoundState->freq += 4) > MAX_FREQ)
Rescale(p);
NextContext(p);
}
void Ppmd7_UpdateBin(CPpmd7 *p)
{
p->FoundState->Freq = (Byte)(p->FoundState->Freq + (p->FoundState->Freq < 128 ? 1: 0));
p->FoundState->freq = (Byte)(p->FoundState->freq + (p->FoundState->freq < 128 ? 1: 0));
p->PrevSuccess = 1;
p->RunLength++;
NextContext(p);
@ -701,7 +701,7 @@ void Ppmd7_UpdateBin(CPpmd7 *p)
void Ppmd7_Update2(CPpmd7 *p)
{
p->MinContext->SummFreq += 4;
if ((p->FoundState->Freq += 4) > MAX_FREQ)
if ((p->FoundState->freq += 4) > MAX_FREQ)
Rescale(p);
p->RunLength = p->InitRL;
UpdateModel(p);

View File

@ -86,7 +86,7 @@ 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->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] + \
@ -108,7 +108,7 @@ typedef struct
{
IPpmd7_RangeDec p;
UInt32 Range;
UInt32 Code;
UInt32 code;
IByteIn *Stream;
} CPpmd7z_RangeDec;

View File

@ -4,35 +4,35 @@ This code is based on PPMd var.H (2001): Dmitry Shkarin : Public domain */
#include "Ppmd7.h"
#define kTopValue (1 << 24)
#define PPMD7_kTopValue (1 << 24)
Bool Ppmd7z_RangeDec_Init(CPpmd7z_RangeDec *p)
{
unsigned i;
p->Code = 0;
p->code = 0;
p->Range = 0xFFFFFFFF;
if (p->Stream->Read((void *)p->Stream) != 0)
return False;
for (i = 0; i < 4; i++)
p->Code = (p->Code << 8) | p->Stream->Read((void *)p->Stream);
return (p->Code < 0xFFFFFFFF);
p->code = (p->code << 8) | p->Stream->Read((void *)p->Stream);
return (p->code < 0xFFFFFFFF);
}
static UInt32 Range_GetThreshold(void *pp, UInt32 total)
{
CPpmd7z_RangeDec *p = (CPpmd7z_RangeDec *)pp;
return (p->Code) / (p->Range /= total);
return (p->code) / (p->Range /= total);
}
static void Range_Normalize(CPpmd7z_RangeDec *p)
{
if (p->Range < kTopValue)
if (p->Range < PPMD7_kTopValue)
{
p->Code = (p->Code << 8) | p->Stream->Read((void *)p->Stream);
p->code = (p->code << 8) | p->Stream->Read((void *)p->Stream);
p->Range <<= 8;
if (p->Range < kTopValue)
if (p->Range < PPMD7_kTopValue)
{
p->Code = (p->Code << 8) | p->Stream->Read((void *)p->Stream);
p->code = (p->code << 8) | p->Stream->Read((void *)p->Stream);
p->Range <<= 8;
}
}
@ -41,7 +41,7 @@ static void Range_Normalize(CPpmd7z_RangeDec *p)
static void Range_Decode(void *pp, UInt32 start, UInt32 size)
{
CPpmd7z_RangeDec *p = (CPpmd7z_RangeDec *)pp;
p->Code -= start * p->Range;
p->code -= start * p->Range;
p->Range *= size;
Range_Normalize(p);
}
@ -51,7 +51,7 @@ static UInt32 Range_DecodeBit(void *pp, UInt32 size0)
CPpmd7z_RangeDec *p = (CPpmd7z_RangeDec *)pp;
UInt32 newBound = (p->Range >> 14) * size0;
UInt32 symbol;
if (p->Code < newBound)
if (p->code < newBound)
{
symbol = 0;
p->Range = newBound;
@ -59,7 +59,7 @@ static UInt32 Range_DecodeBit(void *pp, UInt32 size0)
else
{
symbol = 1;
p->Code -= newBound;
p->code -= newBound;
p->Range -= newBound;
}
Range_Normalize(p);
@ -84,10 +84,10 @@ int Ppmd7_DecodeSymbol(CPpmd7 *p, IPpmd7_RangeDec *rc)
CPpmd_State *s = Ppmd7_GetStats(p, p->MinContext);
unsigned i;
UInt32 count, hiCnt;
if ((count = rc->GetThreshold(rc, p->MinContext->SummFreq)) < (hiCnt = s->Freq))
if ((count = rc->GetThreshold(rc, p->MinContext->SummFreq)) < (hiCnt = s->freq))
{
Byte symbol;
rc->Decode(rc, 0, s->Freq);
rc->Decode(rc, 0, s->freq);
p->FoundState = s;
symbol = s->Symbol;
Ppmd7_Update1_0(p);
@ -97,10 +97,10 @@ int Ppmd7_DecodeSymbol(CPpmd7 *p, IPpmd7_RangeDec *rc)
i = p->MinContext->NumStats - 1;
do
{
if ((hiCnt += (++s)->Freq) > count)
if ((hiCnt += (++s)->freq) > count)
{
Byte symbol;
rc->Decode(rc, hiCnt - s->Freq, s->Freq);
rc->Decode(rc, hiCnt - s->freq, s->freq);
p->FoundState = s;
symbol = s->Symbol;
Ppmd7_Update1(p);
@ -155,7 +155,7 @@ int Ppmd7_DecodeSymbol(CPpmd7 *p, IPpmd7_RangeDec *rc)
do
{
int k = (int)(MASK(s->Symbol));
hiCnt += (s->Freq & k);
hiCnt += (s->freq & k);
ps[i] = s++;
i -= k;
}
@ -169,9 +169,9 @@ int Ppmd7_DecodeSymbol(CPpmd7 *p, IPpmd7_RangeDec *rc)
{
Byte symbol;
CPpmd_State **pps = ps;
for (hiCnt = 0; (hiCnt += (*pps)->Freq) <= count; pps++);
for (hiCnt = 0; (hiCnt += (*pps)->freq) <= count; pps++);
s = *pps;
rc->Decode(rc, hiCnt - s->Freq, s->Freq);
rc->Decode(rc, hiCnt - s->freq, s->freq);
Ppmd_See_Update(see);
p->FoundState = s;
symbol = s->Symbol;

View File

@ -20,13 +20,13 @@
#include <sys/types.h>
#include <string.h>
#include "miscellaneous.h"
#include "../miscellaneous.h"
#include "7z.h"
#include "7zAlloc.h"
#include "7zCrc.h"
#include "7zFile.h"
#include "7zVersion.h"
#include "7zip/7z.h"
#include "7zip/7zAlloc.h"
#include "7zip/7zCrc.h"
#include "7zip/7zFile.h"
#include "7zip/7zVersion.h"
static ISzAlloc g_Alloc = { SzAlloc, SzFree };
@ -225,6 +225,7 @@ long read_7zip_file(const char * archive_path, const char *relative_path, void *
res = ConvertUtf16toCharString(temp,infile);
UInt64 filesize = f->Size;
(void)filesize;
if (strcmp(infile,relative_path) == 0)
{

7
file.c
View File

@ -139,13 +139,16 @@ static ssize_t read_content_file(const char *path, void **buf)
For example: fullpath: /home/user/game.7z/mygame.rom
carchive_path: /home/user/game.7z */
#ifdef HAVE_COMPRESSION
char const* archive_found = strstr(path,g_extern.carchive_path);
const char* archive_found = (const char*)strstr(path, g_extern.carchive_path);
if (g_extern.is_carchive)
{
if(archive_found)
{
/* FIXME - should use fill_pathname_relative helper function here
* to avoid errors. */
char rel_path[PATH_MAX];
snprintf(rel_path, sizeof(rel_path), archive_found+strlen(g_extern.carchive_path)+1);
snprintf(rel_path, sizeof(rel_path),
"%s", archive_found + strlen(g_extern.carchive_path) + 1);
ret = read_compressed_file(g_extern.carchive_path, rel_path, (void**)&ret_buf);
}
}