/** @file\r
LZMA Decompress interfaces\r
\r
- Copyright (c) 2009, Intel Corporation<BR>\r
- All rights reserved. This program and the accompanying materials\r
+ Copyright (c) 2009 - 2010, Intel Corporation. All rights reserved.<BR>\r
+ This program and the accompanying materials\r
are licensed and made available under the terms and conditions of the BSD License\r
which accompanies this distribution. The full text of the license may be found at\r
http://opensource.org/licenses/bsd-license.php\r
#include "Sdk/C/7zVersion.h"\r
#include "Sdk/C/LzmaDec.h"\r
\r
-//\r
-// Global data\r
-//\r
-\r
-CONST VOID *mSourceLastUsedWithGetInfo;\r
-UINT32 mSizeOfLastSource;\r
-UINT32 mDecompressedSizeForLastSource;\r
-VOID *mScratchBuffer;\r
-UINTN mScratchBufferSize;\r
-\r
#define SCRATCH_BUFFER_REQUEST_SIZE SIZE_64KB\r
\r
+typedef struct\r
+{\r
+ ISzAlloc Functions;\r
+ VOID *Buffer;\r
+ UINTN BufferSize;\r
+} ISzAllocWithData;\r
+\r
/**\r
Allocation routine used by LZMA decompression.\r
\r
)\r
{\r
VOID *Addr;\r
+ ISzAllocWithData *Private;\r
+\r
+ Private = (ISzAllocWithData*) P;\r
\r
- if (mScratchBufferSize >= Size) {\r
- Addr = mScratchBuffer;\r
- mScratchBuffer = (VOID*) ((UINT8*)Addr + Size);\r
- mScratchBufferSize -= Size;\r
+ if (Private->BufferSize >= Size) {\r
+ Addr = Private->Buffer;\r
+ Private->Buffer = (VOID*) ((UINT8*)Addr + Size);\r
+ Private->BufferSize -= Size;\r
return Addr;\r
} else {\r
ASSERT (FALSE);\r
//\r
}\r
\r
-STATIC ISzAlloc g_Alloc = { SzAlloc, SzFree };\r
-\r
#define LZMA_HEADER_SIZE (LZMA_PROPS_SIZE + 8)\r
\r
/**\r
\r
DecodedSize = GetDecodedSizeOfBuf((UINT8*)Source);\r
\r
- mSourceLastUsedWithGetInfo = Source;\r
- mSizeOfLastSource = SourceSize;\r
- mDecompressedSizeForLastSource = (UInt32)DecodedSize;\r
- *DestinationSize = mDecompressedSizeForLastSource;\r
+ *DestinationSize = (UINT32)DecodedSize;\r
*ScratchSize = SCRATCH_BUFFER_REQUEST_SIZE;\r
return RETURN_SUCCESS;\r
}\r
\r
-\r
/**\r
Decompresses a Lzma compressed source buffer.\r
\r
then RETURN_INVALID_PARAMETER is returned.\r
\r
@param Source The source buffer containing the compressed data.\r
+ @param SourceSize The size of source buffer.\r
@param Destination The destination buffer to store the decompressed data\r
@param Scratch A temporary scratch buffer that is used to perform the decompression.\r
This is an optional parameter that may be NULL if the \r
EFIAPI\r
LzmaUefiDecompress (\r
IN CONST VOID *Source,\r
+ IN UINTN SourceSize,\r
IN OUT VOID *Destination,\r
IN OUT VOID *Scratch\r
)\r
{\r
- SRes LzmaResult;\r
- ELzmaStatus Status;\r
- SizeT DecodedBufSize;\r
- SizeT EncodedDataSize;\r
-\r
- if (Source != mSourceLastUsedWithGetInfo) {\r
- return RETURN_INVALID_PARAMETER;\r
- }\r
-\r
- DecodedBufSize = (SizeT)mDecompressedSizeForLastSource;\r
- EncodedDataSize = (SizeT)(mSizeOfLastSource - LZMA_HEADER_SIZE);\r
-\r
- mScratchBuffer = Scratch;\r
- mScratchBufferSize = SCRATCH_BUFFER_REQUEST_SIZE;\r
+ SRes LzmaResult;\r
+ ELzmaStatus Status;\r
+ SizeT DecodedBufSize;\r
+ SizeT EncodedDataSize;\r
+ ISzAllocWithData AllocFuncs;\r
+\r
+ AllocFuncs.Functions.Alloc = SzAlloc;\r
+ AllocFuncs.Functions.Free = SzFree;\r
+ AllocFuncs.Buffer = Scratch;\r
+ AllocFuncs.BufferSize = SCRATCH_BUFFER_REQUEST_SIZE;\r
+ \r
+ DecodedBufSize = (SizeT)GetDecodedSizeOfBuf((UINT8*)Source);\r
+ EncodedDataSize = (SizeT) (SourceSize - LZMA_HEADER_SIZE);\r
\r
LzmaResult = LzmaDecode(\r
Destination,\r
LZMA_PROPS_SIZE,\r
LZMA_FINISH_END,\r
&Status,\r
- &g_Alloc\r
+ &(AllocFuncs.Functions)\r
);\r
\r
if (LzmaResult == SZ_OK) {\r