Upload 2.0.2
[physicsfs] / lzma / CPP / 7zip / Compress / LZMA_Alone / LzmaRamDecode.c
1 /* LzmaRamDecode.c */
2
3 #include "LzmaRamDecode.h"
4 #ifdef _SZ_ONE_DIRECTORY
5 #include "LzmaDecode.h"
6 #include "BranchX86.h"
7 #else
8 #include "../../../../C/Compress/Lzma/LzmaDecode.h"
9 #include "../../../../C/Compress/Branch/BranchX86.h"
10 #endif
11
12 #define LZMA_PROPS_SIZE 14
13 #define LZMA_SIZE_OFFSET 6
14
15 int LzmaRamGetUncompressedSize(
16     const unsigned char *inBuffer, 
17     size_t inSize, 
18     size_t *outSize)
19 {
20   unsigned int i;
21   if (inSize < LZMA_PROPS_SIZE)
22     return 1;
23   *outSize = 0;
24   for(i = 0; i < sizeof(size_t); i++)
25     *outSize += ((size_t)inBuffer[LZMA_SIZE_OFFSET + i]) << (8 * i);
26   for(; i < 8; i++)
27     if (inBuffer[LZMA_SIZE_OFFSET + i] != 0)
28       return 1;
29   return 0;
30 }
31
32 #define SZE_DATA_ERROR (1)
33 #define SZE_OUTOFMEMORY (2)
34
35 int LzmaRamDecompress(
36     const unsigned char *inBuffer, 
37     size_t inSize,
38     unsigned char *outBuffer,
39     size_t outSize,
40     size_t *outSizeProcessed,
41     void * (*allocFunc)(size_t size), 
42     void (*freeFunc)(void *))
43 {
44   CLzmaDecoderState state;  /* it's about 24 bytes structure, if int is 32-bit */
45   int result;
46   SizeT outSizeProcessedLoc;
47   SizeT inProcessed;
48   int useFilter;
49   
50   if (inSize < LZMA_PROPS_SIZE)
51     return 1;
52   useFilter = inBuffer[0];
53
54   *outSizeProcessed = 0;
55   if (useFilter > 1)
56     return 1;
57
58   if (LzmaDecodeProperties(&state.Properties, inBuffer + 1, LZMA_PROPERTIES_SIZE) != LZMA_RESULT_OK)
59     return 1;
60   state.Probs = (CProb *)allocFunc(LzmaGetNumProbs(&state.Properties) * sizeof(CProb));
61   if (state.Probs == 0)
62     return SZE_OUTOFMEMORY;
63   
64   result = LzmaDecode(&state,
65     inBuffer + LZMA_PROPS_SIZE, (SizeT)inSize - LZMA_PROPS_SIZE, &inProcessed,
66     outBuffer, (SizeT)outSize, &outSizeProcessedLoc);
67   freeFunc(state.Probs);
68   if (result != LZMA_RESULT_OK)
69     return 1;
70   *outSizeProcessed = (size_t)outSizeProcessedLoc;
71   if (useFilter == 1)
72   {
73     UInt32 x86State;
74     x86_Convert_Init(x86State);
75     x86_Convert(outBuffer, (SizeT)outSizeProcessedLoc, 0, &x86State, 0);
76   }
77   return 0;
78 }