(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_THREADS",
"-DHAVE_DYLIB", "-DHAVE_DYLIB",
"-DHAVE_CG", "-DHAVE_CG",
"-DHAVE_COMPRESSION",
"-D_7ZIP_ST",
"-DHAVE_7ZIP",
); );
PRODUCT_NAME = "$(TARGET_NAME)"; PRODUCT_NAME = "$(TARGET_NAME)";
SDKROOT = macosx; SDKROOT = macosx;
@ -413,6 +416,10 @@
"-DHAVE_THREADS", "-DHAVE_THREADS",
"-DHAVE_DYLIB", "-DHAVE_DYLIB",
"-DHAVE_CG", "-DHAVE_CG",
"-D_7ZIP_ST",
"-DHAVE_COMPRESSION",
"-DHAVE_7ZIP",
"-DHAVE_7ZIP",
); );
PRODUCT_NAME = "$(TARGET_NAME)"; PRODUCT_NAME = "$(TARGET_NAME)";
SDKROOT = macosx; SDKROOT = macosx;

View File

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

View File

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

View File

@ -86,7 +86,7 @@ void Ppmd7_Update2(CPpmd7 *p);
void Ppmd7_UpdateBin(CPpmd7 *p); void Ppmd7_UpdateBin(CPpmd7 *p);
#define Ppmd7_GetBinSumm(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->NS2BSIndx[Ppmd7_GetContext(p, p->MinContext->Suffix)->NumStats - 1] + \
(p->HiBitsFlag = p->HB2Flag[p->FoundState->Symbol]) + \ (p->HiBitsFlag = p->HB2Flag[p->FoundState->Symbol]) + \
2 * p->HB2Flag[Ppmd7Context_OneState(p->MinContext)->Symbol] + \ 2 * p->HB2Flag[Ppmd7Context_OneState(p->MinContext)->Symbol] + \
@ -108,7 +108,7 @@ typedef struct
{ {
IPpmd7_RangeDec p; IPpmd7_RangeDec p;
UInt32 Range; UInt32 Range;
UInt32 Code; UInt32 code;
IByteIn *Stream; IByteIn *Stream;
} CPpmd7z_RangeDec; } CPpmd7z_RangeDec;

View File

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

View File

@ -20,13 +20,13 @@
#include <sys/types.h> #include <sys/types.h>
#include <string.h> #include <string.h>
#include "miscellaneous.h" #include "../miscellaneous.h"
#include "7z.h" #include "7zip/7z.h"
#include "7zAlloc.h" #include "7zip/7zAlloc.h"
#include "7zCrc.h" #include "7zip/7zCrc.h"
#include "7zFile.h" #include "7zip/7zFile.h"
#include "7zVersion.h" #include "7zip/7zVersion.h"
static ISzAlloc g_Alloc = { SzAlloc, SzFree }; 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); res = ConvertUtf16toCharString(temp,infile);
UInt64 filesize = f->Size; UInt64 filesize = f->Size;
(void)filesize;
if (strcmp(infile,relative_path) == 0) 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 For example: fullpath: /home/user/game.7z/mygame.rom
carchive_path: /home/user/game.7z */ carchive_path: /home/user/game.7z */
#ifdef HAVE_COMPRESSION #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 (g_extern.is_carchive)
{ {
if(archive_found) if(archive_found)
{ {
/* FIXME - should use fill_pathname_relative helper function here
* to avoid errors. */
char rel_path[PATH_MAX]; 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); ret = read_compressed_file(g_extern.carchive_path, rel_path, (void**)&ret_buf);
} }
} }