diff options
Diffstat (limited to 'MdeModulePkg/Library/LzmaCustomDecompressLib')
24 files changed, 5922 insertions, 5922 deletions
diff --git a/MdeModulePkg/Library/LzmaCustomDecompressLib/F86GuidedSectionExtraction.c b/MdeModulePkg/Library/LzmaCustomDecompressLib/F86GuidedSectionExtraction.c index 70cfae5660..bf95b6da05 100644 --- a/MdeModulePkg/Library/LzmaCustomDecompressLib/F86GuidedSectionExtraction.c +++ b/MdeModulePkg/Library/LzmaCustomDecompressLib/F86GuidedSectionExtraction.c @@ -1,215 +1,215 @@ -/** @file
- LZMA Decompress GUIDed Section Extraction Library, which produces LZMA custom
- decompression algorithm with the converter for the different arch code.
- It wraps Lzma decompress interfaces to GUIDed Section Extraction interfaces
- and registers them into GUIDed handler table.
-
- Copyright (c) 2012 - 2018, Intel Corporation. All rights reserved.<BR>
- SPDX-License-Identifier: BSD-2-Clause-Patent
-
-**/
-
-#include "LzmaDecompressLibInternal.h"
-#include "Sdk/C/Bra.h"
-
-/**
- Examines a GUIDed section and returns the size of the decoded buffer and the
- size of an scratch buffer required to actually decode the data in a GUIDed section.
-
- Examines a GUIDed section specified by InputSection.
- If GUID for InputSection does not match the GUID that this handler supports,
- then RETURN_UNSUPPORTED is returned.
- If the required information can not be retrieved from InputSection,
- then RETURN_INVALID_PARAMETER is returned.
- If the GUID of InputSection does match the GUID that this handler supports,
- then the size required to hold the decoded buffer is returned in OututBufferSize,
- the size of an optional scratch buffer is returned in ScratchSize, and the Attributes field
- from EFI_GUID_DEFINED_SECTION header of InputSection is returned in SectionAttribute.
-
- If InputSection is NULL, then ASSERT().
- If OutputBufferSize is NULL, then ASSERT().
- If ScratchBufferSize is NULL, then ASSERT().
- If SectionAttribute is NULL, then ASSERT().
-
-
- @param[in] InputSection A pointer to a GUIDed section of an FFS formatted file.
- @param[out] OutputBufferSize A pointer to the size, in bytes, of an output buffer required
- if the buffer specified by InputSection were decoded.
- @param[out] ScratchBufferSize A pointer to the size, in bytes, required as scratch space
- if the buffer specified by InputSection were decoded.
- @param[out] SectionAttribute A pointer to the attributes of the GUIDed section. See the Attributes
- field of EFI_GUID_DEFINED_SECTION in the PI Specification.
-
- @retval RETURN_SUCCESS The information about InputSection was returned.
- @retval RETURN_UNSUPPORTED The section specified by InputSection does not match the GUID this handler supports.
- @retval RETURN_INVALID_PARAMETER The information can not be retrieved from the section specified by InputSection.
-
-**/
-RETURN_STATUS
-EFIAPI
-LzmaArchGuidedSectionGetInfo (
- IN CONST VOID *InputSection,
- OUT UINT32 *OutputBufferSize,
- OUT UINT32 *ScratchBufferSize,
- OUT UINT16 *SectionAttribute
- )
-{
- ASSERT (InputSection != NULL);
- ASSERT (OutputBufferSize != NULL);
- ASSERT (ScratchBufferSize != NULL);
- ASSERT (SectionAttribute != NULL);
-
- if (IS_SECTION2 (InputSection)) {
- if (!CompareGuid (
- &gLzmaF86CustomDecompressGuid,
- &(((EFI_GUID_DEFINED_SECTION2 *)InputSection)->SectionDefinitionGuid)
- ))
- {
- return RETURN_INVALID_PARAMETER;
- }
-
- *SectionAttribute = ((EFI_GUID_DEFINED_SECTION2 *)InputSection)->Attributes;
-
- return LzmaUefiDecompressGetInfo (
- (UINT8 *)InputSection + ((EFI_GUID_DEFINED_SECTION2 *)InputSection)->DataOffset,
- SECTION2_SIZE (InputSection) - ((EFI_GUID_DEFINED_SECTION2 *)InputSection)->DataOffset,
- OutputBufferSize,
- ScratchBufferSize
- );
- } else {
- if (!CompareGuid (
- &gLzmaF86CustomDecompressGuid,
- &(((EFI_GUID_DEFINED_SECTION *)InputSection)->SectionDefinitionGuid)
- ))
- {
- return RETURN_INVALID_PARAMETER;
- }
-
- *SectionAttribute = ((EFI_GUID_DEFINED_SECTION *)InputSection)->Attributes;
-
- return LzmaUefiDecompressGetInfo (
- (UINT8 *)InputSection + ((EFI_GUID_DEFINED_SECTION *)InputSection)->DataOffset,
- SECTION_SIZE (InputSection) - ((EFI_GUID_DEFINED_SECTION *)InputSection)->DataOffset,
- OutputBufferSize,
- ScratchBufferSize
- );
- }
-}
-
-/**
- Decompress a LZAM compressed GUIDed section into a caller allocated output buffer.
-
- Decodes the GUIDed section specified by InputSection.
- If GUID for InputSection does not match the GUID that this handler supports, then RETURN_UNSUPPORTED is returned.
- If the data in InputSection can not be decoded, then RETURN_INVALID_PARAMETER is returned.
- If the GUID of InputSection does match the GUID that this handler supports, then InputSection
- is decoded into the buffer specified by OutputBuffer and the authentication status of this
- decode operation is returned in AuthenticationStatus. If the decoded buffer is identical to the
- data in InputSection, then OutputBuffer is set to point at the data in InputSection. Otherwise,
- the decoded data will be placed in caller allocated buffer specified by OutputBuffer.
-
- If InputSection is NULL, then ASSERT().
- If OutputBuffer is NULL, then ASSERT().
- If ScratchBuffer is NULL and this decode operation requires a scratch buffer, then ASSERT().
- If AuthenticationStatus is NULL, then ASSERT().
-
-
- @param[in] InputSection A pointer to a GUIDed section of an FFS formatted file.
- @param[out] OutputBuffer A pointer to a buffer that contains the result of a decode operation.
- @param[out] ScratchBuffer A caller allocated buffer that may be required by this function
- as a scratch buffer to perform the decode operation.
- @param[out] AuthenticationStatus
- A pointer to the authentication status of the decoded output buffer.
- See the definition of authentication status in the EFI_PEI_GUIDED_SECTION_EXTRACTION_PPI
- section of the PI Specification. EFI_AUTH_STATUS_PLATFORM_OVERRIDE must
- never be set by this handler.
-
- @retval RETURN_SUCCESS The buffer specified by InputSection was decoded.
- @retval RETURN_UNSUPPORTED The section specified by InputSection does not match the GUID this handler supports.
- @retval RETURN_INVALID_PARAMETER The section specified by InputSection can not be decoded.
-
-**/
-RETURN_STATUS
-EFIAPI
-LzmaArchGuidedSectionExtraction (
- IN CONST VOID *InputSection,
- OUT VOID **OutputBuffer,
- OUT VOID *ScratchBuffer OPTIONAL,
- OUT UINT32 *AuthenticationStatus
- )
-{
- EFI_GUID *InputGuid;
- VOID *Source;
- UINTN SourceSize;
- EFI_STATUS Status;
- UINT32 X86State;
- UINT32 OutputBufferSize;
- UINT32 ScratchBufferSize;
-
- ASSERT (OutputBuffer != NULL);
- ASSERT (InputSection != NULL);
-
- if (IS_SECTION2 (InputSection)) {
- InputGuid = &(((EFI_GUID_DEFINED_SECTION2 *)InputSection)->SectionDefinitionGuid);
- Source = (UINT8 *)InputSection + ((EFI_GUID_DEFINED_SECTION2 *)InputSection)->DataOffset;
- SourceSize = SECTION2_SIZE (InputSection) - ((EFI_GUID_DEFINED_SECTION2 *)InputSection)->DataOffset;
- } else {
- InputGuid = &(((EFI_GUID_DEFINED_SECTION *)InputSection)->SectionDefinitionGuid);
- Source = (UINT8 *)InputSection + ((EFI_GUID_DEFINED_SECTION *)InputSection)->DataOffset;
- SourceSize = SECTION_SIZE (InputSection) - ((EFI_GUID_DEFINED_SECTION *)InputSection)->DataOffset;
- }
-
- if (!CompareGuid (&gLzmaF86CustomDecompressGuid, InputGuid)) {
- return RETURN_INVALID_PARAMETER;
- }
-
- //
- // Authentication is set to Zero, which may be ignored.
- //
- *AuthenticationStatus = 0;
-
- Status = LzmaUefiDecompress (
- Source,
- SourceSize,
- *OutputBuffer,
- ScratchBuffer
- );
-
- //
- // After decompress, the data need to be converted to the raw data.
- //
- if (!EFI_ERROR (Status)) {
- Status = LzmaUefiDecompressGetInfo (
- Source,
- (UINT32)SourceSize,
- &OutputBufferSize,
- &ScratchBufferSize
- );
-
- if (!EFI_ERROR (Status)) {
- x86_Convert_Init (X86State);
- x86_Convert (*OutputBuffer, OutputBufferSize, 0, &X86State, 0);
- }
- }
-
- return Status;
-}
-
-/**
- Register LzmaArchDecompress and LzmaArchDecompressGetInfo handlers with LzmaF86CustomDecompressGuid.
-
- @retval RETURN_SUCCESS Register successfully.
- @retval RETURN_OUT_OF_RESOURCES No enough memory to store this handler.
-**/
-EFI_STATUS
-EFIAPI
-LzmaArchDecompressLibConstructor (
- VOID
- )
-{
- return ExtractGuidedSectionRegisterHandlers (
- &gLzmaF86CustomDecompressGuid,
- LzmaArchGuidedSectionGetInfo,
- LzmaArchGuidedSectionExtraction
- );
-}
+/** @file + LZMA Decompress GUIDed Section Extraction Library, which produces LZMA custom + decompression algorithm with the converter for the different arch code. + It wraps Lzma decompress interfaces to GUIDed Section Extraction interfaces + and registers them into GUIDed handler table. + + Copyright (c) 2012 - 2018, Intel Corporation. All rights reserved.<BR> + SPDX-License-Identifier: BSD-2-Clause-Patent + +**/ + +#include "LzmaDecompressLibInternal.h" +#include "Sdk/C/Bra.h" + +/** + Examines a GUIDed section and returns the size of the decoded buffer and the + size of an scratch buffer required to actually decode the data in a GUIDed section. + + Examines a GUIDed section specified by InputSection. + If GUID for InputSection does not match the GUID that this handler supports, + then RETURN_UNSUPPORTED is returned. + If the required information can not be retrieved from InputSection, + then RETURN_INVALID_PARAMETER is returned. + If the GUID of InputSection does match the GUID that this handler supports, + then the size required to hold the decoded buffer is returned in OututBufferSize, + the size of an optional scratch buffer is returned in ScratchSize, and the Attributes field + from EFI_GUID_DEFINED_SECTION header of InputSection is returned in SectionAttribute. + + If InputSection is NULL, then ASSERT(). + If OutputBufferSize is NULL, then ASSERT(). + If ScratchBufferSize is NULL, then ASSERT(). + If SectionAttribute is NULL, then ASSERT(). + + + @param[in] InputSection A pointer to a GUIDed section of an FFS formatted file. + @param[out] OutputBufferSize A pointer to the size, in bytes, of an output buffer required + if the buffer specified by InputSection were decoded. + @param[out] ScratchBufferSize A pointer to the size, in bytes, required as scratch space + if the buffer specified by InputSection were decoded. + @param[out] SectionAttribute A pointer to the attributes of the GUIDed section. See the Attributes + field of EFI_GUID_DEFINED_SECTION in the PI Specification. + + @retval RETURN_SUCCESS The information about InputSection was returned. + @retval RETURN_UNSUPPORTED The section specified by InputSection does not match the GUID this handler supports. + @retval RETURN_INVALID_PARAMETER The information can not be retrieved from the section specified by InputSection. + +**/ +RETURN_STATUS +EFIAPI +LzmaArchGuidedSectionGetInfo ( + IN CONST VOID *InputSection, + OUT UINT32 *OutputBufferSize, + OUT UINT32 *ScratchBufferSize, + OUT UINT16 *SectionAttribute + ) +{ + ASSERT (InputSection != NULL); + ASSERT (OutputBufferSize != NULL); + ASSERT (ScratchBufferSize != NULL); + ASSERT (SectionAttribute != NULL); + + if (IS_SECTION2 (InputSection)) { + if (!CompareGuid ( + &gLzmaF86CustomDecompressGuid, + &(((EFI_GUID_DEFINED_SECTION2 *)InputSection)->SectionDefinitionGuid) + )) + { + return RETURN_INVALID_PARAMETER; + } + + *SectionAttribute = ((EFI_GUID_DEFINED_SECTION2 *)InputSection)->Attributes; + + return LzmaUefiDecompressGetInfo ( + (UINT8 *)InputSection + ((EFI_GUID_DEFINED_SECTION2 *)InputSection)->DataOffset, + SECTION2_SIZE (InputSection) - ((EFI_GUID_DEFINED_SECTION2 *)InputSection)->DataOffset, + OutputBufferSize, + ScratchBufferSize + ); + } else { + if (!CompareGuid ( + &gLzmaF86CustomDecompressGuid, + &(((EFI_GUID_DEFINED_SECTION *)InputSection)->SectionDefinitionGuid) + )) + { + return RETURN_INVALID_PARAMETER; + } + + *SectionAttribute = ((EFI_GUID_DEFINED_SECTION *)InputSection)->Attributes; + + return LzmaUefiDecompressGetInfo ( + (UINT8 *)InputSection + ((EFI_GUID_DEFINED_SECTION *)InputSection)->DataOffset, + SECTION_SIZE (InputSection) - ((EFI_GUID_DEFINED_SECTION *)InputSection)->DataOffset, + OutputBufferSize, + ScratchBufferSize + ); + } +} + +/** + Decompress a LZAM compressed GUIDed section into a caller allocated output buffer. + + Decodes the GUIDed section specified by InputSection. + If GUID for InputSection does not match the GUID that this handler supports, then RETURN_UNSUPPORTED is returned. + If the data in InputSection can not be decoded, then RETURN_INVALID_PARAMETER is returned. + If the GUID of InputSection does match the GUID that this handler supports, then InputSection + is decoded into the buffer specified by OutputBuffer and the authentication status of this + decode operation is returned in AuthenticationStatus. If the decoded buffer is identical to the + data in InputSection, then OutputBuffer is set to point at the data in InputSection. Otherwise, + the decoded data will be placed in caller allocated buffer specified by OutputBuffer. + + If InputSection is NULL, then ASSERT(). + If OutputBuffer is NULL, then ASSERT(). + If ScratchBuffer is NULL and this decode operation requires a scratch buffer, then ASSERT(). + If AuthenticationStatus is NULL, then ASSERT(). + + + @param[in] InputSection A pointer to a GUIDed section of an FFS formatted file. + @param[out] OutputBuffer A pointer to a buffer that contains the result of a decode operation. + @param[out] ScratchBuffer A caller allocated buffer that may be required by this function + as a scratch buffer to perform the decode operation. + @param[out] AuthenticationStatus + A pointer to the authentication status of the decoded output buffer. + See the definition of authentication status in the EFI_PEI_GUIDED_SECTION_EXTRACTION_PPI + section of the PI Specification. EFI_AUTH_STATUS_PLATFORM_OVERRIDE must + never be set by this handler. + + @retval RETURN_SUCCESS The buffer specified by InputSection was decoded. + @retval RETURN_UNSUPPORTED The section specified by InputSection does not match the GUID this handler supports. + @retval RETURN_INVALID_PARAMETER The section specified by InputSection can not be decoded. + +**/ +RETURN_STATUS +EFIAPI +LzmaArchGuidedSectionExtraction ( + IN CONST VOID *InputSection, + OUT VOID **OutputBuffer, + OUT VOID *ScratchBuffer OPTIONAL, + OUT UINT32 *AuthenticationStatus + ) +{ + EFI_GUID *InputGuid; + VOID *Source; + UINTN SourceSize; + EFI_STATUS Status; + UINT32 X86State; + UINT32 OutputBufferSize; + UINT32 ScratchBufferSize; + + ASSERT (OutputBuffer != NULL); + ASSERT (InputSection != NULL); + + if (IS_SECTION2 (InputSection)) { + InputGuid = &(((EFI_GUID_DEFINED_SECTION2 *)InputSection)->SectionDefinitionGuid); + Source = (UINT8 *)InputSection + ((EFI_GUID_DEFINED_SECTION2 *)InputSection)->DataOffset; + SourceSize = SECTION2_SIZE (InputSection) - ((EFI_GUID_DEFINED_SECTION2 *)InputSection)->DataOffset; + } else { + InputGuid = &(((EFI_GUID_DEFINED_SECTION *)InputSection)->SectionDefinitionGuid); + Source = (UINT8 *)InputSection + ((EFI_GUID_DEFINED_SECTION *)InputSection)->DataOffset; + SourceSize = SECTION_SIZE (InputSection) - ((EFI_GUID_DEFINED_SECTION *)InputSection)->DataOffset; + } + + if (!CompareGuid (&gLzmaF86CustomDecompressGuid, InputGuid)) { + return RETURN_INVALID_PARAMETER; + } + + // + // Authentication is set to Zero, which may be ignored. + // + *AuthenticationStatus = 0; + + Status = LzmaUefiDecompress ( + Source, + SourceSize, + *OutputBuffer, + ScratchBuffer + ); + + // + // After decompress, the data need to be converted to the raw data. + // + if (!EFI_ERROR (Status)) { + Status = LzmaUefiDecompressGetInfo ( + Source, + (UINT32)SourceSize, + &OutputBufferSize, + &ScratchBufferSize + ); + + if (!EFI_ERROR (Status)) { + x86_Convert_Init (X86State); + x86_Convert (*OutputBuffer, OutputBufferSize, 0, &X86State, 0); + } + } + + return Status; +} + +/** + Register LzmaArchDecompress and LzmaArchDecompressGetInfo handlers with LzmaF86CustomDecompressGuid. + + @retval RETURN_SUCCESS Register successfully. + @retval RETURN_OUT_OF_RESOURCES No enough memory to store this handler. +**/ +EFI_STATUS +EFIAPI +LzmaArchDecompressLibConstructor ( + VOID + ) +{ + return ExtractGuidedSectionRegisterHandlers ( + &gLzmaF86CustomDecompressGuid, + LzmaArchGuidedSectionGetInfo, + LzmaArchGuidedSectionExtraction + ); +} diff --git a/MdeModulePkg/Library/LzmaCustomDecompressLib/GuidedSectionExtraction.c b/MdeModulePkg/Library/LzmaCustomDecompressLib/GuidedSectionExtraction.c index cace79e32b..d296923e6f 100644 --- a/MdeModulePkg/Library/LzmaCustomDecompressLib/GuidedSectionExtraction.c +++ b/MdeModulePkg/Library/LzmaCustomDecompressLib/GuidedSectionExtraction.c @@ -1,202 +1,202 @@ -/** @file
- LZMA Decompress GUIDed Section Extraction Library.
- It wraps Lzma decompress interfaces to GUIDed Section Extraction interfaces
- and registers them into GUIDed handler table.
-
- Copyright (c) 2009 - 2018, Intel Corporation. All rights reserved.<BR>
- SPDX-License-Identifier: BSD-2-Clause-Patent
-
-**/
-
-#include "LzmaDecompressLibInternal.h"
-
-/**
- Examines a GUIDed section and returns the size of the decoded buffer and the
- size of an scratch buffer required to actually decode the data in a GUIDed section.
-
- Examines a GUIDed section specified by InputSection.
- If GUID for InputSection does not match the GUID that this handler supports,
- then RETURN_UNSUPPORTED is returned.
- If the required information can not be retrieved from InputSection,
- then RETURN_INVALID_PARAMETER is returned.
- If the GUID of InputSection does match the GUID that this handler supports,
- then the size required to hold the decoded buffer is returned in OututBufferSize,
- the size of an optional scratch buffer is returned in ScratchSize, and the Attributes field
- from EFI_GUID_DEFINED_SECTION header of InputSection is returned in SectionAttribute.
-
- If InputSection is NULL, then ASSERT().
- If OutputBufferSize is NULL, then ASSERT().
- If ScratchBufferSize is NULL, then ASSERT().
- If SectionAttribute is NULL, then ASSERT().
-
-
- @param[in] InputSection A pointer to a GUIDed section of an FFS formatted file.
- @param[out] OutputBufferSize A pointer to the size, in bytes, of an output buffer required
- if the buffer specified by InputSection were decoded.
- @param[out] ScratchBufferSize A pointer to the size, in bytes, required as scratch space
- if the buffer specified by InputSection were decoded.
- @param[out] SectionAttribute A pointer to the attributes of the GUIDed section. See the Attributes
- field of EFI_GUID_DEFINED_SECTION in the PI Specification.
-
- @retval RETURN_SUCCESS The information about InputSection was returned.
- @retval RETURN_UNSUPPORTED The section specified by InputSection does not match the GUID this handler supports.
- @retval RETURN_INVALID_PARAMETER The information can not be retrieved from the section specified by InputSection.
-
-**/
-RETURN_STATUS
-EFIAPI
-LzmaGuidedSectionGetInfo (
- IN CONST VOID *InputSection,
- OUT UINT32 *OutputBufferSize,
- OUT UINT32 *ScratchBufferSize,
- OUT UINT16 *SectionAttribute
- )
-{
- ASSERT (InputSection != NULL);
- ASSERT (OutputBufferSize != NULL);
- ASSERT (ScratchBufferSize != NULL);
- ASSERT (SectionAttribute != NULL);
-
- if (IS_SECTION2 (InputSection)) {
- if (!CompareGuid (
- &gLzmaCustomDecompressGuid,
- &(((EFI_GUID_DEFINED_SECTION2 *)InputSection)->SectionDefinitionGuid)
- ))
- {
- return RETURN_INVALID_PARAMETER;
- }
-
- *SectionAttribute = ((EFI_GUID_DEFINED_SECTION2 *)InputSection)->Attributes;
-
- return LzmaUefiDecompressGetInfo (
- (UINT8 *)InputSection + ((EFI_GUID_DEFINED_SECTION2 *)InputSection)->DataOffset,
- SECTION2_SIZE (InputSection) - ((EFI_GUID_DEFINED_SECTION2 *)InputSection)->DataOffset,
- OutputBufferSize,
- ScratchBufferSize
- );
- } else {
- if (!CompareGuid (
- &gLzmaCustomDecompressGuid,
- &(((EFI_GUID_DEFINED_SECTION *)InputSection)->SectionDefinitionGuid)
- ))
- {
- return RETURN_INVALID_PARAMETER;
- }
-
- *SectionAttribute = ((EFI_GUID_DEFINED_SECTION *)InputSection)->Attributes;
-
- return LzmaUefiDecompressGetInfo (
- (UINT8 *)InputSection + ((EFI_GUID_DEFINED_SECTION *)InputSection)->DataOffset,
- SECTION_SIZE (InputSection) - ((EFI_GUID_DEFINED_SECTION *)InputSection)->DataOffset,
- OutputBufferSize,
- ScratchBufferSize
- );
- }
-}
-
-/**
- Decompress a LZAM compressed GUIDed section into a caller allocated output buffer.
-
- Decodes the GUIDed section specified by InputSection.
- If GUID for InputSection does not match the GUID that this handler supports, then RETURN_UNSUPPORTED is returned.
- If the data in InputSection can not be decoded, then RETURN_INVALID_PARAMETER is returned.
- If the GUID of InputSection does match the GUID that this handler supports, then InputSection
- is decoded into the buffer specified by OutputBuffer and the authentication status of this
- decode operation is returned in AuthenticationStatus. If the decoded buffer is identical to the
- data in InputSection, then OutputBuffer is set to point at the data in InputSection. Otherwise,
- the decoded data will be placed in caller allocated buffer specified by OutputBuffer.
-
- If InputSection is NULL, then ASSERT().
- If OutputBuffer is NULL, then ASSERT().
- If ScratchBuffer is NULL and this decode operation requires a scratch buffer, then ASSERT().
- If AuthenticationStatus is NULL, then ASSERT().
-
-
- @param[in] InputSection A pointer to a GUIDed section of an FFS formatted file.
- @param[out] OutputBuffer A pointer to a buffer that contains the result of a decode operation.
- @param[out] ScratchBuffer A caller allocated buffer that may be required by this function
- as a scratch buffer to perform the decode operation.
- @param[out] AuthenticationStatus
- A pointer to the authentication status of the decoded output buffer.
- See the definition of authentication status in the EFI_PEI_GUIDED_SECTION_EXTRACTION_PPI
- section of the PI Specification. EFI_AUTH_STATUS_PLATFORM_OVERRIDE must
- never be set by this handler.
-
- @retval RETURN_SUCCESS The buffer specified by InputSection was decoded.
- @retval RETURN_UNSUPPORTED The section specified by InputSection does not match the GUID this handler supports.
- @retval RETURN_INVALID_PARAMETER The section specified by InputSection can not be decoded.
-
-**/
-RETURN_STATUS
-EFIAPI
-LzmaGuidedSectionExtraction (
- IN CONST VOID *InputSection,
- OUT VOID **OutputBuffer,
- OUT VOID *ScratchBuffer OPTIONAL,
- OUT UINT32 *AuthenticationStatus
- )
-{
- ASSERT (OutputBuffer != NULL);
- ASSERT (InputSection != NULL);
-
- if (IS_SECTION2 (InputSection)) {
- if (!CompareGuid (
- &gLzmaCustomDecompressGuid,
- &(((EFI_GUID_DEFINED_SECTION2 *)InputSection)->SectionDefinitionGuid)
- ))
- {
- return RETURN_INVALID_PARAMETER;
- }
-
- //
- // Authentication is set to Zero, which may be ignored.
- //
- *AuthenticationStatus = 0;
-
- return LzmaUefiDecompress (
- (UINT8 *)InputSection + ((EFI_GUID_DEFINED_SECTION2 *)InputSection)->DataOffset,
- SECTION2_SIZE (InputSection) - ((EFI_GUID_DEFINED_SECTION2 *)InputSection)->DataOffset,
- *OutputBuffer,
- ScratchBuffer
- );
- } else {
- if (!CompareGuid (
- &gLzmaCustomDecompressGuid,
- &(((EFI_GUID_DEFINED_SECTION *)InputSection)->SectionDefinitionGuid)
- ))
- {
- return RETURN_INVALID_PARAMETER;
- }
-
- //
- // Authentication is set to Zero, which may be ignored.
- //
- *AuthenticationStatus = 0;
-
- return LzmaUefiDecompress (
- (UINT8 *)InputSection + ((EFI_GUID_DEFINED_SECTION *)InputSection)->DataOffset,
- SECTION_SIZE (InputSection) - ((EFI_GUID_DEFINED_SECTION *)InputSection)->DataOffset,
- *OutputBuffer,
- ScratchBuffer
- );
- }
-}
-
-/**
- Register LzmaDecompress and LzmaDecompressGetInfo handlers with LzmaCustomerDecompressGuid.
-
- @retval RETURN_SUCCESS Register successfully.
- @retval RETURN_OUT_OF_RESOURCES No enough memory to store this handler.
-**/
-EFI_STATUS
-EFIAPI
-LzmaDecompressLibConstructor (
- VOID
- )
-{
- return ExtractGuidedSectionRegisterHandlers (
- &gLzmaCustomDecompressGuid,
- LzmaGuidedSectionGetInfo,
- LzmaGuidedSectionExtraction
- );
-}
+/** @file + LZMA Decompress GUIDed Section Extraction Library. + It wraps Lzma decompress interfaces to GUIDed Section Extraction interfaces + and registers them into GUIDed handler table. + + Copyright (c) 2009 - 2018, Intel Corporation. All rights reserved.<BR> + SPDX-License-Identifier: BSD-2-Clause-Patent + +**/ + +#include "LzmaDecompressLibInternal.h" + +/** + Examines a GUIDed section and returns the size of the decoded buffer and the + size of an scratch buffer required to actually decode the data in a GUIDed section. + + Examines a GUIDed section specified by InputSection. + If GUID for InputSection does not match the GUID that this handler supports, + then RETURN_UNSUPPORTED is returned. + If the required information can not be retrieved from InputSection, + then RETURN_INVALID_PARAMETER is returned. + If the GUID of InputSection does match the GUID that this handler supports, + then the size required to hold the decoded buffer is returned in OututBufferSize, + the size of an optional scratch buffer is returned in ScratchSize, and the Attributes field + from EFI_GUID_DEFINED_SECTION header of InputSection is returned in SectionAttribute. + + If InputSection is NULL, then ASSERT(). + If OutputBufferSize is NULL, then ASSERT(). + If ScratchBufferSize is NULL, then ASSERT(). + If SectionAttribute is NULL, then ASSERT(). + + + @param[in] InputSection A pointer to a GUIDed section of an FFS formatted file. + @param[out] OutputBufferSize A pointer to the size, in bytes, of an output buffer required + if the buffer specified by InputSection were decoded. + @param[out] ScratchBufferSize A pointer to the size, in bytes, required as scratch space + if the buffer specified by InputSection were decoded. + @param[out] SectionAttribute A pointer to the attributes of the GUIDed section. See the Attributes + field of EFI_GUID_DEFINED_SECTION in the PI Specification. + + @retval RETURN_SUCCESS The information about InputSection was returned. + @retval RETURN_UNSUPPORTED The section specified by InputSection does not match the GUID this handler supports. + @retval RETURN_INVALID_PARAMETER The information can not be retrieved from the section specified by InputSection. + +**/ +RETURN_STATUS +EFIAPI +LzmaGuidedSectionGetInfo ( + IN CONST VOID *InputSection, + OUT UINT32 *OutputBufferSize, + OUT UINT32 *ScratchBufferSize, + OUT UINT16 *SectionAttribute + ) +{ + ASSERT (InputSection != NULL); + ASSERT (OutputBufferSize != NULL); + ASSERT (ScratchBufferSize != NULL); + ASSERT (SectionAttribute != NULL); + + if (IS_SECTION2 (InputSection)) { + if (!CompareGuid ( + &gLzmaCustomDecompressGuid, + &(((EFI_GUID_DEFINED_SECTION2 *)InputSection)->SectionDefinitionGuid) + )) + { + return RETURN_INVALID_PARAMETER; + } + + *SectionAttribute = ((EFI_GUID_DEFINED_SECTION2 *)InputSection)->Attributes; + + return LzmaUefiDecompressGetInfo ( + (UINT8 *)InputSection + ((EFI_GUID_DEFINED_SECTION2 *)InputSection)->DataOffset, + SECTION2_SIZE (InputSection) - ((EFI_GUID_DEFINED_SECTION2 *)InputSection)->DataOffset, + OutputBufferSize, + ScratchBufferSize + ); + } else { + if (!CompareGuid ( + &gLzmaCustomDecompressGuid, + &(((EFI_GUID_DEFINED_SECTION *)InputSection)->SectionDefinitionGuid) + )) + { + return RETURN_INVALID_PARAMETER; + } + + *SectionAttribute = ((EFI_GUID_DEFINED_SECTION *)InputSection)->Attributes; + + return LzmaUefiDecompressGetInfo ( + (UINT8 *)InputSection + ((EFI_GUID_DEFINED_SECTION *)InputSection)->DataOffset, + SECTION_SIZE (InputSection) - ((EFI_GUID_DEFINED_SECTION *)InputSection)->DataOffset, + OutputBufferSize, + ScratchBufferSize + ); + } +} + +/** + Decompress a LZAM compressed GUIDed section into a caller allocated output buffer. + + Decodes the GUIDed section specified by InputSection. + If GUID for InputSection does not match the GUID that this handler supports, then RETURN_UNSUPPORTED is returned. + If the data in InputSection can not be decoded, then RETURN_INVALID_PARAMETER is returned. + If the GUID of InputSection does match the GUID that this handler supports, then InputSection + is decoded into the buffer specified by OutputBuffer and the authentication status of this + decode operation is returned in AuthenticationStatus. If the decoded buffer is identical to the + data in InputSection, then OutputBuffer is set to point at the data in InputSection. Otherwise, + the decoded data will be placed in caller allocated buffer specified by OutputBuffer. + + If InputSection is NULL, then ASSERT(). + If OutputBuffer is NULL, then ASSERT(). + If ScratchBuffer is NULL and this decode operation requires a scratch buffer, then ASSERT(). + If AuthenticationStatus is NULL, then ASSERT(). + + + @param[in] InputSection A pointer to a GUIDed section of an FFS formatted file. + @param[out] OutputBuffer A pointer to a buffer that contains the result of a decode operation. + @param[out] ScratchBuffer A caller allocated buffer that may be required by this function + as a scratch buffer to perform the decode operation. + @param[out] AuthenticationStatus + A pointer to the authentication status of the decoded output buffer. + See the definition of authentication status in the EFI_PEI_GUIDED_SECTION_EXTRACTION_PPI + section of the PI Specification. EFI_AUTH_STATUS_PLATFORM_OVERRIDE must + never be set by this handler. + + @retval RETURN_SUCCESS The buffer specified by InputSection was decoded. + @retval RETURN_UNSUPPORTED The section specified by InputSection does not match the GUID this handler supports. + @retval RETURN_INVALID_PARAMETER The section specified by InputSection can not be decoded. + +**/ +RETURN_STATUS +EFIAPI +LzmaGuidedSectionExtraction ( + IN CONST VOID *InputSection, + OUT VOID **OutputBuffer, + OUT VOID *ScratchBuffer OPTIONAL, + OUT UINT32 *AuthenticationStatus + ) +{ + ASSERT (OutputBuffer != NULL); + ASSERT (InputSection != NULL); + + if (IS_SECTION2 (InputSection)) { + if (!CompareGuid ( + &gLzmaCustomDecompressGuid, + &(((EFI_GUID_DEFINED_SECTION2 *)InputSection)->SectionDefinitionGuid) + )) + { + return RETURN_INVALID_PARAMETER; + } + + // + // Authentication is set to Zero, which may be ignored. + // + *AuthenticationStatus = 0; + + return LzmaUefiDecompress ( + (UINT8 *)InputSection + ((EFI_GUID_DEFINED_SECTION2 *)InputSection)->DataOffset, + SECTION2_SIZE (InputSection) - ((EFI_GUID_DEFINED_SECTION2 *)InputSection)->DataOffset, + *OutputBuffer, + ScratchBuffer + ); + } else { + if (!CompareGuid ( + &gLzmaCustomDecompressGuid, + &(((EFI_GUID_DEFINED_SECTION *)InputSection)->SectionDefinitionGuid) + )) + { + return RETURN_INVALID_PARAMETER; + } + + // + // Authentication is set to Zero, which may be ignored. + // + *AuthenticationStatus = 0; + + return LzmaUefiDecompress ( + (UINT8 *)InputSection + ((EFI_GUID_DEFINED_SECTION *)InputSection)->DataOffset, + SECTION_SIZE (InputSection) - ((EFI_GUID_DEFINED_SECTION *)InputSection)->DataOffset, + *OutputBuffer, + ScratchBuffer + ); + } +} + +/** + Register LzmaDecompress and LzmaDecompressGetInfo handlers with LzmaCustomerDecompressGuid. + + @retval RETURN_SUCCESS Register successfully. + @retval RETURN_OUT_OF_RESOURCES No enough memory to store this handler. +**/ +EFI_STATUS +EFIAPI +LzmaDecompressLibConstructor ( + VOID + ) +{ + return ExtractGuidedSectionRegisterHandlers ( + &gLzmaCustomDecompressGuid, + LzmaGuidedSectionGetInfo, + LzmaGuidedSectionExtraction + ); +} diff --git a/MdeModulePkg/Library/LzmaCustomDecompressLib/LZMA-SDK-README.txt b/MdeModulePkg/Library/LzmaCustomDecompressLib/LZMA-SDK-README.txt index 8095b6edd2..c03b212897 100644 --- a/MdeModulePkg/Library/LzmaCustomDecompressLib/LZMA-SDK-README.txt +++ b/MdeModulePkg/Library/LzmaCustomDecompressLib/LZMA-SDK-README.txt @@ -1,4 +1,4 @@ -LzmaCustomDecompressLib is based on the LZMA SDK 19.00.
-LZMA SDK 19.00 was placed in the public domain on
-2019-02-21. It was released on the
-http://www.7-zip.org/sdk.html website.
+LzmaCustomDecompressLib is based on the LZMA SDK 19.00. +LZMA SDK 19.00 was placed in the public domain on +2019-02-21. It was released on the +http://www.7-zip.org/sdk.html website. diff --git a/MdeModulePkg/Library/LzmaCustomDecompressLib/LzmaArchCustomDecompressLib.inf b/MdeModulePkg/Library/LzmaCustomDecompressLib/LzmaArchCustomDecompressLib.inf index 3a0647e7f8..0b0838552b 100644 --- a/MdeModulePkg/Library/LzmaCustomDecompressLib/LzmaArchCustomDecompressLib.inf +++ b/MdeModulePkg/Library/LzmaCustomDecompressLib/LzmaArchCustomDecompressLib.inf @@ -1,63 +1,63 @@ -## @file
-# LzmaArchCustomDecompressLib produces LZMA custom decompression algorithm with the converter for the different arch code.
-#
-# It is based on the LZMA SDK 19.00
-# LZMA SDK 19.00 was placed in the public domain on 2019-02-21.
-# It was released on the http://www.7-zip.org/sdk.html website.
-#
-# Copyright (c) 2012 - 2020, Intel Corporation. All rights reserved.<BR>
-#
-# SPDX-License-Identifier: BSD-2-Clause-Patent
-#
-#
-##
-
-[Defines]
- INF_VERSION = 0x00010005
- BASE_NAME = LzmaArchDecompressLib
- MODULE_UNI_FILE = LzmaArchDecompressLib.uni
- FILE_GUID = A853C1D2-E003-4cc4-9DD1-8824AD79FE48
- MODULE_TYPE = BASE
- VERSION_STRING = 1.0
- LIBRARY_CLASS = NULL
- CONSTRUCTOR = LzmaArchDecompressLibConstructor
-
-#
-# The following information is for reference only and not required by the build tools.
-#
-# VALID_ARCHITECTURES = IA32 X64
-#
-
-[Sources]
- LzmaDecompress.c
- Sdk/C/Bra.h
- Sdk/C/LzFind.c
- Sdk/C/LzmaDec.c
- Sdk/C/7zVersion.h
- Sdk/C/CpuArch.h
- Sdk/C/LzFind.h
- Sdk/C/LzHash.h
- Sdk/C/LzmaDec.h
- Sdk/C/7zTypes.h
- Sdk/C/Precomp.h
- Sdk/C/Compiler.h
- UefiLzma.h
- LzmaDecompressLibInternal.h
-
-[Sources.Ia32, Sources.X64]
- Sdk/C/Bra86.c
- F86GuidedSectionExtraction.c
-
-[Packages]
- MdePkg/MdePkg.dec
- MdeModulePkg/MdeModulePkg.dec
-
-[Guids.Ia32, Guids.X64]
- gLzmaF86CustomDecompressGuid ## PRODUCES ## GUID # specifies LZMA custom decompress algorithm with converter for x86 code.
-
-[LibraryClasses]
- BaseLib
- DebugLib
- BaseMemoryLib
- ExtractGuidedSectionLib
-
+## @file +# LzmaArchCustomDecompressLib produces LZMA custom decompression algorithm with the converter for the different arch code. +# +# It is based on the LZMA SDK 19.00 +# LZMA SDK 19.00 was placed in the public domain on 2019-02-21. +# It was released on the http://www.7-zip.org/sdk.html website. +# +# Copyright (c) 2012 - 2020, Intel Corporation. All rights reserved.<BR> +# +# SPDX-License-Identifier: BSD-2-Clause-Patent +# +# +## + +[Defines] + INF_VERSION = 0x00010005 + BASE_NAME = LzmaArchDecompressLib + MODULE_UNI_FILE = LzmaArchDecompressLib.uni + FILE_GUID = A853C1D2-E003-4cc4-9DD1-8824AD79FE48 + MODULE_TYPE = BASE + VERSION_STRING = 1.0 + LIBRARY_CLASS = NULL + CONSTRUCTOR = LzmaArchDecompressLibConstructor + +# +# The following information is for reference only and not required by the build tools. +# +# VALID_ARCHITECTURES = IA32 X64 +# + +[Sources] + LzmaDecompress.c + Sdk/C/Bra.h + Sdk/C/LzFind.c + Sdk/C/LzmaDec.c + Sdk/C/7zVersion.h + Sdk/C/CpuArch.h + Sdk/C/LzFind.h + Sdk/C/LzHash.h + Sdk/C/LzmaDec.h + Sdk/C/7zTypes.h + Sdk/C/Precomp.h + Sdk/C/Compiler.h + UefiLzma.h + LzmaDecompressLibInternal.h + +[Sources.Ia32, Sources.X64] + Sdk/C/Bra86.c + F86GuidedSectionExtraction.c + +[Packages] + MdePkg/MdePkg.dec + MdeModulePkg/MdeModulePkg.dec + +[Guids.Ia32, Guids.X64] + gLzmaF86CustomDecompressGuid ## PRODUCES ## GUID # specifies LZMA custom decompress algorithm with converter for x86 code. + +[LibraryClasses] + BaseLib + DebugLib + BaseMemoryLib + ExtractGuidedSectionLib + diff --git a/MdeModulePkg/Library/LzmaCustomDecompressLib/LzmaArchDecompressLib.uni b/MdeModulePkg/Library/LzmaCustomDecompressLib/LzmaArchDecompressLib.uni index b59634ca32..5545be66c7 100644 --- a/MdeModulePkg/Library/LzmaCustomDecompressLib/LzmaArchDecompressLib.uni +++ b/MdeModulePkg/Library/LzmaCustomDecompressLib/LzmaArchDecompressLib.uni @@ -1,18 +1,18 @@ -// /** @file
-// LzmaArchCustomDecompressLib produces LZMA custom decompression algorithm with the converter for the different arch code.
-//
-// It is based on the LZMA SDK 4.65.
-// LZMA SDK 4.65 was placed in the public domain on 2009-02-03.
-// It was released on the http://www.7-zip.org/sdk.html website.
-//
-// Copyright (c) 2012 - 2014, Intel Corporation. All rights reserved.<BR>
-//
-// SPDX-License-Identifier: BSD-2-Clause-Patent
-//
-// **/
-
-
-#string STR_MODULE_ABSTRACT #language en-US "LzmaArchCustomDecompressLib produces LZMA custom decompression algorithm with the converter for the different arch code."
-
-#string STR_MODULE_DESCRIPTION #language en-US "It is based on the LZMA SDK 4.65. LZMA SDK 4.65 was placed in the public domain on 2009-02-03. It was released on the website http://www.7-zip.org/sdk.html ."
-
+// /** @file +// LzmaArchCustomDecompressLib produces LZMA custom decompression algorithm with the converter for the different arch code. +// +// It is based on the LZMA SDK 4.65. +// LZMA SDK 4.65 was placed in the public domain on 2009-02-03. +// It was released on the http://www.7-zip.org/sdk.html website. +// +// Copyright (c) 2012 - 2014, Intel Corporation. All rights reserved.<BR> +// +// SPDX-License-Identifier: BSD-2-Clause-Patent +// +// **/ + + +#string STR_MODULE_ABSTRACT #language en-US "LzmaArchCustomDecompressLib produces LZMA custom decompression algorithm with the converter for the different arch code." + +#string STR_MODULE_DESCRIPTION #language en-US "It is based on the LZMA SDK 4.65. LZMA SDK 4.65 was placed in the public domain on 2009-02-03. It was released on the website http://www.7-zip.org/sdk.html ." + diff --git a/MdeModulePkg/Library/LzmaCustomDecompressLib/LzmaCustomDecompressLib.inf b/MdeModulePkg/Library/LzmaCustomDecompressLib/LzmaCustomDecompressLib.inf index 39e66136c4..13f3543789 100644 --- a/MdeModulePkg/Library/LzmaCustomDecompressLib/LzmaCustomDecompressLib.inf +++ b/MdeModulePkg/Library/LzmaCustomDecompressLib/LzmaCustomDecompressLib.inf @@ -1,59 +1,59 @@ -## @file
-# LzmaCustomDecompressLib produces LZMA custom decompression algorithm.
-#
-# It is based on the LZMA SDK 19.00.
-# LZMA SDK 19.00 was placed in the public domain on 2019-02-21.
-# It was released on the http://www.7-zip.org/sdk.html website.
-#
-# Copyright (c) 2009 - 2020, Intel Corporation. All rights reserved.<BR>
-#
-# SPDX-License-Identifier: BSD-2-Clause-Patent
-#
-#
-##
-
-[Defines]
- INF_VERSION = 0x00010005
- BASE_NAME = LzmaDecompressLib
- MODULE_UNI_FILE = LzmaDecompressLib.uni
- FILE_GUID = 35194660-7421-44ad-9636-e44885f092d1
- MODULE_TYPE = BASE
- VERSION_STRING = 1.0
- LIBRARY_CLASS = NULL
- CONSTRUCTOR = LzmaDecompressLibConstructor
-
-#
-# The following information is for reference only and not required by the build tools.
-#
-# VALID_ARCHITECTURES = IA32 X64 AARCH64 ARM
-#
-
-[Sources]
- LzmaDecompress.c
- Sdk/C/LzFind.c
- Sdk/C/LzmaDec.c
- Sdk/C/7zVersion.h
- Sdk/C/CpuArch.h
- Sdk/C/LzFind.h
- Sdk/C/LzHash.h
- Sdk/C/LzmaDec.h
- Sdk/C/7zTypes.h
- Sdk/C/Precomp.h
- Sdk/C/Compiler.h
- GuidedSectionExtraction.c
- UefiLzma.h
- LzmaDecompressLibInternal.h
-
-[Packages]
- MdePkg/MdePkg.dec
- MdeModulePkg/MdeModulePkg.dec
-
-[Guids]
- gLzmaCustomDecompressGuid ## PRODUCES ## UNDEFINED # specifies LZMA custom decompress algorithm.
-
-[LibraryClasses]
- BaseLib
- DebugLib
- BaseMemoryLib
- ExtractGuidedSectionLib
-
+## @file +# LzmaCustomDecompressLib produces LZMA custom decompression algorithm. +# +# It is based on the LZMA SDK 19.00. +# LZMA SDK 19.00 was placed in the public domain on 2019-02-21. +# It was released on the http://www.7-zip.org/sdk.html website. +# +# Copyright (c) 2009 - 2020, Intel Corporation. All rights reserved.<BR> +# +# SPDX-License-Identifier: BSD-2-Clause-Patent +# +# +## + +[Defines] + INF_VERSION = 0x00010005 + BASE_NAME = LzmaDecompressLib + MODULE_UNI_FILE = LzmaDecompressLib.uni + FILE_GUID = 35194660-7421-44ad-9636-e44885f092d1 + MODULE_TYPE = BASE + VERSION_STRING = 1.0 + LIBRARY_CLASS = NULL + CONSTRUCTOR = LzmaDecompressLibConstructor + +# +# The following information is for reference only and not required by the build tools. +# +# VALID_ARCHITECTURES = IA32 X64 AARCH64 ARM +# + +[Sources] + LzmaDecompress.c + Sdk/C/LzFind.c + Sdk/C/LzmaDec.c + Sdk/C/7zVersion.h + Sdk/C/CpuArch.h + Sdk/C/LzFind.h + Sdk/C/LzHash.h + Sdk/C/LzmaDec.h + Sdk/C/7zTypes.h + Sdk/C/Precomp.h + Sdk/C/Compiler.h + GuidedSectionExtraction.c + UefiLzma.h + LzmaDecompressLibInternal.h + +[Packages] + MdePkg/MdePkg.dec + MdeModulePkg/MdeModulePkg.dec + +[Guids] + gLzmaCustomDecompressGuid ## PRODUCES ## UNDEFINED # specifies LZMA custom decompress algorithm. + +[LibraryClasses] + BaseLib + DebugLib + BaseMemoryLib + ExtractGuidedSectionLib + diff --git a/MdeModulePkg/Library/LzmaCustomDecompressLib/LzmaDecompress.c b/MdeModulePkg/Library/LzmaCustomDecompressLib/LzmaDecompress.c index 18577acf38..5bfc294194 100644 --- a/MdeModulePkg/Library/LzmaCustomDecompressLib/LzmaDecompress.c +++ b/MdeModulePkg/Library/LzmaCustomDecompressLib/LzmaDecompress.c @@ -1,220 +1,220 @@ -/** @file
- LZMA Decompress interfaces
-
- Copyright (c) 2009 - 2018, Intel Corporation. All rights reserved.<BR>
- SPDX-License-Identifier: BSD-2-Clause-Patent
-
-**/
-
-#include "LzmaDecompressLibInternal.h"
-#include "Sdk/C/7zTypes.h"
-#include "Sdk/C/7zVersion.h"
-#include "Sdk/C/LzmaDec.h"
-
-#define SCRATCH_BUFFER_REQUEST_SIZE SIZE_64KB
-
-typedef struct {
- ISzAlloc Functions;
- VOID *Buffer;
- UINTN BufferSize;
-} ISzAllocWithData;
-
-/**
- Allocation routine used by LZMA decompression.
-
- @param P Pointer to the ISzAlloc instance
- @param Size The size in bytes to be allocated
-
- @return The allocated pointer address, or NULL on failure
-**/
-VOID *
-SzAlloc (
- CONST ISzAlloc *P,
- size_t Size
- )
-{
- VOID *Addr;
- ISzAllocWithData *Private;
-
- Private = (ISzAllocWithData *)P;
-
- if (Private->BufferSize >= Size) {
- Addr = Private->Buffer;
- Private->Buffer = (VOID *)((UINT8 *)Addr + Size);
- Private->BufferSize -= Size;
- return Addr;
- } else {
- ASSERT (FALSE);
- return NULL;
- }
-}
-
-/**
- Free routine used by LZMA decompression.
-
- @param P Pointer to the ISzAlloc instance
- @param Address The address to be freed
-**/
-VOID
-SzFree (
- CONST ISzAlloc *P,
- VOID *Address
- )
-{
- //
- // We use the 'scratch buffer' for allocations, so there is no free
- // operation required. The scratch buffer will be freed by the caller
- // of the decompression code.
- //
-}
-
-#define LZMA_HEADER_SIZE (LZMA_PROPS_SIZE + 8)
-
-/**
- Get the size of the uncompressed buffer by parsing EncodeData header.
-
- @param EncodedData Pointer to the compressed data.
-
- @return The size of the uncompressed buffer.
-**/
-UINT64
-GetDecodedSizeOfBuf (
- UINT8 *EncodedData
- )
-{
- UINT64 DecodedSize;
- INTN Index;
-
- /* Parse header */
- DecodedSize = 0;
- for (Index = LZMA_PROPS_SIZE + 7; Index >= LZMA_PROPS_SIZE; Index--) {
- DecodedSize = LShiftU64 (DecodedSize, 8) + EncodedData[Index];
- }
-
- return DecodedSize;
-}
-
-//
-// LZMA functions and data as defined in local LzmaDecompressLibInternal.h
-//
-
-/**
- Given a Lzma compressed source buffer, this function retrieves the size of
- the uncompressed buffer and the size of the scratch buffer required
- to decompress the compressed source buffer.
-
- Retrieves the size of the uncompressed buffer and the temporary scratch buffer
- required to decompress the buffer specified by Source and SourceSize.
- The size of the uncompressed buffer is returned in DestinationSize,
- the size of the scratch buffer is returned in ScratchSize, and RETURN_SUCCESS is returned.
- This function does not have scratch buffer available to perform a thorough
- checking of the validity of the source data. It just retrieves the "Original Size"
- field from the LZMA_HEADER_SIZE beginning bytes of the source data and output it as DestinationSize.
- And ScratchSize is specific to the decompression implementation.
-
- If SourceSize is less than LZMA_HEADER_SIZE, then ASSERT().
-
- @param Source The source buffer containing the compressed data.
- @param SourceSize The size, in bytes, of the source buffer.
- @param DestinationSize A pointer to the size, in bytes, of the uncompressed buffer
- that will be generated when the compressed buffer specified
- by Source and SourceSize is decompressed.
- @param ScratchSize A pointer to the size, in bytes, of the scratch buffer that
- is required to decompress the compressed buffer specified
- by Source and SourceSize.
-
- @retval RETURN_SUCCESS The size of the uncompressed data was returned
- in DestinationSize and the size of the scratch
- buffer was returned in ScratchSize.
-
- @retval RETURN_UNSUPPORTED DestinationSize cannot be output because the
- uncompressed buffer size (in bytes) does not fit
- in a UINT32. Output parameters have not been
- modified.
-**/
-RETURN_STATUS
-EFIAPI
-LzmaUefiDecompressGetInfo (
- IN CONST VOID *Source,
- IN UINT32 SourceSize,
- OUT UINT32 *DestinationSize,
- OUT UINT32 *ScratchSize
- )
-{
- UInt64 DecodedSize;
-
- ASSERT (SourceSize >= LZMA_HEADER_SIZE);
-
- DecodedSize = GetDecodedSizeOfBuf ((UINT8 *)Source);
- if (DecodedSize > MAX_UINT32) {
- return RETURN_UNSUPPORTED;
- }
-
- *DestinationSize = (UINT32)DecodedSize;
- *ScratchSize = SCRATCH_BUFFER_REQUEST_SIZE;
- return RETURN_SUCCESS;
-}
-
-/**
- Decompresses a Lzma compressed source buffer.
-
- Extracts decompressed data to its original form.
- If the compressed source data specified by Source is successfully decompressed
- into Destination, then RETURN_SUCCESS is returned. If the compressed source data
- specified by Source is not in a valid compressed data format,
- then RETURN_INVALID_PARAMETER is returned.
-
- @param Source The source buffer containing the compressed data.
- @param SourceSize The size of source buffer.
- @param Destination The destination buffer to store the decompressed data
- @param Scratch A temporary scratch buffer that is used to perform the decompression.
- This is an optional parameter that may be NULL if the
- required scratch buffer size is 0.
-
- @retval RETURN_SUCCESS Decompression completed successfully, and
- the uncompressed buffer is returned in Destination.
- @retval RETURN_INVALID_PARAMETER
- The source buffer specified by Source is corrupted
- (not in a valid compressed format).
-**/
-RETURN_STATUS
-EFIAPI
-LzmaUefiDecompress (
- IN CONST VOID *Source,
- IN UINTN SourceSize,
- IN OUT VOID *Destination,
- IN OUT VOID *Scratch
- )
-{
- SRes LzmaResult;
- ELzmaStatus Status;
- SizeT DecodedBufSize;
- SizeT EncodedDataSize;
- ISzAllocWithData AllocFuncs;
-
- AllocFuncs.Functions.Alloc = SzAlloc;
- AllocFuncs.Functions.Free = SzFree;
- AllocFuncs.Buffer = Scratch;
- AllocFuncs.BufferSize = SCRATCH_BUFFER_REQUEST_SIZE;
-
- DecodedBufSize = (SizeT)GetDecodedSizeOfBuf ((UINT8 *)Source);
- EncodedDataSize = (SizeT)(SourceSize - LZMA_HEADER_SIZE);
-
- LzmaResult = LzmaDecode (
- Destination,
- &DecodedBufSize,
- (Byte *)((UINT8 *)Source + LZMA_HEADER_SIZE),
- &EncodedDataSize,
- Source,
- LZMA_PROPS_SIZE,
- LZMA_FINISH_END,
- &Status,
- &(AllocFuncs.Functions)
- );
-
- if (LzmaResult == SZ_OK) {
- return RETURN_SUCCESS;
- } else {
- return RETURN_INVALID_PARAMETER;
- }
-}
+/** @file + LZMA Decompress interfaces + + Copyright (c) 2009 - 2018, Intel Corporation. All rights reserved.<BR> + SPDX-License-Identifier: BSD-2-Clause-Patent + +**/ + +#include "LzmaDecompressLibInternal.h" +#include "Sdk/C/7zTypes.h" +#include "Sdk/C/7zVersion.h" +#include "Sdk/C/LzmaDec.h" + +#define SCRATCH_BUFFER_REQUEST_SIZE SIZE_64KB + +typedef struct { + ISzAlloc Functions; + VOID *Buffer; + UINTN BufferSize; +} ISzAllocWithData; + +/** + Allocation routine used by LZMA decompression. + + @param P Pointer to the ISzAlloc instance + @param Size The size in bytes to be allocated + + @return The allocated pointer address, or NULL on failure +**/ +VOID * +SzAlloc ( + CONST ISzAlloc *P, + size_t Size + ) +{ + VOID *Addr; + ISzAllocWithData *Private; + + Private = (ISzAllocWithData *)P; + + if (Private->BufferSize >= Size) { + Addr = Private->Buffer; + Private->Buffer = (VOID *)((UINT8 *)Addr + Size); + Private->BufferSize -= Size; + return Addr; + } else { + ASSERT (FALSE); + return NULL; + } +} + +/** + Free routine used by LZMA decompression. + + @param P Pointer to the ISzAlloc instance + @param Address The address to be freed +**/ +VOID +SzFree ( + CONST ISzAlloc *P, + VOID *Address + ) +{ + // + // We use the 'scratch buffer' for allocations, so there is no free + // operation required. The scratch buffer will be freed by the caller + // of the decompression code. + // +} + +#define LZMA_HEADER_SIZE (LZMA_PROPS_SIZE + 8) + +/** + Get the size of the uncompressed buffer by parsing EncodeData header. + + @param EncodedData Pointer to the compressed data. + + @return The size of the uncompressed buffer. +**/ +UINT64 +GetDecodedSizeOfBuf ( + UINT8 *EncodedData + ) +{ + UINT64 DecodedSize; + INTN Index; + + /* Parse header */ + DecodedSize = 0; + for (Index = LZMA_PROPS_SIZE + 7; Index >= LZMA_PROPS_SIZE; Index--) { + DecodedSize = LShiftU64 (DecodedSize, 8) + EncodedData[Index]; + } + + return DecodedSize; +} + +// +// LZMA functions and data as defined in local LzmaDecompressLibInternal.h +// + +/** + Given a Lzma compressed source buffer, this function retrieves the size of + the uncompressed buffer and the size of the scratch buffer required + to decompress the compressed source buffer. + + Retrieves the size of the uncompressed buffer and the temporary scratch buffer + required to decompress the buffer specified by Source and SourceSize. + The size of the uncompressed buffer is returned in DestinationSize, + the size of the scratch buffer is returned in ScratchSize, and RETURN_SUCCESS is returned. + This function does not have scratch buffer available to perform a thorough + checking of the validity of the source data. It just retrieves the "Original Size" + field from the LZMA_HEADER_SIZE beginning bytes of the source data and output it as DestinationSize. + And ScratchSize is specific to the decompression implementation. + + If SourceSize is less than LZMA_HEADER_SIZE, then ASSERT(). + + @param Source The source buffer containing the compressed data. + @param SourceSize The size, in bytes, of the source buffer. + @param DestinationSize A pointer to the size, in bytes, of the uncompressed buffer + that will be generated when the compressed buffer specified + by Source and SourceSize is decompressed. + @param ScratchSize A pointer to the size, in bytes, of the scratch buffer that + is required to decompress the compressed buffer specified + by Source and SourceSize. + + @retval RETURN_SUCCESS The size of the uncompressed data was returned + in DestinationSize and the size of the scratch + buffer was returned in ScratchSize. + + @retval RETURN_UNSUPPORTED DestinationSize cannot be output because the + uncompressed buffer size (in bytes) does not fit + in a UINT32. Output parameters have not been + modified. +**/ +RETURN_STATUS +EFIAPI +LzmaUefiDecompressGetInfo ( + IN CONST VOID *Source, + IN UINT32 SourceSize, + OUT UINT32 *DestinationSize, + OUT UINT32 *ScratchSize + ) +{ + UInt64 DecodedSize; + + ASSERT (SourceSize >= LZMA_HEADER_SIZE); + + DecodedSize = GetDecodedSizeOfBuf ((UINT8 *)Source); + if (DecodedSize > MAX_UINT32) { + return RETURN_UNSUPPORTED; + } + + *DestinationSize = (UINT32)DecodedSize; + *ScratchSize = SCRATCH_BUFFER_REQUEST_SIZE; + return RETURN_SUCCESS; +} + +/** + Decompresses a Lzma compressed source buffer. + + Extracts decompressed data to its original form. + If the compressed source data specified by Source is successfully decompressed + into Destination, then RETURN_SUCCESS is returned. If the compressed source data + specified by Source is not in a valid compressed data format, + then RETURN_INVALID_PARAMETER is returned. + + @param Source The source buffer containing the compressed data. + @param SourceSize The size of source buffer. + @param Destination The destination buffer to store the decompressed data + @param Scratch A temporary scratch buffer that is used to perform the decompression. + This is an optional parameter that may be NULL if the + required scratch buffer size is 0. + + @retval RETURN_SUCCESS Decompression completed successfully, and + the uncompressed buffer is returned in Destination. + @retval RETURN_INVALID_PARAMETER + The source buffer specified by Source is corrupted + (not in a valid compressed format). +**/ +RETURN_STATUS +EFIAPI +LzmaUefiDecompress ( + IN CONST VOID *Source, + IN UINTN SourceSize, + IN OUT VOID *Destination, + IN OUT VOID *Scratch + ) +{ + SRes LzmaResult; + ELzmaStatus Status; + SizeT DecodedBufSize; + SizeT EncodedDataSize; + ISzAllocWithData AllocFuncs; + + AllocFuncs.Functions.Alloc = SzAlloc; + AllocFuncs.Functions.Free = SzFree; + AllocFuncs.Buffer = Scratch; + AllocFuncs.BufferSize = SCRATCH_BUFFER_REQUEST_SIZE; + + DecodedBufSize = (SizeT)GetDecodedSizeOfBuf ((UINT8 *)Source); + EncodedDataSize = (SizeT)(SourceSize - LZMA_HEADER_SIZE); + + LzmaResult = LzmaDecode ( + Destination, + &DecodedBufSize, + (Byte *)((UINT8 *)Source + LZMA_HEADER_SIZE), + &EncodedDataSize, + Source, + LZMA_PROPS_SIZE, + LZMA_FINISH_END, + &Status, + &(AllocFuncs.Functions) + ); + + if (LzmaResult == SZ_OK) { + return RETURN_SUCCESS; + } else { + return RETURN_INVALID_PARAMETER; + } +} diff --git a/MdeModulePkg/Library/LzmaCustomDecompressLib/LzmaDecompressLib.uni b/MdeModulePkg/Library/LzmaCustomDecompressLib/LzmaDecompressLib.uni index 89e20c14b0..9bf04f9483 100644 --- a/MdeModulePkg/Library/LzmaCustomDecompressLib/LzmaDecompressLib.uni +++ b/MdeModulePkg/Library/LzmaCustomDecompressLib/LzmaDecompressLib.uni @@ -1,18 +1,18 @@ -// /** @file
-// LzmaCustomDecompressLib produces LZMA custom decompression algorithm.
-//
-// It is based on the LZMA SDK 4.65.
-// LZMA SDK 4.65 was placed in the public domain on 2009-02-03.
-// It was released on the http://www.7-zip.org/sdk.html website.
-//
-// Copyright (c) 2009 - 2014, Intel Corporation. All rights reserved.<BR>
-//
-// SPDX-License-Identifier: BSD-2-Clause-Patent
-//
-// **/
-
-
-#string STR_MODULE_ABSTRACT #language en-US "LzmaCustomDecompressLib produces LZMA custom decompression algorithm"
-
-#string STR_MODULE_DESCRIPTION #language en-US "It is based on the LZMA SDK 4.65. LZMA SDK 4.65 was placed in the public domain on 2009-02-03. It was released on the website http://www.7-zip.org/sdk.html ."
-
+// /** @file +// LzmaCustomDecompressLib produces LZMA custom decompression algorithm. +// +// It is based on the LZMA SDK 4.65. +// LZMA SDK 4.65 was placed in the public domain on 2009-02-03. +// It was released on the http://www.7-zip.org/sdk.html website. +// +// Copyright (c) 2009 - 2014, Intel Corporation. All rights reserved.<BR> +// +// SPDX-License-Identifier: BSD-2-Clause-Patent +// +// **/ + + +#string STR_MODULE_ABSTRACT #language en-US "LzmaCustomDecompressLib produces LZMA custom decompression algorithm" + +#string STR_MODULE_DESCRIPTION #language en-US "It is based on the LZMA SDK 4.65. LZMA SDK 4.65 was placed in the public domain on 2009-02-03. It was released on the website http://www.7-zip.org/sdk.html ." + diff --git a/MdeModulePkg/Library/LzmaCustomDecompressLib/LzmaDecompressLibInternal.h b/MdeModulePkg/Library/LzmaCustomDecompressLib/LzmaDecompressLibInternal.h index 1dc54eb930..16b263a9f8 100644 --- a/MdeModulePkg/Library/LzmaCustomDecompressLib/LzmaDecompressLibInternal.h +++ b/MdeModulePkg/Library/LzmaCustomDecompressLib/LzmaDecompressLibInternal.h @@ -1,94 +1,94 @@ -/** @file
- LZMA Decompress Library internal header file declares Lzma decompress interfaces.
-
- Copyright (c) 2009 - 2018, Intel Corporation. All rights reserved.<BR>
- SPDX-License-Identifier: BSD-2-Clause-Patent
-
-**/
-
-#ifndef __LZMADECOMPRESSLIB_INTERNAL_H__
-#define __LZMADECOMPRESSLIB_INTERNAL_H__
-
-#include <Base.h>
-#include <PiPei.h>
-#include <Library/BaseLib.h>
-#include <Library/BaseMemoryLib.h>
-#include <Library/DebugLib.h>
-#include <Library/ExtractGuidedSectionLib.h>
-#include <Guid/LzmaDecompress.h>
-
-/**
- Given a Lzma compressed source buffer, this function retrieves the size of
- the uncompressed buffer and the size of the scratch buffer required
- to decompress the compressed source buffer.
-
- Retrieves the size of the uncompressed buffer and the temporary scratch buffer
- required to decompress the buffer specified by Source and SourceSize.
- The size of the uncompressed buffer is returned in DestinationSize,
- the size of the scratch buffer is returned in ScratchSize, and RETURN_SUCCESS is returned.
- This function does not have scratch buffer available to perform a thorough
- checking of the validity of the source data. It just retrieves the "Original Size"
- field from the LZMA_HEADER_SIZE beginning bytes of the source data and output it as DestinationSize.
- And ScratchSize is specific to the decompression implementation.
-
- If SourceSize is less than LZMA_HEADER_SIZE, then ASSERT().
-
- @param Source The source buffer containing the compressed data.
- @param SourceSize The size, in bytes, of the source buffer.
- @param DestinationSize A pointer to the size, in bytes, of the uncompressed buffer
- that will be generated when the compressed buffer specified
- by Source and SourceSize is decompressed.
- @param ScratchSize A pointer to the size, in bytes, of the scratch buffer that
- is required to decompress the compressed buffer specified
- by Source and SourceSize.
-
- @retval RETURN_SUCCESS The size of the uncompressed data was returned
- in DestinationSize and the size of the scratch
- buffer was returned in ScratchSize.
-
- @retval RETURN_UNSUPPORTED DestinationSize cannot be output because the
- uncompressed buffer size (in bytes) does not fit
- in a UINT32. Output parameters have not been
- modified.
-**/
-RETURN_STATUS
-EFIAPI
-LzmaUefiDecompressGetInfo (
- IN CONST VOID *Source,
- IN UINT32 SourceSize,
- OUT UINT32 *DestinationSize,
- OUT UINT32 *ScratchSize
- );
-
-/**
- Decompresses a Lzma compressed source buffer.
-
- Extracts decompressed data to its original form.
- If the compressed source data specified by Source is successfully decompressed
- into Destination, then RETURN_SUCCESS is returned. If the compressed source data
- specified by Source is not in a valid compressed data format,
- then RETURN_INVALID_PARAMETER is returned.
-
- @param Source The source buffer containing the compressed data.
- @param SourceSize The size of source buffer.
- @param Destination The destination buffer to store the decompressed data
- @param Scratch A temporary scratch buffer that is used to perform the decompression.
- This is an optional parameter that may be NULL if the
- required scratch buffer size is 0.
-
- @retval RETURN_SUCCESS Decompression completed successfully, and
- the uncompressed buffer is returned in Destination.
- @retval RETURN_INVALID_PARAMETER
- The source buffer specified by Source is corrupted
- (not in a valid compressed format).
-**/
-RETURN_STATUS
-EFIAPI
-LzmaUefiDecompress (
- IN CONST VOID *Source,
- IN UINTN SourceSize,
- IN OUT VOID *Destination,
- IN OUT VOID *Scratch
- );
-
-#endif
+/** @file + LZMA Decompress Library internal header file declares Lzma decompress interfaces. + + Copyright (c) 2009 - 2018, Intel Corporation. All rights reserved.<BR> + SPDX-License-Identifier: BSD-2-Clause-Patent + +**/ + +#ifndef __LZMADECOMPRESSLIB_INTERNAL_H__ +#define __LZMADECOMPRESSLIB_INTERNAL_H__ + +#include <Base.h> +#include <PiPei.h> +#include <Library/BaseLib.h> +#include <Library/BaseMemoryLib.h> +#include <Library/DebugLib.h> +#include <Library/ExtractGuidedSectionLib.h> +#include <Guid/LzmaDecompress.h> + +/** + Given a Lzma compressed source buffer, this function retrieves the size of + the uncompressed buffer and the size of the scratch buffer required + to decompress the compressed source buffer. + + Retrieves the size of the uncompressed buffer and the temporary scratch buffer + required to decompress the buffer specified by Source and SourceSize. + The size of the uncompressed buffer is returned in DestinationSize, + the size of the scratch buffer is returned in ScratchSize, and RETURN_SUCCESS is returned. + This function does not have scratch buffer available to perform a thorough + checking of the validity of the source data. It just retrieves the "Original Size" + field from the LZMA_HEADER_SIZE beginning bytes of the source data and output it as DestinationSize. + And ScratchSize is specific to the decompression implementation. + + If SourceSize is less than LZMA_HEADER_SIZE, then ASSERT(). + + @param Source The source buffer containing the compressed data. + @param SourceSize The size, in bytes, of the source buffer. + @param DestinationSize A pointer to the size, in bytes, of the uncompressed buffer + that will be generated when the compressed buffer specified + by Source and SourceSize is decompressed. + @param ScratchSize A pointer to the size, in bytes, of the scratch buffer that + is required to decompress the compressed buffer specified + by Source and SourceSize. + + @retval RETURN_SUCCESS The size of the uncompressed data was returned + in DestinationSize and the size of the scratch + buffer was returned in ScratchSize. + + @retval RETURN_UNSUPPORTED DestinationSize cannot be output because the + uncompressed buffer size (in bytes) does not fit + in a UINT32. Output parameters have not been + modified. +**/ +RETURN_STATUS +EFIAPI +LzmaUefiDecompressGetInfo ( + IN CONST VOID *Source, + IN UINT32 SourceSize, + OUT UINT32 *DestinationSize, + OUT UINT32 *ScratchSize + ); + +/** + Decompresses a Lzma compressed source buffer. + + Extracts decompressed data to its original form. + If the compressed source data specified by Source is successfully decompressed + into Destination, then RETURN_SUCCESS is returned. If the compressed source data + specified by Source is not in a valid compressed data format, + then RETURN_INVALID_PARAMETER is returned. + + @param Source The source buffer containing the compressed data. + @param SourceSize The size of source buffer. + @param Destination The destination buffer to store the decompressed data + @param Scratch A temporary scratch buffer that is used to perform the decompression. + This is an optional parameter that may be NULL if the + required scratch buffer size is 0. + + @retval RETURN_SUCCESS Decompression completed successfully, and + the uncompressed buffer is returned in Destination. + @retval RETURN_INVALID_PARAMETER + The source buffer specified by Source is corrupted + (not in a valid compressed format). +**/ +RETURN_STATUS +EFIAPI +LzmaUefiDecompress ( + IN CONST VOID *Source, + IN UINTN SourceSize, + IN OUT VOID *Destination, + IN OUT VOID *Scratch + ); + +#endif diff --git a/MdeModulePkg/Library/LzmaCustomDecompressLib/Sdk/C/7zTypes.h b/MdeModulePkg/Library/LzmaCustomDecompressLib/Sdk/C/7zTypes.h index 502a32e4da..dafba321d5 100644 --- a/MdeModulePkg/Library/LzmaCustomDecompressLib/Sdk/C/7zTypes.h +++ b/MdeModulePkg/Library/LzmaCustomDecompressLib/Sdk/C/7zTypes.h @@ -1,448 +1,448 @@ -/* 7zTypes.h -- Basic types
-2018-08-04 : Igor Pavlov : Public domain */
-
-#ifndef __7Z_TYPES_H
-#define __7Z_TYPES_H
-
-#ifdef _WIN32
-/* #include <windows.h> */
-#endif
-
-#ifdef EFIAPI
- #include "UefiLzma.h"
-#else
- #include <stddef.h>
-#endif
-
-#ifndef EXTERN_C_BEGIN
- #ifdef __cplusplus
-#define EXTERN_C_BEGIN extern "C" {
-#define EXTERN_C_END }
- #else
-#define EXTERN_C_BEGIN
-#define EXTERN_C_END
- #endif
-#endif
-
-EXTERN_C_BEGIN
-
-#define SZ_OK 0
-
-#define SZ_ERROR_DATA 1
-#define SZ_ERROR_MEM 2
-#define SZ_ERROR_CRC 3
-#define SZ_ERROR_UNSUPPORTED 4
-#define SZ_ERROR_PARAM 5
-#define SZ_ERROR_INPUT_EOF 6
-#define SZ_ERROR_OUTPUT_EOF 7
-#define SZ_ERROR_READ 8
-#define SZ_ERROR_WRITE 9
-#define SZ_ERROR_PROGRESS 10
-#define SZ_ERROR_FAIL 11
-#define SZ_ERROR_THREAD 12
-
-#define SZ_ERROR_ARCHIVE 16
-#define SZ_ERROR_NO_ARCHIVE 17
-
-typedef int SRes;
-
-#ifdef _WIN32
-
-/* typedef DWORD WRes; */
-typedef unsigned WRes;
-#define MY_SRes_HRESULT_FROM_WRes(x) HRESULT_FROM_WIN32(x)
-
-#else
-
-typedef int WRes;
-#define MY__FACILITY_WIN32 7
-#define MY__FACILITY__WRes MY__FACILITY_WIN32
-#define MY_SRes_HRESULT_FROM_WRes(x) ((HRESULT)(x) <= 0 ? ((HRESULT)(x)) : ((HRESULT) (((x) & 0x0000FFFF) | (MY__FACILITY__WRes << 16) | 0x80000000)))
-
-#endif
-
-#ifndef RINOK
-#define RINOK(x) { int __result__ = (x); if (__result__ != 0) return __result__; }
-#endif
-
-typedef unsigned char Byte;
-typedef short Int16;
-typedef unsigned short UInt16;
-
-#ifdef _LZMA_UINT32_IS_ULONG
-typedef long Int32;
-typedef unsigned long UInt32;
-#else
-typedef int Int32;
-typedef unsigned int UInt32;
-#endif
-
-#ifdef _SZ_NO_INT_64
-
-/* define _SZ_NO_INT_64, if your compiler doesn't support 64-bit integers.
- NOTES: Some code will work incorrectly in that case! */
-
-typedef long Int64;
-typedef unsigned long UInt64;
-
-#else
-
- #if defined (_MSC_VER) || defined (__BORLANDC__)
-typedef __int64 Int64;
-typedef unsigned __int64 UInt64;
-#define UINT64_CONST(n) n
- #else
-typedef long long int Int64;
-typedef unsigned long long int UInt64;
-#define UINT64_CONST(n) n ## ULL
- #endif
-
-#endif
-
-#ifdef _LZMA_NO_SYSTEM_SIZE_T
-typedef UInt32 SizeT;
-#else
-typedef size_t SizeT;
-#endif
-
-typedef int BoolInt;
-/* typedef BoolInt Bool; */
-#define True 1
-#define False 0
-
-#ifdef _WIN32
-#define MY_STD_CALL __stdcall
-#else
-#define MY_STD_CALL
-#endif
-
-#if defined (_MSC_VER) && !defined (__clang__)
-
- #if _MSC_VER >= 1300
-#define MY_NO_INLINE __declspec(noinline)
- #else
-#define MY_NO_INLINE
- #endif
-
-#define MY_FORCE_INLINE __forceinline
-
-#define MY_CDECL __cdecl
-#define MY_FAST_CALL __fastcall
-
-#else
-
-#define MY_NO_INLINE
-#define MY_FORCE_INLINE
-#define MY_CDECL
-#define MY_FAST_CALL
-
-/* inline keyword : for C++ / C99 */
-
-/* GCC, clang: */
-
-/*
-#if defined (__GNUC__) && (__GNUC__ >= 4)
-#define MY_FORCE_INLINE __attribute__((always_inline))
-#define MY_NO_INLINE __attribute__((noinline))
-#endif
-*/
-
-#endif
-
-/* The following interfaces use first parameter as pointer to structure */
-
-typedef struct IByteIn IByteIn;
-struct IByteIn {
- Byte (*Read)(
- const IByteIn *p
- ); /* reads one byte, returns 0 in case of EOF or error */
-};
-
-#define IByteIn_Read(p) (p)->Read(p)
-
-typedef struct IByteOut IByteOut;
-struct IByteOut {
- void (*Write)(
- const IByteOut *p,
- Byte b
- );
-};
-
-#define IByteOut_Write(p, b) (p)->Write(p, b)
-
-typedef struct ISeqInStream ISeqInStream;
-struct ISeqInStream {
- SRes (*Read)(
- const ISeqInStream *p,
- void *buf,
- size_t *size
- );
-
- /* if (input(*size) != 0 && output(*size) == 0) means end_of_stream.
- (output(*size) < input(*size)) is allowed */
-};
-
-#define ISeqInStream_Read(p, buf, size) (p)->Read(p, buf, size)
-
-/* it can return SZ_ERROR_INPUT_EOF */
-SRes
-SeqInStream_Read (
- const ISeqInStream *stream,
- void *buf,
- size_t size
- );
-
-SRes
-SeqInStream_Read2 (
- const ISeqInStream *stream,
- void *buf,
- size_t size,
- SRes errorType
- );
-
-SRes
-SeqInStream_ReadByte (
- const ISeqInStream *stream,
- Byte *buf
- );
-
-typedef struct ISeqOutStream ISeqOutStream;
-struct ISeqOutStream {
- size_t (*Write)(
- const ISeqOutStream *p,
- const void *buf,
- size_t size
- );
-
- /* Returns: result - the number of actually written bytes.
- (result < size) means error */
-};
-
-#define ISeqOutStream_Write(p, buf, size) (p)->Write(p, buf, size)
-
-typedef enum {
- SZ_SEEK_SET = 0,
- SZ_SEEK_CUR = 1,
- SZ_SEEK_END = 2
-} ESzSeek;
-
-typedef struct ISeekInStream ISeekInStream;
-struct ISeekInStream {
- SRes (*Read)(
- const ISeekInStream *p,
- void *buf,
- size_t *size
- ); /* same as ISeqInStream::Read */
- SRes (*Seek)(
- const ISeekInStream *p,
- Int64 *pos,
- ESzSeek origin
- );
-};
-
-#define ISeekInStream_Read(p, buf, size) (p)->Read(p, buf, size)
-#define ISeekInStream_Seek(p, pos, origin) (p)->Seek(p, pos, origin)
-
-typedef struct ILookInStream ILookInStream;
-struct ILookInStream {
- SRes (*Look)(
- const ILookInStream *p,
- const void **buf,
- size_t *size
- );
-
- /* if (input(*size) != 0 && output(*size) == 0) means end_of_stream.
- (output(*size) > input(*size)) is not allowed
- (output(*size) < input(*size)) is allowed */
- SRes (*Skip)(
- const ILookInStream *p,
- size_t offset
- );
- /* offset must be <= output(*size) of Look */
-
- SRes (*Read)(
- const ILookInStream *p,
- void *buf,
- size_t *size
- );
- /* reads directly (without buffer). It's same as ISeqInStream::Read */
- SRes (*Seek)(
- const ILookInStream *p,
- Int64 *pos,
- ESzSeek origin
- );
-};
-
-#define ILookInStream_Look(p, buf, size) (p)->Look(p, buf, size)
-#define ILookInStream_Skip(p, offset) (p)->Skip(p, offset)
-#define ILookInStream_Read(p, buf, size) (p)->Read(p, buf, size)
-#define ILookInStream_Seek(p, pos, origin) (p)->Seek(p, pos, origin)
-
-SRes
-LookInStream_LookRead (
- const ILookInStream *stream,
- void *buf,
- size_t *size
- );
-
-SRes
-LookInStream_SeekTo (
- const ILookInStream *stream,
- UInt64 offset
- );
-
-/* reads via ILookInStream::Read */
-SRes
-LookInStream_Read2 (
- const ILookInStream *stream,
- void *buf,
- size_t size,
- SRes errorType
- );
-
-SRes
-LookInStream_Read (
- const ILookInStream *stream,
- void *buf,
- size_t size
- );
-
-typedef struct {
- ILookInStream vt;
- const ISeekInStream *realStream;
-
- size_t pos;
- size_t size; /* it's data size */
-
- /* the following variables must be set outside */
- Byte *buf;
- size_t bufSize;
-} CLookToRead2;
-
-void
-LookToRead2_CreateVTable (
- CLookToRead2 *p,
- int lookahead
- );
-
-#define LookToRead2_Init(p) { (p)->pos = (p)->size = 0; }
-
-typedef struct {
- ISeqInStream vt;
- const ILookInStream *realStream;
-} CSecToLook;
-
-void
-SecToLook_CreateVTable (
- CSecToLook *p
- );
-
-typedef struct {
- ISeqInStream vt;
- const ILookInStream *realStream;
-} CSecToRead;
-
-void
-SecToRead_CreateVTable (
- CSecToRead *p
- );
-
-typedef struct ICompressProgress ICompressProgress;
-
-struct ICompressProgress {
- SRes (*Progress)(
- const ICompressProgress *p,
- UInt64 inSize,
- UInt64 outSize
- );
-
- /* Returns: result. (result != SZ_OK) means break.
- Value (UInt64)(Int64)-1 for size means unknown value. */
-};
-
-#define ICompressProgress_Progress(p, inSize, outSize) (p)->Progress(p, inSize, outSize)
-
-typedef struct ISzAlloc ISzAlloc;
-typedef const ISzAlloc *ISzAllocPtr;
-
-struct ISzAlloc {
- void *(*Alloc)(
- ISzAllocPtr p,
- size_t size
- );
- void (*Free)(
- ISzAllocPtr p,
- void *address
- ); /* address can be 0 */
-};
-
-#define ISzAlloc_Alloc(p, size) (p)->Alloc(p, size)
-#define ISzAlloc_Free(p, a) (p)->Free(p, a)
-
-/* deprecated */
-#define IAlloc_Alloc(p, size) ISzAlloc_Alloc(p, size)
-#define IAlloc_Free(p, a) ISzAlloc_Free(p, a)
-
-#ifndef MY_offsetof
- #ifdef offsetof
-#define MY_offsetof(type, m) offsetof(type, m)
-
-/*
-#define MY_offsetof(type, m) FIELD_OFFSET(type, m)
-*/
- #else
-#define MY_offsetof(type, m) ((size_t)&(((type *)0)->m))
- #endif
-#endif
-
-#ifndef MY_container_of
-
-/*
-#define MY_container_of(ptr, type, m) container_of(ptr, type, m)
-#define MY_container_of(ptr, type, m) CONTAINING_RECORD(ptr, type, m)
-#define MY_container_of(ptr, type, m) ((type *)((char *)(ptr) - offsetof(type, m)))
-#define MY_container_of(ptr, type, m) (&((type *)0)->m == (ptr), ((type *)(((char *)(ptr)) - MY_offsetof(type, m))))
-*/
-
-/*
- GCC shows warning: "perhaps the 'offsetof' macro was used incorrectly"
- GCC 3.4.4 : classes with constructor
- GCC 4.8.1 : classes with non-public variable members"
-*/
-
-#define MY_container_of(ptr, type, m) ((type *)((char *)(1 ? (ptr) : &((type *)0)->m) - MY_offsetof(type, m)))
-
-#endif
-
-#define CONTAINER_FROM_VTBL_SIMPLE(ptr, type, m) ((type *)(ptr))
-
-/*
-#define CONTAINER_FROM_VTBL(ptr, type, m) CONTAINER_FROM_VTBL_SIMPLE(ptr, type, m)
-*/
-#define CONTAINER_FROM_VTBL(ptr, type, m) MY_container_of(ptr, type, m)
-
-#define CONTAINER_FROM_VTBL_CLS(ptr, type, m) CONTAINER_FROM_VTBL_SIMPLE(ptr, type, m)
-
-/*
-#define CONTAINER_FROM_VTBL_CLS(ptr, type, m) CONTAINER_FROM_VTBL(ptr, type, m)
-*/
-
-#ifdef _WIN32
-
-#define CHAR_PATH_SEPARATOR '\\'
-#define WCHAR_PATH_SEPARATOR L'\\'
-#define STRING_PATH_SEPARATOR "\\"
-#define WSTRING_PATH_SEPARATOR L"\\"
-
-#else
-
-#define CHAR_PATH_SEPARATOR '/'
-#define WCHAR_PATH_SEPARATOR L'/'
-#define STRING_PATH_SEPARATOR "/"
-#define WSTRING_PATH_SEPARATOR L"/"
-
-#endif
-
-EXTERN_C_END
-
-#endif
+/* 7zTypes.h -- Basic types +2018-08-04 : Igor Pavlov : Public domain */ + +#ifndef __7Z_TYPES_H +#define __7Z_TYPES_H + +#ifdef _WIN32 +/* #include <windows.h> */ +#endif + +#ifdef EFIAPI + #include "UefiLzma.h" +#else + #include <stddef.h> +#endif + +#ifndef EXTERN_C_BEGIN + #ifdef __cplusplus +#define EXTERN_C_BEGIN extern "C" { +#define EXTERN_C_END } + #else +#define EXTERN_C_BEGIN +#define EXTERN_C_END + #endif +#endif + +EXTERN_C_BEGIN + +#define SZ_OK 0 + +#define SZ_ERROR_DATA 1 +#define SZ_ERROR_MEM 2 +#define SZ_ERROR_CRC 3 +#define SZ_ERROR_UNSUPPORTED 4 +#define SZ_ERROR_PARAM 5 +#define SZ_ERROR_INPUT_EOF 6 +#define SZ_ERROR_OUTPUT_EOF 7 +#define SZ_ERROR_READ 8 +#define SZ_ERROR_WRITE 9 +#define SZ_ERROR_PROGRESS 10 +#define SZ_ERROR_FAIL 11 +#define SZ_ERROR_THREAD 12 + +#define SZ_ERROR_ARCHIVE 16 +#define SZ_ERROR_NO_ARCHIVE 17 + +typedef int SRes; + +#ifdef _WIN32 + +/* typedef DWORD WRes; */ +typedef unsigned WRes; +#define MY_SRes_HRESULT_FROM_WRes(x) HRESULT_FROM_WIN32(x) + +#else + +typedef int WRes; +#define MY__FACILITY_WIN32 7 +#define MY__FACILITY__WRes MY__FACILITY_WIN32 +#define MY_SRes_HRESULT_FROM_WRes(x) ((HRESULT)(x) <= 0 ? ((HRESULT)(x)) : ((HRESULT) (((x) & 0x0000FFFF) | (MY__FACILITY__WRes << 16) | 0x80000000))) + +#endif + +#ifndef RINOK +#define RINOK(x) { int __result__ = (x); if (__result__ != 0) return __result__; } +#endif + +typedef unsigned char Byte; +typedef short Int16; +typedef unsigned short UInt16; + +#ifdef _LZMA_UINT32_IS_ULONG +typedef long Int32; +typedef unsigned long UInt32; +#else +typedef int Int32; +typedef unsigned int UInt32; +#endif + +#ifdef _SZ_NO_INT_64 + +/* define _SZ_NO_INT_64, if your compiler doesn't support 64-bit integers. + NOTES: Some code will work incorrectly in that case! */ + +typedef long Int64; +typedef unsigned long UInt64; + +#else + + #if defined (_MSC_VER) || defined (__BORLANDC__) +typedef __int64 Int64; +typedef unsigned __int64 UInt64; +#define UINT64_CONST(n) n + #else +typedef long long int Int64; +typedef unsigned long long int UInt64; +#define UINT64_CONST(n) n ## ULL + #endif + +#endif + +#ifdef _LZMA_NO_SYSTEM_SIZE_T +typedef UInt32 SizeT; +#else +typedef size_t SizeT; +#endif + +typedef int BoolInt; +/* typedef BoolInt Bool; */ +#define True 1 +#define False 0 + +#ifdef _WIN32 +#define MY_STD_CALL __stdcall +#else +#define MY_STD_CALL +#endif + +#if defined (_MSC_VER) && !defined (__clang__) + + #if _MSC_VER >= 1300 +#define MY_NO_INLINE __declspec(noinline) + #else +#define MY_NO_INLINE + #endif + +#define MY_FORCE_INLINE __forceinline + +#define MY_CDECL __cdecl +#define MY_FAST_CALL __fastcall + +#else + +#define MY_NO_INLINE +#define MY_FORCE_INLINE +#define MY_CDECL +#define MY_FAST_CALL + +/* inline keyword : for C++ / C99 */ + +/* GCC, clang: */ + +/* +#if defined (__GNUC__) && (__GNUC__ >= 4) +#define MY_FORCE_INLINE __attribute__((always_inline)) +#define MY_NO_INLINE __attribute__((noinline)) +#endif +*/ + +#endif + +/* The following interfaces use first parameter as pointer to structure */ + +typedef struct IByteIn IByteIn; +struct IByteIn { + Byte (*Read)( + const IByteIn *p + ); /* reads one byte, returns 0 in case of EOF or error */ +}; + +#define IByteIn_Read(p) (p)->Read(p) + +typedef struct IByteOut IByteOut; +struct IByteOut { + void (*Write)( + const IByteOut *p, + Byte b + ); +}; + +#define IByteOut_Write(p, b) (p)->Write(p, b) + +typedef struct ISeqInStream ISeqInStream; +struct ISeqInStream { + SRes (*Read)( + const ISeqInStream *p, + void *buf, + size_t *size + ); + + /* if (input(*size) != 0 && output(*size) == 0) means end_of_stream. + (output(*size) < input(*size)) is allowed */ +}; + +#define ISeqInStream_Read(p, buf, size) (p)->Read(p, buf, size) + +/* it can return SZ_ERROR_INPUT_EOF */ +SRes +SeqInStream_Read ( + const ISeqInStream *stream, + void *buf, + size_t size + ); + +SRes +SeqInStream_Read2 ( + const ISeqInStream *stream, + void *buf, + size_t size, + SRes errorType + ); + +SRes +SeqInStream_ReadByte ( + const ISeqInStream *stream, + Byte *buf + ); + +typedef struct ISeqOutStream ISeqOutStream; +struct ISeqOutStream { + size_t (*Write)( + const ISeqOutStream *p, + const void *buf, + size_t size + ); + + /* Returns: result - the number of actually written bytes. + (result < size) means error */ +}; + +#define ISeqOutStream_Write(p, buf, size) (p)->Write(p, buf, size) + +typedef enum { + SZ_SEEK_SET = 0, + SZ_SEEK_CUR = 1, + SZ_SEEK_END = 2 +} ESzSeek; + +typedef struct ISeekInStream ISeekInStream; +struct ISeekInStream { + SRes (*Read)( + const ISeekInStream *p, + void *buf, + size_t *size + ); /* same as ISeqInStream::Read */ + SRes (*Seek)( + const ISeekInStream *p, + Int64 *pos, + ESzSeek origin + ); +}; + +#define ISeekInStream_Read(p, buf, size) (p)->Read(p, buf, size) +#define ISeekInStream_Seek(p, pos, origin) (p)->Seek(p, pos, origin) + +typedef struct ILookInStream ILookInStream; +struct ILookInStream { + SRes (*Look)( + const ILookInStream *p, + const void **buf, + size_t *size + ); + + /* if (input(*size) != 0 && output(*size) == 0) means end_of_stream. + (output(*size) > input(*size)) is not allowed + (output(*size) < input(*size)) is allowed */ + SRes (*Skip)( + const ILookInStream *p, + size_t offset + ); + /* offset must be <= output(*size) of Look */ + + SRes (*Read)( + const ILookInStream *p, + void *buf, + size_t *size + ); + /* reads directly (without buffer). It's same as ISeqInStream::Read */ + SRes (*Seek)( + const ILookInStream *p, + Int64 *pos, + ESzSeek origin + ); +}; + +#define ILookInStream_Look(p, buf, size) (p)->Look(p, buf, size) +#define ILookInStream_Skip(p, offset) (p)->Skip(p, offset) +#define ILookInStream_Read(p, buf, size) (p)->Read(p, buf, size) +#define ILookInStream_Seek(p, pos, origin) (p)->Seek(p, pos, origin) + +SRes +LookInStream_LookRead ( + const ILookInStream *stream, + void *buf, + size_t *size + ); + +SRes +LookInStream_SeekTo ( + const ILookInStream *stream, + UInt64 offset + ); + +/* reads via ILookInStream::Read */ +SRes +LookInStream_Read2 ( + const ILookInStream *stream, + void *buf, + size_t size, + SRes errorType + ); + +SRes +LookInStream_Read ( + const ILookInStream *stream, + void *buf, + size_t size + ); + +typedef struct { + ILookInStream vt; + const ISeekInStream *realStream; + + size_t pos; + size_t size; /* it's data size */ + + /* the following variables must be set outside */ + Byte *buf; + size_t bufSize; +} CLookToRead2; + +void +LookToRead2_CreateVTable ( + CLookToRead2 *p, + int lookahead + ); + +#define LookToRead2_Init(p) { (p)->pos = (p)->size = 0; } + +typedef struct { + ISeqInStream vt; + const ILookInStream *realStream; +} CSecToLook; + +void +SecToLook_CreateVTable ( + CSecToLook *p + ); + +typedef struct { + ISeqInStream vt; + const ILookInStream *realStream; +} CSecToRead; + +void +SecToRead_CreateVTable ( + CSecToRead *p + ); + +typedef struct ICompressProgress ICompressProgress; + +struct ICompressProgress { + SRes (*Progress)( + const ICompressProgress *p, + UInt64 inSize, + UInt64 outSize + ); + + /* Returns: result. (result != SZ_OK) means break. + Value (UInt64)(Int64)-1 for size means unknown value. */ +}; + +#define ICompressProgress_Progress(p, inSize, outSize) (p)->Progress(p, inSize, outSize) + +typedef struct ISzAlloc ISzAlloc; +typedef const ISzAlloc *ISzAllocPtr; + +struct ISzAlloc { + void *(*Alloc)( + ISzAllocPtr p, + size_t size + ); + void (*Free)( + ISzAllocPtr p, + void *address + ); /* address can be 0 */ +}; + +#define ISzAlloc_Alloc(p, size) (p)->Alloc(p, size) +#define ISzAlloc_Free(p, a) (p)->Free(p, a) + +/* deprecated */ +#define IAlloc_Alloc(p, size) ISzAlloc_Alloc(p, size) +#define IAlloc_Free(p, a) ISzAlloc_Free(p, a) + +#ifndef MY_offsetof + #ifdef offsetof +#define MY_offsetof(type, m) offsetof(type, m) + +/* +#define MY_offsetof(type, m) FIELD_OFFSET(type, m) +*/ + #else +#define MY_offsetof(type, m) ((size_t)&(((type *)0)->m)) + #endif +#endif + +#ifndef MY_container_of + +/* +#define MY_container_of(ptr, type, m) container_of(ptr, type, m) +#define MY_container_of(ptr, type, m) CONTAINING_RECORD(ptr, type, m) +#define MY_container_of(ptr, type, m) ((type *)((char *)(ptr) - offsetof(type, m))) +#define MY_container_of(ptr, type, m) (&((type *)0)->m == (ptr), ((type *)(((char *)(ptr)) - MY_offsetof(type, m)))) +*/ + +/* + GCC shows warning: "perhaps the 'offsetof' macro was used incorrectly" + GCC 3.4.4 : classes with constructor + GCC 4.8.1 : classes with non-public variable members" +*/ + +#define MY_container_of(ptr, type, m) ((type *)((char *)(1 ? (ptr) : &((type *)0)->m) - MY_offsetof(type, m))) + +#endif + +#define CONTAINER_FROM_VTBL_SIMPLE(ptr, type, m) ((type *)(ptr)) + +/* +#define CONTAINER_FROM_VTBL(ptr, type, m) CONTAINER_FROM_VTBL_SIMPLE(ptr, type, m) +*/ +#define CONTAINER_FROM_VTBL(ptr, type, m) MY_container_of(ptr, type, m) + +#define CONTAINER_FROM_VTBL_CLS(ptr, type, m) CONTAINER_FROM_VTBL_SIMPLE(ptr, type, m) + +/* +#define CONTAINER_FROM_VTBL_CLS(ptr, type, m) CONTAINER_FROM_VTBL(ptr, type, m) +*/ + +#ifdef _WIN32 + +#define CHAR_PATH_SEPARATOR '\\' +#define WCHAR_PATH_SEPARATOR L'\\' +#define STRING_PATH_SEPARATOR "\\" +#define WSTRING_PATH_SEPARATOR L"\\" + +#else + +#define CHAR_PATH_SEPARATOR '/' +#define WCHAR_PATH_SEPARATOR L'/' +#define STRING_PATH_SEPARATOR "/" +#define WSTRING_PATH_SEPARATOR L"/" + +#endif + +EXTERN_C_END + +#endif diff --git a/MdeModulePkg/Library/LzmaCustomDecompressLib/Sdk/C/7zVersion.h b/MdeModulePkg/Library/LzmaCustomDecompressLib/Sdk/C/7zVersion.h index a45aa2008f..58e42c5bf6 100644 --- a/MdeModulePkg/Library/LzmaCustomDecompressLib/Sdk/C/7zVersion.h +++ b/MdeModulePkg/Library/LzmaCustomDecompressLib/Sdk/C/7zVersion.h @@ -1,27 +1,27 @@ -#define MY_VER_MAJOR 19
-#define MY_VER_MINOR 00
-#define MY_VER_BUILD 0
-#define MY_VERSION_NUMBERS "19.00"
-#define MY_VERSION MY_VERSION_NUMBERS
-
-#ifdef MY_CPU_NAME
-#define MY_VERSION_CPU MY_VERSION " (" MY_CPU_NAME ")"
-#else
-#define MY_VERSION_CPU MY_VERSION
-#endif
-
-#define MY_DATE "2019-02-21"
-#undef MY_COPYRIGHT
-#undef MY_VERSION_COPYRIGHT_DATE
-#define MY_AUTHOR_NAME "Igor Pavlov"
-#define MY_COPYRIGHT_PD "Igor Pavlov : Public domain"
-#define MY_COPYRIGHT_CR "Copyright (c) 1999-2018 Igor Pavlov"
-
-#ifdef USE_COPYRIGHT_CR
-#define MY_COPYRIGHT MY_COPYRIGHT_CR
-#else
-#define MY_COPYRIGHT MY_COPYRIGHT_PD
-#endif
-
-#define MY_COPYRIGHT_DATE MY_COPYRIGHT " : " MY_DATE
-#define MY_VERSION_COPYRIGHT_DATE MY_VERSION_CPU " : " MY_COPYRIGHT " : " MY_DATE
+#define MY_VER_MAJOR 19 +#define MY_VER_MINOR 00 +#define MY_VER_BUILD 0 +#define MY_VERSION_NUMBERS "19.00" +#define MY_VERSION MY_VERSION_NUMBERS + +#ifdef MY_CPU_NAME +#define MY_VERSION_CPU MY_VERSION " (" MY_CPU_NAME ")" +#else +#define MY_VERSION_CPU MY_VERSION +#endif + +#define MY_DATE "2019-02-21" +#undef MY_COPYRIGHT +#undef MY_VERSION_COPYRIGHT_DATE +#define MY_AUTHOR_NAME "Igor Pavlov" +#define MY_COPYRIGHT_PD "Igor Pavlov : Public domain" +#define MY_COPYRIGHT_CR "Copyright (c) 1999-2018 Igor Pavlov" + +#ifdef USE_COPYRIGHT_CR +#define MY_COPYRIGHT MY_COPYRIGHT_CR +#else +#define MY_COPYRIGHT MY_COPYRIGHT_PD +#endif + +#define MY_COPYRIGHT_DATE MY_COPYRIGHT " : " MY_DATE +#define MY_VERSION_COPYRIGHT_DATE MY_VERSION_CPU " : " MY_COPYRIGHT " : " MY_DATE diff --git a/MdeModulePkg/Library/LzmaCustomDecompressLib/Sdk/C/Bra.h b/MdeModulePkg/Library/LzmaCustomDecompressLib/Sdk/C/Bra.h index 85085192fb..0e3ae2d3cd 100644 --- a/MdeModulePkg/Library/LzmaCustomDecompressLib/Sdk/C/Bra.h +++ b/MdeModulePkg/Library/LzmaCustomDecompressLib/Sdk/C/Bra.h @@ -1,106 +1,106 @@ -/* Bra.h -- Branch converters for executables
-2013-01-18 : Igor Pavlov : Public domain */
-
-#ifndef __BRA_H
-#define __BRA_H
-
-#include "7zTypes.h"
-
-EXTERN_C_BEGIN
-
-/*
-These functions convert relative addresses to absolute addresses
-in CALL instructions to increase the compression ratio.
-
- In:
- data - data buffer
- size - size of data
- ip - current virtual Instruction Pinter (IP) value
- state - state variable for x86 converter
- encoding - 0 (for decoding), 1 (for encoding)
-
- Out:
- state - state variable for x86 converter
-
- Returns:
- The number of processed bytes. If you call these functions with multiple calls,
- you must start next call with first byte after block of processed bytes.
-
- Type Endian Alignment LookAhead
-
- x86 little 1 4
- ARMT little 2 2
- ARM little 4 0
- PPC big 4 0
- SPARC big 4 0
- IA64 little 16 0
-
- size must be >= Alignment + LookAhead, if it's not last block.
- If (size < Alignment + LookAhead), converter returns 0.
-
- Example:
-
- UInt32 ip = 0;
- for ()
- {
- ; size must be >= Alignment + LookAhead, if it's not last block
- SizeT processed = Convert(data, size, ip, 1);
- data += processed;
- size -= processed;
- ip += processed;
- }
-*/
-
-#define x86_Convert_Init(state) { state = 0; }
-SizeT
-x86_Convert (
- Byte *data,
- SizeT size,
- UInt32 ip,
- UInt32 *state,
- int encoding
- );
-
-SizeT
-ARM_Convert (
- Byte *data,
- SizeT size,
- UInt32 ip,
- int encoding
- );
-
-SizeT
-ARMT_Convert (
- Byte *data,
- SizeT size,
- UInt32 ip,
- int encoding
- );
-
-SizeT
-PPC_Convert (
- Byte *data,
- SizeT size,
- UInt32 ip,
- int encoding
- );
-
-SizeT
-SPARC_Convert (
- Byte *data,
- SizeT size,
- UInt32 ip,
- int encoding
- );
-
-SizeT
-IA64_Convert (
- Byte *data,
- SizeT size,
- UInt32 ip,
- int encoding
- );
-
-EXTERN_C_END
-
-#endif
+/* Bra.h -- Branch converters for executables +2013-01-18 : Igor Pavlov : Public domain */ + +#ifndef __BRA_H +#define __BRA_H + +#include "7zTypes.h" + +EXTERN_C_BEGIN + +/* +These functions convert relative addresses to absolute addresses +in CALL instructions to increase the compression ratio. + + In: + data - data buffer + size - size of data + ip - current virtual Instruction Pinter (IP) value + state - state variable for x86 converter + encoding - 0 (for decoding), 1 (for encoding) + + Out: + state - state variable for x86 converter + + Returns: + The number of processed bytes. If you call these functions with multiple calls, + you must start next call with first byte after block of processed bytes. + + Type Endian Alignment LookAhead + + x86 little 1 4 + ARMT little 2 2 + ARM little 4 0 + PPC big 4 0 + SPARC big 4 0 + IA64 little 16 0 + + size must be >= Alignment + LookAhead, if it's not last block. + If (size < Alignment + LookAhead), converter returns 0. + + Example: + + UInt32 ip = 0; + for () + { + ; size must be >= Alignment + LookAhead, if it's not last block + SizeT processed = Convert(data, size, ip, 1); + data += processed; + size -= processed; + ip += processed; + } +*/ + +#define x86_Convert_Init(state) { state = 0; } +SizeT +x86_Convert ( + Byte *data, + SizeT size, + UInt32 ip, + UInt32 *state, + int encoding + ); + +SizeT +ARM_Convert ( + Byte *data, + SizeT size, + UInt32 ip, + int encoding + ); + +SizeT +ARMT_Convert ( + Byte *data, + SizeT size, + UInt32 ip, + int encoding + ); + +SizeT +PPC_Convert ( + Byte *data, + SizeT size, + UInt32 ip, + int encoding + ); + +SizeT +SPARC_Convert ( + Byte *data, + SizeT size, + UInt32 ip, + int encoding + ); + +SizeT +IA64_Convert ( + Byte *data, + SizeT size, + UInt32 ip, + int encoding + ); + +EXTERN_C_END + +#endif diff --git a/MdeModulePkg/Library/LzmaCustomDecompressLib/Sdk/C/Bra86.c b/MdeModulePkg/Library/LzmaCustomDecompressLib/Sdk/C/Bra86.c index ec5f574035..452330a97d 100644 --- a/MdeModulePkg/Library/LzmaCustomDecompressLib/Sdk/C/Bra86.c +++ b/MdeModulePkg/Library/LzmaCustomDecompressLib/Sdk/C/Bra86.c @@ -1,91 +1,91 @@ -/* Bra86.c -- Converter for x86 code (BCJ)
-2017-04-03 : Igor Pavlov : Public domain */
-
-#include "Precomp.h"
-
-#include "Bra.h"
-
-#define Test86MSByte(b) ((((b) + 1) & 0xFE) == 0)
-
-SizeT
-x86_Convert (
- Byte *data,
- SizeT size,
- UInt32 ip,
- UInt32 *state,
- int encoding
- )
-{
- SizeT pos = 0;
- UInt32 mask = *state & 7;
-
- if (size < 5) {
- return 0;
- }
-
- size -= 4;
- ip += 5;
-
- for ( ; ;) {
- Byte *p = data + pos;
- const Byte *limit = data + size;
- for ( ; p < limit; p++) {
- if ((*p & 0xFE) == 0xE8) {
- break;
- }
- }
-
- {
- SizeT d = (SizeT)(p - data - pos);
- pos = (SizeT)(p - data);
- if (p >= limit) {
- *state = (d > 2 ? 0 : mask >> (unsigned)d);
- return pos;
- }
-
- if (d > 2) {
- mask = 0;
- } else {
- mask >>= (unsigned)d;
- if ((mask != 0) && ((mask > 4) || (mask == 3) || Test86MSByte (p[(size_t)(mask >> 1) + 1]))) {
- mask = (mask >> 1) | 4;
- pos++;
- continue;
- }
- }
- }
-
- if (Test86MSByte (p[4])) {
- UInt32 v = ((UInt32)p[4] << 24) | ((UInt32)p[3] << 16) | ((UInt32)p[2] << 8) | ((UInt32)p[1]);
- UInt32 cur = ip + (UInt32)pos;
- pos += 5;
- if (encoding) {
- v += cur;
- } else {
- v -= cur;
- }
-
- if (mask != 0) {
- unsigned sh = (mask & 6) << 2;
- if (Test86MSByte ((Byte)(v >> sh))) {
- v ^= (((UInt32)0x100 << sh) - 1);
- if (encoding) {
- v += cur;
- } else {
- v -= cur;
- }
- }
-
- mask = 0;
- }
-
- p[1] = (Byte)v;
- p[2] = (Byte)(v >> 8);
- p[3] = (Byte)(v >> 16);
- p[4] = (Byte)(0 - ((v >> 24) & 1));
- } else {
- mask = (mask >> 1) | 4;
- pos++;
- }
- }
-}
+/* Bra86.c -- Converter for x86 code (BCJ) +2017-04-03 : Igor Pavlov : Public domain */ + +#include "Precomp.h" + +#include "Bra.h" + +#define Test86MSByte(b) ((((b) + 1) & 0xFE) == 0) + +SizeT +x86_Convert ( + Byte *data, + SizeT size, + UInt32 ip, + UInt32 *state, + int encoding + ) +{ + SizeT pos = 0; + UInt32 mask = *state & 7; + + if (size < 5) { + return 0; + } + + size -= 4; + ip += 5; + + for ( ; ;) { + Byte *p = data + pos; + const Byte *limit = data + size; + for ( ; p < limit; p++) { + if ((*p & 0xFE) == 0xE8) { + break; + } + } + + { + SizeT d = (SizeT)(p - data - pos); + pos = (SizeT)(p - data); + if (p >= limit) { + *state = (d > 2 ? 0 : mask >> (unsigned)d); + return pos; + } + + if (d > 2) { + mask = 0; + } else { + mask >>= (unsigned)d; + if ((mask != 0) && ((mask > 4) || (mask == 3) || Test86MSByte (p[(size_t)(mask >> 1) + 1]))) { + mask = (mask >> 1) | 4; + pos++; + continue; + } + } + } + + if (Test86MSByte (p[4])) { + UInt32 v = ((UInt32)p[4] << 24) | ((UInt32)p[3] << 16) | ((UInt32)p[2] << 8) | ((UInt32)p[1]); + UInt32 cur = ip + (UInt32)pos; + pos += 5; + if (encoding) { + v += cur; + } else { + v -= cur; + } + + if (mask != 0) { + unsigned sh = (mask & 6) << 2; + if (Test86MSByte ((Byte)(v >> sh))) { + v ^= (((UInt32)0x100 << sh) - 1); + if (encoding) { + v += cur; + } else { + v -= cur; + } + } + + mask = 0; + } + + p[1] = (Byte)v; + p[2] = (Byte)(v >> 8); + p[3] = (Byte)(v >> 16); + p[4] = (Byte)(0 - ((v >> 24) & 1)); + } else { + mask = (mask >> 1) | 4; + pos++; + } + } +} diff --git a/MdeModulePkg/Library/LzmaCustomDecompressLib/Sdk/C/Compiler.h b/MdeModulePkg/Library/LzmaCustomDecompressLib/Sdk/C/Compiler.h index e8968d3497..72c8b1fbe3 100644 --- a/MdeModulePkg/Library/LzmaCustomDecompressLib/Sdk/C/Compiler.h +++ b/MdeModulePkg/Library/LzmaCustomDecompressLib/Sdk/C/Compiler.h @@ -1,33 +1,33 @@ -/* Compiler.h
-2017-04-03 : Igor Pavlov : Public domain */
-
-#ifndef __7Z_COMPILER_H
-#define __7Z_COMPILER_H
-
-#ifdef _MSC_VER
-
- #ifdef UNDER_CE
-#define RPC_NO_WINDOWS_H
-/* #pragma warning(disable : 4115) // '_RPC_ASYNC_STATE' : named type definition in parentheses */
- #pragma warning(disable : 4201) // nonstandard extension used : nameless struct/union
- #pragma warning(disable : 4214) // nonstandard extension used : bit field types other than int
- #endif
-
- #if _MSC_VER >= 1300
- #pragma warning(disable : 4996) // This function or variable may be unsafe
- #else
- #pragma warning(disable : 4511) // copy constructor could not be generated
- #pragma warning(disable : 4512) // assignment operator could not be generated
- #pragma warning(disable : 4514) // unreferenced inline function has been removed
- #pragma warning(disable : 4702) // unreachable code
- #pragma warning(disable : 4710) // not inlined
- #pragma warning(disable : 4714) // function marked as __forceinline not inlined
- #pragma warning(disable : 4786) // identifier was truncated to '255' characters in the debug information
- #endif
-
-#endif
-
-#define UNUSED_VAR(x) (void)x;
-/* #define UNUSED_VAR(x) x=x; */
-
-#endif
+/* Compiler.h +2017-04-03 : Igor Pavlov : Public domain */ + +#ifndef __7Z_COMPILER_H +#define __7Z_COMPILER_H + +#ifdef _MSC_VER + + #ifdef UNDER_CE +#define RPC_NO_WINDOWS_H +/* #pragma warning(disable : 4115) // '_RPC_ASYNC_STATE' : named type definition in parentheses */ + #pragma warning(disable : 4201) // nonstandard extension used : nameless struct/union + #pragma warning(disable : 4214) // nonstandard extension used : bit field types other than int + #endif + + #if _MSC_VER >= 1300 + #pragma warning(disable : 4996) // This function or variable may be unsafe + #else + #pragma warning(disable : 4511) // copy constructor could not be generated + #pragma warning(disable : 4512) // assignment operator could not be generated + #pragma warning(disable : 4514) // unreferenced inline function has been removed + #pragma warning(disable : 4702) // unreachable code + #pragma warning(disable : 4710) // not inlined + #pragma warning(disable : 4714) // function marked as __forceinline not inlined + #pragma warning(disable : 4786) // identifier was truncated to '255' characters in the debug information + #endif + +#endif + +#define UNUSED_VAR(x) (void)x; +/* #define UNUSED_VAR(x) x=x; */ + +#endif diff --git a/MdeModulePkg/Library/LzmaCustomDecompressLib/Sdk/C/CpuArch.h b/MdeModulePkg/Library/LzmaCustomDecompressLib/Sdk/C/CpuArch.h index 671a77bdb7..30218b9520 100644 --- a/MdeModulePkg/Library/LzmaCustomDecompressLib/Sdk/C/CpuArch.h +++ b/MdeModulePkg/Library/LzmaCustomDecompressLib/Sdk/C/CpuArch.h @@ -1,336 +1,336 @@ -/* CpuArch.h -- CPU specific code
-2018-02-18 : Igor Pavlov : Public domain */
-
-#ifndef __CPU_ARCH_H
-#define __CPU_ARCH_H
-
-#include "7zTypes.h"
-
-EXTERN_C_BEGIN
-
-/*
-MY_CPU_LE means that CPU is LITTLE ENDIAN.
-MY_CPU_BE means that CPU is BIG ENDIAN.
-If MY_CPU_LE and MY_CPU_BE are not defined, we don't know about ENDIANNESS of platform.
-
-MY_CPU_LE_UNALIGN means that CPU is LITTLE ENDIAN and CPU supports unaligned memory accesses.
-*/
-
-#if defined (_M_X64) \
- || defined (_M_AMD64) \
- || defined (__x86_64__) \
- || defined (__AMD64__) \
- || defined (__amd64__)
-#define MY_CPU_AMD64
- #ifdef __ILP32__
-#define MY_CPU_NAME "x32"
- #else
-#define MY_CPU_NAME "x64"
- #endif
-#define MY_CPU_64BIT
-#endif
-
-#if defined (_M_IX86) \
- || defined (__i386__)
-#define MY_CPU_X86
-#define MY_CPU_NAME "x86"
-#define MY_CPU_32BIT
-#endif
-
-#if defined (_M_ARM64) \
- || defined (__AARCH64EL__) \
- || defined (__AARCH64EB__) \
- || defined (__aarch64__)
-#define MY_CPU_ARM64
-#define MY_CPU_NAME "arm64"
-#define MY_CPU_64BIT
-#endif
-
-#if defined (_M_ARM) \
- || defined (_M_ARM_NT) \
- || defined (_M_ARMT) \
- || defined (__arm__) \
- || defined (__thumb__) \
- || defined (__ARMEL__) \
- || defined (__ARMEB__) \
- || defined (__THUMBEL__) \
- || defined (__THUMBEB__)
-#define MY_CPU_ARM
-#define MY_CPU_NAME "arm"
-#define MY_CPU_32BIT
-#endif
-
-#if defined (_M_IA64) \
- || defined (__ia64__)
-#define MY_CPU_IA64
-#define MY_CPU_NAME "ia64"
-#define MY_CPU_64BIT
-#endif
-
-#if defined (__mips64) \
- || defined (__mips64__) \
- || (defined (__mips) && (__mips == 64 || __mips == 4 || __mips == 3))
-#define MY_CPU_NAME "mips64"
-#define MY_CPU_64BIT
-#elif defined (__mips__)
-#define MY_CPU_NAME "mips"
-/* #define MY_CPU_32BIT */
-#endif
-
-#if defined (__ppc64__) \
- || defined (__powerpc64__)
- #ifdef __ILP32__
-#define MY_CPU_NAME "ppc64-32"
- #else
-#define MY_CPU_NAME "ppc64"
- #endif
-#define MY_CPU_64BIT
-#elif defined (__ppc__) \
- || defined (__powerpc__)
-#define MY_CPU_NAME "ppc"
-#define MY_CPU_32BIT
-#endif
-
-#if defined (__sparc64__)
-#define MY_CPU_NAME "sparc64"
-#define MY_CPU_64BIT
-#elif defined (__sparc__)
-#define MY_CPU_NAME "sparc"
-/* #define MY_CPU_32BIT */
-#endif
-
-#if defined (MY_CPU_X86) || defined (MY_CPU_AMD64)
-#define MY_CPU_X86_OR_AMD64
-#endif
-
-#ifdef _WIN32
-
- #ifdef MY_CPU_ARM
-#define MY_CPU_ARM_LE
- #endif
-
- #ifdef MY_CPU_ARM64
-#define MY_CPU_ARM64_LE
- #endif
-
- #ifdef _M_IA64
-#define MY_CPU_IA64_LE
- #endif
-
-#endif
-
-#if defined (MY_CPU_X86_OR_AMD64) \
- || defined (MY_CPU_ARM_LE) \
- || defined (MY_CPU_ARM64_LE) \
- || defined (MY_CPU_IA64_LE) \
- || defined (__LITTLE_ENDIAN__) \
- || defined (__ARMEL__) \
- || defined (__THUMBEL__) \
- || defined (__AARCH64EL__) \
- || defined (__MIPSEL__) \
- || defined (__MIPSEL) \
- || defined (_MIPSEL) \
- || defined (__BFIN__) \
- || (defined (__BYTE_ORDER__) && (__BYTE_ORDER__ == __ORDER_LITTLE_ENDIAN__))
-#define MY_CPU_LE
-#endif
-
-#if defined (__BIG_ENDIAN__) \
- || defined (__ARMEB__) \
- || defined (__THUMBEB__) \
- || defined (__AARCH64EB__) \
- || defined (__MIPSEB__) \
- || defined (__MIPSEB) \
- || defined (_MIPSEB) \
- || defined (__m68k__) \
- || defined (__s390__) \
- || defined (__s390x__) \
- || defined (__zarch__) \
- || (defined (__BYTE_ORDER__) && (__BYTE_ORDER__ == __ORDER_BIG_ENDIAN__))
-#define MY_CPU_BE
-#endif
-
-#if defined (MY_CPU_LE) && defined (MY_CPU_BE)
- #error Stop_Compiling_Bad_Endian
-#endif
-
-#if defined (MY_CPU_32BIT) && defined (MY_CPU_64BIT)
- #error Stop_Compiling_Bad_32_64_BIT
-#endif
-
-#ifndef MY_CPU_NAME
- #ifdef MY_CPU_LE
-#define MY_CPU_NAME "LE"
- #elif defined (MY_CPU_BE)
-#define MY_CPU_NAME "BE"
- #else
-
-/*
-#define MY_CPU_NAME ""
-*/
- #endif
-#endif
-
-#ifdef MY_CPU_LE
- #if defined (MY_CPU_X86_OR_AMD64) \
- || defined (MY_CPU_ARM64) \
- || defined (__ARM_FEATURE_UNALIGNED)
-#define MY_CPU_LE_UNALIGN
- #endif
-#endif
-
-#ifdef MY_CPU_LE_UNALIGN
-
-#define GetUi16(p) (*(const UInt16 *)(const void *)(p))
-#define GetUi32(p) (*(const UInt32 *)(const void *)(p))
-#define GetUi64(p) (*(const UInt64 *)(const void *)(p))
-
-#define SetUi16(p, v) { *(UInt16 *)(p) = (v); }
-#define SetUi32(p, v) { *(UInt32 *)(p) = (v); }
-#define SetUi64(p, v) { *(UInt64 *)(p) = (v); }
-
-#else
-
-#define GetUi16(p) ( (UInt16) (\
- ((const Byte *)(p))[0] | \
- ((UInt16)((const Byte *)(p))[1] << 8) ))
-
-#define GetUi32(p) (\
- ((const Byte *)(p))[0] | \
- ((UInt32)((const Byte *)(p))[1] << 8) | \
- ((UInt32)((const Byte *)(p))[2] << 16) | \
- ((UInt32)((const Byte *)(p))[3] << 24))
-
-#define GetUi64(p) (GetUi32(p) | ((UInt64)GetUi32(((const Byte *)(p)) + 4) << 32))
-
-#define SetUi16(p, v) { Byte *_ppp_ = (Byte *)(p); UInt32 _vvv_ = (v);\
- _ppp_[0] = (Byte)_vvv_; \
- _ppp_[1] = (Byte)(_vvv_ >> 8); }
-
-#define SetUi32(p, v) { Byte *_ppp_ = (Byte *)(p); UInt32 _vvv_ = (v);\
- _ppp_[0] = (Byte)_vvv_; \
- _ppp_[1] = (Byte)(_vvv_ >> 8); \
- _ppp_[2] = (Byte)(_vvv_ >> 16); \
- _ppp_[3] = (Byte)(_vvv_ >> 24); }
-
-#define SetUi64(p, v) { Byte *_ppp2_ = (Byte *)(p); UInt64 _vvv2_ = (v);\
- SetUi32(_ppp2_ , (UInt32)_vvv2_); \
- SetUi32(_ppp2_ + 4, (UInt32)(_vvv2_ >> 32)); }
-
-#endif
-
-#ifdef __has_builtin
-#define MY__has_builtin(x) __has_builtin(x)
-#else
-#define MY__has_builtin(x) 0
-#endif
-
-#if defined (MY_CPU_LE_UNALIGN) && /* defined(_WIN64) && */ (_MSC_VER >= 1300)
-
-/* Note: we use bswap instruction, that is unsupported in 386 cpu */
-
- #include <stdlib.h>
-
- #pragma intrinsic(_byteswap_ushort)
- #pragma intrinsic(_byteswap_ulong)
- #pragma intrinsic(_byteswap_uint64)
-
-/* #define GetBe16(p) _byteswap_ushort(*(const UInt16 *)(const Byte *)(p)) */
-#define GetBe32(p) _byteswap_ulong(*(const UInt32 *)(const Byte *)(p))
-#define GetBe64(p) _byteswap_uint64(*(const UInt64 *)(const Byte *)(p))
-
-#define SetBe32(p, v) (*(UInt32 *)(void *)(p)) = _byteswap_ulong(v)
-
-#elif defined (MY_CPU_LE_UNALIGN) && ( \
- (defined (__GNUC__) && (__GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 3))) \
- || (defined (__clang__) && MY__has_builtin (__builtin_bswap16)))
-
-/* #define GetBe16(p) __builtin_bswap16(*(const UInt16 *)(const Byte *)(p)) */
-#define GetBe32(p) __builtin_bswap32(*(const UInt32 *)(const Byte *)(p))
-#define GetBe64(p) __builtin_bswap64(*(const UInt64 *)(const Byte *)(p))
-
-#define SetBe32(p, v) (*(UInt32 *)(void *)(p)) = __builtin_bswap32(v)
-
-#else
-
-#define GetBe32(p) (\
- ((UInt32)((const Byte *)(p))[0] << 24) | \
- ((UInt32)((const Byte *)(p))[1] << 16) | \
- ((UInt32)((const Byte *)(p))[2] << 8) | \
- ((const Byte *)(p))[3] )
-
-#define GetBe64(p) (((UInt64)GetBe32(p) << 32) | GetBe32(((const Byte *)(p)) + 4))
-
-#define SetBe32(p, v) { Byte *_ppp_ = (Byte *)(p); UInt32 _vvv_ = (v);\
- _ppp_[0] = (Byte)(_vvv_ >> 24); \
- _ppp_[1] = (Byte)(_vvv_ >> 16); \
- _ppp_[2] = (Byte)(_vvv_ >> 8); \
- _ppp_[3] = (Byte)_vvv_; }
-
-#endif
-
-#ifndef GetBe16
-
-#define GetBe16(p) ( (UInt16) (\
- ((UInt16)((const Byte *)(p))[0] << 8) | \
- ((const Byte *)(p))[1] ))
-
-#endif
-
-#ifdef MY_CPU_X86_OR_AMD64
-
-typedef struct {
- UInt32 maxFunc;
- UInt32 vendor[3];
- UInt32 ver;
- UInt32 b;
- UInt32 c;
- UInt32 d;
-} Cx86cpuid;
-
-enum {
- CPU_FIRM_INTEL,
- CPU_FIRM_AMD,
- CPU_FIRM_VIA
-};
-
-void
-MyCPUID (
- UInt32 function,
- UInt32 *a,
- UInt32 *b,
- UInt32 *c,
- UInt32 *d
- );
-
-BoolInt
-x86cpuid_CheckAndRead (
- Cx86cpuid *p
- );
-
-int
-x86cpuid_GetFirm (
- const Cx86cpuid *p
- );
-
-#define x86cpuid_GetFamily(ver) (((ver >> 16) & 0xFF0) | ((ver >> 8) & 0xF))
-#define x86cpuid_GetModel(ver) (((ver >> 12) & 0xF0) | ((ver >> 4) & 0xF))
-#define x86cpuid_GetStepping(ver) (ver & 0xF)
-
-BoolInt
-CPU_Is_InOrder (
- );
-
-BoolInt
-CPU_Is_Aes_Supported (
- );
-
-BoolInt
-CPU_IsSupported_PageGB (
- );
-
-#endif
-
-EXTERN_C_END
-
-#endif
+/* CpuArch.h -- CPU specific code +2018-02-18 : Igor Pavlov : Public domain */ + +#ifndef __CPU_ARCH_H +#define __CPU_ARCH_H + +#include "7zTypes.h" + +EXTERN_C_BEGIN + +/* +MY_CPU_LE means that CPU is LITTLE ENDIAN. +MY_CPU_BE means that CPU is BIG ENDIAN. +If MY_CPU_LE and MY_CPU_BE are not defined, we don't know about ENDIANNESS of platform. + +MY_CPU_LE_UNALIGN means that CPU is LITTLE ENDIAN and CPU supports unaligned memory accesses. +*/ + +#if defined (_M_X64) \ + || defined (_M_AMD64) \ + || defined (__x86_64__) \ + || defined (__AMD64__) \ + || defined (__amd64__) +#define MY_CPU_AMD64 + #ifdef __ILP32__ +#define MY_CPU_NAME "x32" + #else +#define MY_CPU_NAME "x64" + #endif +#define MY_CPU_64BIT +#endif + +#if defined (_M_IX86) \ + || defined (__i386__) +#define MY_CPU_X86 +#define MY_CPU_NAME "x86" +#define MY_CPU_32BIT +#endif + +#if defined (_M_ARM64) \ + || defined (__AARCH64EL__) \ + || defined (__AARCH64EB__) \ + || defined (__aarch64__) +#define MY_CPU_ARM64 +#define MY_CPU_NAME "arm64" +#define MY_CPU_64BIT +#endif + +#if defined (_M_ARM) \ + || defined (_M_ARM_NT) \ + || defined (_M_ARMT) \ + || defined (__arm__) \ + || defined (__thumb__) \ + || defined (__ARMEL__) \ + || defined (__ARMEB__) \ + || defined (__THUMBEL__) \ + || defined (__THUMBEB__) +#define MY_CPU_ARM +#define MY_CPU_NAME "arm" +#define MY_CPU_32BIT +#endif + +#if defined (_M_IA64) \ + || defined (__ia64__) +#define MY_CPU_IA64 +#define MY_CPU_NAME "ia64" +#define MY_CPU_64BIT +#endif + +#if defined (__mips64) \ + || defined (__mips64__) \ + || (defined (__mips) && (__mips == 64 || __mips == 4 || __mips == 3)) +#define MY_CPU_NAME "mips64" +#define MY_CPU_64BIT +#elif defined (__mips__) +#define MY_CPU_NAME "mips" +/* #define MY_CPU_32BIT */ +#endif + +#if defined (__ppc64__) \ + || defined (__powerpc64__) + #ifdef __ILP32__ +#define MY_CPU_NAME "ppc64-32" + #else +#define MY_CPU_NAME "ppc64" + #endif +#define MY_CPU_64BIT +#elif defined (__ppc__) \ + || defined (__powerpc__) +#define MY_CPU_NAME "ppc" +#define MY_CPU_32BIT +#endif + +#if defined (__sparc64__) +#define MY_CPU_NAME "sparc64" +#define MY_CPU_64BIT +#elif defined (__sparc__) +#define MY_CPU_NAME "sparc" +/* #define MY_CPU_32BIT */ +#endif + +#if defined (MY_CPU_X86) || defined (MY_CPU_AMD64) +#define MY_CPU_X86_OR_AMD64 +#endif + +#ifdef _WIN32 + + #ifdef MY_CPU_ARM +#define MY_CPU_ARM_LE + #endif + + #ifdef MY_CPU_ARM64 +#define MY_CPU_ARM64_LE + #endif + + #ifdef _M_IA64 +#define MY_CPU_IA64_LE + #endif + +#endif + +#if defined (MY_CPU_X86_OR_AMD64) \ + || defined (MY_CPU_ARM_LE) \ + || defined (MY_CPU_ARM64_LE) \ + || defined (MY_CPU_IA64_LE) \ + || defined (__LITTLE_ENDIAN__) \ + || defined (__ARMEL__) \ + || defined (__THUMBEL__) \ + || defined (__AARCH64EL__) \ + || defined (__MIPSEL__) \ + || defined (__MIPSEL) \ + || defined (_MIPSEL) \ + || defined (__BFIN__) \ + || (defined (__BYTE_ORDER__) && (__BYTE_ORDER__ == __ORDER_LITTLE_ENDIAN__)) +#define MY_CPU_LE +#endif + +#if defined (__BIG_ENDIAN__) \ + || defined (__ARMEB__) \ + || defined (__THUMBEB__) \ + || defined (__AARCH64EB__) \ + || defined (__MIPSEB__) \ + || defined (__MIPSEB) \ + || defined (_MIPSEB) \ + || defined (__m68k__) \ + || defined (__s390__) \ + || defined (__s390x__) \ + || defined (__zarch__) \ + || (defined (__BYTE_ORDER__) && (__BYTE_ORDER__ == __ORDER_BIG_ENDIAN__)) +#define MY_CPU_BE +#endif + +#if defined (MY_CPU_LE) && defined (MY_CPU_BE) + #error Stop_Compiling_Bad_Endian +#endif + +#if defined (MY_CPU_32BIT) && defined (MY_CPU_64BIT) + #error Stop_Compiling_Bad_32_64_BIT +#endif + +#ifndef MY_CPU_NAME + #ifdef MY_CPU_LE +#define MY_CPU_NAME "LE" + #elif defined (MY_CPU_BE) +#define MY_CPU_NAME "BE" + #else + +/* +#define MY_CPU_NAME "" +*/ + #endif +#endif + +#ifdef MY_CPU_LE + #if defined (MY_CPU_X86_OR_AMD64) \ + || defined (MY_CPU_ARM64) \ + || defined (__ARM_FEATURE_UNALIGNED) +#define MY_CPU_LE_UNALIGN + #endif +#endif + +#ifdef MY_CPU_LE_UNALIGN + +#define GetUi16(p) (*(const UInt16 *)(const void *)(p)) +#define GetUi32(p) (*(const UInt32 *)(const void *)(p)) +#define GetUi64(p) (*(const UInt64 *)(const void *)(p)) + +#define SetUi16(p, v) { *(UInt16 *)(p) = (v); } +#define SetUi32(p, v) { *(UInt32 *)(p) = (v); } +#define SetUi64(p, v) { *(UInt64 *)(p) = (v); } + +#else + +#define GetUi16(p) ( (UInt16) (\ + ((const Byte *)(p))[0] | \ + ((UInt16)((const Byte *)(p))[1] << 8) )) + +#define GetUi32(p) (\ + ((const Byte *)(p))[0] | \ + ((UInt32)((const Byte *)(p))[1] << 8) | \ + ((UInt32)((const Byte *)(p))[2] << 16) | \ + ((UInt32)((const Byte *)(p))[3] << 24)) + +#define GetUi64(p) (GetUi32(p) | ((UInt64)GetUi32(((const Byte *)(p)) + 4) << 32)) + +#define SetUi16(p, v) { Byte *_ppp_ = (Byte *)(p); UInt32 _vvv_ = (v);\ + _ppp_[0] = (Byte)_vvv_; \ + _ppp_[1] = (Byte)(_vvv_ >> 8); } + +#define SetUi32(p, v) { Byte *_ppp_ = (Byte *)(p); UInt32 _vvv_ = (v);\ + _ppp_[0] = (Byte)_vvv_; \ + _ppp_[1] = (Byte)(_vvv_ >> 8); \ + _ppp_[2] = (Byte)(_vvv_ >> 16); \ + _ppp_[3] = (Byte)(_vvv_ >> 24); } + +#define SetUi64(p, v) { Byte *_ppp2_ = (Byte *)(p); UInt64 _vvv2_ = (v);\ + SetUi32(_ppp2_ , (UInt32)_vvv2_); \ + SetUi32(_ppp2_ + 4, (UInt32)(_vvv2_ >> 32)); } + +#endif + +#ifdef __has_builtin +#define MY__has_builtin(x) __has_builtin(x) +#else +#define MY__has_builtin(x) 0 +#endif + +#if defined (MY_CPU_LE_UNALIGN) && /* defined(_WIN64) && */ (_MSC_VER >= 1300) + +/* Note: we use bswap instruction, that is unsupported in 386 cpu */ + + #include <stdlib.h> + + #pragma intrinsic(_byteswap_ushort) + #pragma intrinsic(_byteswap_ulong) + #pragma intrinsic(_byteswap_uint64) + +/* #define GetBe16(p) _byteswap_ushort(*(const UInt16 *)(const Byte *)(p)) */ +#define GetBe32(p) _byteswap_ulong(*(const UInt32 *)(const Byte *)(p)) +#define GetBe64(p) _byteswap_uint64(*(const UInt64 *)(const Byte *)(p)) + +#define SetBe32(p, v) (*(UInt32 *)(void *)(p)) = _byteswap_ulong(v) + +#elif defined (MY_CPU_LE_UNALIGN) && ( \ + (defined (__GNUC__) && (__GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 3))) \ + || (defined (__clang__) && MY__has_builtin (__builtin_bswap16))) + +/* #define GetBe16(p) __builtin_bswap16(*(const UInt16 *)(const Byte *)(p)) */ +#define GetBe32(p) __builtin_bswap32(*(const UInt32 *)(const Byte *)(p)) +#define GetBe64(p) __builtin_bswap64(*(const UInt64 *)(const Byte *)(p)) + +#define SetBe32(p, v) (*(UInt32 *)(void *)(p)) = __builtin_bswap32(v) + +#else + +#define GetBe32(p) (\ + ((UInt32)((const Byte *)(p))[0] << 24) | \ + ((UInt32)((const Byte *)(p))[1] << 16) | \ + ((UInt32)((const Byte *)(p))[2] << 8) | \ + ((const Byte *)(p))[3] ) + +#define GetBe64(p) (((UInt64)GetBe32(p) << 32) | GetBe32(((const Byte *)(p)) + 4)) + +#define SetBe32(p, v) { Byte *_ppp_ = (Byte *)(p); UInt32 _vvv_ = (v);\ + _ppp_[0] = (Byte)(_vvv_ >> 24); \ + _ppp_[1] = (Byte)(_vvv_ >> 16); \ + _ppp_[2] = (Byte)(_vvv_ >> 8); \ + _ppp_[3] = (Byte)_vvv_; } + +#endif + +#ifndef GetBe16 + +#define GetBe16(p) ( (UInt16) (\ + ((UInt16)((const Byte *)(p))[0] << 8) | \ + ((const Byte *)(p))[1] )) + +#endif + +#ifdef MY_CPU_X86_OR_AMD64 + +typedef struct { + UInt32 maxFunc; + UInt32 vendor[3]; + UInt32 ver; + UInt32 b; + UInt32 c; + UInt32 d; +} Cx86cpuid; + +enum { + CPU_FIRM_INTEL, + CPU_FIRM_AMD, + CPU_FIRM_VIA +}; + +void +MyCPUID ( + UInt32 function, + UInt32 *a, + UInt32 *b, + UInt32 *c, + UInt32 *d + ); + +BoolInt +x86cpuid_CheckAndRead ( + Cx86cpuid *p + ); + +int +x86cpuid_GetFirm ( + const Cx86cpuid *p + ); + +#define x86cpuid_GetFamily(ver) (((ver >> 16) & 0xFF0) | ((ver >> 8) & 0xF)) +#define x86cpuid_GetModel(ver) (((ver >> 12) & 0xF0) | ((ver >> 4) & 0xF)) +#define x86cpuid_GetStepping(ver) (ver & 0xF) + +BoolInt +CPU_Is_InOrder ( + ); + +BoolInt +CPU_Is_Aes_Supported ( + ); + +BoolInt +CPU_IsSupported_PageGB ( + ); + +#endif + +EXTERN_C_END + +#endif diff --git a/MdeModulePkg/Library/LzmaCustomDecompressLib/Sdk/C/LzFind.c b/MdeModulePkg/Library/LzmaCustomDecompressLib/Sdk/C/LzFind.c index 2102409a4b..e3261701b9 100644 --- a/MdeModulePkg/Library/LzmaCustomDecompressLib/Sdk/C/LzFind.c +++ b/MdeModulePkg/Library/LzmaCustomDecompressLib/Sdk/C/LzFind.c @@ -1,1344 +1,1344 @@ -/* LzFind.c -- Match finder for LZ algorithms
-2018-07-08 : Igor Pavlov : Public domain */
-
-#include "Precomp.h"
-
-#ifndef EFIAPI
- #include <string.h>
-#endif
-
-#include "LzFind.h"
-#include "LzHash.h"
-
-#define kEmptyHashValue 0
-#define kMaxValForNormalize ((UInt32)0xFFFFFFFF)
-#define kNormalizeStepMin (1 << 10)/* it must be power of 2 */
-#define kNormalizeMask (~(UInt32)(kNormalizeStepMin - 1))
-#define kMaxHistorySize ((UInt32)7 << 29)
-
-#define kStartMaxLen 3
-
-static void
-LzInWindow_Free (
- CMatchFinder *p,
- ISzAllocPtr alloc
- )
-{
- if (!p->directInput) {
- ISzAlloc_Free (alloc, p->bufferBase);
- p->bufferBase = NULL;
- }
-}
-
-/* keepSizeBefore + keepSizeAfter + keepSizeReserv must be < 4G) */
-
-static int
-LzInWindow_Create (
- CMatchFinder *p,
- UInt32 keepSizeReserv,
- ISzAllocPtr alloc
- )
-{
- UInt32 blockSize = p->keepSizeBefore + p->keepSizeAfter + keepSizeReserv;
-
- if (p->directInput) {
- p->blockSize = blockSize;
- return 1;
- }
-
- if (!p->bufferBase || (p->blockSize != blockSize)) {
- LzInWindow_Free (p, alloc);
- p->blockSize = blockSize;
- p->bufferBase = (Byte *)ISzAlloc_Alloc (alloc, (size_t)blockSize);
- }
-
- return (p->bufferBase != NULL);
-}
-
-Byte *
-MatchFinder_GetPointerToCurrentPos (
- CMatchFinder *p
- )
-{
- return p->buffer;
-}
-
-UInt32
-MatchFinder_GetNumAvailableBytes (
- CMatchFinder *p
- )
-{
- return p->streamPos - p->pos;
-}
-
-void
-MatchFinder_ReduceOffsets (
- CMatchFinder *p,
- UInt32 subValue
- )
-{
- p->posLimit -= subValue;
- p->pos -= subValue;
- p->streamPos -= subValue;
-}
-
-static void
-MatchFinder_ReadBlock (
- CMatchFinder *p
- )
-{
- if (p->streamEndWasReached || (p->result != SZ_OK)) {
- return;
- }
-
- /* We use (p->streamPos - p->pos) value. (p->streamPos < p->pos) is allowed. */
-
- if (p->directInput) {
- UInt32 curSize = 0xFFFFFFFF - (p->streamPos - p->pos);
- if (curSize > p->directInputRem) {
- curSize = (UInt32)p->directInputRem;
- }
-
- p->directInputRem -= curSize;
- p->streamPos += curSize;
- if (p->directInputRem == 0) {
- p->streamEndWasReached = 1;
- }
-
- return;
- }
-
- for ( ; ;) {
- Byte *dest = p->buffer + (p->streamPos - p->pos);
- size_t size = (p->bufferBase + p->blockSize - dest);
- if (size == 0) {
- return;
- }
-
- p->result = ISeqInStream_Read (p->stream, dest, &size);
- if (p->result != SZ_OK) {
- return;
- }
-
- if (size == 0) {
- p->streamEndWasReached = 1;
- return;
- }
-
- p->streamPos += (UInt32)size;
- if (p->streamPos - p->pos > p->keepSizeAfter) {
- return;
- }
- }
-}
-
-void
-MatchFinder_MoveBlock (
- CMatchFinder *p
- )
-{
- memmove (
- p->bufferBase,
- p->buffer - p->keepSizeBefore,
- (size_t)(p->streamPos - p->pos) + p->keepSizeBefore
- );
- p->buffer = p->bufferBase + p->keepSizeBefore;
-}
-
-int
-MatchFinder_NeedMove (
- CMatchFinder *p
- )
-{
- if (p->directInput) {
- return 0;
- }
-
- /* if (p->streamEndWasReached) return 0; */
- return ((size_t)(p->bufferBase + p->blockSize - p->buffer) <= p->keepSizeAfter);
-}
-
-void
-MatchFinder_ReadIfRequired (
- CMatchFinder *p
- )
-{
- if (p->streamEndWasReached) {
- return;
- }
-
- if (p->keepSizeAfter >= p->streamPos - p->pos) {
- MatchFinder_ReadBlock (p);
- }
-}
-
-static void
-MatchFinder_CheckAndMoveAndRead (
- CMatchFinder *p
- )
-{
- if (MatchFinder_NeedMove (p)) {
- MatchFinder_MoveBlock (p);
- }
-
- MatchFinder_ReadBlock (p);
-}
-
-static void
-MatchFinder_SetDefaultSettings (
- CMatchFinder *p
- )
-{
- p->cutValue = 32;
- p->btMode = 1;
- p->numHashBytes = 4;
- p->bigHash = 0;
-}
-
-#define kCrcPoly 0xEDB88320
-
-void
-MatchFinder_Construct (
- CMatchFinder *p
- )
-{
- unsigned i;
-
- p->bufferBase = NULL;
- p->directInput = 0;
- p->hash = NULL;
- p->expectedDataSize = (UInt64)(Int64)-1;
- MatchFinder_SetDefaultSettings (p);
-
- for (i = 0; i < 256; i++) {
- UInt32 r = (UInt32)i;
- unsigned j;
- for (j = 0; j < 8; j++) {
- r = (r >> 1) ^ (kCrcPoly & ((UInt32)0 - (r & 1)));
- }
-
- p->crc[i] = r;
- }
-}
-
-static void
-MatchFinder_FreeThisClassMemory (
- CMatchFinder *p,
- ISzAllocPtr alloc
- )
-{
- ISzAlloc_Free (alloc, p->hash);
- p->hash = NULL;
-}
-
-void
-MatchFinder_Free (
- CMatchFinder *p,
- ISzAllocPtr alloc
- )
-{
- MatchFinder_FreeThisClassMemory (p, alloc);
- LzInWindow_Free (p, alloc);
-}
-
-static CLzRef *
-AllocRefs (
- size_t num,
- ISzAllocPtr alloc
- )
-{
- size_t sizeInBytes = (size_t)num * sizeof (CLzRef);
-
- if (sizeInBytes / sizeof (CLzRef) != num) {
- return NULL;
- }
-
- return (CLzRef *)ISzAlloc_Alloc (alloc, sizeInBytes);
-}
-
-int
-MatchFinder_Create (
- CMatchFinder *p,
- UInt32 historySize,
- UInt32 keepAddBufferBefore,
- UInt32 matchMaxLen,
- UInt32 keepAddBufferAfter,
- ISzAllocPtr alloc
- )
-{
- UInt32 sizeReserv;
-
- if (historySize > kMaxHistorySize) {
- MatchFinder_Free (p, alloc);
- return 0;
- }
-
- sizeReserv = historySize >> 1;
- if (historySize >= ((UInt32)3 << 30)) {
- sizeReserv = historySize >> 3;
- } else if (historySize >= ((UInt32)2 << 30)) {
- sizeReserv = historySize >> 2;
- }
-
- sizeReserv += (keepAddBufferBefore + matchMaxLen + keepAddBufferAfter) / 2 + (1 << 19);
-
- p->keepSizeBefore = historySize + keepAddBufferBefore + 1;
- p->keepSizeAfter = matchMaxLen + keepAddBufferAfter;
-
- /* we need one additional byte, since we use MoveBlock after pos++ and before dictionary using */
-
- if (LzInWindow_Create (p, sizeReserv, alloc)) {
- UInt32 newCyclicBufferSize = historySize + 1;
- UInt32 hs;
- p->matchMaxLen = matchMaxLen;
- {
- p->fixedHashSize = 0;
- if (p->numHashBytes == 2) {
- hs = (1 << 16) - 1;
- } else {
- hs = historySize;
- if (hs > p->expectedDataSize) {
- hs = (UInt32)p->expectedDataSize;
- }
-
- if (hs != 0) {
- hs--;
- }
-
- hs |= (hs >> 1);
- hs |= (hs >> 2);
- hs |= (hs >> 4);
- hs |= (hs >> 8);
- hs >>= 1;
- hs |= 0xFFFF; /* don't change it! It's required for Deflate */
- if (hs > (1 << 24)) {
- if (p->numHashBytes == 3) {
- hs = (1 << 24) - 1;
- } else {
- hs >>= 1;
- }
-
- /* if (bigHash) mode, GetHeads4b() in LzFindMt.c needs (hs >= ((1 << 24) - 1))) */
- }
- }
-
- p->hashMask = hs;
- hs++;
- if (p->numHashBytes > 2) {
- p->fixedHashSize += kHash2Size;
- }
-
- if (p->numHashBytes > 3) {
- p->fixedHashSize += kHash3Size;
- }
-
- if (p->numHashBytes > 4) {
- p->fixedHashSize += kHash4Size;
- }
-
- hs += p->fixedHashSize;
- }
-
- {
- size_t newSize;
- size_t numSons;
- p->historySize = historySize;
- p->hashSizeSum = hs;
- p->cyclicBufferSize = newCyclicBufferSize;
-
- numSons = newCyclicBufferSize;
- if (p->btMode) {
- numSons <<= 1;
- }
-
- newSize = hs + numSons;
-
- if (p->hash && (p->numRefs == newSize)) {
- return 1;
- }
-
- MatchFinder_FreeThisClassMemory (p, alloc);
- p->numRefs = newSize;
- p->hash = AllocRefs (newSize, alloc);
-
- if (p->hash) {
- p->son = p->hash + p->hashSizeSum;
- return 1;
- }
- }
- }
-
- MatchFinder_Free (p, alloc);
- return 0;
-}
-
-static void
-MatchFinder_SetLimits (
- CMatchFinder *p
- )
-{
- UInt32 limit = kMaxValForNormalize - p->pos;
- UInt32 limit2 = p->cyclicBufferSize - p->cyclicBufferPos;
-
- if (limit2 < limit) {
- limit = limit2;
- }
-
- limit2 = p->streamPos - p->pos;
-
- if (limit2 <= p->keepSizeAfter) {
- if (limit2 > 0) {
- limit2 = 1;
- }
- } else {
- limit2 -= p->keepSizeAfter;
- }
-
- if (limit2 < limit) {
- limit = limit2;
- }
-
- {
- UInt32 lenLimit = p->streamPos - p->pos;
- if (lenLimit > p->matchMaxLen) {
- lenLimit = p->matchMaxLen;
- }
-
- p->lenLimit = lenLimit;
- }
- p->posLimit = p->pos + limit;
-}
-
-void
-MatchFinder_Init_LowHash (
- CMatchFinder *p
- )
-{
- size_t i;
- CLzRef *items = p->hash;
- size_t numItems = p->fixedHashSize;
-
- for (i = 0; i < numItems; i++) {
- items[i] = kEmptyHashValue;
- }
-}
-
-void
-MatchFinder_Init_HighHash (
- CMatchFinder *p
- )
-{
- size_t i;
- CLzRef *items = p->hash + p->fixedHashSize;
- size_t numItems = (size_t)p->hashMask + 1;
-
- for (i = 0; i < numItems; i++) {
- items[i] = kEmptyHashValue;
- }
-}
-
-void
-MatchFinder_Init_3 (
- CMatchFinder *p,
- int readData
- )
-{
- p->cyclicBufferPos = 0;
- p->buffer = p->bufferBase;
- p->pos =
- p->streamPos = p->cyclicBufferSize;
- p->result = SZ_OK;
- p->streamEndWasReached = 0;
-
- if (readData) {
- MatchFinder_ReadBlock (p);
- }
-
- MatchFinder_SetLimits (p);
-}
-
-void
-MatchFinder_Init (
- CMatchFinder *p
- )
-{
- MatchFinder_Init_HighHash (p);
- MatchFinder_Init_LowHash (p);
- MatchFinder_Init_3 (p, True);
-}
-
-static UInt32
-MatchFinder_GetSubValue (
- CMatchFinder *p
- )
-{
- return (p->pos - p->historySize - 1) & kNormalizeMask;
-}
-
-void
-MatchFinder_Normalize3 (
- UInt32 subValue,
- CLzRef *items,
- size_t numItems
- )
-{
- size_t i;
-
- for (i = 0; i < numItems; i++) {
- UInt32 value = items[i];
- if (value <= subValue) {
- value = kEmptyHashValue;
- } else {
- value -= subValue;
- }
-
- items[i] = value;
- }
-}
-
-static void
-MatchFinder_Normalize (
- CMatchFinder *p
- )
-{
- UInt32 subValue = MatchFinder_GetSubValue (p);
-
- MatchFinder_Normalize3 (subValue, p->hash, p->numRefs);
- MatchFinder_ReduceOffsets (p, subValue);
-}
-
-MY_NO_INLINE
-static void
-MatchFinder_CheckLimits (
- CMatchFinder *p
- )
-{
- if (p->pos == kMaxValForNormalize) {
- MatchFinder_Normalize (p);
- }
-
- if (!p->streamEndWasReached && (p->keepSizeAfter == p->streamPos - p->pos)) {
- MatchFinder_CheckAndMoveAndRead (p);
- }
-
- if (p->cyclicBufferPos == p->cyclicBufferSize) {
- p->cyclicBufferPos = 0;
- }
-
- MatchFinder_SetLimits (p);
-}
-
-/*
- (lenLimit > maxLen)
-*/
-MY_FORCE_INLINE
-static UInt32 *
-Hc_GetMatchesSpec (
- unsigned lenLimit,
- UInt32 curMatch,
- UInt32 pos,
- const Byte *cur,
- CLzRef *son,
- UInt32 _cyclicBufferPos,
- UInt32 _cyclicBufferSize,
- UInt32 cutValue,
- UInt32 *distances,
- unsigned maxLen
- )
-{
- /*
- son[_cyclicBufferPos] = curMatch;
- for (;;)
- {
- UInt32 delta = pos - curMatch;
- if (cutValue-- == 0 || delta >= _cyclicBufferSize)
- return distances;
- {
- const Byte *pb = cur - delta;
- curMatch = son[_cyclicBufferPos - delta + ((delta > _cyclicBufferPos) ? _cyclicBufferSize : 0)];
- if (pb[maxLen] == cur[maxLen] && *pb == *cur)
- {
- UInt32 len = 0;
- while (++len != lenLimit)
- if (pb[len] != cur[len])
- break;
- if (maxLen < len)
- {
- maxLen = len;
- *distances++ = len;
- *distances++ = delta - 1;
- if (len == lenLimit)
- return distances;
- }
- }
- }
- }
- */
-
- const Byte *lim = cur + lenLimit;
-
- son[_cyclicBufferPos] = curMatch;
- do {
- UInt32 delta = pos - curMatch;
- if (delta >= _cyclicBufferSize) {
- break;
- }
-
- {
- ptrdiff_t diff;
- curMatch = son[_cyclicBufferPos - delta + ((delta > _cyclicBufferPos) ? _cyclicBufferSize : 0)];
- diff = (ptrdiff_t)0 - delta;
- if (cur[maxLen] == cur[maxLen + diff]) {
- const Byte *c = cur;
- while (*c == c[diff]) {
- if (++c == lim) {
- distances[0] = (UInt32)(lim - cur);
- distances[1] = delta - 1;
- return distances + 2;
- }
- }
-
- {
- unsigned len = (unsigned)(c - cur);
- if (maxLen < len) {
- maxLen = len;
- distances[0] = (UInt32)len;
- distances[1] = delta - 1;
- distances += 2;
- }
- }
- }
- }
- } while (--cutValue);
-
- return distances;
-}
-
-MY_FORCE_INLINE
-UInt32 *
-GetMatchesSpec1 (
- UInt32 lenLimit,
- UInt32 curMatch,
- UInt32 pos,
- const Byte *cur,
- CLzRef *son,
- UInt32 _cyclicBufferPos,
- UInt32 _cyclicBufferSize,
- UInt32 cutValue,
- UInt32 *distances,
- UInt32 maxLen
- )
-{
- CLzRef *ptr0 = son + ((size_t)_cyclicBufferPos << 1) + 1;
- CLzRef *ptr1 = son + ((size_t)_cyclicBufferPos << 1);
- unsigned len0 = 0, len1 = 0;
-
- for ( ; ;) {
- UInt32 delta = pos - curMatch;
- if ((cutValue-- == 0) || (delta >= _cyclicBufferSize)) {
- *ptr0 = *ptr1 = kEmptyHashValue;
- return distances;
- }
-
- {
- CLzRef *pair = son + ((size_t)(_cyclicBufferPos - delta + ((delta > _cyclicBufferPos) ? _cyclicBufferSize : 0)) << 1);
- const Byte *pb = cur - delta;
- unsigned len = (len0 < len1 ? len0 : len1);
- UInt32 pair0 = pair[0];
- if (pb[len] == cur[len]) {
- if ((++len != lenLimit) && (pb[len] == cur[len])) {
- while (++len != lenLimit) {
- if (pb[len] != cur[len]) {
- break;
- }
- }
- }
-
- if (maxLen < len) {
- maxLen = (UInt32)len;
- *distances++ = (UInt32)len;
- *distances++ = delta - 1;
- if (len == lenLimit) {
- *ptr1 = pair0;
- *ptr0 = pair[1];
- return distances;
- }
- }
- }
-
- if (pb[len] < cur[len]) {
- *ptr1 = curMatch;
- ptr1 = pair + 1;
- curMatch = *ptr1;
- len1 = len;
- } else {
- *ptr0 = curMatch;
- ptr0 = pair;
- curMatch = *ptr0;
- len0 = len;
- }
- }
- }
-}
-
-static void
-SkipMatchesSpec (
- UInt32 lenLimit,
- UInt32 curMatch,
- UInt32 pos,
- const Byte *cur,
- CLzRef *son,
- UInt32 _cyclicBufferPos,
- UInt32 _cyclicBufferSize,
- UInt32 cutValue
- )
-{
- CLzRef *ptr0 = son + ((size_t)_cyclicBufferPos << 1) + 1;
- CLzRef *ptr1 = son + ((size_t)_cyclicBufferPos << 1);
- unsigned len0 = 0, len1 = 0;
-
- for ( ; ;) {
- UInt32 delta = pos - curMatch;
- if ((cutValue-- == 0) || (delta >= _cyclicBufferSize)) {
- *ptr0 = *ptr1 = kEmptyHashValue;
- return;
- }
-
- {
- CLzRef *pair = son + ((size_t)(_cyclicBufferPos - delta + ((delta > _cyclicBufferPos) ? _cyclicBufferSize : 0)) << 1);
- const Byte *pb = cur - delta;
- unsigned len = (len0 < len1 ? len0 : len1);
- if (pb[len] == cur[len]) {
- while (++len != lenLimit) {
- if (pb[len] != cur[len]) {
- break;
- }
- }
-
- {
- if (len == lenLimit) {
- *ptr1 = pair[0];
- *ptr0 = pair[1];
- return;
- }
- }
- }
-
- if (pb[len] < cur[len]) {
- *ptr1 = curMatch;
- ptr1 = pair + 1;
- curMatch = *ptr1;
- len1 = len;
- } else {
- *ptr0 = curMatch;
- ptr0 = pair;
- curMatch = *ptr0;
- len0 = len;
- }
- }
- }
-}
-
-#define MOVE_POS \
- ++p->cyclicBufferPos; \
- p->buffer++; \
- if (++p->pos == p->posLimit) MatchFinder_CheckLimits(p);
-
-#define MOVE_POS_RET MOVE_POS return (UInt32)offset;
-
-static void
-MatchFinder_MovePos (
- CMatchFinder *p
- )
-{
- MOVE_POS;
-}
-
-#define GET_MATCHES_HEADER2(minLen, ret_op) \
- unsigned lenLimit; UInt32 hv; const Byte *cur; UInt32 curMatch; \
- lenLimit = (unsigned)p->lenLimit; { if (lenLimit < minLen) { MatchFinder_MovePos(p); ret_op; }} \
- cur = p->buffer;
-
-#define GET_MATCHES_HEADER(minLen) GET_MATCHES_HEADER2(minLen, return 0)
-#define SKIP_HEADER(minLen) GET_MATCHES_HEADER2(minLen, continue)
-
-#define MF_PARAMS(p) p->pos, p->buffer, p->son, p->cyclicBufferPos, p->cyclicBufferSize, p->cutValue
-
-#define GET_MATCHES_FOOTER(offset, maxLen) \
- offset = (unsigned)(GetMatchesSpec1((UInt32)lenLimit, curMatch, MF_PARAMS(p), \
- distances + offset, (UInt32)maxLen) - distances); MOVE_POS_RET;
-
-#define SKIP_FOOTER \
- SkipMatchesSpec((UInt32)lenLimit, curMatch, MF_PARAMS(p)); MOVE_POS;
-
-#define UPDATE_maxLen {\
- ptrdiff_t diff = (ptrdiff_t)0 - d2; \
- const Byte *c = cur + maxLen; \
- const Byte *lim = cur + lenLimit; \
- for (; c != lim; c++) if (*(c + diff) != *c) break; \
- maxLen = (unsigned)(c - cur); }
-
-static UInt32
-Bt2_MatchFinder_GetMatches (
- CMatchFinder *p,
- UInt32 *distances
- )
-{
- unsigned offset;
-
- GET_MATCHES_HEADER (2)
- HASH2_CALC;
- curMatch = p->hash[hv];
- p->hash[hv] = p->pos;
- offset = 0;
- GET_MATCHES_FOOTER (offset, 1)
-}
-
-UInt32
-Bt3Zip_MatchFinder_GetMatches (
- CMatchFinder *p,
- UInt32 *distances
- )
-{
- unsigned offset;
-
- GET_MATCHES_HEADER (3)
- HASH_ZIP_CALC;
- curMatch = p->hash[hv];
- p->hash[hv] = p->pos;
- offset = 0;
- GET_MATCHES_FOOTER (offset, 2)
-}
-
-static UInt32
-Bt3_MatchFinder_GetMatches (
- CMatchFinder *p,
- UInt32 *distances
- )
-{
- UInt32 h2, d2, pos;
- unsigned maxLen, offset;
- UInt32 *hash;
-
- GET_MATCHES_HEADER (3)
-
- HASH3_CALC;
-
- hash = p->hash;
- pos = p->pos;
-
- d2 = pos - hash[h2];
-
- curMatch = (hash + kFix3HashSize)[hv];
-
- hash[h2] = pos;
- (hash + kFix3HashSize)[hv] = pos;
-
- maxLen = 2;
- offset = 0;
-
- if ((d2 < p->cyclicBufferSize) && (*(cur - d2) == *cur)) {
- UPDATE_maxLen
- distances[0] = (UInt32)maxLen;
- distances[1] = d2 - 1;
- offset = 2;
- if (maxLen == lenLimit) {
- SkipMatchesSpec ((UInt32)lenLimit, curMatch, MF_PARAMS (p));
- MOVE_POS_RET;
- }
- }
-
- GET_MATCHES_FOOTER (offset, maxLen)
-}
-
-static UInt32
-Bt4_MatchFinder_GetMatches (
- CMatchFinder *p,
- UInt32 *distances
- )
-{
- UInt32 h2, h3, d2, d3, pos;
- unsigned maxLen, offset;
- UInt32 *hash;
-
- GET_MATCHES_HEADER (4)
-
- HASH4_CALC;
-
- hash = p->hash;
- pos = p->pos;
-
- d2 = pos - hash[h2];
- d3 = pos - (hash + kFix3HashSize)[h3];
-
- curMatch = (hash + kFix4HashSize)[hv];
-
- hash[h2] = pos;
- (hash + kFix3HashSize)[h3] = pos;
- (hash + kFix4HashSize)[hv] = pos;
-
- maxLen = 0;
- offset = 0;
-
- if ((d2 < p->cyclicBufferSize) && (*(cur - d2) == *cur)) {
- maxLen = 2;
- distances[0] = 2;
- distances[1] = d2 - 1;
- offset = 2;
- }
-
- if ((d2 != d3) && (d3 < p->cyclicBufferSize) && (*(cur - d3) == *cur)) {
- maxLen = 3;
- distances[(size_t)offset + 1] = d3 - 1;
- offset += 2;
- d2 = d3;
- }
-
- if (offset != 0) {
- UPDATE_maxLen
- distances[(size_t)offset - 2] = (UInt32)maxLen;
- if (maxLen == lenLimit) {
- SkipMatchesSpec ((UInt32)lenLimit, curMatch, MF_PARAMS (p));
- MOVE_POS_RET;
- }
- }
-
- if (maxLen < 3) {
- maxLen = 3;
- }
-
- GET_MATCHES_FOOTER (offset, maxLen)
-}
-
-/*
-static UInt32 Bt5_MatchFinder_GetMatches(CMatchFinder *p, UInt32 *distances)
-{
- UInt32 h2, h3, h4, d2, d3, d4, maxLen, offset, pos;
- UInt32 *hash;
- GET_MATCHES_HEADER(5)
-
- HASH5_CALC;
-
- hash = p->hash;
- pos = p->pos;
-
- d2 = pos - hash[ h2];
- d3 = pos - (hash + kFix3HashSize)[h3];
- d4 = pos - (hash + kFix4HashSize)[h4];
-
- curMatch = (hash + kFix5HashSize)[hv];
-
- hash[ h2] = pos;
- (hash + kFix3HashSize)[h3] = pos;
- (hash + kFix4HashSize)[h4] = pos;
- (hash + kFix5HashSize)[hv] = pos;
-
- maxLen = 0;
- offset = 0;
-
- if (d2 < p->cyclicBufferSize && *(cur - d2) == *cur)
- {
- distances[0] = maxLen = 2;
- distances[1] = d2 - 1;
- offset = 2;
- if (*(cur - d2 + 2) == cur[2])
- distances[0] = maxLen = 3;
- else if (d3 < p->cyclicBufferSize && *(cur - d3) == *cur)
- {
- distances[2] = maxLen = 3;
- distances[3] = d3 - 1;
- offset = 4;
- d2 = d3;
- }
- }
- else if (d3 < p->cyclicBufferSize && *(cur - d3) == *cur)
- {
- distances[0] = maxLen = 3;
- distances[1] = d3 - 1;
- offset = 2;
- d2 = d3;
- }
-
- if (d2 != d4 && d4 < p->cyclicBufferSize
- && *(cur - d4) == *cur
- && *(cur - d4 + 3) == *(cur + 3))
- {
- maxLen = 4;
- distances[(size_t)offset + 1] = d4 - 1;
- offset += 2;
- d2 = d4;
- }
-
- if (offset != 0)
- {
- UPDATE_maxLen
- distances[(size_t)offset - 2] = maxLen;
- if (maxLen == lenLimit)
- {
- SkipMatchesSpec(lenLimit, curMatch, MF_PARAMS(p));
- MOVE_POS_RET;
- }
- }
-
- if (maxLen < 4)
- maxLen = 4;
-
- GET_MATCHES_FOOTER(offset, maxLen)
-}
-*/
-static UInt32
-Hc4_MatchFinder_GetMatches (
- CMatchFinder *p,
- UInt32 *distances
- )
-{
- UInt32 h2, h3, d2, d3, pos;
- unsigned maxLen, offset;
- UInt32 *hash;
-
- GET_MATCHES_HEADER (4)
-
- HASH4_CALC;
-
- hash = p->hash;
- pos = p->pos;
-
- d2 = pos - hash[h2];
- d3 = pos - (hash + kFix3HashSize)[h3];
-
- curMatch = (hash + kFix4HashSize)[hv];
-
- hash[h2] = pos;
- (hash + kFix3HashSize)[h3] = pos;
- (hash + kFix4HashSize)[hv] = pos;
-
- maxLen = 0;
- offset = 0;
-
- if ((d2 < p->cyclicBufferSize) && (*(cur - d2) == *cur)) {
- maxLen = 2;
- distances[0] = 2;
- distances[1] = d2 - 1;
- offset = 2;
- }
-
- if ((d2 != d3) && (d3 < p->cyclicBufferSize) && (*(cur - d3) == *cur)) {
- maxLen = 3;
- distances[(size_t)offset + 1] = d3 - 1;
- offset += 2;
- d2 = d3;
- }
-
- if (offset != 0) {
- UPDATE_maxLen
- distances[(size_t)offset - 2] = (UInt32)maxLen;
- if (maxLen == lenLimit) {
- p->son[p->cyclicBufferPos] = curMatch;
- MOVE_POS_RET;
- }
- }
-
- if (maxLen < 3) {
- maxLen = 3;
- }
-
- offset = (unsigned)(Hc_GetMatchesSpec (
- lenLimit,
- curMatch,
- MF_PARAMS (p),
- distances + offset,
- maxLen
- ) - (distances));
- MOVE_POS_RET
-}
-
-/*
-static UInt32 Hc5_MatchFinder_GetMatches(CMatchFinder *p, UInt32 *distances)
-{
- UInt32 h2, h3, h4, d2, d3, d4, maxLen, offset, pos
- UInt32 *hash;
- GET_MATCHES_HEADER(5)
-
- HASH5_CALC;
-
- hash = p->hash;
- pos = p->pos;
-
- d2 = pos - hash[ h2];
- d3 = pos - (hash + kFix3HashSize)[h3];
- d4 = pos - (hash + kFix4HashSize)[h4];
-
- curMatch = (hash + kFix5HashSize)[hv];
-
- hash[ h2] = pos;
- (hash + kFix3HashSize)[h3] = pos;
- (hash + kFix4HashSize)[h4] = pos;
- (hash + kFix5HashSize)[hv] = pos;
-
- maxLen = 0;
- offset = 0;
-
- if (d2 < p->cyclicBufferSize && *(cur - d2) == *cur)
- {
- distances[0] = maxLen = 2;
- distances[1] = d2 - 1;
- offset = 2;
- if (*(cur - d2 + 2) == cur[2])
- distances[0] = maxLen = 3;
- else if (d3 < p->cyclicBufferSize && *(cur - d3) == *cur)
- {
- distances[2] = maxLen = 3;
- distances[3] = d3 - 1;
- offset = 4;
- d2 = d3;
- }
- }
- else if (d3 < p->cyclicBufferSize && *(cur - d3) == *cur)
- {
- distances[0] = maxLen = 3;
- distances[1] = d3 - 1;
- offset = 2;
- d2 = d3;
- }
-
- if (d2 != d4 && d4 < p->cyclicBufferSize
- && *(cur - d4) == *cur
- && *(cur - d4 + 3) == *(cur + 3))
- {
- maxLen = 4;
- distances[(size_t)offset + 1] = d4 - 1;
- offset += 2;
- d2 = d4;
- }
-
- if (offset != 0)
- {
- UPDATE_maxLen
- distances[(size_t)offset - 2] = maxLen;
- if (maxLen == lenLimit)
- {
- p->son[p->cyclicBufferPos] = curMatch;
- MOVE_POS_RET;
- }
- }
-
- if (maxLen < 4)
- maxLen = 4;
-
- offset = (UInt32)(Hc_GetMatchesSpec(lenLimit, curMatch, MF_PARAMS(p),
- distances + offset, maxLen) - (distances));
- MOVE_POS_RET
-}
-*/
-UInt32
-Hc3Zip_MatchFinder_GetMatches (
- CMatchFinder *p,
- UInt32 *distances
- )
-{
- unsigned offset;
-
- GET_MATCHES_HEADER (3)
- HASH_ZIP_CALC;
- curMatch = p->hash[hv];
- p->hash[hv] = p->pos;
- offset = (unsigned)(Hc_GetMatchesSpec (
- lenLimit,
- curMatch,
- MF_PARAMS (p),
- distances,
- 2
- ) - (distances));
- MOVE_POS_RET
-}
-
-static void
-Bt2_MatchFinder_Skip (
- CMatchFinder *p,
- UInt32 num
- )
-{
- do {
- SKIP_HEADER (2)
- HASH2_CALC;
- curMatch = p->hash[hv];
- p->hash[hv] = p->pos;
- SKIP_FOOTER
- } while (--num != 0);
-}
-
-void
-Bt3Zip_MatchFinder_Skip (
- CMatchFinder *p,
- UInt32 num
- )
-{
- do {
- SKIP_HEADER (3)
- HASH_ZIP_CALC;
- curMatch = p->hash[hv];
- p->hash[hv] = p->pos;
- SKIP_FOOTER
- } while (--num != 0);
-}
-
-static void
-Bt3_MatchFinder_Skip (
- CMatchFinder *p,
- UInt32 num
- )
-{
- do {
- UInt32 h2;
- UInt32 *hash;
- SKIP_HEADER (3)
- HASH3_CALC;
- hash = p->hash;
- curMatch = (hash + kFix3HashSize)[hv];
- hash[h2] =
- (hash + kFix3HashSize)[hv] = p->pos;
- SKIP_FOOTER
- } while (--num != 0);
-}
-
-static void
-Bt4_MatchFinder_Skip (
- CMatchFinder *p,
- UInt32 num
- )
-{
- do {
- UInt32 h2, h3;
- UInt32 *hash;
- SKIP_HEADER (4)
- HASH4_CALC;
- hash = p->hash;
- curMatch = (hash + kFix4HashSize)[hv];
- hash[h2] =
- (hash + kFix3HashSize)[h3] =
- (hash + kFix4HashSize)[hv] = p->pos;
- SKIP_FOOTER
- } while (--num != 0);
-}
-
-/*
-static void Bt5_MatchFinder_Skip(CMatchFinder *p, UInt32 num)
-{
- do
- {
- UInt32 h2, h3, h4;
- UInt32 *hash;
- SKIP_HEADER(5)
- HASH5_CALC;
- hash = p->hash;
- curMatch = (hash + kFix5HashSize)[hv];
- hash[ h2] =
- (hash + kFix3HashSize)[h3] =
- (hash + kFix4HashSize)[h4] =
- (hash + kFix5HashSize)[hv] = p->pos;
- SKIP_FOOTER
- }
- while (--num != 0);
-}
-*/
-static void
-Hc4_MatchFinder_Skip (
- CMatchFinder *p,
- UInt32 num
- )
-{
- do {
- UInt32 h2, h3;
- UInt32 *hash;
- SKIP_HEADER (4)
- HASH4_CALC;
- hash = p->hash;
- curMatch = (hash + kFix4HashSize)[hv];
- hash[h2] =
- (hash + kFix3HashSize)[h3] =
- (hash + kFix4HashSize)[hv] = p->pos;
- p->son[p->cyclicBufferPos] = curMatch;
- MOVE_POS
- } while (--num != 0);
-}
-
-/*
-static void Hc5_MatchFinder_Skip(CMatchFinder *p, UInt32 num)
-{
- do
- {
- UInt32 h2, h3, h4;
- UInt32 *hash;
- SKIP_HEADER(5)
- HASH5_CALC;
- hash = p->hash;
- curMatch = hash + kFix5HashSize)[hv];
- hash[ h2] =
- (hash + kFix3HashSize)[h3] =
- (hash + kFix4HashSize)[h4] =
- (hash + kFix5HashSize)[hv] = p->pos;
- p->son[p->cyclicBufferPos] = curMatch;
- MOVE_POS
- }
- while (--num != 0);
-}
-*/
-void
-Hc3Zip_MatchFinder_Skip (
- CMatchFinder *p,
- UInt32 num
- )
-{
- do {
- SKIP_HEADER (3)
- HASH_ZIP_CALC;
- curMatch = p->hash[hv];
- p->hash[hv] = p->pos;
- p->son[p->cyclicBufferPos] = curMatch;
- MOVE_POS
- } while (--num != 0);
-}
-
-void
-MatchFinder_CreateVTable (
- CMatchFinder *p,
- IMatchFinder *vTable
- )
-{
- vTable->Init = (Mf_Init_Func)MatchFinder_Init;
- vTable->GetNumAvailableBytes = (Mf_GetNumAvailableBytes_Func)MatchFinder_GetNumAvailableBytes;
- vTable->GetPointerToCurrentPos = (Mf_GetPointerToCurrentPos_Func)MatchFinder_GetPointerToCurrentPos;
- if (!p->btMode) {
- /* if (p->numHashBytes <= 4) */
- {
- vTable->GetMatches = (Mf_GetMatches_Func)Hc4_MatchFinder_GetMatches;
- vTable->Skip = (Mf_Skip_Func)Hc4_MatchFinder_Skip;
- }
-
- /*
- else
- {
- vTable->GetMatches = (Mf_GetMatches_Func)Hc5_MatchFinder_GetMatches;
- vTable->Skip = (Mf_Skip_Func)Hc5_MatchFinder_Skip;
- }
- */
- } else if (p->numHashBytes == 2) {
- vTable->GetMatches = (Mf_GetMatches_Func)Bt2_MatchFinder_GetMatches;
- vTable->Skip = (Mf_Skip_Func)Bt2_MatchFinder_Skip;
- } else if (p->numHashBytes == 3) {
- vTable->GetMatches = (Mf_GetMatches_Func)Bt3_MatchFinder_GetMatches;
- vTable->Skip = (Mf_Skip_Func)Bt3_MatchFinder_Skip;
- } else {
- /* if (p->numHashBytes == 4) */
- vTable->GetMatches = (Mf_GetMatches_Func)Bt4_MatchFinder_GetMatches;
- vTable->Skip = (Mf_Skip_Func)Bt4_MatchFinder_Skip;
- }
-
- /*
- else
- {
- vTable->GetMatches = (Mf_GetMatches_Func)Bt5_MatchFinder_GetMatches;
- vTable->Skip = (Mf_Skip_Func)Bt5_MatchFinder_Skip;
- }
- */
-}
+/* LzFind.c -- Match finder for LZ algorithms +2018-07-08 : Igor Pavlov : Public domain */ + +#include "Precomp.h" + +#ifndef EFIAPI + #include <string.h> +#endif + +#include "LzFind.h" +#include "LzHash.h" + +#define kEmptyHashValue 0 +#define kMaxValForNormalize ((UInt32)0xFFFFFFFF) +#define kNormalizeStepMin (1 << 10)/* it must be power of 2 */ +#define kNormalizeMask (~(UInt32)(kNormalizeStepMin - 1)) +#define kMaxHistorySize ((UInt32)7 << 29) + +#define kStartMaxLen 3 + +static void +LzInWindow_Free ( + CMatchFinder *p, + ISzAllocPtr alloc + ) +{ + if (!p->directInput) { + ISzAlloc_Free (alloc, p->bufferBase); + p->bufferBase = NULL; + } +} + +/* keepSizeBefore + keepSizeAfter + keepSizeReserv must be < 4G) */ + +static int +LzInWindow_Create ( + CMatchFinder *p, + UInt32 keepSizeReserv, + ISzAllocPtr alloc + ) +{ + UInt32 blockSize = p->keepSizeBefore + p->keepSizeAfter + keepSizeReserv; + + if (p->directInput) { + p->blockSize = blockSize; + return 1; + } + + if (!p->bufferBase || (p->blockSize != blockSize)) { + LzInWindow_Free (p, alloc); + p->blockSize = blockSize; + p->bufferBase = (Byte *)ISzAlloc_Alloc (alloc, (size_t)blockSize); + } + + return (p->bufferBase != NULL); +} + +Byte * +MatchFinder_GetPointerToCurrentPos ( + CMatchFinder *p + ) +{ + return p->buffer; +} + +UInt32 +MatchFinder_GetNumAvailableBytes ( + CMatchFinder *p + ) +{ + return p->streamPos - p->pos; +} + +void +MatchFinder_ReduceOffsets ( + CMatchFinder *p, + UInt32 subValue + ) +{ + p->posLimit -= subValue; + p->pos -= subValue; + p->streamPos -= subValue; +} + +static void +MatchFinder_ReadBlock ( + CMatchFinder *p + ) +{ + if (p->streamEndWasReached || (p->result != SZ_OK)) { + return; + } + + /* We use (p->streamPos - p->pos) value. (p->streamPos < p->pos) is allowed. */ + + if (p->directInput) { + UInt32 curSize = 0xFFFFFFFF - (p->streamPos - p->pos); + if (curSize > p->directInputRem) { + curSize = (UInt32)p->directInputRem; + } + + p->directInputRem -= curSize; + p->streamPos += curSize; + if (p->directInputRem == 0) { + p->streamEndWasReached = 1; + } + + return; + } + + for ( ; ;) { + Byte *dest = p->buffer + (p->streamPos - p->pos); + size_t size = (p->bufferBase + p->blockSize - dest); + if (size == 0) { + return; + } + + p->result = ISeqInStream_Read (p->stream, dest, &size); + if (p->result != SZ_OK) { + return; + } + + if (size == 0) { + p->streamEndWasReached = 1; + return; + } + + p->streamPos += (UInt32)size; + if (p->streamPos - p->pos > p->keepSizeAfter) { + return; + } + } +} + +void +MatchFinder_MoveBlock ( + CMatchFinder *p + ) +{ + memmove ( + p->bufferBase, + p->buffer - p->keepSizeBefore, + (size_t)(p->streamPos - p->pos) + p->keepSizeBefore + ); + p->buffer = p->bufferBase + p->keepSizeBefore; +} + +int +MatchFinder_NeedMove ( + CMatchFinder *p + ) +{ + if (p->directInput) { + return 0; + } + + /* if (p->streamEndWasReached) return 0; */ + return ((size_t)(p->bufferBase + p->blockSize - p->buffer) <= p->keepSizeAfter); +} + +void +MatchFinder_ReadIfRequired ( + CMatchFinder *p + ) +{ + if (p->streamEndWasReached) { + return; + } + + if (p->keepSizeAfter >= p->streamPos - p->pos) { + MatchFinder_ReadBlock (p); + } +} + +static void +MatchFinder_CheckAndMoveAndRead ( + CMatchFinder *p + ) +{ + if (MatchFinder_NeedMove (p)) { + MatchFinder_MoveBlock (p); + } + + MatchFinder_ReadBlock (p); +} + +static void +MatchFinder_SetDefaultSettings ( + CMatchFinder *p + ) +{ + p->cutValue = 32; + p->btMode = 1; + p->numHashBytes = 4; + p->bigHash = 0; +} + +#define kCrcPoly 0xEDB88320 + +void +MatchFinder_Construct ( + CMatchFinder *p + ) +{ + unsigned i; + + p->bufferBase = NULL; + p->directInput = 0; + p->hash = NULL; + p->expectedDataSize = (UInt64)(Int64)-1; + MatchFinder_SetDefaultSettings (p); + + for (i = 0; i < 256; i++) { + UInt32 r = (UInt32)i; + unsigned j; + for (j = 0; j < 8; j++) { + r = (r >> 1) ^ (kCrcPoly & ((UInt32)0 - (r & 1))); + } + + p->crc[i] = r; + } +} + +static void +MatchFinder_FreeThisClassMemory ( + CMatchFinder *p, + ISzAllocPtr alloc + ) +{ + ISzAlloc_Free (alloc, p->hash); + p->hash = NULL; +} + +void +MatchFinder_Free ( + CMatchFinder *p, + ISzAllocPtr alloc + ) +{ + MatchFinder_FreeThisClassMemory (p, alloc); + LzInWindow_Free (p, alloc); +} + +static CLzRef * +AllocRefs ( + size_t num, + ISzAllocPtr alloc + ) +{ + size_t sizeInBytes = (size_t)num * sizeof (CLzRef); + + if (sizeInBytes / sizeof (CLzRef) != num) { + return NULL; + } + + return (CLzRef *)ISzAlloc_Alloc (alloc, sizeInBytes); +} + +int +MatchFinder_Create ( + CMatchFinder *p, + UInt32 historySize, + UInt32 keepAddBufferBefore, + UInt32 matchMaxLen, + UInt32 keepAddBufferAfter, + ISzAllocPtr alloc + ) +{ + UInt32 sizeReserv; + + if (historySize > kMaxHistorySize) { + MatchFinder_Free (p, alloc); + return 0; + } + + sizeReserv = historySize >> 1; + if (historySize >= ((UInt32)3 << 30)) { + sizeReserv = historySize >> 3; + } else if (historySize >= ((UInt32)2 << 30)) { + sizeReserv = historySize >> 2; + } + + sizeReserv += (keepAddBufferBefore + matchMaxLen + keepAddBufferAfter) / 2 + (1 << 19); + + p->keepSizeBefore = historySize + keepAddBufferBefore + 1; + p->keepSizeAfter = matchMaxLen + keepAddBufferAfter; + + /* we need one additional byte, since we use MoveBlock after pos++ and before dictionary using */ + + if (LzInWindow_Create (p, sizeReserv, alloc)) { + UInt32 newCyclicBufferSize = historySize + 1; + UInt32 hs; + p->matchMaxLen = matchMaxLen; + { + p->fixedHashSize = 0; + if (p->numHashBytes == 2) { + hs = (1 << 16) - 1; + } else { + hs = historySize; + if (hs > p->expectedDataSize) { + hs = (UInt32)p->expectedDataSize; + } + + if (hs != 0) { + hs--; + } + + hs |= (hs >> 1); + hs |= (hs >> 2); + hs |= (hs >> 4); + hs |= (hs >> 8); + hs >>= 1; + hs |= 0xFFFF; /* don't change it! It's required for Deflate */ + if (hs > (1 << 24)) { + if (p->numHashBytes == 3) { + hs = (1 << 24) - 1; + } else { + hs >>= 1; + } + + /* if (bigHash) mode, GetHeads4b() in LzFindMt.c needs (hs >= ((1 << 24) - 1))) */ + } + } + + p->hashMask = hs; + hs++; + if (p->numHashBytes > 2) { + p->fixedHashSize += kHash2Size; + } + + if (p->numHashBytes > 3) { + p->fixedHashSize += kHash3Size; + } + + if (p->numHashBytes > 4) { + p->fixedHashSize += kHash4Size; + } + + hs += p->fixedHashSize; + } + + { + size_t newSize; + size_t numSons; + p->historySize = historySize; + p->hashSizeSum = hs; + p->cyclicBufferSize = newCyclicBufferSize; + + numSons = newCyclicBufferSize; + if (p->btMode) { + numSons <<= 1; + } + + newSize = hs + numSons; + + if (p->hash && (p->numRefs == newSize)) { + return 1; + } + + MatchFinder_FreeThisClassMemory (p, alloc); + p->numRefs = newSize; + p->hash = AllocRefs (newSize, alloc); + + if (p->hash) { + p->son = p->hash + p->hashSizeSum; + return 1; + } + } + } + + MatchFinder_Free (p, alloc); + return 0; +} + +static void +MatchFinder_SetLimits ( + CMatchFinder *p + ) +{ + UInt32 limit = kMaxValForNormalize - p->pos; + UInt32 limit2 = p->cyclicBufferSize - p->cyclicBufferPos; + + if (limit2 < limit) { + limit = limit2; + } + + limit2 = p->streamPos - p->pos; + + if (limit2 <= p->keepSizeAfter) { + if (limit2 > 0) { + limit2 = 1; + } + } else { + limit2 -= p->keepSizeAfter; + } + + if (limit2 < limit) { + limit = limit2; + } + + { + UInt32 lenLimit = p->streamPos - p->pos; + if (lenLimit > p->matchMaxLen) { + lenLimit = p->matchMaxLen; + } + + p->lenLimit = lenLimit; + } + p->posLimit = p->pos + limit; +} + +void +MatchFinder_Init_LowHash ( + CMatchFinder *p + ) +{ + size_t i; + CLzRef *items = p->hash; + size_t numItems = p->fixedHashSize; + + for (i = 0; i < numItems; i++) { + items[i] = kEmptyHashValue; + } +} + +void +MatchFinder_Init_HighHash ( + CMatchFinder *p + ) +{ + size_t i; + CLzRef *items = p->hash + p->fixedHashSize; + size_t numItems = (size_t)p->hashMask + 1; + + for (i = 0; i < numItems; i++) { + items[i] = kEmptyHashValue; + } +} + +void +MatchFinder_Init_3 ( + CMatchFinder *p, + int readData + ) +{ + p->cyclicBufferPos = 0; + p->buffer = p->bufferBase; + p->pos = + p->streamPos = p->cyclicBufferSize; + p->result = SZ_OK; + p->streamEndWasReached = 0; + + if (readData) { + MatchFinder_ReadBlock (p); + } + + MatchFinder_SetLimits (p); +} + +void +MatchFinder_Init ( + CMatchFinder *p + ) +{ + MatchFinder_Init_HighHash (p); + MatchFinder_Init_LowHash (p); + MatchFinder_Init_3 (p, True); +} + +static UInt32 +MatchFinder_GetSubValue ( + CMatchFinder *p + ) +{ + return (p->pos - p->historySize - 1) & kNormalizeMask; +} + +void +MatchFinder_Normalize3 ( + UInt32 subValue, + CLzRef *items, + size_t numItems + ) +{ + size_t i; + + for (i = 0; i < numItems; i++) { + UInt32 value = items[i]; + if (value <= subValue) { + value = kEmptyHashValue; + } else { + value -= subValue; + } + + items[i] = value; + } +} + +static void +MatchFinder_Normalize ( + CMatchFinder *p + ) +{ + UInt32 subValue = MatchFinder_GetSubValue (p); + + MatchFinder_Normalize3 (subValue, p->hash, p->numRefs); + MatchFinder_ReduceOffsets (p, subValue); +} + +MY_NO_INLINE +static void +MatchFinder_CheckLimits ( + CMatchFinder *p + ) +{ + if (p->pos == kMaxValForNormalize) { + MatchFinder_Normalize (p); + } + + if (!p->streamEndWasReached && (p->keepSizeAfter == p->streamPos - p->pos)) { + MatchFinder_CheckAndMoveAndRead (p); + } + + if (p->cyclicBufferPos == p->cyclicBufferSize) { + p->cyclicBufferPos = 0; + } + + MatchFinder_SetLimits (p); +} + +/* + (lenLimit > maxLen) +*/ +MY_FORCE_INLINE +static UInt32 * +Hc_GetMatchesSpec ( + unsigned lenLimit, + UInt32 curMatch, + UInt32 pos, + const Byte *cur, + CLzRef *son, + UInt32 _cyclicBufferPos, + UInt32 _cyclicBufferSize, + UInt32 cutValue, + UInt32 *distances, + unsigned maxLen + ) +{ + /* + son[_cyclicBufferPos] = curMatch; + for (;;) + { + UInt32 delta = pos - curMatch; + if (cutValue-- == 0 || delta >= _cyclicBufferSize) + return distances; + { + const Byte *pb = cur - delta; + curMatch = son[_cyclicBufferPos - delta + ((delta > _cyclicBufferPos) ? _cyclicBufferSize : 0)]; + if (pb[maxLen] == cur[maxLen] && *pb == *cur) + { + UInt32 len = 0; + while (++len != lenLimit) + if (pb[len] != cur[len]) + break; + if (maxLen < len) + { + maxLen = len; + *distances++ = len; + *distances++ = delta - 1; + if (len == lenLimit) + return distances; + } + } + } + } + */ + + const Byte *lim = cur + lenLimit; + + son[_cyclicBufferPos] = curMatch; + do { + UInt32 delta = pos - curMatch; + if (delta >= _cyclicBufferSize) { + break; + } + + { + ptrdiff_t diff; + curMatch = son[_cyclicBufferPos - delta + ((delta > _cyclicBufferPos) ? _cyclicBufferSize : 0)]; + diff = (ptrdiff_t)0 - delta; + if (cur[maxLen] == cur[maxLen + diff]) { + const Byte *c = cur; + while (*c == c[diff]) { + if (++c == lim) { + distances[0] = (UInt32)(lim - cur); + distances[1] = delta - 1; + return distances + 2; + } + } + + { + unsigned len = (unsigned)(c - cur); + if (maxLen < len) { + maxLen = len; + distances[0] = (UInt32)len; + distances[1] = delta - 1; + distances += 2; + } + } + } + } + } while (--cutValue); + + return distances; +} + +MY_FORCE_INLINE +UInt32 * +GetMatchesSpec1 ( + UInt32 lenLimit, + UInt32 curMatch, + UInt32 pos, + const Byte *cur, + CLzRef *son, + UInt32 _cyclicBufferPos, + UInt32 _cyclicBufferSize, + UInt32 cutValue, + UInt32 *distances, + UInt32 maxLen + ) +{ + CLzRef *ptr0 = son + ((size_t)_cyclicBufferPos << 1) + 1; + CLzRef *ptr1 = son + ((size_t)_cyclicBufferPos << 1); + unsigned len0 = 0, len1 = 0; + + for ( ; ;) { + UInt32 delta = pos - curMatch; + if ((cutValue-- == 0) || (delta >= _cyclicBufferSize)) { + *ptr0 = *ptr1 = kEmptyHashValue; + return distances; + } + + { + CLzRef *pair = son + ((size_t)(_cyclicBufferPos - delta + ((delta > _cyclicBufferPos) ? _cyclicBufferSize : 0)) << 1); + const Byte *pb = cur - delta; + unsigned len = (len0 < len1 ? len0 : len1); + UInt32 pair0 = pair[0]; + if (pb[len] == cur[len]) { + if ((++len != lenLimit) && (pb[len] == cur[len])) { + while (++len != lenLimit) { + if (pb[len] != cur[len]) { + break; + } + } + } + + if (maxLen < len) { + maxLen = (UInt32)len; + *distances++ = (UInt32)len; + *distances++ = delta - 1; + if (len == lenLimit) { + *ptr1 = pair0; + *ptr0 = pair[1]; + return distances; + } + } + } + + if (pb[len] < cur[len]) { + *ptr1 = curMatch; + ptr1 = pair + 1; + curMatch = *ptr1; + len1 = len; + } else { + *ptr0 = curMatch; + ptr0 = pair; + curMatch = *ptr0; + len0 = len; + } + } + } +} + +static void +SkipMatchesSpec ( + UInt32 lenLimit, + UInt32 curMatch, + UInt32 pos, + const Byte *cur, + CLzRef *son, + UInt32 _cyclicBufferPos, + UInt32 _cyclicBufferSize, + UInt32 cutValue + ) +{ + CLzRef *ptr0 = son + ((size_t)_cyclicBufferPos << 1) + 1; + CLzRef *ptr1 = son + ((size_t)_cyclicBufferPos << 1); + unsigned len0 = 0, len1 = 0; + + for ( ; ;) { + UInt32 delta = pos - curMatch; + if ((cutValue-- == 0) || (delta >= _cyclicBufferSize)) { + *ptr0 = *ptr1 = kEmptyHashValue; + return; + } + + { + CLzRef *pair = son + ((size_t)(_cyclicBufferPos - delta + ((delta > _cyclicBufferPos) ? _cyclicBufferSize : 0)) << 1); + const Byte *pb = cur - delta; + unsigned len = (len0 < len1 ? len0 : len1); + if (pb[len] == cur[len]) { + while (++len != lenLimit) { + if (pb[len] != cur[len]) { + break; + } + } + + { + if (len == lenLimit) { + *ptr1 = pair[0]; + *ptr0 = pair[1]; + return; + } + } + } + + if (pb[len] < cur[len]) { + *ptr1 = curMatch; + ptr1 = pair + 1; + curMatch = *ptr1; + len1 = len; + } else { + *ptr0 = curMatch; + ptr0 = pair; + curMatch = *ptr0; + len0 = len; + } + } + } +} + +#define MOVE_POS \ + ++p->cyclicBufferPos; \ + p->buffer++; \ + if (++p->pos == p->posLimit) MatchFinder_CheckLimits(p); + +#define MOVE_POS_RET MOVE_POS return (UInt32)offset; + +static void +MatchFinder_MovePos ( + CMatchFinder *p + ) +{ + MOVE_POS; +} + +#define GET_MATCHES_HEADER2(minLen, ret_op) \ + unsigned lenLimit; UInt32 hv; const Byte *cur; UInt32 curMatch; \ + lenLimit = (unsigned)p->lenLimit; { if (lenLimit < minLen) { MatchFinder_MovePos(p); ret_op; }} \ + cur = p->buffer; + +#define GET_MATCHES_HEADER(minLen) GET_MATCHES_HEADER2(minLen, return 0) +#define SKIP_HEADER(minLen) GET_MATCHES_HEADER2(minLen, continue) + +#define MF_PARAMS(p) p->pos, p->buffer, p->son, p->cyclicBufferPos, p->cyclicBufferSize, p->cutValue + +#define GET_MATCHES_FOOTER(offset, maxLen) \ + offset = (unsigned)(GetMatchesSpec1((UInt32)lenLimit, curMatch, MF_PARAMS(p), \ + distances + offset, (UInt32)maxLen) - distances); MOVE_POS_RET; + +#define SKIP_FOOTER \ + SkipMatchesSpec((UInt32)lenLimit, curMatch, MF_PARAMS(p)); MOVE_POS; + +#define UPDATE_maxLen {\ + ptrdiff_t diff = (ptrdiff_t)0 - d2; \ + const Byte *c = cur + maxLen; \ + const Byte *lim = cur + lenLimit; \ + for (; c != lim; c++) if (*(c + diff) != *c) break; \ + maxLen = (unsigned)(c - cur); } + +static UInt32 +Bt2_MatchFinder_GetMatches ( + CMatchFinder *p, + UInt32 *distances + ) +{ + unsigned offset; + + GET_MATCHES_HEADER (2) + HASH2_CALC; + curMatch = p->hash[hv]; + p->hash[hv] = p->pos; + offset = 0; + GET_MATCHES_FOOTER (offset, 1) +} + +UInt32 +Bt3Zip_MatchFinder_GetMatches ( + CMatchFinder *p, + UInt32 *distances + ) +{ + unsigned offset; + + GET_MATCHES_HEADER (3) + HASH_ZIP_CALC; + curMatch = p->hash[hv]; + p->hash[hv] = p->pos; + offset = 0; + GET_MATCHES_FOOTER (offset, 2) +} + +static UInt32 +Bt3_MatchFinder_GetMatches ( + CMatchFinder *p, + UInt32 *distances + ) +{ + UInt32 h2, d2, pos; + unsigned maxLen, offset; + UInt32 *hash; + + GET_MATCHES_HEADER (3) + + HASH3_CALC; + + hash = p->hash; + pos = p->pos; + + d2 = pos - hash[h2]; + + curMatch = (hash + kFix3HashSize)[hv]; + + hash[h2] = pos; + (hash + kFix3HashSize)[hv] = pos; + + maxLen = 2; + offset = 0; + + if ((d2 < p->cyclicBufferSize) && (*(cur - d2) == *cur)) { + UPDATE_maxLen + distances[0] = (UInt32)maxLen; + distances[1] = d2 - 1; + offset = 2; + if (maxLen == lenLimit) { + SkipMatchesSpec ((UInt32)lenLimit, curMatch, MF_PARAMS (p)); + MOVE_POS_RET; + } + } + + GET_MATCHES_FOOTER (offset, maxLen) +} + +static UInt32 +Bt4_MatchFinder_GetMatches ( + CMatchFinder *p, + UInt32 *distances + ) +{ + UInt32 h2, h3, d2, d3, pos; + unsigned maxLen, offset; + UInt32 *hash; + + GET_MATCHES_HEADER (4) + + HASH4_CALC; + + hash = p->hash; + pos = p->pos; + + d2 = pos - hash[h2]; + d3 = pos - (hash + kFix3HashSize)[h3]; + + curMatch = (hash + kFix4HashSize)[hv]; + + hash[h2] = pos; + (hash + kFix3HashSize)[h3] = pos; + (hash + kFix4HashSize)[hv] = pos; + + maxLen = 0; + offset = 0; + + if ((d2 < p->cyclicBufferSize) && (*(cur - d2) == *cur)) { + maxLen = 2; + distances[0] = 2; + distances[1] = d2 - 1; + offset = 2; + } + + if ((d2 != d3) && (d3 < p->cyclicBufferSize) && (*(cur - d3) == *cur)) { + maxLen = 3; + distances[(size_t)offset + 1] = d3 - 1; + offset += 2; + d2 = d3; + } + + if (offset != 0) { + UPDATE_maxLen + distances[(size_t)offset - 2] = (UInt32)maxLen; + if (maxLen == lenLimit) { + SkipMatchesSpec ((UInt32)lenLimit, curMatch, MF_PARAMS (p)); + MOVE_POS_RET; + } + } + + if (maxLen < 3) { + maxLen = 3; + } + + GET_MATCHES_FOOTER (offset, maxLen) +} + +/* +static UInt32 Bt5_MatchFinder_GetMatches(CMatchFinder *p, UInt32 *distances) +{ + UInt32 h2, h3, h4, d2, d3, d4, maxLen, offset, pos; + UInt32 *hash; + GET_MATCHES_HEADER(5) + + HASH5_CALC; + + hash = p->hash; + pos = p->pos; + + d2 = pos - hash[ h2]; + d3 = pos - (hash + kFix3HashSize)[h3]; + d4 = pos - (hash + kFix4HashSize)[h4]; + + curMatch = (hash + kFix5HashSize)[hv]; + + hash[ h2] = pos; + (hash + kFix3HashSize)[h3] = pos; + (hash + kFix4HashSize)[h4] = pos; + (hash + kFix5HashSize)[hv] = pos; + + maxLen = 0; + offset = 0; + + if (d2 < p->cyclicBufferSize && *(cur - d2) == *cur) + { + distances[0] = maxLen = 2; + distances[1] = d2 - 1; + offset = 2; + if (*(cur - d2 + 2) == cur[2]) + distances[0] = maxLen = 3; + else if (d3 < p->cyclicBufferSize && *(cur - d3) == *cur) + { + distances[2] = maxLen = 3; + distances[3] = d3 - 1; + offset = 4; + d2 = d3; + } + } + else if (d3 < p->cyclicBufferSize && *(cur - d3) == *cur) + { + distances[0] = maxLen = 3; + distances[1] = d3 - 1; + offset = 2; + d2 = d3; + } + + if (d2 != d4 && d4 < p->cyclicBufferSize + && *(cur - d4) == *cur + && *(cur - d4 + 3) == *(cur + 3)) + { + maxLen = 4; + distances[(size_t)offset + 1] = d4 - 1; + offset += 2; + d2 = d4; + } + + if (offset != 0) + { + UPDATE_maxLen + distances[(size_t)offset - 2] = maxLen; + if (maxLen == lenLimit) + { + SkipMatchesSpec(lenLimit, curMatch, MF_PARAMS(p)); + MOVE_POS_RET; + } + } + + if (maxLen < 4) + maxLen = 4; + + GET_MATCHES_FOOTER(offset, maxLen) +} +*/ +static UInt32 +Hc4_MatchFinder_GetMatches ( + CMatchFinder *p, + UInt32 *distances + ) +{ + UInt32 h2, h3, d2, d3, pos; + unsigned maxLen, offset; + UInt32 *hash; + + GET_MATCHES_HEADER (4) + + HASH4_CALC; + + hash = p->hash; + pos = p->pos; + + d2 = pos - hash[h2]; + d3 = pos - (hash + kFix3HashSize)[h3]; + + curMatch = (hash + kFix4HashSize)[hv]; + + hash[h2] = pos; + (hash + kFix3HashSize)[h3] = pos; + (hash + kFix4HashSize)[hv] = pos; + + maxLen = 0; + offset = 0; + + if ((d2 < p->cyclicBufferSize) && (*(cur - d2) == *cur)) { + maxLen = 2; + distances[0] = 2; + distances[1] = d2 - 1; + offset = 2; + } + + if ((d2 != d3) && (d3 < p->cyclicBufferSize) && (*(cur - d3) == *cur)) { + maxLen = 3; + distances[(size_t)offset + 1] = d3 - 1; + offset += 2; + d2 = d3; + } + + if (offset != 0) { + UPDATE_maxLen + distances[(size_t)offset - 2] = (UInt32)maxLen; + if (maxLen == lenLimit) { + p->son[p->cyclicBufferPos] = curMatch; + MOVE_POS_RET; + } + } + + if (maxLen < 3) { + maxLen = 3; + } + + offset = (unsigned)(Hc_GetMatchesSpec ( + lenLimit, + curMatch, + MF_PARAMS (p), + distances + offset, + maxLen + ) - (distances)); + MOVE_POS_RET +} + +/* +static UInt32 Hc5_MatchFinder_GetMatches(CMatchFinder *p, UInt32 *distances) +{ + UInt32 h2, h3, h4, d2, d3, d4, maxLen, offset, pos + UInt32 *hash; + GET_MATCHES_HEADER(5) + + HASH5_CALC; + + hash = p->hash; + pos = p->pos; + + d2 = pos - hash[ h2]; + d3 = pos - (hash + kFix3HashSize)[h3]; + d4 = pos - (hash + kFix4HashSize)[h4]; + + curMatch = (hash + kFix5HashSize)[hv]; + + hash[ h2] = pos; + (hash + kFix3HashSize)[h3] = pos; + (hash + kFix4HashSize)[h4] = pos; + (hash + kFix5HashSize)[hv] = pos; + + maxLen = 0; + offset = 0; + + if (d2 < p->cyclicBufferSize && *(cur - d2) == *cur) + { + distances[0] = maxLen = 2; + distances[1] = d2 - 1; + offset = 2; + if (*(cur - d2 + 2) == cur[2]) + distances[0] = maxLen = 3; + else if (d3 < p->cyclicBufferSize && *(cur - d3) == *cur) + { + distances[2] = maxLen = 3; + distances[3] = d3 - 1; + offset = 4; + d2 = d3; + } + } + else if (d3 < p->cyclicBufferSize && *(cur - d3) == *cur) + { + distances[0] = maxLen = 3; + distances[1] = d3 - 1; + offset = 2; + d2 = d3; + } + + if (d2 != d4 && d4 < p->cyclicBufferSize + && *(cur - d4) == *cur + && *(cur - d4 + 3) == *(cur + 3)) + { + maxLen = 4; + distances[(size_t)offset + 1] = d4 - 1; + offset += 2; + d2 = d4; + } + + if (offset != 0) + { + UPDATE_maxLen + distances[(size_t)offset - 2] = maxLen; + if (maxLen == lenLimit) + { + p->son[p->cyclicBufferPos] = curMatch; + MOVE_POS_RET; + } + } + + if (maxLen < 4) + maxLen = 4; + + offset = (UInt32)(Hc_GetMatchesSpec(lenLimit, curMatch, MF_PARAMS(p), + distances + offset, maxLen) - (distances)); + MOVE_POS_RET +} +*/ +UInt32 +Hc3Zip_MatchFinder_GetMatches ( + CMatchFinder *p, + UInt32 *distances + ) +{ + unsigned offset; + + GET_MATCHES_HEADER (3) + HASH_ZIP_CALC; + curMatch = p->hash[hv]; + p->hash[hv] = p->pos; + offset = (unsigned)(Hc_GetMatchesSpec ( + lenLimit, + curMatch, + MF_PARAMS (p), + distances, + 2 + ) - (distances)); + MOVE_POS_RET +} + +static void +Bt2_MatchFinder_Skip ( + CMatchFinder *p, + UInt32 num + ) +{ + do { + SKIP_HEADER (2) + HASH2_CALC; + curMatch = p->hash[hv]; + p->hash[hv] = p->pos; + SKIP_FOOTER + } while (--num != 0); +} + +void +Bt3Zip_MatchFinder_Skip ( + CMatchFinder *p, + UInt32 num + ) +{ + do { + SKIP_HEADER (3) + HASH_ZIP_CALC; + curMatch = p->hash[hv]; + p->hash[hv] = p->pos; + SKIP_FOOTER + } while (--num != 0); +} + +static void +Bt3_MatchFinder_Skip ( + CMatchFinder *p, + UInt32 num + ) +{ + do { + UInt32 h2; + UInt32 *hash; + SKIP_HEADER (3) + HASH3_CALC; + hash = p->hash; + curMatch = (hash + kFix3HashSize)[hv]; + hash[h2] = + (hash + kFix3HashSize)[hv] = p->pos; + SKIP_FOOTER + } while (--num != 0); +} + +static void +Bt4_MatchFinder_Skip ( + CMatchFinder *p, + UInt32 num + ) +{ + do { + UInt32 h2, h3; + UInt32 *hash; + SKIP_HEADER (4) + HASH4_CALC; + hash = p->hash; + curMatch = (hash + kFix4HashSize)[hv]; + hash[h2] = + (hash + kFix3HashSize)[h3] = + (hash + kFix4HashSize)[hv] = p->pos; + SKIP_FOOTER + } while (--num != 0); +} + +/* +static void Bt5_MatchFinder_Skip(CMatchFinder *p, UInt32 num) +{ + do + { + UInt32 h2, h3, h4; + UInt32 *hash; + SKIP_HEADER(5) + HASH5_CALC; + hash = p->hash; + curMatch = (hash + kFix5HashSize)[hv]; + hash[ h2] = + (hash + kFix3HashSize)[h3] = + (hash + kFix4HashSize)[h4] = + (hash + kFix5HashSize)[hv] = p->pos; + SKIP_FOOTER + } + while (--num != 0); +} +*/ +static void +Hc4_MatchFinder_Skip ( + CMatchFinder *p, + UInt32 num + ) +{ + do { + UInt32 h2, h3; + UInt32 *hash; + SKIP_HEADER (4) + HASH4_CALC; + hash = p->hash; + curMatch = (hash + kFix4HashSize)[hv]; + hash[h2] = + (hash + kFix3HashSize)[h3] = + (hash + kFix4HashSize)[hv] = p->pos; + p->son[p->cyclicBufferPos] = curMatch; + MOVE_POS + } while (--num != 0); +} + +/* +static void Hc5_MatchFinder_Skip(CMatchFinder *p, UInt32 num) +{ + do + { + UInt32 h2, h3, h4; + UInt32 *hash; + SKIP_HEADER(5) + HASH5_CALC; + hash = p->hash; + curMatch = hash + kFix5HashSize)[hv]; + hash[ h2] = + (hash + kFix3HashSize)[h3] = + (hash + kFix4HashSize)[h4] = + (hash + kFix5HashSize)[hv] = p->pos; + p->son[p->cyclicBufferPos] = curMatch; + MOVE_POS + } + while (--num != 0); +} +*/ +void +Hc3Zip_MatchFinder_Skip ( + CMatchFinder *p, + UInt32 num + ) +{ + do { + SKIP_HEADER (3) + HASH_ZIP_CALC; + curMatch = p->hash[hv]; + p->hash[hv] = p->pos; + p->son[p->cyclicBufferPos] = curMatch; + MOVE_POS + } while (--num != 0); +} + +void +MatchFinder_CreateVTable ( + CMatchFinder *p, + IMatchFinder *vTable + ) +{ + vTable->Init = (Mf_Init_Func)MatchFinder_Init; + vTable->GetNumAvailableBytes = (Mf_GetNumAvailableBytes_Func)MatchFinder_GetNumAvailableBytes; + vTable->GetPointerToCurrentPos = (Mf_GetPointerToCurrentPos_Func)MatchFinder_GetPointerToCurrentPos; + if (!p->btMode) { + /* if (p->numHashBytes <= 4) */ + { + vTable->GetMatches = (Mf_GetMatches_Func)Hc4_MatchFinder_GetMatches; + vTable->Skip = (Mf_Skip_Func)Hc4_MatchFinder_Skip; + } + + /* + else + { + vTable->GetMatches = (Mf_GetMatches_Func)Hc5_MatchFinder_GetMatches; + vTable->Skip = (Mf_Skip_Func)Hc5_MatchFinder_Skip; + } + */ + } else if (p->numHashBytes == 2) { + vTable->GetMatches = (Mf_GetMatches_Func)Bt2_MatchFinder_GetMatches; + vTable->Skip = (Mf_Skip_Func)Bt2_MatchFinder_Skip; + } else if (p->numHashBytes == 3) { + vTable->GetMatches = (Mf_GetMatches_Func)Bt3_MatchFinder_GetMatches; + vTable->Skip = (Mf_Skip_Func)Bt3_MatchFinder_Skip; + } else { + /* if (p->numHashBytes == 4) */ + vTable->GetMatches = (Mf_GetMatches_Func)Bt4_MatchFinder_GetMatches; + vTable->Skip = (Mf_Skip_Func)Bt4_MatchFinder_Skip; + } + + /* + else + { + vTable->GetMatches = (Mf_GetMatches_Func)Bt5_MatchFinder_GetMatches; + vTable->Skip = (Mf_Skip_Func)Bt5_MatchFinder_Skip; + } + */ +} diff --git a/MdeModulePkg/Library/LzmaCustomDecompressLib/Sdk/C/LzFind.h b/MdeModulePkg/Library/LzmaCustomDecompressLib/Sdk/C/LzFind.h index 923d3e3d95..4f35f36a9f 100644 --- a/MdeModulePkg/Library/LzmaCustomDecompressLib/Sdk/C/LzFind.h +++ b/MdeModulePkg/Library/LzmaCustomDecompressLib/Sdk/C/LzFind.h @@ -1,219 +1,219 @@ -/* LzFind.h -- Match finder for LZ algorithms
-2017-06-10 : Igor Pavlov : Public domain */
-
-#ifndef __LZ_FIND_H
-#define __LZ_FIND_H
-
-#include "7zTypes.h"
-
-EXTERN_C_BEGIN
-
-typedef UInt32 CLzRef;
-
-typedef struct _CMatchFinder {
- Byte *buffer;
- UInt32 pos;
- UInt32 posLimit;
- UInt32 streamPos;
- UInt32 lenLimit;
-
- UInt32 cyclicBufferPos;
- UInt32 cyclicBufferSize; /* it must be = (historySize + 1) */
-
- Byte streamEndWasReached;
- Byte btMode;
- Byte bigHash;
- Byte directInput;
-
- UInt32 matchMaxLen;
- CLzRef *hash;
- CLzRef *son;
- UInt32 hashMask;
- UInt32 cutValue;
-
- Byte *bufferBase;
- ISeqInStream *stream;
-
- UInt32 blockSize;
- UInt32 keepSizeBefore;
- UInt32 keepSizeAfter;
-
- UInt32 numHashBytes;
- size_t directInputRem;
- UInt32 historySize;
- UInt32 fixedHashSize;
- UInt32 hashSizeSum;
- SRes result;
- UInt32 crc[256];
- size_t numRefs;
-
- UInt64 expectedDataSize;
-} CMatchFinder;
-
-#define Inline_MatchFinder_GetPointerToCurrentPos(p) ((p)->buffer)
-
-#define Inline_MatchFinder_GetNumAvailableBytes(p) ((p)->streamPos - (p)->pos)
-
-#define Inline_MatchFinder_IsFinishedOK(p) \
- ((p)->streamEndWasReached \
- && (p)->streamPos == (p)->pos \
- && (!(p)->directInput || (p)->directInputRem == 0))
-
-int
-MatchFinder_NeedMove (
- CMatchFinder *p
- );
-
-Byte *
-MatchFinder_GetPointerToCurrentPos (
- CMatchFinder *p
- );
-
-void
-MatchFinder_MoveBlock (
- CMatchFinder *p
- );
-
-void
-MatchFinder_ReadIfRequired (
- CMatchFinder *p
- );
-
-void
-MatchFinder_Construct (
- CMatchFinder *p
- );
-
-/* Conditions:
- historySize <= 3 GB
- keepAddBufferBefore + matchMaxLen + keepAddBufferAfter < 511MB
-*/
-int
-MatchFinder_Create (
- CMatchFinder *p,
- UInt32 historySize,
- UInt32 keepAddBufferBefore,
- UInt32 matchMaxLen,
- UInt32 keepAddBufferAfter,
- ISzAllocPtr alloc
- );
-
-void
-MatchFinder_Free (
- CMatchFinder *p,
- ISzAllocPtr alloc
- );
-
-void
-MatchFinder_Normalize3 (
- UInt32 subValue,
- CLzRef *items,
- size_t numItems
- );
-
-void
-MatchFinder_ReduceOffsets (
- CMatchFinder *p,
- UInt32 subValue
- );
-
-UInt32 *
-GetMatchesSpec1 (
- UInt32 lenLimit,
- UInt32 curMatch,
- UInt32 pos,
- const Byte *buffer,
- CLzRef *son,
- UInt32 _cyclicBufferPos,
- UInt32 _cyclicBufferSize,
- UInt32 _cutValue,
- UInt32 *distances,
- UInt32 maxLen
- );
-
-/*
-Conditions:
- Mf_GetNumAvailableBytes_Func must be called before each Mf_GetMatchLen_Func.
- Mf_GetPointerToCurrentPos_Func's result must be used only before any other function
-*/
-
-typedef void (*Mf_Init_Func)(
- void *object
- );
-typedef UInt32 (*Mf_GetNumAvailableBytes_Func)(
- void *object
- );
-typedef const Byte * (*Mf_GetPointerToCurrentPos_Func)(
- void *object
- );
-typedef UInt32 (*Mf_GetMatches_Func)(
- void *object,
- UInt32 *distances
- );
-typedef void (*Mf_Skip_Func)(
- void *object,
- UInt32
- );
-
-typedef struct _IMatchFinder {
- Mf_Init_Func Init;
- Mf_GetNumAvailableBytes_Func GetNumAvailableBytes;
- Mf_GetPointerToCurrentPos_Func GetPointerToCurrentPos;
- Mf_GetMatches_Func GetMatches;
- Mf_Skip_Func Skip;
-} IMatchFinder;
-
-void
-MatchFinder_CreateVTable (
- CMatchFinder *p,
- IMatchFinder *vTable
- );
-
-void
-MatchFinder_Init_LowHash (
- CMatchFinder *p
- );
-
-void
-MatchFinder_Init_HighHash (
- CMatchFinder *p
- );
-
-void
-MatchFinder_Init_3 (
- CMatchFinder *p,
- int readData
- );
-
-void
-MatchFinder_Init (
- CMatchFinder *p
- );
-
-UInt32
-Bt3Zip_MatchFinder_GetMatches (
- CMatchFinder *p,
- UInt32 *distances
- );
-
-UInt32
-Hc3Zip_MatchFinder_GetMatches (
- CMatchFinder *p,
- UInt32 *distances
- );
-
-void
-Bt3Zip_MatchFinder_Skip (
- CMatchFinder *p,
- UInt32 num
- );
-
-void
-Hc3Zip_MatchFinder_Skip (
- CMatchFinder *p,
- UInt32 num
- );
-
-EXTERN_C_END
-
-#endif
+/* LzFind.h -- Match finder for LZ algorithms +2017-06-10 : Igor Pavlov : Public domain */ + +#ifndef __LZ_FIND_H +#define __LZ_FIND_H + +#include "7zTypes.h" + +EXTERN_C_BEGIN + +typedef UInt32 CLzRef; + +typedef struct _CMatchFinder { + Byte *buffer; + UInt32 pos; + UInt32 posLimit; + UInt32 streamPos; + UInt32 lenLimit; + + UInt32 cyclicBufferPos; + UInt32 cyclicBufferSize; /* it must be = (historySize + 1) */ + + Byte streamEndWasReached; + Byte btMode; + Byte bigHash; + Byte directInput; + + UInt32 matchMaxLen; + CLzRef *hash; + CLzRef *son; + UInt32 hashMask; + UInt32 cutValue; + + Byte *bufferBase; + ISeqInStream *stream; + + UInt32 blockSize; + UInt32 keepSizeBefore; + UInt32 keepSizeAfter; + + UInt32 numHashBytes; + size_t directInputRem; + UInt32 historySize; + UInt32 fixedHashSize; + UInt32 hashSizeSum; + SRes result; + UInt32 crc[256]; + size_t numRefs; + + UInt64 expectedDataSize; +} CMatchFinder; + +#define Inline_MatchFinder_GetPointerToCurrentPos(p) ((p)->buffer) + +#define Inline_MatchFinder_GetNumAvailableBytes(p) ((p)->streamPos - (p)->pos) + +#define Inline_MatchFinder_IsFinishedOK(p) \ + ((p)->streamEndWasReached \ + && (p)->streamPos == (p)->pos \ + && (!(p)->directInput || (p)->directInputRem == 0)) + +int +MatchFinder_NeedMove ( + CMatchFinder *p + ); + +Byte * +MatchFinder_GetPointerToCurrentPos ( + CMatchFinder *p + ); + +void +MatchFinder_MoveBlock ( + CMatchFinder *p + ); + +void +MatchFinder_ReadIfRequired ( + CMatchFinder *p + ); + +void +MatchFinder_Construct ( + CMatchFinder *p + ); + +/* Conditions: + historySize <= 3 GB + keepAddBufferBefore + matchMaxLen + keepAddBufferAfter < 511MB +*/ +int +MatchFinder_Create ( + CMatchFinder *p, + UInt32 historySize, + UInt32 keepAddBufferBefore, + UInt32 matchMaxLen, + UInt32 keepAddBufferAfter, + ISzAllocPtr alloc + ); + +void +MatchFinder_Free ( + CMatchFinder *p, + ISzAllocPtr alloc + ); + +void +MatchFinder_Normalize3 ( + UInt32 subValue, + CLzRef *items, + size_t numItems + ); + +void +MatchFinder_ReduceOffsets ( + CMatchFinder *p, + UInt32 subValue + ); + +UInt32 * +GetMatchesSpec1 ( + UInt32 lenLimit, + UInt32 curMatch, + UInt32 pos, + const Byte *buffer, + CLzRef *son, + UInt32 _cyclicBufferPos, + UInt32 _cyclicBufferSize, + UInt32 _cutValue, + UInt32 *distances, + UInt32 maxLen + ); + +/* +Conditions: + Mf_GetNumAvailableBytes_Func must be called before each Mf_GetMatchLen_Func. + Mf_GetPointerToCurrentPos_Func's result must be used only before any other function +*/ + +typedef void (*Mf_Init_Func)( + void *object + ); +typedef UInt32 (*Mf_GetNumAvailableBytes_Func)( + void *object + ); +typedef const Byte * (*Mf_GetPointerToCurrentPos_Func)( + void *object + ); +typedef UInt32 (*Mf_GetMatches_Func)( + void *object, + UInt32 *distances + ); +typedef void (*Mf_Skip_Func)( + void *object, + UInt32 + ); + +typedef struct _IMatchFinder { + Mf_Init_Func Init; + Mf_GetNumAvailableBytes_Func GetNumAvailableBytes; + Mf_GetPointerToCurrentPos_Func GetPointerToCurrentPos; + Mf_GetMatches_Func GetMatches; + Mf_Skip_Func Skip; +} IMatchFinder; + +void +MatchFinder_CreateVTable ( + CMatchFinder *p, + IMatchFinder *vTable + ); + +void +MatchFinder_Init_LowHash ( + CMatchFinder *p + ); + +void +MatchFinder_Init_HighHash ( + CMatchFinder *p + ); + +void +MatchFinder_Init_3 ( + CMatchFinder *p, + int readData + ); + +void +MatchFinder_Init ( + CMatchFinder *p + ); + +UInt32 +Bt3Zip_MatchFinder_GetMatches ( + CMatchFinder *p, + UInt32 *distances + ); + +UInt32 +Hc3Zip_MatchFinder_GetMatches ( + CMatchFinder *p, + UInt32 *distances + ); + +void +Bt3Zip_MatchFinder_Skip ( + CMatchFinder *p, + UInt32 num + ); + +void +Hc3Zip_MatchFinder_Skip ( + CMatchFinder *p, + UInt32 num + ); + +EXTERN_C_END + +#endif diff --git a/MdeModulePkg/Library/LzmaCustomDecompressLib/Sdk/C/LzHash.h b/MdeModulePkg/Library/LzmaCustomDecompressLib/Sdk/C/LzHash.h index eec8bb13bd..2bd148ac00 100644 --- a/MdeModulePkg/Library/LzmaCustomDecompressLib/Sdk/C/LzHash.h +++ b/MdeModulePkg/Library/LzmaCustomDecompressLib/Sdk/C/LzHash.h @@ -1,56 +1,56 @@ -/* LzHash.h -- HASH functions for LZ algorithms
-2015-04-12 : Igor Pavlov : Public domain */
-
-#ifndef __LZ_HASH_H
-#define __LZ_HASH_H
-
-#define kHash2Size (1 << 10)
-#define kHash3Size (1 << 16)
-#define kHash4Size (1 << 20)
-
-#define kFix3HashSize (kHash2Size)
-#define kFix4HashSize (kHash2Size + kHash3Size)
-#define kFix5HashSize (kHash2Size + kHash3Size + kHash4Size)
-
-#define HASH2_CALC hv = cur[0] | ((UInt32)cur[1] << 8);
-
-#define HASH3_CALC {\
- UInt32 temp = p->crc[cur[0]] ^ cur[1]; \
- h2 = temp & (kHash2Size - 1); \
- hv = (temp ^ ((UInt32)cur[2] << 8)) & p->hashMask; }
-
-#define HASH4_CALC {\
- UInt32 temp = p->crc[cur[0]] ^ cur[1]; \
- h2 = temp & (kHash2Size - 1); \
- temp ^= ((UInt32)cur[2] << 8); \
- h3 = temp & (kHash3Size - 1); \
- hv = (temp ^ (p->crc[cur[3]] << 5)) & p->hashMask; }
-
-#define HASH5_CALC {\
- UInt32 temp = p->crc[cur[0]] ^ cur[1]; \
- h2 = temp & (kHash2Size - 1); \
- temp ^= ((UInt32)cur[2] << 8); \
- h3 = temp & (kHash3Size - 1); \
- temp ^= (p->crc[cur[3]] << 5); \
- h4 = temp & (kHash4Size - 1); \
- hv = (temp ^ (p->crc[cur[4]] << 3)) & p->hashMask; }
-
-/* #define HASH_ZIP_CALC hv = ((cur[0] | ((UInt32)cur[1] << 8)) ^ p->crc[cur[2]]) & 0xFFFF; */
-#define HASH_ZIP_CALC hv = ((cur[2] | ((UInt32)cur[0] << 8)) ^ p->crc[cur[1]]) & 0xFFFF;
-
-#define MT_HASH2_CALC \
- h2 = (p->crc[cur[0]] ^ cur[1]) & (kHash2Size - 1);
-
-#define MT_HASH3_CALC {\
- UInt32 temp = p->crc[cur[0]] ^ cur[1]; \
- h2 = temp & (kHash2Size - 1); \
- h3 = (temp ^ ((UInt32)cur[2] << 8)) & (kHash3Size - 1); }
-
-#define MT_HASH4_CALC {\
- UInt32 temp = p->crc[cur[0]] ^ cur[1]; \
- h2 = temp & (kHash2Size - 1); \
- temp ^= ((UInt32)cur[2] << 8); \
- h3 = temp & (kHash3Size - 1); \
- h4 = (temp ^ (p->crc[cur[3]] << 5)) & (kHash4Size - 1); }
-
-#endif
+/* LzHash.h -- HASH functions for LZ algorithms +2015-04-12 : Igor Pavlov : Public domain */ + +#ifndef __LZ_HASH_H +#define __LZ_HASH_H + +#define kHash2Size (1 << 10) +#define kHash3Size (1 << 16) +#define kHash4Size (1 << 20) + +#define kFix3HashSize (kHash2Size) +#define kFix4HashSize (kHash2Size + kHash3Size) +#define kFix5HashSize (kHash2Size + kHash3Size + kHash4Size) + +#define HASH2_CALC hv = cur[0] | ((UInt32)cur[1] << 8); + +#define HASH3_CALC {\ + UInt32 temp = p->crc[cur[0]] ^ cur[1]; \ + h2 = temp & (kHash2Size - 1); \ + hv = (temp ^ ((UInt32)cur[2] << 8)) & p->hashMask; } + +#define HASH4_CALC {\ + UInt32 temp = p->crc[cur[0]] ^ cur[1]; \ + h2 = temp & (kHash2Size - 1); \ + temp ^= ((UInt32)cur[2] << 8); \ + h3 = temp & (kHash3Size - 1); \ + hv = (temp ^ (p->crc[cur[3]] << 5)) & p->hashMask; } + +#define HASH5_CALC {\ + UInt32 temp = p->crc[cur[0]] ^ cur[1]; \ + h2 = temp & (kHash2Size - 1); \ + temp ^= ((UInt32)cur[2] << 8); \ + h3 = temp & (kHash3Size - 1); \ + temp ^= (p->crc[cur[3]] << 5); \ + h4 = temp & (kHash4Size - 1); \ + hv = (temp ^ (p->crc[cur[4]] << 3)) & p->hashMask; } + +/* #define HASH_ZIP_CALC hv = ((cur[0] | ((UInt32)cur[1] << 8)) ^ p->crc[cur[2]]) & 0xFFFF; */ +#define HASH_ZIP_CALC hv = ((cur[2] | ((UInt32)cur[0] << 8)) ^ p->crc[cur[1]]) & 0xFFFF; + +#define MT_HASH2_CALC \ + h2 = (p->crc[cur[0]] ^ cur[1]) & (kHash2Size - 1); + +#define MT_HASH3_CALC {\ + UInt32 temp = p->crc[cur[0]] ^ cur[1]; \ + h2 = temp & (kHash2Size - 1); \ + h3 = (temp ^ ((UInt32)cur[2] << 8)) & (kHash3Size - 1); } + +#define MT_HASH4_CALC {\ + UInt32 temp = p->crc[cur[0]] ^ cur[1]; \ + h2 = temp & (kHash2Size - 1); \ + temp ^= ((UInt32)cur[2] << 8); \ + h3 = temp & (kHash3Size - 1); \ + h4 = (temp ^ (p->crc[cur[3]] << 5)) & (kHash4Size - 1); } + +#endif diff --git a/MdeModulePkg/Library/LzmaCustomDecompressLib/Sdk/C/LzmaDec.c b/MdeModulePkg/Library/LzmaCustomDecompressLib/Sdk/C/LzmaDec.c index 54c7077984..7d02f7874e 100644 --- a/MdeModulePkg/Library/LzmaCustomDecompressLib/Sdk/C/LzmaDec.c +++ b/MdeModulePkg/Library/LzmaCustomDecompressLib/Sdk/C/LzmaDec.c @@ -1,1241 +1,1241 @@ -/* LzmaDec.c -- LZMA Decoder
-2018-07-04 : Igor Pavlov : Public domain */
-
-#include "Precomp.h"
-
-#ifndef EFIAPI
- #include <string.h>
-#endif
-
-/* #include "CpuArch.h" */
-#include "LzmaDec.h"
-
-#define kNumTopBits 24
-#define kTopValue ((UInt32)1 << kNumTopBits)
-
-#define kNumBitModelTotalBits 11
-#define kBitModelTotal (1 << kNumBitModelTotalBits)
-#define kNumMoveBits 5
-
-#define RC_INIT_SIZE 5
-
-#define NORMALIZE if (range < kTopValue) { range <<= 8; code = (code << 8) | (*buf++); }
-
-#define IF_BIT_0(p) ttt = *(p); NORMALIZE; bound = (range >> kNumBitModelTotalBits) * (UInt32)ttt; if (code < bound)
-#define UPDATE_0(p) range = bound; *(p) = (CLzmaProb)(ttt + ((kBitModelTotal - ttt) >> kNumMoveBits));
-#define UPDATE_1(p) range -= bound; code -= bound; *(p) = (CLzmaProb)(ttt - (ttt >> kNumMoveBits));
-#define GET_BIT2(p, i, A0, A1) IF_BIT_0(p)\
- { UPDATE_0(p); i = (i + i); A0; } else \
- { UPDATE_1(p); i = (i + i) + 1; A1; }
-
-#define TREE_GET_BIT(probs, i) { GET_BIT2(probs + i, i, ;, ;); }
-
-#define REV_BIT(p, i, A0, A1) IF_BIT_0(p + i)\
- { UPDATE_0(p + i); A0; } else \
- { UPDATE_1(p + i); A1; }
-#define REV_BIT_VAR(p, i, m) REV_BIT(p, i, i += m; m += m, m += m; i += m; )
-#define REV_BIT_CONST(p, i, m) REV_BIT(p, i, i += m; , i += m * 2; )
-#define REV_BIT_LAST(p, i, m) REV_BIT(p, i, i -= m , ; )
-
-#define TREE_DECODE(probs, limit, i) \
- { i = 1; do { TREE_GET_BIT(probs, i); } while (i < limit); i -= limit; }
-
-/* #define _LZMA_SIZE_OPT */
-
-#ifdef _LZMA_SIZE_OPT
-#define TREE_6_DECODE(probs, i) TREE_DECODE(probs, (1 << 6), i)
-#else
-#define TREE_6_DECODE(probs, i) \
- { i = 1; \
- TREE_GET_BIT(probs, i); \
- TREE_GET_BIT(probs, i); \
- TREE_GET_BIT(probs, i); \
- TREE_GET_BIT(probs, i); \
- TREE_GET_BIT(probs, i); \
- TREE_GET_BIT(probs, i); \
- i -= 0x40; }
-#endif
-
-#define NORMAL_LITER_DEC TREE_GET_BIT(prob, symbol)
-#define MATCHED_LITER_DEC \
- matchByte += matchByte; \
- bit = offs; \
- offs &= matchByte; \
- probLit = prob + (offs + bit + symbol); \
- GET_BIT2(probLit, symbol, offs ^= bit; , ;)
-
-#define NORMALIZE_CHECK if (range < kTopValue) { if (buf >= bufLimit) return DUMMY_ERROR; range <<= 8; code = (code << 8) | (*buf++); }
-
-#define IF_BIT_0_CHECK(p) ttt = *(p); NORMALIZE_CHECK; bound = (range >> kNumBitModelTotalBits) * (UInt32)ttt; if (code < bound)
-#define UPDATE_0_CHECK range = bound;
-#define UPDATE_1_CHECK range -= bound; code -= bound;
-#define GET_BIT2_CHECK(p, i, A0, A1) IF_BIT_0_CHECK(p)\
- { UPDATE_0_CHECK; i = (i + i); A0; } else \
- { UPDATE_1_CHECK; i = (i + i) + 1; A1; }
-#define GET_BIT_CHECK(p, i) GET_BIT2_CHECK(p, i, ; , ;)
-#define TREE_DECODE_CHECK(probs, limit, i) \
- { i = 1; do { GET_BIT_CHECK(probs + i, i) } while (i < limit); i -= limit; }
-
-#define REV_BIT_CHECK(p, i, m) IF_BIT_0_CHECK(p + i)\
- { UPDATE_0_CHECK; i += m; m += m; } else \
- { UPDATE_1_CHECK; m += m; i += m; }
-
-#define kNumPosBitsMax 4
-#define kNumPosStatesMax (1 << kNumPosBitsMax)
-
-#define kLenNumLowBits 3
-#define kLenNumLowSymbols (1 << kLenNumLowBits)
-#define kLenNumHighBits 8
-#define kLenNumHighSymbols (1 << kLenNumHighBits)
-
-#define LenLow 0
-#define LenHigh (LenLow + 2 * (kNumPosStatesMax << kLenNumLowBits))
-#define kNumLenProbs (LenHigh + kLenNumHighSymbols)
-
-#define LenChoice LenLow
-#define LenChoice2 (LenLow + (1 << kLenNumLowBits))
-
-#define kNumStates 12
-#define kNumStates2 16
-#define kNumLitStates 7
-
-#define kStartPosModelIndex 4
-#define kEndPosModelIndex 14
-#define kNumFullDistances (1 << (kEndPosModelIndex >> 1))
-
-#define kNumPosSlotBits 6
-#define kNumLenToPosStates 4
-
-#define kNumAlignBits 4
-#define kAlignTableSize (1 << kNumAlignBits)
-
-#define kMatchMinLen 2
-#define kMatchSpecLenStart (kMatchMinLen + kLenNumLowSymbols * 2 + kLenNumHighSymbols)
-
-/* External ASM code needs same CLzmaProb array layout. So don't change it. */
-
-/* (probs_1664) is faster and better for code size at some platforms */
-
-/*
-#ifdef MY_CPU_X86_OR_AMD64
-*/
-#define kStartOffset 1664
-#define GET_PROBS p->probs_1664
-
-/*
-#define GET_PROBS p->probs + kStartOffset
-#else
-#define kStartOffset 0
-#define GET_PROBS p->probs
-#endif
-*/
-
-#define SpecPos (-kStartOffset)
-#define IsRep0Long (SpecPos + kNumFullDistances)
-#define RepLenCoder (IsRep0Long + (kNumStates2 << kNumPosBitsMax))
-#define LenCoder (RepLenCoder + kNumLenProbs)
-#define IsMatch (LenCoder + kNumLenProbs)
-#define Align (IsMatch + (kNumStates2 << kNumPosBitsMax))
-#define IsRep (Align + kAlignTableSize)
-#define IsRepG0 (IsRep + kNumStates)
-#define IsRepG1 (IsRepG0 + kNumStates)
-#define IsRepG2 (IsRepG1 + kNumStates)
-#define PosSlot (IsRepG2 + kNumStates)
-#define Literal (PosSlot + (kNumLenToPosStates << kNumPosSlotBits))
-#define NUM_BASE_PROBS (Literal + kStartOffset)
-
-#if Align != 0 && kStartOffset != 0
- #error Stop_Compiling_Bad_LZMA_kAlign
-#endif
-
-#if NUM_BASE_PROBS != 1984
- #error Stop_Compiling_Bad_LZMA_PROBS
-#endif
-
-#define LZMA_LIT_SIZE 0x300
-
-#define LzmaProps_GetNumProbs(p) (NUM_BASE_PROBS + ((UInt32)LZMA_LIT_SIZE << ((p)->lc + (p)->lp)))
-
-#define CALC_POS_STATE(processedPos, pbMask) (((processedPos) & (pbMask)) << 4)
-#define COMBINED_PS_STATE (posState + state)
-#define GET_LEN_STATE (posState)
-
-#define LZMA_DIC_MIN (1 << 12)
-
-/*
-p->remainLen : shows status of LZMA decoder:
- < kMatchSpecLenStart : normal remain
- = kMatchSpecLenStart : finished
- = kMatchSpecLenStart + 1 : need init range coder
- = kMatchSpecLenStart + 2 : need init range coder and state
-*/
-
-/* ---------- LZMA_DECODE_REAL ---------- */
-
-/*
-LzmaDec_DecodeReal_3() can be implemented in external ASM file.
-3 - is the code compatibility version of that function for check at link time.
-*/
-
-#define LZMA_DECODE_REAL LzmaDec_DecodeReal_3
-
-/*
-LZMA_DECODE_REAL()
-In:
- RangeCoder is normalized
- if (p->dicPos == limit)
- {
- LzmaDec_TryDummy() was called before to exclude LITERAL and MATCH-REP cases.
- So first symbol can be only MATCH-NON-REP. And if that MATCH-NON-REP symbol
- is not END_OF_PAYALOAD_MARKER, then function returns error code.
- }
-
-Processing:
- first LZMA symbol will be decoded in any case
- All checks for limits are at the end of main loop,
- It will decode new LZMA-symbols while (p->buf < bufLimit && dicPos < limit),
- RangeCoder is still without last normalization when (p->buf < bufLimit) is being checked.
-
-Out:
- RangeCoder is normalized
- Result:
- SZ_OK - OK
- SZ_ERROR_DATA - Error
- p->remainLen:
- < kMatchSpecLenStart : normal remain
- = kMatchSpecLenStart : finished
-*/
-
-#ifdef _LZMA_DEC_OPT
-
-int MY_FAST_CALL
-LZMA_DECODE_REAL (
- CLzmaDec *p,
- SizeT limit,
- const Byte *bufLimit
- );
-
-#else
-
-static
-int MY_FAST_CALL
-LZMA_DECODE_REAL (
- CLzmaDec *p,
- SizeT limit,
- const Byte *bufLimit
- )
-{
- CLzmaProb *probs = GET_PROBS;
- unsigned state = (unsigned)p->state;
- UInt32 rep0 = p->reps[0], rep1 = p->reps[1], rep2 = p->reps[2], rep3 = p->reps[3];
- unsigned pbMask = ((unsigned)1 << (p->prop.pb)) - 1;
- unsigned lc = p->prop.lc;
- unsigned lpMask = ((unsigned)0x100 << p->prop.lp) - ((unsigned)0x100 >> lc);
-
- Byte *dic = p->dic;
- SizeT dicBufSize = p->dicBufSize;
- SizeT dicPos = p->dicPos;
-
- UInt32 processedPos = p->processedPos;
- UInt32 checkDicSize = p->checkDicSize;
- unsigned len = 0;
-
- const Byte *buf = p->buf;
- UInt32 range = p->range;
- UInt32 code = p->code;
-
- do {
- CLzmaProb *prob;
- UInt32 bound;
- unsigned ttt;
- unsigned posState = CALC_POS_STATE (processedPos, pbMask);
-
- prob = probs + IsMatch + COMBINED_PS_STATE;
- IF_BIT_0 (prob) {
- unsigned symbol;
-
- UPDATE_0 (prob);
- prob = probs + Literal;
- if ((processedPos != 0) || (checkDicSize != 0)) {
- prob += (UInt32)3 * ((((processedPos << 8) + dic[(dicPos == 0 ? dicBufSize : dicPos) - 1]) & lpMask) << lc);
- }
-
- processedPos++;
-
- if (state < kNumLitStates) {
- state -= (state < 4) ? state : 3;
- symbol = 1;
- #ifdef _LZMA_SIZE_OPT
- do {
- NORMAL_LITER_DEC
- } while (symbol < 0x100);
-
- #else
- NORMAL_LITER_DEC
- NORMAL_LITER_DEC
- NORMAL_LITER_DEC
- NORMAL_LITER_DEC
- NORMAL_LITER_DEC
- NORMAL_LITER_DEC
- NORMAL_LITER_DEC
- NORMAL_LITER_DEC
- #endif
- } else {
- unsigned matchByte = dic[dicPos - rep0 + (dicPos < rep0 ? dicBufSize : 0)];
- unsigned offs = 0x100;
- state -= (state < 10) ? 3 : 6;
- symbol = 1;
- #ifdef _LZMA_SIZE_OPT
- do {
- unsigned bit;
- CLzmaProb *probLit;
- MATCHED_LITER_DEC
- } while (symbol < 0x100);
-
- #else
- {
- unsigned bit;
- CLzmaProb *probLit;
- MATCHED_LITER_DEC
- MATCHED_LITER_DEC
- MATCHED_LITER_DEC
- MATCHED_LITER_DEC
- MATCHED_LITER_DEC
- MATCHED_LITER_DEC
- MATCHED_LITER_DEC
- MATCHED_LITER_DEC
- }
- #endif
- }
-
- dic[dicPos++] = (Byte)symbol;
- continue;
- }
-
- {
- UPDATE_1 (prob);
- prob = probs + IsRep + state;
- IF_BIT_0 (prob) {
- UPDATE_0 (prob);
- state += kNumStates;
- prob = probs + LenCoder;
- } else {
- UPDATE_1 (prob);
-
- /*
- // that case was checked before with kBadRepCode
- if (checkDicSize == 0 && processedPos == 0)
- return SZ_ERROR_DATA;
- */
- prob = probs + IsRepG0 + state;
- IF_BIT_0 (prob) {
- UPDATE_0 (prob);
- prob = probs + IsRep0Long + COMBINED_PS_STATE;
- IF_BIT_0 (prob) {
- UPDATE_0 (prob);
- dic[dicPos] = dic[dicPos - rep0 + (dicPos < rep0 ? dicBufSize : 0)];
- dicPos++;
- processedPos++;
- state = state < kNumLitStates ? 9 : 11;
- continue;
- }
- UPDATE_1 (prob);
- } else {
- UInt32 distance;
- UPDATE_1 (prob);
- prob = probs + IsRepG1 + state;
- IF_BIT_0 (prob) {
- UPDATE_0 (prob);
- distance = rep1;
- } else {
- UPDATE_1 (prob);
- prob = probs + IsRepG2 + state;
- IF_BIT_0 (prob) {
- UPDATE_0 (prob);
- distance = rep2;
- } else {
- UPDATE_1 (prob);
- distance = rep3;
- rep3 = rep2;
- }
- rep2 = rep1;
- }
- rep1 = rep0;
- rep0 = distance;
- }
- state = state < kNumLitStates ? 8 : 11;
- prob = probs + RepLenCoder;
- }
-
- #ifdef _LZMA_SIZE_OPT
- {
- unsigned lim, offset;
- CLzmaProb *probLen = prob + LenChoice;
- IF_BIT_0 (probLen) {
- UPDATE_0 (probLen);
- probLen = prob + LenLow + GET_LEN_STATE;
- offset = 0;
- lim = (1 << kLenNumLowBits);
- } else {
- UPDATE_1 (probLen);
- probLen = prob + LenChoice2;
- IF_BIT_0 (probLen) {
- UPDATE_0 (probLen);
- probLen = prob + LenLow + GET_LEN_STATE + (1 << kLenNumLowBits);
- offset = kLenNumLowSymbols;
- lim = (1 << kLenNumLowBits);
- } else {
- UPDATE_1 (probLen);
- probLen = prob + LenHigh;
- offset = kLenNumLowSymbols * 2;
- lim = (1 << kLenNumHighBits);
- }
- }
- TREE_DECODE (probLen, lim, len);
- len += offset;
- }
- #else
- {
- CLzmaProb *probLen = prob + LenChoice;
- IF_BIT_0 (probLen) {
- UPDATE_0 (probLen);
- probLen = prob + LenLow + GET_LEN_STATE;
- len = 1;
- TREE_GET_BIT (probLen, len);
- TREE_GET_BIT (probLen, len);
- TREE_GET_BIT (probLen, len);
- len -= 8;
- } else {
- UPDATE_1 (probLen);
- probLen = prob + LenChoice2;
- IF_BIT_0 (probLen) {
- UPDATE_0 (probLen);
- probLen = prob + LenLow + GET_LEN_STATE + (1 << kLenNumLowBits);
- len = 1;
- TREE_GET_BIT (probLen, len);
- TREE_GET_BIT (probLen, len);
- TREE_GET_BIT (probLen, len);
- } else {
- UPDATE_1 (probLen);
- probLen = prob + LenHigh;
- TREE_DECODE (probLen, (1 << kLenNumHighBits), len);
- len += kLenNumLowSymbols * 2;
- }
- }
- }
- #endif
-
- if (state >= kNumStates) {
- UInt32 distance;
- prob = probs + PosSlot +
- ((len < kNumLenToPosStates ? len : kNumLenToPosStates - 1) << kNumPosSlotBits);
- TREE_6_DECODE (prob, distance);
- if (distance >= kStartPosModelIndex) {
- unsigned posSlot = (unsigned)distance;
- unsigned numDirectBits = (unsigned)(((distance >> 1) - 1));
- distance = (2 | (distance & 1));
- if (posSlot < kEndPosModelIndex) {
- distance <<= numDirectBits;
- prob = probs + SpecPos;
- {
- UInt32 m = 1;
- distance++;
- do {
- REV_BIT_VAR (prob, distance, m);
- } while (--numDirectBits);
-
- distance -= m;
- }
- } else {
- numDirectBits -= kNumAlignBits;
- do {
- NORMALIZE
- range >>= 1;
-
- {
- UInt32 t;
- code -= range;
- t = (0 - ((UInt32)code >> 31)); /* (UInt32)((Int32)code >> 31) */
- distance = (distance << 1) + (t + 1);
- code += range & t;
- }
-
- /*
- distance <<= 1;
- if (code >= range)
- {
- code -= range;
- distance |= 1;
- }
- */
- } while (--numDirectBits);
-
- prob = probs + Align;
- distance <<= kNumAlignBits;
- {
- unsigned i = 1;
- REV_BIT_CONST (prob, i, 1);
- REV_BIT_CONST (prob, i, 2);
- REV_BIT_CONST (prob, i, 4);
- REV_BIT_LAST (prob, i, 8);
- distance |= i;
- }
- if (distance == (UInt32)0xFFFFFFFF) {
- len = kMatchSpecLenStart;
- state -= kNumStates;
- break;
- }
- }
- }
-
- rep3 = rep2;
- rep2 = rep1;
- rep1 = rep0;
- rep0 = distance + 1;
- state = (state < kNumStates + kNumLitStates) ? kNumLitStates : kNumLitStates + 3;
- if (distance >= ((checkDicSize == 0) ? processedPos : checkDicSize)) {
- p->dicPos = dicPos;
- return SZ_ERROR_DATA;
- }
- }
-
- len += kMatchMinLen;
-
- {
- SizeT rem;
- unsigned curLen;
- SizeT pos;
-
- if ((rem = limit - dicPos) == 0) {
- p->dicPos = dicPos;
- return SZ_ERROR_DATA;
- }
-
- curLen = ((rem < len) ? (unsigned)rem : len);
- pos = dicPos - rep0 + (dicPos < rep0 ? dicBufSize : 0);
-
- processedPos += (UInt32)curLen;
-
- len -= curLen;
- if (curLen <= dicBufSize - pos) {
- Byte *dest = dic + dicPos;
- ptrdiff_t src = (ptrdiff_t)pos - (ptrdiff_t)dicPos;
- const Byte *lim = dest + curLen;
- dicPos += (SizeT)curLen;
- do {
- *(dest) = (Byte)*(dest + src);
- } while (++dest != lim);
- } else {
- do {
- dic[dicPos++] = dic[pos];
- if (++pos == dicBufSize) {
- pos = 0;
- }
- } while (--curLen != 0);
- }
- }
- }
- } while (dicPos < limit && buf < bufLimit);
-
- NORMALIZE;
-
- p->buf = buf;
- p->range = range;
- p->code = code;
- p->remainLen = (UInt32)len;
- p->dicPos = dicPos;
- p->processedPos = processedPos;
- p->reps[0] = rep0;
- p->reps[1] = rep1;
- p->reps[2] = rep2;
- p->reps[3] = rep3;
- p->state = (UInt32)state;
-
- return SZ_OK;
-}
-
-#endif
-
-static void MY_FAST_CALL
-LzmaDec_WriteRem (
- CLzmaDec *p,
- SizeT limit
- )
-{
- if ((p->remainLen != 0) && (p->remainLen < kMatchSpecLenStart)) {
- Byte *dic = p->dic;
- SizeT dicPos = p->dicPos;
- SizeT dicBufSize = p->dicBufSize;
- unsigned len = (unsigned)p->remainLen;
- SizeT rep0 = p->reps[0]; /* we use SizeT to avoid the BUG of VC14 for AMD64 */
- SizeT rem = limit - dicPos;
- if (rem < len) {
- len = (unsigned)(rem);
- }
-
- if ((p->checkDicSize == 0) && (p->prop.dicSize - p->processedPos <= len)) {
- p->checkDicSize = p->prop.dicSize;
- }
-
- p->processedPos += (UInt32)len;
- p->remainLen -= (UInt32)len;
- while (len != 0) {
- len--;
- dic[dicPos] = dic[dicPos - rep0 + (dicPos < rep0 ? dicBufSize : 0)];
- dicPos++;
- }
-
- p->dicPos = dicPos;
- }
-}
-
-#define kRange0 0xFFFFFFFF
-#define kBound0 ((kRange0 >> kNumBitModelTotalBits) << (kNumBitModelTotalBits - 1))
-#define kBadRepCode (kBound0 + (((kRange0 - kBound0) >> kNumBitModelTotalBits) << (kNumBitModelTotalBits - 1)))
-#if kBadRepCode != (0xC0000000 - 0x400)
- #error Stop_Compiling_Bad_LZMA_Check
-#endif
-
-static int MY_FAST_CALL
-LzmaDec_DecodeReal2 (
- CLzmaDec *p,
- SizeT limit,
- const Byte *bufLimit
- )
-{
- do {
- SizeT limit2 = limit;
- if (p->checkDicSize == 0) {
- UInt32 rem = p->prop.dicSize - p->processedPos;
- if (limit - p->dicPos > rem) {
- limit2 = p->dicPos + rem;
- }
-
- if (p->processedPos == 0) {
- if (p->code >= kBadRepCode) {
- return SZ_ERROR_DATA;
- }
- }
- }
-
- RINOK (LZMA_DECODE_REAL (p, limit2, bufLimit));
-
- if ((p->checkDicSize == 0) && (p->processedPos >= p->prop.dicSize)) {
- p->checkDicSize = p->prop.dicSize;
- }
-
- LzmaDec_WriteRem (p, limit);
- } while (p->dicPos < limit && p->buf < bufLimit && p->remainLen < kMatchSpecLenStart);
-
- return 0;
-}
-
-typedef enum {
- DUMMY_ERROR, /* unexpected end of input stream */
- DUMMY_LIT,
- DUMMY_MATCH,
- DUMMY_REP
-} ELzmaDummy;
-
-static ELzmaDummy
-LzmaDec_TryDummy (
- const CLzmaDec *p,
- const Byte *buf,
- SizeT inSize
- )
-{
- UInt32 range = p->range;
- UInt32 code = p->code;
- const Byte *bufLimit = buf + inSize;
- const CLzmaProb *probs = GET_PROBS;
- unsigned state = (unsigned)p->state;
- ELzmaDummy res;
-
- {
- const CLzmaProb *prob;
- UInt32 bound;
- unsigned ttt;
- unsigned posState = CALC_POS_STATE (p->processedPos, (1 << p->prop.pb) - 1);
-
- prob = probs + IsMatch + COMBINED_PS_STATE;
- IF_BIT_0_CHECK (prob) {
- UPDATE_0_CHECK
-
- /* if (bufLimit - buf >= 7) return DUMMY_LIT; */
-
- prob = probs + Literal;
-
- if ((p->checkDicSize != 0) || (p->processedPos != 0)) {
- prob += ((UInt32)LZMA_LIT_SIZE *
- ((((p->processedPos) & ((1 << (p->prop.lp)) - 1)) << p->prop.lc) +
- (p->dic[(p->dicPos == 0 ? p->dicBufSize : p->dicPos) - 1] >> (8 - p->prop.lc))));
- }
-
- if (state < kNumLitStates) {
- unsigned symbol = 1;
- do {
- GET_BIT_CHECK (prob + symbol, symbol)
- } while (symbol < 0x100);
- } else {
- unsigned matchByte = p->dic[p->dicPos - p->reps[0] +
- (p->dicPos < p->reps[0] ? p->dicBufSize : 0)];
- unsigned offs = 0x100;
- unsigned symbol = 1;
- do {
- unsigned bit;
- const CLzmaProb *probLit;
- matchByte += matchByte;
- bit = offs;
- offs &= matchByte;
- probLit = prob + (offs + bit + symbol);
- GET_BIT2_CHECK (
- probLit,
- symbol,
- offs ^= bit;
- ,
- ;
- )
- } while (symbol < 0x100);
- }
-
- res = DUMMY_LIT;
- } else {
- unsigned len;
- UPDATE_1_CHECK;
-
- prob = probs + IsRep + state;
- IF_BIT_0_CHECK (prob) {
- UPDATE_0_CHECK;
- state = 0;
- prob = probs + LenCoder;
- res = DUMMY_MATCH;
- } else {
- UPDATE_1_CHECK;
- res = DUMMY_REP;
- prob = probs + IsRepG0 + state;
- IF_BIT_0_CHECK (prob) {
- UPDATE_0_CHECK;
- prob = probs + IsRep0Long + COMBINED_PS_STATE;
- IF_BIT_0_CHECK (prob) {
- UPDATE_0_CHECK;
- NORMALIZE_CHECK;
- return DUMMY_REP;
- } else {
- UPDATE_1_CHECK;
- }
- } else {
- UPDATE_1_CHECK;
- prob = probs + IsRepG1 + state;
- IF_BIT_0_CHECK (prob) {
- UPDATE_0_CHECK;
- } else {
- UPDATE_1_CHECK;
- prob = probs + IsRepG2 + state;
- IF_BIT_0_CHECK (prob) {
- UPDATE_0_CHECK;
- } else {
- UPDATE_1_CHECK;
- }
- }
- }
- state = kNumStates;
- prob = probs + RepLenCoder;
- }
- {
- unsigned limit, offset;
- const CLzmaProb *probLen = prob + LenChoice;
- IF_BIT_0_CHECK (probLen) {
- UPDATE_0_CHECK;
- probLen = prob + LenLow + GET_LEN_STATE;
- offset = 0;
- limit = 1 << kLenNumLowBits;
- } else {
- UPDATE_1_CHECK;
- probLen = prob + LenChoice2;
- IF_BIT_0_CHECK (probLen) {
- UPDATE_0_CHECK;
- probLen = prob + LenLow + GET_LEN_STATE + (1 << kLenNumLowBits);
- offset = kLenNumLowSymbols;
- limit = 1 << kLenNumLowBits;
- } else {
- UPDATE_1_CHECK;
- probLen = prob + LenHigh;
- offset = kLenNumLowSymbols * 2;
- limit = 1 << kLenNumHighBits;
- }
- }
- TREE_DECODE_CHECK (probLen, limit, len);
- len += offset;
- }
-
- if (state < 4) {
- unsigned posSlot;
- prob = probs + PosSlot +
- ((len < kNumLenToPosStates - 1 ? len : kNumLenToPosStates - 1) <<
- kNumPosSlotBits);
- TREE_DECODE_CHECK (prob, 1 << kNumPosSlotBits, posSlot);
- if (posSlot >= kStartPosModelIndex) {
- unsigned numDirectBits = ((posSlot >> 1) - 1);
-
- /* if (bufLimit - buf >= 8) return DUMMY_MATCH; */
-
- if (posSlot < kEndPosModelIndex) {
- prob = probs + SpecPos + ((2 | (posSlot & 1)) << numDirectBits);
- } else {
- numDirectBits -= kNumAlignBits;
- do {
- NORMALIZE_CHECK
- range >>= 1;
- code -= range & (((code - range) >> 31) - 1);
- /* if (code >= range) code -= range; */
- } while (--numDirectBits);
-
- prob = probs + Align;
- numDirectBits = kNumAlignBits;
- }
-
- {
- unsigned i = 1;
- unsigned m = 1;
- do {
- REV_BIT_CHECK (prob, i, m);
- } while (--numDirectBits);
- }
- }
- }
- }
- }
-
- NORMALIZE_CHECK;
- return res;
-}
-
-void
-LzmaDec_InitDicAndState (
- CLzmaDec *p,
- BoolInt initDic,
- BoolInt initState
- )
-{
- p->remainLen = kMatchSpecLenStart + 1;
- p->tempBufSize = 0;
-
- if (initDic) {
- p->processedPos = 0;
- p->checkDicSize = 0;
- p->remainLen = kMatchSpecLenStart + 2;
- }
-
- if (initState) {
- p->remainLen = kMatchSpecLenStart + 2;
- }
-}
-
-void
-LzmaDec_Init (
- CLzmaDec *p
- )
-{
- p->dicPos = 0;
- LzmaDec_InitDicAndState (p, True, True);
-}
-
-SRes
-LzmaDec_DecodeToDic (
- CLzmaDec *p,
- SizeT dicLimit,
- const Byte *src,
- SizeT *srcLen,
- ELzmaFinishMode finishMode,
- ELzmaStatus *status
- )
-{
- SizeT inSize = *srcLen;
-
- (*srcLen) = 0;
-
- *status = LZMA_STATUS_NOT_SPECIFIED;
-
- if (p->remainLen > kMatchSpecLenStart) {
- for ( ; inSize > 0 && p->tempBufSize < RC_INIT_SIZE; (*srcLen)++, inSize--) {
- p->tempBuf[p->tempBufSize++] = *src++;
- }
-
- if ((p->tempBufSize != 0) && (p->tempBuf[0] != 0)) {
- return SZ_ERROR_DATA;
- }
-
- if (p->tempBufSize < RC_INIT_SIZE) {
- *status = LZMA_STATUS_NEEDS_MORE_INPUT;
- return SZ_OK;
- }
-
- p->code =
- ((UInt32)p->tempBuf[1] << 24)
- | ((UInt32)p->tempBuf[2] << 16)
- | ((UInt32)p->tempBuf[3] << 8)
- | ((UInt32)p->tempBuf[4]);
- p->range = 0xFFFFFFFF;
- p->tempBufSize = 0;
-
- if (p->remainLen > kMatchSpecLenStart + 1) {
- SizeT numProbs = LzmaProps_GetNumProbs (&p->prop);
- SizeT i;
- CLzmaProb *probs = p->probs;
- for (i = 0; i < numProbs; i++) {
- probs[i] = kBitModelTotal >> 1;
- }
-
- p->reps[0] = p->reps[1] = p->reps[2] = p->reps[3] = 1;
- p->state = 0;
- }
-
- p->remainLen = 0;
- }
-
- LzmaDec_WriteRem (p, dicLimit);
-
- while (p->remainLen != kMatchSpecLenStart) {
- int checkEndMarkNow = 0;
-
- if (p->dicPos >= dicLimit) {
- if ((p->remainLen == 0) && (p->code == 0)) {
- *status = LZMA_STATUS_MAYBE_FINISHED_WITHOUT_MARK;
- return SZ_OK;
- }
-
- if (finishMode == LZMA_FINISH_ANY) {
- *status = LZMA_STATUS_NOT_FINISHED;
- return SZ_OK;
- }
-
- if (p->remainLen != 0) {
- *status = LZMA_STATUS_NOT_FINISHED;
- return SZ_ERROR_DATA;
- }
-
- checkEndMarkNow = 1;
- }
-
- if (p->tempBufSize == 0) {
- SizeT processed;
- const Byte *bufLimit;
- if ((inSize < LZMA_REQUIRED_INPUT_MAX) || checkEndMarkNow) {
- int dummyRes = LzmaDec_TryDummy (p, src, inSize);
- if (dummyRes == DUMMY_ERROR) {
- memcpy (p->tempBuf, src, inSize);
- p->tempBufSize = (unsigned)inSize;
- (*srcLen) += inSize;
- *status = LZMA_STATUS_NEEDS_MORE_INPUT;
- return SZ_OK;
- }
-
- if (checkEndMarkNow && (dummyRes != DUMMY_MATCH)) {
- *status = LZMA_STATUS_NOT_FINISHED;
- return SZ_ERROR_DATA;
- }
-
- bufLimit = src;
- } else {
- bufLimit = src + inSize - LZMA_REQUIRED_INPUT_MAX;
- }
-
- p->buf = src;
- if (LzmaDec_DecodeReal2 (p, dicLimit, bufLimit) != 0) {
- return SZ_ERROR_DATA;
- }
-
- processed = (SizeT)(p->buf - src);
- (*srcLen) += processed;
- src += processed;
- inSize -= processed;
- } else {
- unsigned rem = p->tempBufSize, lookAhead = 0;
- while (rem < LZMA_REQUIRED_INPUT_MAX && lookAhead < inSize) {
- p->tempBuf[rem++] = src[lookAhead++];
- }
-
- p->tempBufSize = rem;
- if ((rem < LZMA_REQUIRED_INPUT_MAX) || checkEndMarkNow) {
- int dummyRes = LzmaDec_TryDummy (p, p->tempBuf, (SizeT)rem);
- if (dummyRes == DUMMY_ERROR) {
- (*srcLen) += (SizeT)lookAhead;
- *status = LZMA_STATUS_NEEDS_MORE_INPUT;
- return SZ_OK;
- }
-
- if (checkEndMarkNow && (dummyRes != DUMMY_MATCH)) {
- *status = LZMA_STATUS_NOT_FINISHED;
- return SZ_ERROR_DATA;
- }
- }
-
- p->buf = p->tempBuf;
- if (LzmaDec_DecodeReal2 (p, dicLimit, p->buf) != 0) {
- return SZ_ERROR_DATA;
- }
-
- {
- unsigned kkk = (unsigned)(p->buf - p->tempBuf);
- if (rem < kkk) {
- return SZ_ERROR_FAIL; /* some internal error */
- }
-
- rem -= kkk;
- if (lookAhead < rem) {
- return SZ_ERROR_FAIL; /* some internal error */
- }
-
- lookAhead -= rem;
- }
- (*srcLen) += (SizeT)lookAhead;
- src += lookAhead;
- inSize -= (SizeT)lookAhead;
- p->tempBufSize = 0;
- }
- }
-
- if (p->code != 0) {
- return SZ_ERROR_DATA;
- }
-
- *status = LZMA_STATUS_FINISHED_WITH_MARK;
- return SZ_OK;
-}
-
-SRes
-LzmaDec_DecodeToBuf (
- CLzmaDec *p,
- Byte *dest,
- SizeT *destLen,
- const Byte *src,
- SizeT *srcLen,
- ELzmaFinishMode finishMode,
- ELzmaStatus *status
- )
-{
- SizeT outSize = *destLen;
- SizeT inSize = *srcLen;
-
- *srcLen = *destLen = 0;
- for ( ; ;) {
- SizeT inSizeCur = inSize, outSizeCur, dicPos;
- ELzmaFinishMode curFinishMode;
- SRes res;
- if (p->dicPos == p->dicBufSize) {
- p->dicPos = 0;
- }
-
- dicPos = p->dicPos;
- if (outSize > p->dicBufSize - dicPos) {
- outSizeCur = p->dicBufSize;
- curFinishMode = LZMA_FINISH_ANY;
- } else {
- outSizeCur = dicPos + outSize;
- curFinishMode = finishMode;
- }
-
- res = LzmaDec_DecodeToDic (p, outSizeCur, src, &inSizeCur, curFinishMode, status);
- src += inSizeCur;
- inSize -= inSizeCur;
- *srcLen += inSizeCur;
- outSizeCur = p->dicPos - dicPos;
- memcpy (dest, p->dic + dicPos, outSizeCur);
- dest += outSizeCur;
- outSize -= outSizeCur;
- *destLen += outSizeCur;
- if (res != 0) {
- return res;
- }
-
- if ((outSizeCur == 0) || (outSize == 0)) {
- return SZ_OK;
- }
- }
-}
-
-void
-LzmaDec_FreeProbs (
- CLzmaDec *p,
- ISzAllocPtr alloc
- )
-{
- ISzAlloc_Free (alloc, p->probs);
- p->probs = NULL;
-}
-
-static void
-LzmaDec_FreeDict (
- CLzmaDec *p,
- ISzAllocPtr alloc
- )
-{
- ISzAlloc_Free (alloc, p->dic);
- p->dic = NULL;
-}
-
-void
-LzmaDec_Free (
- CLzmaDec *p,
- ISzAllocPtr alloc
- )
-{
- LzmaDec_FreeProbs (p, alloc);
- LzmaDec_FreeDict (p, alloc);
-}
-
-SRes
-LzmaProps_Decode (
- CLzmaProps *p,
- const Byte *data,
- unsigned size
- )
-{
- UInt32 dicSize;
- Byte d;
-
- if (size < LZMA_PROPS_SIZE) {
- return SZ_ERROR_UNSUPPORTED;
- } else {
- dicSize = data[1] | ((UInt32)data[2] << 8) | ((UInt32)data[3] << 16) | ((UInt32)data[4] << 24);
- }
-
- if (dicSize < LZMA_DIC_MIN) {
- dicSize = LZMA_DIC_MIN;
- }
-
- p->dicSize = dicSize;
-
- d = data[0];
- if (d >= (9 * 5 * 5)) {
- return SZ_ERROR_UNSUPPORTED;
- }
-
- p->lc = (Byte)(d % 9);
- d /= 9;
- p->pb = (Byte)(d / 5);
- p->lp = (Byte)(d % 5);
-
- return SZ_OK;
-}
-
-static SRes
-LzmaDec_AllocateProbs2 (
- CLzmaDec *p,
- const CLzmaProps *propNew,
- ISzAllocPtr alloc
- )
-{
- UInt32 numProbs = LzmaProps_GetNumProbs (propNew);
-
- if (!p->probs || (numProbs != p->numProbs)) {
- LzmaDec_FreeProbs (p, alloc);
- p->probs = (CLzmaProb *)ISzAlloc_Alloc (alloc, numProbs * sizeof (CLzmaProb));
- if (!p->probs) {
- return SZ_ERROR_MEM;
- }
-
- p->probs_1664 = p->probs + 1664;
- p->numProbs = numProbs;
- }
-
- return SZ_OK;
-}
-
-SRes
-LzmaDec_AllocateProbs (
- CLzmaDec *p,
- const Byte *props,
- unsigned propsSize,
- ISzAllocPtr alloc
- )
-{
- CLzmaProps propNew;
-
- RINOK (LzmaProps_Decode (&propNew, props, propsSize));
- RINOK (LzmaDec_AllocateProbs2 (p, &propNew, alloc));
- p->prop = propNew;
- return SZ_OK;
-}
-
-SRes
-LzmaDec_Allocate (
- CLzmaDec *p,
- const Byte *props,
- unsigned propsSize,
- ISzAllocPtr alloc
- )
-{
- CLzmaProps propNew;
- SizeT dicBufSize;
-
- RINOK (LzmaProps_Decode (&propNew, props, propsSize));
- RINOK (LzmaDec_AllocateProbs2 (p, &propNew, alloc));
-
- {
- UInt32 dictSize = propNew.dicSize;
- SizeT mask = ((UInt32)1 << 12) - 1;
- if (dictSize >= ((UInt32)1 << 30)) {
- mask = ((UInt32)1 << 22) - 1;
- } else if (dictSize >= ((UInt32)1 << 22)) {
- mask = ((UInt32)1 << 20) - 1;
- }
-
- dicBufSize = ((SizeT)dictSize + mask) & ~mask;
- if (dicBufSize < dictSize) {
- dicBufSize = dictSize;
- }
- }
-
- if (!p->dic || (dicBufSize != p->dicBufSize)) {
- LzmaDec_FreeDict (p, alloc);
- p->dic = (Byte *)ISzAlloc_Alloc (alloc, dicBufSize);
- if (!p->dic) {
- LzmaDec_FreeProbs (p, alloc);
- return SZ_ERROR_MEM;
- }
- }
-
- p->dicBufSize = dicBufSize;
- p->prop = propNew;
- return SZ_OK;
-}
-
-SRes
-LzmaDecode (
- Byte *dest,
- SizeT *destLen,
- const Byte *src,
- SizeT *srcLen,
- const Byte *propData,
- unsigned propSize,
- ELzmaFinishMode finishMode,
- ELzmaStatus *status,
- ISzAllocPtr alloc
- )
-{
- CLzmaDec p;
- SRes res;
- SizeT outSize = *destLen, inSize = *srcLen;
-
- *destLen = *srcLen = 0;
- *status = LZMA_STATUS_NOT_SPECIFIED;
- if (inSize < RC_INIT_SIZE) {
- return SZ_ERROR_INPUT_EOF;
- }
-
- LzmaDec_Construct (&p);
- RINOK (LzmaDec_AllocateProbs (&p, propData, propSize, alloc));
- p.dic = dest;
- p.dicBufSize = outSize;
- LzmaDec_Init (&p);
- *srcLen = inSize;
- res = LzmaDec_DecodeToDic (&p, outSize, src, srcLen, finishMode, status);
- *destLen = p.dicPos;
- if ((res == SZ_OK) && (*status == LZMA_STATUS_NEEDS_MORE_INPUT)) {
- res = SZ_ERROR_INPUT_EOF;
- }
-
- LzmaDec_FreeProbs (&p, alloc);
- return res;
-}
+/* LzmaDec.c -- LZMA Decoder +2018-07-04 : Igor Pavlov : Public domain */ + +#include "Precomp.h" + +#ifndef EFIAPI + #include <string.h> +#endif + +/* #include "CpuArch.h" */ +#include "LzmaDec.h" + +#define kNumTopBits 24 +#define kTopValue ((UInt32)1 << kNumTopBits) + +#define kNumBitModelTotalBits 11 +#define kBitModelTotal (1 << kNumBitModelTotalBits) +#define kNumMoveBits 5 + +#define RC_INIT_SIZE 5 + +#define NORMALIZE if (range < kTopValue) { range <<= 8; code = (code << 8) | (*buf++); } + +#define IF_BIT_0(p) ttt = *(p); NORMALIZE; bound = (range >> kNumBitModelTotalBits) * (UInt32)ttt; if (code < bound) +#define UPDATE_0(p) range = bound; *(p) = (CLzmaProb)(ttt + ((kBitModelTotal - ttt) >> kNumMoveBits)); +#define UPDATE_1(p) range -= bound; code -= bound; *(p) = (CLzmaProb)(ttt - (ttt >> kNumMoveBits)); +#define GET_BIT2(p, i, A0, A1) IF_BIT_0(p)\ + { UPDATE_0(p); i = (i + i); A0; } else \ + { UPDATE_1(p); i = (i + i) + 1; A1; } + +#define TREE_GET_BIT(probs, i) { GET_BIT2(probs + i, i, ;, ;); } + +#define REV_BIT(p, i, A0, A1) IF_BIT_0(p + i)\ + { UPDATE_0(p + i); A0; } else \ + { UPDATE_1(p + i); A1; } +#define REV_BIT_VAR(p, i, m) REV_BIT(p, i, i += m; m += m, m += m; i += m; ) +#define REV_BIT_CONST(p, i, m) REV_BIT(p, i, i += m; , i += m * 2; ) +#define REV_BIT_LAST(p, i, m) REV_BIT(p, i, i -= m , ; ) + +#define TREE_DECODE(probs, limit, i) \ + { i = 1; do { TREE_GET_BIT(probs, i); } while (i < limit); i -= limit; } + +/* #define _LZMA_SIZE_OPT */ + +#ifdef _LZMA_SIZE_OPT +#define TREE_6_DECODE(probs, i) TREE_DECODE(probs, (1 << 6), i) +#else +#define TREE_6_DECODE(probs, i) \ + { i = 1; \ + TREE_GET_BIT(probs, i); \ + TREE_GET_BIT(probs, i); \ + TREE_GET_BIT(probs, i); \ + TREE_GET_BIT(probs, i); \ + TREE_GET_BIT(probs, i); \ + TREE_GET_BIT(probs, i); \ + i -= 0x40; } +#endif + +#define NORMAL_LITER_DEC TREE_GET_BIT(prob, symbol) +#define MATCHED_LITER_DEC \ + matchByte += matchByte; \ + bit = offs; \ + offs &= matchByte; \ + probLit = prob + (offs + bit + symbol); \ + GET_BIT2(probLit, symbol, offs ^= bit; , ;) + +#define NORMALIZE_CHECK if (range < kTopValue) { if (buf >= bufLimit) return DUMMY_ERROR; range <<= 8; code = (code << 8) | (*buf++); } + +#define IF_BIT_0_CHECK(p) ttt = *(p); NORMALIZE_CHECK; bound = (range >> kNumBitModelTotalBits) * (UInt32)ttt; if (code < bound) +#define UPDATE_0_CHECK range = bound; +#define UPDATE_1_CHECK range -= bound; code -= bound; +#define GET_BIT2_CHECK(p, i, A0, A1) IF_BIT_0_CHECK(p)\ + { UPDATE_0_CHECK; i = (i + i); A0; } else \ + { UPDATE_1_CHECK; i = (i + i) + 1; A1; } +#define GET_BIT_CHECK(p, i) GET_BIT2_CHECK(p, i, ; , ;) +#define TREE_DECODE_CHECK(probs, limit, i) \ + { i = 1; do { GET_BIT_CHECK(probs + i, i) } while (i < limit); i -= limit; } + +#define REV_BIT_CHECK(p, i, m) IF_BIT_0_CHECK(p + i)\ + { UPDATE_0_CHECK; i += m; m += m; } else \ + { UPDATE_1_CHECK; m += m; i += m; } + +#define kNumPosBitsMax 4 +#define kNumPosStatesMax (1 << kNumPosBitsMax) + +#define kLenNumLowBits 3 +#define kLenNumLowSymbols (1 << kLenNumLowBits) +#define kLenNumHighBits 8 +#define kLenNumHighSymbols (1 << kLenNumHighBits) + +#define LenLow 0 +#define LenHigh (LenLow + 2 * (kNumPosStatesMax << kLenNumLowBits)) +#define kNumLenProbs (LenHigh + kLenNumHighSymbols) + +#define LenChoice LenLow +#define LenChoice2 (LenLow + (1 << kLenNumLowBits)) + +#define kNumStates 12 +#define kNumStates2 16 +#define kNumLitStates 7 + +#define kStartPosModelIndex 4 +#define kEndPosModelIndex 14 +#define kNumFullDistances (1 << (kEndPosModelIndex >> 1)) + +#define kNumPosSlotBits 6 +#define kNumLenToPosStates 4 + +#define kNumAlignBits 4 +#define kAlignTableSize (1 << kNumAlignBits) + +#define kMatchMinLen 2 +#define kMatchSpecLenStart (kMatchMinLen + kLenNumLowSymbols * 2 + kLenNumHighSymbols) + +/* External ASM code needs same CLzmaProb array layout. So don't change it. */ + +/* (probs_1664) is faster and better for code size at some platforms */ + +/* +#ifdef MY_CPU_X86_OR_AMD64 +*/ +#define kStartOffset 1664 +#define GET_PROBS p->probs_1664 + +/* +#define GET_PROBS p->probs + kStartOffset +#else +#define kStartOffset 0 +#define GET_PROBS p->probs +#endif +*/ + +#define SpecPos (-kStartOffset) +#define IsRep0Long (SpecPos + kNumFullDistances) +#define RepLenCoder (IsRep0Long + (kNumStates2 << kNumPosBitsMax)) +#define LenCoder (RepLenCoder + kNumLenProbs) +#define IsMatch (LenCoder + kNumLenProbs) +#define Align (IsMatch + (kNumStates2 << kNumPosBitsMax)) +#define IsRep (Align + kAlignTableSize) +#define IsRepG0 (IsRep + kNumStates) +#define IsRepG1 (IsRepG0 + kNumStates) +#define IsRepG2 (IsRepG1 + kNumStates) +#define PosSlot (IsRepG2 + kNumStates) +#define Literal (PosSlot + (kNumLenToPosStates << kNumPosSlotBits)) +#define NUM_BASE_PROBS (Literal + kStartOffset) + +#if Align != 0 && kStartOffset != 0 + #error Stop_Compiling_Bad_LZMA_kAlign +#endif + +#if NUM_BASE_PROBS != 1984 + #error Stop_Compiling_Bad_LZMA_PROBS +#endif + +#define LZMA_LIT_SIZE 0x300 + +#define LzmaProps_GetNumProbs(p) (NUM_BASE_PROBS + ((UInt32)LZMA_LIT_SIZE << ((p)->lc + (p)->lp))) + +#define CALC_POS_STATE(processedPos, pbMask) (((processedPos) & (pbMask)) << 4) +#define COMBINED_PS_STATE (posState + state) +#define GET_LEN_STATE (posState) + +#define LZMA_DIC_MIN (1 << 12) + +/* +p->remainLen : shows status of LZMA decoder: + < kMatchSpecLenStart : normal remain + = kMatchSpecLenStart : finished + = kMatchSpecLenStart + 1 : need init range coder + = kMatchSpecLenStart + 2 : need init range coder and state +*/ + +/* ---------- LZMA_DECODE_REAL ---------- */ + +/* +LzmaDec_DecodeReal_3() can be implemented in external ASM file. +3 - is the code compatibility version of that function for check at link time. +*/ + +#define LZMA_DECODE_REAL LzmaDec_DecodeReal_3 + +/* +LZMA_DECODE_REAL() +In: + RangeCoder is normalized + if (p->dicPos == limit) + { + LzmaDec_TryDummy() was called before to exclude LITERAL and MATCH-REP cases. + So first symbol can be only MATCH-NON-REP. And if that MATCH-NON-REP symbol + is not END_OF_PAYALOAD_MARKER, then function returns error code. + } + +Processing: + first LZMA symbol will be decoded in any case + All checks for limits are at the end of main loop, + It will decode new LZMA-symbols while (p->buf < bufLimit && dicPos < limit), + RangeCoder is still without last normalization when (p->buf < bufLimit) is being checked. + +Out: + RangeCoder is normalized + Result: + SZ_OK - OK + SZ_ERROR_DATA - Error + p->remainLen: + < kMatchSpecLenStart : normal remain + = kMatchSpecLenStart : finished +*/ + +#ifdef _LZMA_DEC_OPT + +int MY_FAST_CALL +LZMA_DECODE_REAL ( + CLzmaDec *p, + SizeT limit, + const Byte *bufLimit + ); + +#else + +static +int MY_FAST_CALL +LZMA_DECODE_REAL ( + CLzmaDec *p, + SizeT limit, + const Byte *bufLimit + ) +{ + CLzmaProb *probs = GET_PROBS; + unsigned state = (unsigned)p->state; + UInt32 rep0 = p->reps[0], rep1 = p->reps[1], rep2 = p->reps[2], rep3 = p->reps[3]; + unsigned pbMask = ((unsigned)1 << (p->prop.pb)) - 1; + unsigned lc = p->prop.lc; + unsigned lpMask = ((unsigned)0x100 << p->prop.lp) - ((unsigned)0x100 >> lc); + + Byte *dic = p->dic; + SizeT dicBufSize = p->dicBufSize; + SizeT dicPos = p->dicPos; + + UInt32 processedPos = p->processedPos; + UInt32 checkDicSize = p->checkDicSize; + unsigned len = 0; + + const Byte *buf = p->buf; + UInt32 range = p->range; + UInt32 code = p->code; + + do { + CLzmaProb *prob; + UInt32 bound; + unsigned ttt; + unsigned posState = CALC_POS_STATE (processedPos, pbMask); + + prob = probs + IsMatch + COMBINED_PS_STATE; + IF_BIT_0 (prob) { + unsigned symbol; + + UPDATE_0 (prob); + prob = probs + Literal; + if ((processedPos != 0) || (checkDicSize != 0)) { + prob += (UInt32)3 * ((((processedPos << 8) + dic[(dicPos == 0 ? dicBufSize : dicPos) - 1]) & lpMask) << lc); + } + + processedPos++; + + if (state < kNumLitStates) { + state -= (state < 4) ? state : 3; + symbol = 1; + #ifdef _LZMA_SIZE_OPT + do { + NORMAL_LITER_DEC + } while (symbol < 0x100); + + #else + NORMAL_LITER_DEC + NORMAL_LITER_DEC + NORMAL_LITER_DEC + NORMAL_LITER_DEC + NORMAL_LITER_DEC + NORMAL_LITER_DEC + NORMAL_LITER_DEC + NORMAL_LITER_DEC + #endif + } else { + unsigned matchByte = dic[dicPos - rep0 + (dicPos < rep0 ? dicBufSize : 0)]; + unsigned offs = 0x100; + state -= (state < 10) ? 3 : 6; + symbol = 1; + #ifdef _LZMA_SIZE_OPT + do { + unsigned bit; + CLzmaProb *probLit; + MATCHED_LITER_DEC + } while (symbol < 0x100); + + #else + { + unsigned bit; + CLzmaProb *probLit; + MATCHED_LITER_DEC + MATCHED_LITER_DEC + MATCHED_LITER_DEC + MATCHED_LITER_DEC + MATCHED_LITER_DEC + MATCHED_LITER_DEC + MATCHED_LITER_DEC + MATCHED_LITER_DEC + } + #endif + } + + dic[dicPos++] = (Byte)symbol; + continue; + } + + { + UPDATE_1 (prob); + prob = probs + IsRep + state; + IF_BIT_0 (prob) { + UPDATE_0 (prob); + state += kNumStates; + prob = probs + LenCoder; + } else { + UPDATE_1 (prob); + + /* + // that case was checked before with kBadRepCode + if (checkDicSize == 0 && processedPos == 0) + return SZ_ERROR_DATA; + */ + prob = probs + IsRepG0 + state; + IF_BIT_0 (prob) { + UPDATE_0 (prob); + prob = probs + IsRep0Long + COMBINED_PS_STATE; + IF_BIT_0 (prob) { + UPDATE_0 (prob); + dic[dicPos] = dic[dicPos - rep0 + (dicPos < rep0 ? dicBufSize : 0)]; + dicPos++; + processedPos++; + state = state < kNumLitStates ? 9 : 11; + continue; + } + UPDATE_1 (prob); + } else { + UInt32 distance; + UPDATE_1 (prob); + prob = probs + IsRepG1 + state; + IF_BIT_0 (prob) { + UPDATE_0 (prob); + distance = rep1; + } else { + UPDATE_1 (prob); + prob = probs + IsRepG2 + state; + IF_BIT_0 (prob) { + UPDATE_0 (prob); + distance = rep2; + } else { + UPDATE_1 (prob); + distance = rep3; + rep3 = rep2; + } + rep2 = rep1; + } + rep1 = rep0; + rep0 = distance; + } + state = state < kNumLitStates ? 8 : 11; + prob = probs + RepLenCoder; + } + + #ifdef _LZMA_SIZE_OPT + { + unsigned lim, offset; + CLzmaProb *probLen = prob + LenChoice; + IF_BIT_0 (probLen) { + UPDATE_0 (probLen); + probLen = prob + LenLow + GET_LEN_STATE; + offset = 0; + lim = (1 << kLenNumLowBits); + } else { + UPDATE_1 (probLen); + probLen = prob + LenChoice2; + IF_BIT_0 (probLen) { + UPDATE_0 (probLen); + probLen = prob + LenLow + GET_LEN_STATE + (1 << kLenNumLowBits); + offset = kLenNumLowSymbols; + lim = (1 << kLenNumLowBits); + } else { + UPDATE_1 (probLen); + probLen = prob + LenHigh; + offset = kLenNumLowSymbols * 2; + lim = (1 << kLenNumHighBits); + } + } + TREE_DECODE (probLen, lim, len); + len += offset; + } + #else + { + CLzmaProb *probLen = prob + LenChoice; + IF_BIT_0 (probLen) { + UPDATE_0 (probLen); + probLen = prob + LenLow + GET_LEN_STATE; + len = 1; + TREE_GET_BIT (probLen, len); + TREE_GET_BIT (probLen, len); + TREE_GET_BIT (probLen, len); + len -= 8; + } else { + UPDATE_1 (probLen); + probLen = prob + LenChoice2; + IF_BIT_0 (probLen) { + UPDATE_0 (probLen); + probLen = prob + LenLow + GET_LEN_STATE + (1 << kLenNumLowBits); + len = 1; + TREE_GET_BIT (probLen, len); + TREE_GET_BIT (probLen, len); + TREE_GET_BIT (probLen, len); + } else { + UPDATE_1 (probLen); + probLen = prob + LenHigh; + TREE_DECODE (probLen, (1 << kLenNumHighBits), len); + len += kLenNumLowSymbols * 2; + } + } + } + #endif + + if (state >= kNumStates) { + UInt32 distance; + prob = probs + PosSlot + + ((len < kNumLenToPosStates ? len : kNumLenToPosStates - 1) << kNumPosSlotBits); + TREE_6_DECODE (prob, distance); + if (distance >= kStartPosModelIndex) { + unsigned posSlot = (unsigned)distance; + unsigned numDirectBits = (unsigned)(((distance >> 1) - 1)); + distance = (2 | (distance & 1)); + if (posSlot < kEndPosModelIndex) { + distance <<= numDirectBits; + prob = probs + SpecPos; + { + UInt32 m = 1; + distance++; + do { + REV_BIT_VAR (prob, distance, m); + } while (--numDirectBits); + + distance -= m; + } + } else { + numDirectBits -= kNumAlignBits; + do { + NORMALIZE + range >>= 1; + + { + UInt32 t; + code -= range; + t = (0 - ((UInt32)code >> 31)); /* (UInt32)((Int32)code >> 31) */ + distance = (distance << 1) + (t + 1); + code += range & t; + } + + /* + distance <<= 1; + if (code >= range) + { + code -= range; + distance |= 1; + } + */ + } while (--numDirectBits); + + prob = probs + Align; + distance <<= kNumAlignBits; + { + unsigned i = 1; + REV_BIT_CONST (prob, i, 1); + REV_BIT_CONST (prob, i, 2); + REV_BIT_CONST (prob, i, 4); + REV_BIT_LAST (prob, i, 8); + distance |= i; + } + if (distance == (UInt32)0xFFFFFFFF) { + len = kMatchSpecLenStart; + state -= kNumStates; + break; + } + } + } + + rep3 = rep2; + rep2 = rep1; + rep1 = rep0; + rep0 = distance + 1; + state = (state < kNumStates + kNumLitStates) ? kNumLitStates : kNumLitStates + 3; + if (distance >= ((checkDicSize == 0) ? processedPos : checkDicSize)) { + p->dicPos = dicPos; + return SZ_ERROR_DATA; + } + } + + len += kMatchMinLen; + + { + SizeT rem; + unsigned curLen; + SizeT pos; + + if ((rem = limit - dicPos) == 0) { + p->dicPos = dicPos; + return SZ_ERROR_DATA; + } + + curLen = ((rem < len) ? (unsigned)rem : len); + pos = dicPos - rep0 + (dicPos < rep0 ? dicBufSize : 0); + + processedPos += (UInt32)curLen; + + len -= curLen; + if (curLen <= dicBufSize - pos) { + Byte *dest = dic + dicPos; + ptrdiff_t src = (ptrdiff_t)pos - (ptrdiff_t)dicPos; + const Byte *lim = dest + curLen; + dicPos += (SizeT)curLen; + do { + *(dest) = (Byte)*(dest + src); + } while (++dest != lim); + } else { + do { + dic[dicPos++] = dic[pos]; + if (++pos == dicBufSize) { + pos = 0; + } + } while (--curLen != 0); + } + } + } + } while (dicPos < limit && buf < bufLimit); + + NORMALIZE; + + p->buf = buf; + p->range = range; + p->code = code; + p->remainLen = (UInt32)len; + p->dicPos = dicPos; + p->processedPos = processedPos; + p->reps[0] = rep0; + p->reps[1] = rep1; + p->reps[2] = rep2; + p->reps[3] = rep3; + p->state = (UInt32)state; + + return SZ_OK; +} + +#endif + +static void MY_FAST_CALL +LzmaDec_WriteRem ( + CLzmaDec *p, + SizeT limit + ) +{ + if ((p->remainLen != 0) && (p->remainLen < kMatchSpecLenStart)) { + Byte *dic = p->dic; + SizeT dicPos = p->dicPos; + SizeT dicBufSize = p->dicBufSize; + unsigned len = (unsigned)p->remainLen; + SizeT rep0 = p->reps[0]; /* we use SizeT to avoid the BUG of VC14 for AMD64 */ + SizeT rem = limit - dicPos; + if (rem < len) { + len = (unsigned)(rem); + } + + if ((p->checkDicSize == 0) && (p->prop.dicSize - p->processedPos <= len)) { + p->checkDicSize = p->prop.dicSize; + } + + p->processedPos += (UInt32)len; + p->remainLen -= (UInt32)len; + while (len != 0) { + len--; + dic[dicPos] = dic[dicPos - rep0 + (dicPos < rep0 ? dicBufSize : 0)]; + dicPos++; + } + + p->dicPos = dicPos; + } +} + +#define kRange0 0xFFFFFFFF +#define kBound0 ((kRange0 >> kNumBitModelTotalBits) << (kNumBitModelTotalBits - 1)) +#define kBadRepCode (kBound0 + (((kRange0 - kBound0) >> kNumBitModelTotalBits) << (kNumBitModelTotalBits - 1))) +#if kBadRepCode != (0xC0000000 - 0x400) + #error Stop_Compiling_Bad_LZMA_Check +#endif + +static int MY_FAST_CALL +LzmaDec_DecodeReal2 ( + CLzmaDec *p, + SizeT limit, + const Byte *bufLimit + ) +{ + do { + SizeT limit2 = limit; + if (p->checkDicSize == 0) { + UInt32 rem = p->prop.dicSize - p->processedPos; + if (limit - p->dicPos > rem) { + limit2 = p->dicPos + rem; + } + + if (p->processedPos == 0) { + if (p->code >= kBadRepCode) { + return SZ_ERROR_DATA; + } + } + } + + RINOK (LZMA_DECODE_REAL (p, limit2, bufLimit)); + + if ((p->checkDicSize == 0) && (p->processedPos >= p->prop.dicSize)) { + p->checkDicSize = p->prop.dicSize; + } + + LzmaDec_WriteRem (p, limit); + } while (p->dicPos < limit && p->buf < bufLimit && p->remainLen < kMatchSpecLenStart); + + return 0; +} + +typedef enum { + DUMMY_ERROR, /* unexpected end of input stream */ + DUMMY_LIT, + DUMMY_MATCH, + DUMMY_REP +} ELzmaDummy; + +static ELzmaDummy +LzmaDec_TryDummy ( + const CLzmaDec *p, + const Byte *buf, + SizeT inSize + ) +{ + UInt32 range = p->range; + UInt32 code = p->code; + const Byte *bufLimit = buf + inSize; + const CLzmaProb *probs = GET_PROBS; + unsigned state = (unsigned)p->state; + ELzmaDummy res; + + { + const CLzmaProb *prob; + UInt32 bound; + unsigned ttt; + unsigned posState = CALC_POS_STATE (p->processedPos, (1 << p->prop.pb) - 1); + + prob = probs + IsMatch + COMBINED_PS_STATE; + IF_BIT_0_CHECK (prob) { + UPDATE_0_CHECK + + /* if (bufLimit - buf >= 7) return DUMMY_LIT; */ + + prob = probs + Literal; + + if ((p->checkDicSize != 0) || (p->processedPos != 0)) { + prob += ((UInt32)LZMA_LIT_SIZE * + ((((p->processedPos) & ((1 << (p->prop.lp)) - 1)) << p->prop.lc) + + (p->dic[(p->dicPos == 0 ? p->dicBufSize : p->dicPos) - 1] >> (8 - p->prop.lc)))); + } + + if (state < kNumLitStates) { + unsigned symbol = 1; + do { + GET_BIT_CHECK (prob + symbol, symbol) + } while (symbol < 0x100); + } else { + unsigned matchByte = p->dic[p->dicPos - p->reps[0] + + (p->dicPos < p->reps[0] ? p->dicBufSize : 0)]; + unsigned offs = 0x100; + unsigned symbol = 1; + do { + unsigned bit; + const CLzmaProb *probLit; + matchByte += matchByte; + bit = offs; + offs &= matchByte; + probLit = prob + (offs + bit + symbol); + GET_BIT2_CHECK ( + probLit, + symbol, + offs ^= bit; + , + ; + ) + } while (symbol < 0x100); + } + + res = DUMMY_LIT; + } else { + unsigned len; + UPDATE_1_CHECK; + + prob = probs + IsRep + state; + IF_BIT_0_CHECK (prob) { + UPDATE_0_CHECK; + state = 0; + prob = probs + LenCoder; + res = DUMMY_MATCH; + } else { + UPDATE_1_CHECK; + res = DUMMY_REP; + prob = probs + IsRepG0 + state; + IF_BIT_0_CHECK (prob) { + UPDATE_0_CHECK; + prob = probs + IsRep0Long + COMBINED_PS_STATE; + IF_BIT_0_CHECK (prob) { + UPDATE_0_CHECK; + NORMALIZE_CHECK; + return DUMMY_REP; + } else { + UPDATE_1_CHECK; + } + } else { + UPDATE_1_CHECK; + prob = probs + IsRepG1 + state; + IF_BIT_0_CHECK (prob) { + UPDATE_0_CHECK; + } else { + UPDATE_1_CHECK; + prob = probs + IsRepG2 + state; + IF_BIT_0_CHECK (prob) { + UPDATE_0_CHECK; + } else { + UPDATE_1_CHECK; + } + } + } + state = kNumStates; + prob = probs + RepLenCoder; + } + { + unsigned limit, offset; + const CLzmaProb *probLen = prob + LenChoice; + IF_BIT_0_CHECK (probLen) { + UPDATE_0_CHECK; + probLen = prob + LenLow + GET_LEN_STATE; + offset = 0; + limit = 1 << kLenNumLowBits; + } else { + UPDATE_1_CHECK; + probLen = prob + LenChoice2; + IF_BIT_0_CHECK (probLen) { + UPDATE_0_CHECK; + probLen = prob + LenLow + GET_LEN_STATE + (1 << kLenNumLowBits); + offset = kLenNumLowSymbols; + limit = 1 << kLenNumLowBits; + } else { + UPDATE_1_CHECK; + probLen = prob + LenHigh; + offset = kLenNumLowSymbols * 2; + limit = 1 << kLenNumHighBits; + } + } + TREE_DECODE_CHECK (probLen, limit, len); + len += offset; + } + + if (state < 4) { + unsigned posSlot; + prob = probs + PosSlot + + ((len < kNumLenToPosStates - 1 ? len : kNumLenToPosStates - 1) << + kNumPosSlotBits); + TREE_DECODE_CHECK (prob, 1 << kNumPosSlotBits, posSlot); + if (posSlot >= kStartPosModelIndex) { + unsigned numDirectBits = ((posSlot >> 1) - 1); + + /* if (bufLimit - buf >= 8) return DUMMY_MATCH; */ + + if (posSlot < kEndPosModelIndex) { + prob = probs + SpecPos + ((2 | (posSlot & 1)) << numDirectBits); + } else { + numDirectBits -= kNumAlignBits; + do { + NORMALIZE_CHECK + range >>= 1; + code -= range & (((code - range) >> 31) - 1); + /* if (code >= range) code -= range; */ + } while (--numDirectBits); + + prob = probs + Align; + numDirectBits = kNumAlignBits; + } + + { + unsigned i = 1; + unsigned m = 1; + do { + REV_BIT_CHECK (prob, i, m); + } while (--numDirectBits); + } + } + } + } + } + + NORMALIZE_CHECK; + return res; +} + +void +LzmaDec_InitDicAndState ( + CLzmaDec *p, + BoolInt initDic, + BoolInt initState + ) +{ + p->remainLen = kMatchSpecLenStart + 1; + p->tempBufSize = 0; + + if (initDic) { + p->processedPos = 0; + p->checkDicSize = 0; + p->remainLen = kMatchSpecLenStart + 2; + } + + if (initState) { + p->remainLen = kMatchSpecLenStart + 2; + } +} + +void +LzmaDec_Init ( + CLzmaDec *p + ) +{ + p->dicPos = 0; + LzmaDec_InitDicAndState (p, True, True); +} + +SRes +LzmaDec_DecodeToDic ( + CLzmaDec *p, + SizeT dicLimit, + const Byte *src, + SizeT *srcLen, + ELzmaFinishMode finishMode, + ELzmaStatus *status + ) +{ + SizeT inSize = *srcLen; + + (*srcLen) = 0; + + *status = LZMA_STATUS_NOT_SPECIFIED; + + if (p->remainLen > kMatchSpecLenStart) { + for ( ; inSize > 0 && p->tempBufSize < RC_INIT_SIZE; (*srcLen)++, inSize--) { + p->tempBuf[p->tempBufSize++] = *src++; + } + + if ((p->tempBufSize != 0) && (p->tempBuf[0] != 0)) { + return SZ_ERROR_DATA; + } + + if (p->tempBufSize < RC_INIT_SIZE) { + *status = LZMA_STATUS_NEEDS_MORE_INPUT; + return SZ_OK; + } + + p->code = + ((UInt32)p->tempBuf[1] << 24) + | ((UInt32)p->tempBuf[2] << 16) + | ((UInt32)p->tempBuf[3] << 8) + | ((UInt32)p->tempBuf[4]); + p->range = 0xFFFFFFFF; + p->tempBufSize = 0; + + if (p->remainLen > kMatchSpecLenStart + 1) { + SizeT numProbs = LzmaProps_GetNumProbs (&p->prop); + SizeT i; + CLzmaProb *probs = p->probs; + for (i = 0; i < numProbs; i++) { + probs[i] = kBitModelTotal >> 1; + } + + p->reps[0] = p->reps[1] = p->reps[2] = p->reps[3] = 1; + p->state = 0; + } + + p->remainLen = 0; + } + + LzmaDec_WriteRem (p, dicLimit); + + while (p->remainLen != kMatchSpecLenStart) { + int checkEndMarkNow = 0; + + if (p->dicPos >= dicLimit) { + if ((p->remainLen == 0) && (p->code == 0)) { + *status = LZMA_STATUS_MAYBE_FINISHED_WITHOUT_MARK; + return SZ_OK; + } + + if (finishMode == LZMA_FINISH_ANY) { + *status = LZMA_STATUS_NOT_FINISHED; + return SZ_OK; + } + + if (p->remainLen != 0) { + *status = LZMA_STATUS_NOT_FINISHED; + return SZ_ERROR_DATA; + } + + checkEndMarkNow = 1; + } + + if (p->tempBufSize == 0) { + SizeT processed; + const Byte *bufLimit; + if ((inSize < LZMA_REQUIRED_INPUT_MAX) || checkEndMarkNow) { + int dummyRes = LzmaDec_TryDummy (p, src, inSize); + if (dummyRes == DUMMY_ERROR) { + memcpy (p->tempBuf, src, inSize); + p->tempBufSize = (unsigned)inSize; + (*srcLen) += inSize; + *status = LZMA_STATUS_NEEDS_MORE_INPUT; + return SZ_OK; + } + + if (checkEndMarkNow && (dummyRes != DUMMY_MATCH)) { + *status = LZMA_STATUS_NOT_FINISHED; + return SZ_ERROR_DATA; + } + + bufLimit = src; + } else { + bufLimit = src + inSize - LZMA_REQUIRED_INPUT_MAX; + } + + p->buf = src; + if (LzmaDec_DecodeReal2 (p, dicLimit, bufLimit) != 0) { + return SZ_ERROR_DATA; + } + + processed = (SizeT)(p->buf - src); + (*srcLen) += processed; + src += processed; + inSize -= processed; + } else { + unsigned rem = p->tempBufSize, lookAhead = 0; + while (rem < LZMA_REQUIRED_INPUT_MAX && lookAhead < inSize) { + p->tempBuf[rem++] = src[lookAhead++]; + } + + p->tempBufSize = rem; + if ((rem < LZMA_REQUIRED_INPUT_MAX) || checkEndMarkNow) { + int dummyRes = LzmaDec_TryDummy (p, p->tempBuf, (SizeT)rem); + if (dummyRes == DUMMY_ERROR) { + (*srcLen) += (SizeT)lookAhead; + *status = LZMA_STATUS_NEEDS_MORE_INPUT; + return SZ_OK; + } + + if (checkEndMarkNow && (dummyRes != DUMMY_MATCH)) { + *status = LZMA_STATUS_NOT_FINISHED; + return SZ_ERROR_DATA; + } + } + + p->buf = p->tempBuf; + if (LzmaDec_DecodeReal2 (p, dicLimit, p->buf) != 0) { + return SZ_ERROR_DATA; + } + + { + unsigned kkk = (unsigned)(p->buf - p->tempBuf); + if (rem < kkk) { + return SZ_ERROR_FAIL; /* some internal error */ + } + + rem -= kkk; + if (lookAhead < rem) { + return SZ_ERROR_FAIL; /* some internal error */ + } + + lookAhead -= rem; + } + (*srcLen) += (SizeT)lookAhead; + src += lookAhead; + inSize -= (SizeT)lookAhead; + p->tempBufSize = 0; + } + } + + if (p->code != 0) { + return SZ_ERROR_DATA; + } + + *status = LZMA_STATUS_FINISHED_WITH_MARK; + return SZ_OK; +} + +SRes +LzmaDec_DecodeToBuf ( + CLzmaDec *p, + Byte *dest, + SizeT *destLen, + const Byte *src, + SizeT *srcLen, + ELzmaFinishMode finishMode, + ELzmaStatus *status + ) +{ + SizeT outSize = *destLen; + SizeT inSize = *srcLen; + + *srcLen = *destLen = 0; + for ( ; ;) { + SizeT inSizeCur = inSize, outSizeCur, dicPos; + ELzmaFinishMode curFinishMode; + SRes res; + if (p->dicPos == p->dicBufSize) { + p->dicPos = 0; + } + + dicPos = p->dicPos; + if (outSize > p->dicBufSize - dicPos) { + outSizeCur = p->dicBufSize; + curFinishMode = LZMA_FINISH_ANY; + } else { + outSizeCur = dicPos + outSize; + curFinishMode = finishMode; + } + + res = LzmaDec_DecodeToDic (p, outSizeCur, src, &inSizeCur, curFinishMode, status); + src += inSizeCur; + inSize -= inSizeCur; + *srcLen += inSizeCur; + outSizeCur = p->dicPos - dicPos; + memcpy (dest, p->dic + dicPos, outSizeCur); + dest += outSizeCur; + outSize -= outSizeCur; + *destLen += outSizeCur; + if (res != 0) { + return res; + } + + if ((outSizeCur == 0) || (outSize == 0)) { + return SZ_OK; + } + } +} + +void +LzmaDec_FreeProbs ( + CLzmaDec *p, + ISzAllocPtr alloc + ) +{ + ISzAlloc_Free (alloc, p->probs); + p->probs = NULL; +} + +static void +LzmaDec_FreeDict ( + CLzmaDec *p, + ISzAllocPtr alloc + ) +{ + ISzAlloc_Free (alloc, p->dic); + p->dic = NULL; +} + +void +LzmaDec_Free ( + CLzmaDec *p, + ISzAllocPtr alloc + ) +{ + LzmaDec_FreeProbs (p, alloc); + LzmaDec_FreeDict (p, alloc); +} + +SRes +LzmaProps_Decode ( + CLzmaProps *p, + const Byte *data, + unsigned size + ) +{ + UInt32 dicSize; + Byte d; + + if (size < LZMA_PROPS_SIZE) { + return SZ_ERROR_UNSUPPORTED; + } else { + dicSize = data[1] | ((UInt32)data[2] << 8) | ((UInt32)data[3] << 16) | ((UInt32)data[4] << 24); + } + + if (dicSize < LZMA_DIC_MIN) { + dicSize = LZMA_DIC_MIN; + } + + p->dicSize = dicSize; + + d = data[0]; + if (d >= (9 * 5 * 5)) { + return SZ_ERROR_UNSUPPORTED; + } + + p->lc = (Byte)(d % 9); + d /= 9; + p->pb = (Byte)(d / 5); + p->lp = (Byte)(d % 5); + + return SZ_OK; +} + +static SRes +LzmaDec_AllocateProbs2 ( + CLzmaDec *p, + const CLzmaProps *propNew, + ISzAllocPtr alloc + ) +{ + UInt32 numProbs = LzmaProps_GetNumProbs (propNew); + + if (!p->probs || (numProbs != p->numProbs)) { + LzmaDec_FreeProbs (p, alloc); + p->probs = (CLzmaProb *)ISzAlloc_Alloc (alloc, numProbs * sizeof (CLzmaProb)); + if (!p->probs) { + return SZ_ERROR_MEM; + } + + p->probs_1664 = p->probs + 1664; + p->numProbs = numProbs; + } + + return SZ_OK; +} + +SRes +LzmaDec_AllocateProbs ( + CLzmaDec *p, + const Byte *props, + unsigned propsSize, + ISzAllocPtr alloc + ) +{ + CLzmaProps propNew; + + RINOK (LzmaProps_Decode (&propNew, props, propsSize)); + RINOK (LzmaDec_AllocateProbs2 (p, &propNew, alloc)); + p->prop = propNew; + return SZ_OK; +} + +SRes +LzmaDec_Allocate ( + CLzmaDec *p, + const Byte *props, + unsigned propsSize, + ISzAllocPtr alloc + ) +{ + CLzmaProps propNew; + SizeT dicBufSize; + + RINOK (LzmaProps_Decode (&propNew, props, propsSize)); + RINOK (LzmaDec_AllocateProbs2 (p, &propNew, alloc)); + + { + UInt32 dictSize = propNew.dicSize; + SizeT mask = ((UInt32)1 << 12) - 1; + if (dictSize >= ((UInt32)1 << 30)) { + mask = ((UInt32)1 << 22) - 1; + } else if (dictSize >= ((UInt32)1 << 22)) { + mask = ((UInt32)1 << 20) - 1; + } + + dicBufSize = ((SizeT)dictSize + mask) & ~mask; + if (dicBufSize < dictSize) { + dicBufSize = dictSize; + } + } + + if (!p->dic || (dicBufSize != p->dicBufSize)) { + LzmaDec_FreeDict (p, alloc); + p->dic = (Byte *)ISzAlloc_Alloc (alloc, dicBufSize); + if (!p->dic) { + LzmaDec_FreeProbs (p, alloc); + return SZ_ERROR_MEM; + } + } + + p->dicBufSize = dicBufSize; + p->prop = propNew; + return SZ_OK; +} + +SRes +LzmaDecode ( + Byte *dest, + SizeT *destLen, + const Byte *src, + SizeT *srcLen, + const Byte *propData, + unsigned propSize, + ELzmaFinishMode finishMode, + ELzmaStatus *status, + ISzAllocPtr alloc + ) +{ + CLzmaDec p; + SRes res; + SizeT outSize = *destLen, inSize = *srcLen; + + *destLen = *srcLen = 0; + *status = LZMA_STATUS_NOT_SPECIFIED; + if (inSize < RC_INIT_SIZE) { + return SZ_ERROR_INPUT_EOF; + } + + LzmaDec_Construct (&p); + RINOK (LzmaDec_AllocateProbs (&p, propData, propSize, alloc)); + p.dic = dest; + p.dicBufSize = outSize; + LzmaDec_Init (&p); + *srcLen = inSize; + res = LzmaDec_DecodeToDic (&p, outSize, src, srcLen, finishMode, status); + *destLen = p.dicPos; + if ((res == SZ_OK) && (*status == LZMA_STATUS_NEEDS_MORE_INPUT)) { + res = SZ_ERROR_INPUT_EOF; + } + + LzmaDec_FreeProbs (&p, alloc); + return res; +} diff --git a/MdeModulePkg/Library/LzmaCustomDecompressLib/Sdk/C/LzmaDec.h b/MdeModulePkg/Library/LzmaCustomDecompressLib/Sdk/C/LzmaDec.h index 11f028876f..24482e1702 100644 --- a/MdeModulePkg/Library/LzmaCustomDecompressLib/Sdk/C/LzmaDec.h +++ b/MdeModulePkg/Library/LzmaCustomDecompressLib/Sdk/C/LzmaDec.h @@ -1,279 +1,279 @@ -/* LzmaDec.h -- LZMA Decoder
-2018-04-21 : Igor Pavlov : Public domain */
-
-#ifndef __LZMA_DEC_H
-#define __LZMA_DEC_H
-
-#include "7zTypes.h"
-
-EXTERN_C_BEGIN
-
-/* #define _LZMA_PROB32 */
-
-/* _LZMA_PROB32 can increase the speed on some CPUs,
- but memory usage for CLzmaDec::probs will be doubled in that case */
-
-typedef
-#ifdef _LZMA_PROB32
- UInt32
-#else
- UInt16
-#endif
- CLzmaProb;
-
-/* ---------- LZMA Properties ---------- */
-
-#define LZMA_PROPS_SIZE 5
-
-typedef struct _CLzmaProps {
- Byte lc;
- Byte lp;
- Byte pb;
- Byte _pad_;
- UInt32 dicSize;
-} CLzmaProps;
-
-/* LzmaProps_Decode - decodes properties
-Returns:
- SZ_OK
- SZ_ERROR_UNSUPPORTED - Unsupported properties
-*/
-
-SRes
-LzmaProps_Decode (
- CLzmaProps *p,
- const Byte *data,
- unsigned size
- );
-
-/* ---------- LZMA Decoder state ---------- */
-
-/* LZMA_REQUIRED_INPUT_MAX = number of required input bytes for worst case.
- Num bits = log2((2^11 / 31) ^ 22) + 26 < 134 + 26 = 160; */
-
-#define LZMA_REQUIRED_INPUT_MAX 20
-
-typedef struct {
- /* Don't change this structure. ASM code can use it. */
- CLzmaProps prop;
- CLzmaProb *probs;
- CLzmaProb *probs_1664;
- Byte *dic;
- SizeT dicBufSize;
- SizeT dicPos;
- const Byte *buf;
- UInt32 range;
- UInt32 code;
- UInt32 processedPos;
- UInt32 checkDicSize;
- UInt32 reps[4];
- UInt32 state;
- UInt32 remainLen;
-
- UInt32 numProbs;
- unsigned tempBufSize;
- Byte tempBuf[LZMA_REQUIRED_INPUT_MAX];
-} CLzmaDec;
-
-#define LzmaDec_Construct(p) { (p)->dic = NULL; (p)->probs = NULL; }
-
-void
-LzmaDec_Init (
- CLzmaDec *p
- );
-
-/* There are two types of LZMA streams:
- - Stream with end mark. That end mark adds about 6 bytes to compressed size.
- - Stream without end mark. You must know exact uncompressed size to decompress such stream. */
-
-typedef enum {
- LZMA_FINISH_ANY, /* finish at any point */
- LZMA_FINISH_END /* block must be finished at the end */
-} ELzmaFinishMode;
-
-/* ELzmaFinishMode has meaning only if the decoding reaches output limit !!!
-
- You must use LZMA_FINISH_END, when you know that current output buffer
- covers last bytes of block. In other cases you must use LZMA_FINISH_ANY.
-
- If LZMA decoder sees end marker before reaching output limit, it returns SZ_OK,
- and output value of destLen will be less than output buffer size limit.
- You can check status result also.
-
- You can use multiple checks to test data integrity after full decompression:
- 1) Check Result and "status" variable.
- 2) Check that output(destLen) = uncompressedSize, if you know real uncompressedSize.
- 3) Check that output(srcLen) = compressedSize, if you know real compressedSize.
- You must use correct finish mode in that case. */
-
-typedef enum {
- LZMA_STATUS_NOT_SPECIFIED, /* use main error code instead */
- LZMA_STATUS_FINISHED_WITH_MARK, /* stream was finished with end mark. */
- LZMA_STATUS_NOT_FINISHED, /* stream was not finished */
- LZMA_STATUS_NEEDS_MORE_INPUT, /* you must provide more input bytes */
- LZMA_STATUS_MAYBE_FINISHED_WITHOUT_MARK /* there is probability that stream was finished without end mark */
-} ELzmaStatus;
-
-/* ELzmaStatus is used only as output value for function call */
-
-/* ---------- Interfaces ---------- */
-
-/* There are 3 levels of interfaces:
- 1) Dictionary Interface
- 2) Buffer Interface
- 3) One Call Interface
- You can select any of these interfaces, but don't mix functions from different
- groups for same object. */
-
-/* There are two variants to allocate state for Dictionary Interface:
- 1) LzmaDec_Allocate / LzmaDec_Free
- 2) LzmaDec_AllocateProbs / LzmaDec_FreeProbs
- You can use variant 2, if you set dictionary buffer manually.
- For Buffer Interface you must always use variant 1.
-
-LzmaDec_Allocate* can return:
- SZ_OK
- SZ_ERROR_MEM - Memory allocation error
- SZ_ERROR_UNSUPPORTED - Unsupported properties
-*/
-
-SRes
-LzmaDec_AllocateProbs (
- CLzmaDec *p,
- const Byte *props,
- unsigned propsSize,
- ISzAllocPtr alloc
- );
-
-void
-LzmaDec_FreeProbs (
- CLzmaDec *p,
- ISzAllocPtr alloc
- );
-
-SRes
-LzmaDec_Allocate (
- CLzmaDec *p,
- const Byte *props,
- unsigned propsSize,
- ISzAllocPtr alloc
- );
-
-void
-LzmaDec_Free (
- CLzmaDec *p,
- ISzAllocPtr alloc
- );
-
-/* ---------- Dictionary Interface ---------- */
-
-/* You can use it, if you want to eliminate the overhead for data copying from
- dictionary to some other external buffer.
- You must work with CLzmaDec variables directly in this interface.
-
- STEPS:
- LzmaDec_Construct()
- LzmaDec_Allocate()
- for (each new stream)
- {
- LzmaDec_Init()
- while (it needs more decompression)
- {
- LzmaDec_DecodeToDic()
- use data from CLzmaDec::dic and update CLzmaDec::dicPos
- }
- }
- LzmaDec_Free()
-*/
-
-/* LzmaDec_DecodeToDic
-
- The decoding to internal dictionary buffer (CLzmaDec::dic).
- You must manually update CLzmaDec::dicPos, if it reaches CLzmaDec::dicBufSize !!!
-
-finishMode:
- It has meaning only if the decoding reaches output limit (dicLimit).
- LZMA_FINISH_ANY - Decode just dicLimit bytes.
- LZMA_FINISH_END - Stream must be finished after dicLimit.
-
-Returns:
- SZ_OK
- status:
- LZMA_STATUS_FINISHED_WITH_MARK
- LZMA_STATUS_NOT_FINISHED
- LZMA_STATUS_NEEDS_MORE_INPUT
- LZMA_STATUS_MAYBE_FINISHED_WITHOUT_MARK
- SZ_ERROR_DATA - Data error
-*/
-
-SRes
-LzmaDec_DecodeToDic (
- CLzmaDec *p,
- SizeT dicLimit,
- const Byte *src,
- SizeT *srcLen,
- ELzmaFinishMode finishMode,
- ELzmaStatus *status
- );
-
-/* ---------- Buffer Interface ---------- */
-
-/* It's zlib-like interface.
- See LzmaDec_DecodeToDic description for information about STEPS and return results,
- but you must use LzmaDec_DecodeToBuf instead of LzmaDec_DecodeToDic and you don't need
- to work with CLzmaDec variables manually.
-
-finishMode:
- It has meaning only if the decoding reaches output limit (*destLen).
- LZMA_FINISH_ANY - Decode just destLen bytes.
- LZMA_FINISH_END - Stream must be finished after (*destLen).
-*/
-
-SRes
-LzmaDec_DecodeToBuf (
- CLzmaDec *p,
- Byte *dest,
- SizeT *destLen,
- const Byte *src,
- SizeT *srcLen,
- ELzmaFinishMode finishMode,
- ELzmaStatus *status
- );
-
-/* ---------- One Call Interface ---------- */
-
-/* LzmaDecode
-
-finishMode:
- It has meaning only if the decoding reaches output limit (*destLen).
- LZMA_FINISH_ANY - Decode just destLen bytes.
- LZMA_FINISH_END - Stream must be finished after (*destLen).
-
-Returns:
- SZ_OK
- status:
- LZMA_STATUS_FINISHED_WITH_MARK
- LZMA_STATUS_NOT_FINISHED
- LZMA_STATUS_MAYBE_FINISHED_WITHOUT_MARK
- SZ_ERROR_DATA - Data error
- SZ_ERROR_MEM - Memory allocation error
- SZ_ERROR_UNSUPPORTED - Unsupported properties
- SZ_ERROR_INPUT_EOF - It needs more bytes in input buffer (src).
-*/
-
-SRes
-LzmaDecode (
- Byte *dest,
- SizeT *destLen,
- const Byte *src,
- SizeT *srcLen,
- const Byte *propData,
- unsigned propSize,
- ELzmaFinishMode finishMode,
- ELzmaStatus *status,
- ISzAllocPtr alloc
- );
-
-EXTERN_C_END
-
-#endif
+/* LzmaDec.h -- LZMA Decoder +2018-04-21 : Igor Pavlov : Public domain */ + +#ifndef __LZMA_DEC_H +#define __LZMA_DEC_H + +#include "7zTypes.h" + +EXTERN_C_BEGIN + +/* #define _LZMA_PROB32 */ + +/* _LZMA_PROB32 can increase the speed on some CPUs, + but memory usage for CLzmaDec::probs will be doubled in that case */ + +typedef +#ifdef _LZMA_PROB32 + UInt32 +#else + UInt16 +#endif + CLzmaProb; + +/* ---------- LZMA Properties ---------- */ + +#define LZMA_PROPS_SIZE 5 + +typedef struct _CLzmaProps { + Byte lc; + Byte lp; + Byte pb; + Byte _pad_; + UInt32 dicSize; +} CLzmaProps; + +/* LzmaProps_Decode - decodes properties +Returns: + SZ_OK + SZ_ERROR_UNSUPPORTED - Unsupported properties +*/ + +SRes +LzmaProps_Decode ( + CLzmaProps *p, + const Byte *data, + unsigned size + ); + +/* ---------- LZMA Decoder state ---------- */ + +/* LZMA_REQUIRED_INPUT_MAX = number of required input bytes for worst case. + Num bits = log2((2^11 / 31) ^ 22) + 26 < 134 + 26 = 160; */ + +#define LZMA_REQUIRED_INPUT_MAX 20 + +typedef struct { + /* Don't change this structure. ASM code can use it. */ + CLzmaProps prop; + CLzmaProb *probs; + CLzmaProb *probs_1664; + Byte *dic; + SizeT dicBufSize; + SizeT dicPos; + const Byte *buf; + UInt32 range; + UInt32 code; + UInt32 processedPos; + UInt32 checkDicSize; + UInt32 reps[4]; + UInt32 state; + UInt32 remainLen; + + UInt32 numProbs; + unsigned tempBufSize; + Byte tempBuf[LZMA_REQUIRED_INPUT_MAX]; +} CLzmaDec; + +#define LzmaDec_Construct(p) { (p)->dic = NULL; (p)->probs = NULL; } + +void +LzmaDec_Init ( + CLzmaDec *p + ); + +/* There are two types of LZMA streams: + - Stream with end mark. That end mark adds about 6 bytes to compressed size. + - Stream without end mark. You must know exact uncompressed size to decompress such stream. */ + +typedef enum { + LZMA_FINISH_ANY, /* finish at any point */ + LZMA_FINISH_END /* block must be finished at the end */ +} ELzmaFinishMode; + +/* ELzmaFinishMode has meaning only if the decoding reaches output limit !!! + + You must use LZMA_FINISH_END, when you know that current output buffer + covers last bytes of block. In other cases you must use LZMA_FINISH_ANY. + + If LZMA decoder sees end marker before reaching output limit, it returns SZ_OK, + and output value of destLen will be less than output buffer size limit. + You can check status result also. + + You can use multiple checks to test data integrity after full decompression: + 1) Check Result and "status" variable. + 2) Check that output(destLen) = uncompressedSize, if you know real uncompressedSize. + 3) Check that output(srcLen) = compressedSize, if you know real compressedSize. + You must use correct finish mode in that case. */ + +typedef enum { + LZMA_STATUS_NOT_SPECIFIED, /* use main error code instead */ + LZMA_STATUS_FINISHED_WITH_MARK, /* stream was finished with end mark. */ + LZMA_STATUS_NOT_FINISHED, /* stream was not finished */ + LZMA_STATUS_NEEDS_MORE_INPUT, /* you must provide more input bytes */ + LZMA_STATUS_MAYBE_FINISHED_WITHOUT_MARK /* there is probability that stream was finished without end mark */ +} ELzmaStatus; + +/* ELzmaStatus is used only as output value for function call */ + +/* ---------- Interfaces ---------- */ + +/* There are 3 levels of interfaces: + 1) Dictionary Interface + 2) Buffer Interface + 3) One Call Interface + You can select any of these interfaces, but don't mix functions from different + groups for same object. */ + +/* There are two variants to allocate state for Dictionary Interface: + 1) LzmaDec_Allocate / LzmaDec_Free + 2) LzmaDec_AllocateProbs / LzmaDec_FreeProbs + You can use variant 2, if you set dictionary buffer manually. + For Buffer Interface you must always use variant 1. + +LzmaDec_Allocate* can return: + SZ_OK + SZ_ERROR_MEM - Memory allocation error + SZ_ERROR_UNSUPPORTED - Unsupported properties +*/ + +SRes +LzmaDec_AllocateProbs ( + CLzmaDec *p, + const Byte *props, + unsigned propsSize, + ISzAllocPtr alloc + ); + +void +LzmaDec_FreeProbs ( + CLzmaDec *p, + ISzAllocPtr alloc + ); + +SRes +LzmaDec_Allocate ( + CLzmaDec *p, + const Byte *props, + unsigned propsSize, + ISzAllocPtr alloc + ); + +void +LzmaDec_Free ( + CLzmaDec *p, + ISzAllocPtr alloc + ); + +/* ---------- Dictionary Interface ---------- */ + +/* You can use it, if you want to eliminate the overhead for data copying from + dictionary to some other external buffer. + You must work with CLzmaDec variables directly in this interface. + + STEPS: + LzmaDec_Construct() + LzmaDec_Allocate() + for (each new stream) + { + LzmaDec_Init() + while (it needs more decompression) + { + LzmaDec_DecodeToDic() + use data from CLzmaDec::dic and update CLzmaDec::dicPos + } + } + LzmaDec_Free() +*/ + +/* LzmaDec_DecodeToDic + + The decoding to internal dictionary buffer (CLzmaDec::dic). + You must manually update CLzmaDec::dicPos, if it reaches CLzmaDec::dicBufSize !!! + +finishMode: + It has meaning only if the decoding reaches output limit (dicLimit). + LZMA_FINISH_ANY - Decode just dicLimit bytes. + LZMA_FINISH_END - Stream must be finished after dicLimit. + +Returns: + SZ_OK + status: + LZMA_STATUS_FINISHED_WITH_MARK + LZMA_STATUS_NOT_FINISHED + LZMA_STATUS_NEEDS_MORE_INPUT + LZMA_STATUS_MAYBE_FINISHED_WITHOUT_MARK + SZ_ERROR_DATA - Data error +*/ + +SRes +LzmaDec_DecodeToDic ( + CLzmaDec *p, + SizeT dicLimit, + const Byte *src, + SizeT *srcLen, + ELzmaFinishMode finishMode, + ELzmaStatus *status + ); + +/* ---------- Buffer Interface ---------- */ + +/* It's zlib-like interface. + See LzmaDec_DecodeToDic description for information about STEPS and return results, + but you must use LzmaDec_DecodeToBuf instead of LzmaDec_DecodeToDic and you don't need + to work with CLzmaDec variables manually. + +finishMode: + It has meaning only if the decoding reaches output limit (*destLen). + LZMA_FINISH_ANY - Decode just destLen bytes. + LZMA_FINISH_END - Stream must be finished after (*destLen). +*/ + +SRes +LzmaDec_DecodeToBuf ( + CLzmaDec *p, + Byte *dest, + SizeT *destLen, + const Byte *src, + SizeT *srcLen, + ELzmaFinishMode finishMode, + ELzmaStatus *status + ); + +/* ---------- One Call Interface ---------- */ + +/* LzmaDecode + +finishMode: + It has meaning only if the decoding reaches output limit (*destLen). + LZMA_FINISH_ANY - Decode just destLen bytes. + LZMA_FINISH_END - Stream must be finished after (*destLen). + +Returns: + SZ_OK + status: + LZMA_STATUS_FINISHED_WITH_MARK + LZMA_STATUS_NOT_FINISHED + LZMA_STATUS_MAYBE_FINISHED_WITHOUT_MARK + SZ_ERROR_DATA - Data error + SZ_ERROR_MEM - Memory allocation error + SZ_ERROR_UNSUPPORTED - Unsupported properties + SZ_ERROR_INPUT_EOF - It needs more bytes in input buffer (src). +*/ + +SRes +LzmaDecode ( + Byte *dest, + SizeT *destLen, + const Byte *src, + SizeT *srcLen, + const Byte *propData, + unsigned propSize, + ELzmaFinishMode finishMode, + ELzmaStatus *status, + ISzAllocPtr alloc + ); + +EXTERN_C_END + +#endif diff --git a/MdeModulePkg/Library/LzmaCustomDecompressLib/Sdk/C/Precomp.h b/MdeModulePkg/Library/LzmaCustomDecompressLib/Sdk/C/Precomp.h index edb5814439..e8ff8b40e8 100644 --- a/MdeModulePkg/Library/LzmaCustomDecompressLib/Sdk/C/Precomp.h +++ b/MdeModulePkg/Library/LzmaCustomDecompressLib/Sdk/C/Precomp.h @@ -1,10 +1,10 @@ -/* Precomp.h -- StdAfx
-2013-11-12 : Igor Pavlov : Public domain */
-
-#ifndef __7Z_PRECOMP_H
-#define __7Z_PRECOMP_H
-
-#include "Compiler.h"
-/* #include "7zTypes.h" */
-
-#endif
+/* Precomp.h -- StdAfx +2013-11-12 : Igor Pavlov : Public domain */ + +#ifndef __7Z_PRECOMP_H +#define __7Z_PRECOMP_H + +#include "Compiler.h" +/* #include "7zTypes.h" */ + +#endif diff --git a/MdeModulePkg/Library/LzmaCustomDecompressLib/Sdk/DOC/lzma-history.txt b/MdeModulePkg/Library/LzmaCustomDecompressLib/Sdk/DOC/lzma-history.txt index 96090b2b45..5990cf76ad 100644 --- a/MdeModulePkg/Library/LzmaCustomDecompressLib/Sdk/DOC/lzma-history.txt +++ b/MdeModulePkg/Library/LzmaCustomDecompressLib/Sdk/DOC/lzma-history.txt @@ -1,446 +1,446 @@ -HISTORY of the LZMA SDK
------------------------
-
-19.00 2019-02-21
--------------------------
-- Encryption strength for 7z archives was increased:
- the size of random initialization vector was increased from 64-bit to 128-bit,
- and the pseudo-random number generator was improved.
-- The bug in 7zIn.c code was fixed.
-
-
-18.06 2018-12-30
--------------------------
-- The speed for LZMA/LZMA2 compressing was increased by 3-10%,
- and there are minor changes in compression ratio.
-- Some bugs were fixed.
-- The bug in 7-Zip 18.02-18.05 was fixed:
- There was memory leak in multithreading xz decoder - XzDecMt_Decode(),
- if xz stream contains only one block.
-- The changes for MSVS compiler makefiles:
- - the makefiles now use "PLATFORM" macroname with values (x64, x86, arm64)
- instead of "CPU" macroname with values (AMD64, ARM64).
- - the makefiles by default now use static version of the run-time library.
-
-
-18.05 2018-04-30
--------------------------
-- The speed for LZMA/LZMA2 compressing was increased
- by 8% for fastest/fast compression levels and
- by 3% for normal/maximum compression levels.
-- Previous versions of 7-Zip could work incorrectly in "Large memory pages" mode in
- Windows 10 because of some BUG with "Large Pages" in Windows 10.
- Now 7-Zip doesn't use "Large Pages" on Windows 10 up to revision 1709 (16299).
-- The BUG was fixed in Lzma2Enc.c
- Lzma2Enc_Encode2() function worked incorretly,
- if (inStream == NULL) and the number of block threads is more than 1.
-
-
-18.03 beta 2018-03-04
--------------------------
-- Asm\x86\LzmaDecOpt.asm: new optimized LZMA decoder written in asm
- for x64 with about 30% higher speed than main version of LZMA decoder written in C.
-- The speed for single-thread LZMA/LZMA2 decoder written in C was increased by 3%.
-- 7-Zip now can use multi-threading for 7z/LZMA2 decoding,
- if there are multiple independent data chunks in LZMA2 stream.
-- 7-Zip now can use multi-threading for xz decoding,
- if there are multiple blocks in xz stream.
-
-
-18.01 2019-01-28
--------------------------
-- The BUG in 17.01 - 18.00 beta was fixed:
- XzDec.c : random block unpacking and XzUnpacker_IsBlockFinished()
- didn't work correctly for xz archives without checksum (CRC).
-
-
-18.00 beta 2019-01-10
--------------------------
-- The BUG in xz encoder was fixed:
- There was memory leak of 16 KB for each file compressed with
- xz compression method, if additional filter was used.
-
-
-17.01 beta 2017-08-28
--------------------------
-- Minor speed optimization for LZMA2 (xz and 7z) multi-threading compression.
- 7-Zip now uses additional memory buffers for multi-block LZMA2 compression.
- CPU utilization was slightly improved.
-- 7-zip now creates multi-block xz archives by default. Block size can be
- specified with -ms[Size]{m|g} switch.
-- xz decoder now can unpack random block from multi-block xz archives.
-- 7-Zip command line: @listfile now doesn't work after -- switch.
- Use -i@listfile before -- switch instead.
-- The BUGs were fixed:
- 7-Zip 17.00 beta crashed for commands that write anti-item to 7z archive.
-
-
-17.00 beta 2017-04-29
--------------------------
-- NewHandler.h / NewHandler.cpp:
- now it redefines operator new() only for old MSVC compilers (_MSC_VER < 1900).
-- C/7zTypes.h : the names of variables in interface structures were changed (vt).
-- Some bugs were fixed. 7-Zip could crash in some cases.
-- Some internal changes in code.
-
-
-16.04 2016-10-04
--------------------------
-- The bug was fixed in DllSecur.c.
-
-
-16.03 2016-09-28
--------------------------
-- SFX modules now use some protection against DLL preloading attack.
-- Some bugs in 7z code were fixed.
-
-
-16.02 2016-05-21
--------------------------
-- The BUG in 16.00 - 16.01 was fixed:
- Split Handler (SplitHandler.cpp) returned incorrect
- total size value (kpidSize) for split archives.
-
-
-16.01 2016-05-19
--------------------------
-- Some internal changes to reduce the number of compiler warnings.
-
-
-16.00 2016-05-10
--------------------------
-- Some bugs were fixed.
-
-
-15.12 2015-11-19
--------------------------
-- The BUG in C version of 7z decoder was fixed:
- 7zDec.c : SzDecodeLzma2()
- 7z decoder could mistakenly report about decoding error for some 7z archives
- that use LZMA2 compression method.
- The probability to get that mistaken decoding error report was about
- one error per 16384 solid blocks for solid blocks larger than 16 KB (compressed size).
-- The BUG (in 9.26-15.11) in C version of 7z decoder was fixed:
- 7zArcIn.c : SzReadHeader2()
- 7z decoder worked incorrectly for 7z archives that contain
- empty solid blocks, that can be placed to 7z archive, if some file is
- unavailable for reading during archive creation.
-
-
-15.09 beta 2015-10-16
--------------------------
-- The BUG in LZMA / LZMA2 encoding code was fixed.
- The BUG in LzFind.c::MatchFinder_ReadBlock() function.
- If input data size is larger than (4 GiB - dictionary_size),
- the following code worked incorrectly:
- - LZMA : LzmaEnc_MemEncode(), LzmaEncode() : LZMA encoding functions
- for compressing from memory to memory.
- That BUG is not related to LZMA encoder version that works via streams.
- - LZMA2 : multi-threaded version of LZMA2 encoder worked incorrectly, if
- default value of chunk size (CLzma2EncProps::blockSize) is changed
- to value larger than (4 GiB - dictionary_size).
-
-
-9.38 beta 2015-01-03
--------------------------
-- The BUG in 9.31-9.37 was fixed:
- IArchiveGetRawProps interface was disabled for 7z archives.
-- The BUG in 9.26-9.36 was fixed:
- Some code in CPP\7zip\Archive\7z\ worked correctly only under Windows.
-
-
-9.36 beta 2014-12-26
--------------------------
-- The BUG in command line version was fixed:
- 7-Zip created temporary archive in current folder during update archive
- operation, if -w{Path} switch was not specified.
- The fixed 7-Zip creates temporary archive in folder that contains updated archive.
-- The BUG in 9.33-9.35 was fixed:
- 7-Zip silently ignored file reading errors during 7z or gz archive creation,
- and the created archive contained only part of file that was read before error.
- The fixed 7-Zip stops archive creation and it reports about error.
-
-
-9.35 beta 2014-12-07
--------------------------
-- 7zr.exe now support AES encryption.
-- SFX mudules were added to LZMA SDK
-- Some bugs were fixed.
-
-
-9.21 beta 2011-04-11
--------------------------
-- New class FString for file names at file systems.
-- Speed optimization in CRC code for big-endian CPUs.
-- The BUG in Lzma2Dec.c was fixed:
- Lzma2Decode function didn't work.
-
-
-9.18 beta 2010-11-02
--------------------------
-- New small SFX module for installers (SfxSetup).
-
-
-9.12 beta 2010-03-24
--------------------------
-- The BUG in LZMA SDK 9.* was fixed: LZMA2 codec didn't work,
- if more than 10 threads were used (or more than 20 threads in some modes).
-
-
-9.11 beta 2010-03-15
--------------------------
-- PPMd compression method support
-
-
-9.09 2009-12-12
--------------------------
-- The bug was fixed:
- Utf16_To_Utf8 funstions in UTFConvert.cpp and 7zMain.c
- incorrectly converted surrogate characters (the code >= 0x10000) to UTF-8.
-- Some bugs were fixed
-
-
-9.06 2009-08-17
--------------------------
-- Some changes in ANSI-C 7z Decoder interfaces.
-
-
-9.04 2009-05-30
--------------------------
-- LZMA2 compression method support
-- xz format support
-
-
-4.65 2009-02-03
--------------------------
-- Some minor fixes
-
-
-4.63 2008-12-31
--------------------------
-- Some minor fixes
-
-
-4.61 beta 2008-11-23
--------------------------
-- The bug in ANSI-C LZMA Decoder was fixed:
- If encoded stream was corrupted, decoder could access memory
- outside of allocated range.
-- Some changes in ANSI-C 7z Decoder interfaces.
-- LZMA SDK is placed in the public domain.
-
-
-4.60 beta 2008-08-19
--------------------------
-- Some minor fixes.
-
-
-4.59 beta 2008-08-13
--------------------------
-- The bug was fixed:
- LZMA Encoder in fast compression mode could access memory outside of
- allocated range in some rare cases.
-
-
-4.58 beta 2008-05-05
--------------------------
-- ANSI-C LZMA Decoder was rewritten for speed optimizations.
-- ANSI-C LZMA Encoder was included to LZMA SDK.
-- C++ LZMA code now is just wrapper over ANSI-C code.
-
-
-4.57 2007-12-12
--------------------------
-- Speed optimizations in ?++ LZMA Decoder.
-- Small changes for more compatibility with some C/C++ compilers.
-
-
-4.49 beta 2007-07-05
--------------------------
-- .7z ANSI-C Decoder:
- - now it supports BCJ and BCJ2 filters
- - now it supports files larger than 4 GB.
- - now it supports "Last Write Time" field for files.
-- C++ code for .7z archives compressing/decompressing from 7-zip
- was included to LZMA SDK.
-
-
-4.43 2006-06-04
--------------------------
-- Small changes for more compatibility with some C/C++ compilers.
-
-
-4.42 2006-05-15
--------------------------
-- Small changes in .h files in ANSI-C version.
-
-
-4.39 beta 2006-04-14
--------------------------
-- The bug in versions 4.33b:4.38b was fixed:
- C++ version of LZMA encoder could not correctly compress
- files larger than 2 GB with HC4 match finder (-mfhc4).
-
-
-4.37 beta 2005-04-06
--------------------------
-- Fixes in C++ code: code could no be compiled if _NO_EXCEPTIONS was defined.
-
-
-4.35 beta 2005-03-02
--------------------------
-- The bug was fixed in C++ version of LZMA Decoder:
- If encoded stream was corrupted, decoder could access memory
- outside of allocated range.
-
-
-4.34 beta 2006-02-27
--------------------------
-- Compressing speed and memory requirements for compressing were increased
-- LZMA now can use only these match finders: HC4, BT2, BT3, BT4
-
-
-4.32 2005-12-09
--------------------------
-- Java version of LZMA SDK was included
-
-
-4.30 2005-11-20
--------------------------
-- Compression ratio was improved in -a2 mode
-- Speed optimizations for compressing in -a2 mode
-- -fb switch now supports values up to 273
-- The bug in 7z_C (7zIn.c) was fixed:
- It used Alloc/Free functions from different memory pools.
- So if program used two memory pools, it worked incorrectly.
-- 7z_C: .7z format supporting was improved
-- LZMA# SDK (C#.NET version) was included
-
-
-4.27 (Updated) 2005-09-21
--------------------------
-- Some GUIDs/interfaces in C++ were changed.
- IStream.h:
- ISequentialInStream::Read now works as old ReadPart
- ISequentialOutStream::Write now works as old WritePart
-
-
-4.27 2005-08-07
--------------------------
-- The bug in LzmaDecodeSize.c was fixed:
- if _LZMA_IN_CB and _LZMA_OUT_READ were defined,
- decompressing worked incorrectly.
-
-
-4.26 2005-08-05
--------------------------
-- Fixes in 7z_C code and LzmaTest.c:
- previous versions could work incorrectly,
- if malloc(0) returns 0
-
-
-4.23 2005-06-29
--------------------------
-- Small fixes in C++ code
-
-
-4.22 2005-06-10
--------------------------
-- Small fixes
-
-
-4.21 2005-06-08
--------------------------
-- Interfaces for ANSI-C LZMA Decoder (LzmaDecode.c) were changed
-- New additional version of ANSI-C LZMA Decoder with zlib-like interface:
- - LzmaStateDecode.h
- - LzmaStateDecode.c
- - LzmaStateTest.c
-- ANSI-C LZMA Decoder now can decompress files larger than 4 GB
-
-
-4.17 2005-04-18
--------------------------
-- New example for RAM->RAM compressing/decompressing:
- LZMA + BCJ (filter for x86 code):
- - LzmaRam.h
- - LzmaRam.cpp
- - LzmaRamDecode.h
- - LzmaRamDecode.c
- - -f86 switch for lzma.exe
-
-
-4.16 2005-03-29
--------------------------
-- The bug was fixed in LzmaDecode.c (ANSI-C LZMA Decoder):
- If _LZMA_OUT_READ was defined, and if encoded stream was corrupted,
- decoder could access memory outside of allocated range.
-- Speed optimization of ANSI-C LZMA Decoder (now it's about 20% faster).
- Old version of LZMA Decoder now is in file LzmaDecodeSize.c.
- LzmaDecodeSize.c can provide slightly smaller code than LzmaDecode.c
-- Small speed optimization in LZMA C++ code
-- filter for SPARC's code was added
-- Simplified version of .7z ANSI-C Decoder was included
-
-
-4.06 2004-09-05
--------------------------
-- The bug in v4.05 was fixed:
- LZMA-Encoder didn't release output stream in some cases.
-
-
-4.05 2004-08-25
--------------------------
-- Source code of filters for x86, IA-64, ARM, ARM-Thumb
- and PowerPC code was included to SDK
-- Some internal minor changes
-
-
-4.04 2004-07-28
--------------------------
-- More compatibility with some C++ compilers
-
-
-4.03 2004-06-18
--------------------------
-- "Benchmark" command was added. It measures compressing
- and decompressing speed and shows rating values.
- Also it checks hardware errors.
-
-
-4.02 2004-06-10
--------------------------
-- C++ LZMA Encoder/Decoder code now is more portable
- and it can be compiled by GCC on Linux.
-
-
-4.01 2004-02-15
--------------------------
-- Some detection of data corruption was enabled.
- LzmaDecode.c / RangeDecoderReadByte
- .....
- {
- rd->ExtraBytes = 1;
- return 0xFF;
- }
-
-
-4.00 2004-02-13
--------------------------
-- Original version of LZMA SDK
-
-
-
-HISTORY of the LZMA
--------------------
- 2001-2008: Improvements to LZMA compressing/decompressing code,
- keeping compatibility with original LZMA format
- 1996-2001: Development of LZMA compression format
-
- Some milestones:
-
- 2001-08-30: LZMA compression was added to 7-Zip
- 1999-01-02: First version of 7-Zip was released
-
-
-End of document
+HISTORY of the LZMA SDK +----------------------- + +19.00 2019-02-21 +------------------------- +- Encryption strength for 7z archives was increased: + the size of random initialization vector was increased from 64-bit to 128-bit, + and the pseudo-random number generator was improved. +- The bug in 7zIn.c code was fixed. + + +18.06 2018-12-30 +------------------------- +- The speed for LZMA/LZMA2 compressing was increased by 3-10%, + and there are minor changes in compression ratio. +- Some bugs were fixed. +- The bug in 7-Zip 18.02-18.05 was fixed: + There was memory leak in multithreading xz decoder - XzDecMt_Decode(), + if xz stream contains only one block. +- The changes for MSVS compiler makefiles: + - the makefiles now use "PLATFORM" macroname with values (x64, x86, arm64) + instead of "CPU" macroname with values (AMD64, ARM64). + - the makefiles by default now use static version of the run-time library. + + +18.05 2018-04-30 +------------------------- +- The speed for LZMA/LZMA2 compressing was increased + by 8% for fastest/fast compression levels and + by 3% for normal/maximum compression levels. +- Previous versions of 7-Zip could work incorrectly in "Large memory pages" mode in + Windows 10 because of some BUG with "Large Pages" in Windows 10. + Now 7-Zip doesn't use "Large Pages" on Windows 10 up to revision 1709 (16299). +- The BUG was fixed in Lzma2Enc.c + Lzma2Enc_Encode2() function worked incorretly, + if (inStream == NULL) and the number of block threads is more than 1. + + +18.03 beta 2018-03-04 +------------------------- +- Asm\x86\LzmaDecOpt.asm: new optimized LZMA decoder written in asm + for x64 with about 30% higher speed than main version of LZMA decoder written in C. +- The speed for single-thread LZMA/LZMA2 decoder written in C was increased by 3%. +- 7-Zip now can use multi-threading for 7z/LZMA2 decoding, + if there are multiple independent data chunks in LZMA2 stream. +- 7-Zip now can use multi-threading for xz decoding, + if there are multiple blocks in xz stream. + + +18.01 2019-01-28 +------------------------- +- The BUG in 17.01 - 18.00 beta was fixed: + XzDec.c : random block unpacking and XzUnpacker_IsBlockFinished() + didn't work correctly for xz archives without checksum (CRC). + + +18.00 beta 2019-01-10 +------------------------- +- The BUG in xz encoder was fixed: + There was memory leak of 16 KB for each file compressed with + xz compression method, if additional filter was used. + + +17.01 beta 2017-08-28 +------------------------- +- Minor speed optimization for LZMA2 (xz and 7z) multi-threading compression. + 7-Zip now uses additional memory buffers for multi-block LZMA2 compression. + CPU utilization was slightly improved. +- 7-zip now creates multi-block xz archives by default. Block size can be + specified with -ms[Size]{m|g} switch. +- xz decoder now can unpack random block from multi-block xz archives. +- 7-Zip command line: @listfile now doesn't work after -- switch. + Use -i@listfile before -- switch instead. +- The BUGs were fixed: + 7-Zip 17.00 beta crashed for commands that write anti-item to 7z archive. + + +17.00 beta 2017-04-29 +------------------------- +- NewHandler.h / NewHandler.cpp: + now it redefines operator new() only for old MSVC compilers (_MSC_VER < 1900). +- C/7zTypes.h : the names of variables in interface structures were changed (vt). +- Some bugs were fixed. 7-Zip could crash in some cases. +- Some internal changes in code. + + +16.04 2016-10-04 +------------------------- +- The bug was fixed in DllSecur.c. + + +16.03 2016-09-28 +------------------------- +- SFX modules now use some protection against DLL preloading attack. +- Some bugs in 7z code were fixed. + + +16.02 2016-05-21 +------------------------- +- The BUG in 16.00 - 16.01 was fixed: + Split Handler (SplitHandler.cpp) returned incorrect + total size value (kpidSize) for split archives. + + +16.01 2016-05-19 +------------------------- +- Some internal changes to reduce the number of compiler warnings. + + +16.00 2016-05-10 +------------------------- +- Some bugs were fixed. + + +15.12 2015-11-19 +------------------------- +- The BUG in C version of 7z decoder was fixed: + 7zDec.c : SzDecodeLzma2() + 7z decoder could mistakenly report about decoding error for some 7z archives + that use LZMA2 compression method. + The probability to get that mistaken decoding error report was about + one error per 16384 solid blocks for solid blocks larger than 16 KB (compressed size). +- The BUG (in 9.26-15.11) in C version of 7z decoder was fixed: + 7zArcIn.c : SzReadHeader2() + 7z decoder worked incorrectly for 7z archives that contain + empty solid blocks, that can be placed to 7z archive, if some file is + unavailable for reading during archive creation. + + +15.09 beta 2015-10-16 +------------------------- +- The BUG in LZMA / LZMA2 encoding code was fixed. + The BUG in LzFind.c::MatchFinder_ReadBlock() function. + If input data size is larger than (4 GiB - dictionary_size), + the following code worked incorrectly: + - LZMA : LzmaEnc_MemEncode(), LzmaEncode() : LZMA encoding functions + for compressing from memory to memory. + That BUG is not related to LZMA encoder version that works via streams. + - LZMA2 : multi-threaded version of LZMA2 encoder worked incorrectly, if + default value of chunk size (CLzma2EncProps::blockSize) is changed + to value larger than (4 GiB - dictionary_size). + + +9.38 beta 2015-01-03 +------------------------- +- The BUG in 9.31-9.37 was fixed: + IArchiveGetRawProps interface was disabled for 7z archives. +- The BUG in 9.26-9.36 was fixed: + Some code in CPP\7zip\Archive\7z\ worked correctly only under Windows. + + +9.36 beta 2014-12-26 +------------------------- +- The BUG in command line version was fixed: + 7-Zip created temporary archive in current folder during update archive + operation, if -w{Path} switch was not specified. + The fixed 7-Zip creates temporary archive in folder that contains updated archive. +- The BUG in 9.33-9.35 was fixed: + 7-Zip silently ignored file reading errors during 7z or gz archive creation, + and the created archive contained only part of file that was read before error. + The fixed 7-Zip stops archive creation and it reports about error. + + +9.35 beta 2014-12-07 +------------------------- +- 7zr.exe now support AES encryption. +- SFX mudules were added to LZMA SDK +- Some bugs were fixed. + + +9.21 beta 2011-04-11 +------------------------- +- New class FString for file names at file systems. +- Speed optimization in CRC code for big-endian CPUs. +- The BUG in Lzma2Dec.c was fixed: + Lzma2Decode function didn't work. + + +9.18 beta 2010-11-02 +------------------------- +- New small SFX module for installers (SfxSetup). + + +9.12 beta 2010-03-24 +------------------------- +- The BUG in LZMA SDK 9.* was fixed: LZMA2 codec didn't work, + if more than 10 threads were used (or more than 20 threads in some modes). + + +9.11 beta 2010-03-15 +------------------------- +- PPMd compression method support + + +9.09 2009-12-12 +------------------------- +- The bug was fixed: + Utf16_To_Utf8 funstions in UTFConvert.cpp and 7zMain.c + incorrectly converted surrogate characters (the code >= 0x10000) to UTF-8. +- Some bugs were fixed + + +9.06 2009-08-17 +------------------------- +- Some changes in ANSI-C 7z Decoder interfaces. + + +9.04 2009-05-30 +------------------------- +- LZMA2 compression method support +- xz format support + + +4.65 2009-02-03 +------------------------- +- Some minor fixes + + +4.63 2008-12-31 +------------------------- +- Some minor fixes + + +4.61 beta 2008-11-23 +------------------------- +- The bug in ANSI-C LZMA Decoder was fixed: + If encoded stream was corrupted, decoder could access memory + outside of allocated range. +- Some changes in ANSI-C 7z Decoder interfaces. +- LZMA SDK is placed in the public domain. + + +4.60 beta 2008-08-19 +------------------------- +- Some minor fixes. + + +4.59 beta 2008-08-13 +------------------------- +- The bug was fixed: + LZMA Encoder in fast compression mode could access memory outside of + allocated range in some rare cases. + + +4.58 beta 2008-05-05 +------------------------- +- ANSI-C LZMA Decoder was rewritten for speed optimizations. +- ANSI-C LZMA Encoder was included to LZMA SDK. +- C++ LZMA code now is just wrapper over ANSI-C code. + + +4.57 2007-12-12 +------------------------- +- Speed optimizations in ?++ LZMA Decoder. +- Small changes for more compatibility with some C/C++ compilers. + + +4.49 beta 2007-07-05 +------------------------- +- .7z ANSI-C Decoder: + - now it supports BCJ and BCJ2 filters + - now it supports files larger than 4 GB. + - now it supports "Last Write Time" field for files. +- C++ code for .7z archives compressing/decompressing from 7-zip + was included to LZMA SDK. + + +4.43 2006-06-04 +------------------------- +- Small changes for more compatibility with some C/C++ compilers. + + +4.42 2006-05-15 +------------------------- +- Small changes in .h files in ANSI-C version. + + +4.39 beta 2006-04-14 +------------------------- +- The bug in versions 4.33b:4.38b was fixed: + C++ version of LZMA encoder could not correctly compress + files larger than 2 GB with HC4 match finder (-mfhc4). + + +4.37 beta 2005-04-06 +------------------------- +- Fixes in C++ code: code could no be compiled if _NO_EXCEPTIONS was defined. + + +4.35 beta 2005-03-02 +------------------------- +- The bug was fixed in C++ version of LZMA Decoder: + If encoded stream was corrupted, decoder could access memory + outside of allocated range. + + +4.34 beta 2006-02-27 +------------------------- +- Compressing speed and memory requirements for compressing were increased +- LZMA now can use only these match finders: HC4, BT2, BT3, BT4 + + +4.32 2005-12-09 +------------------------- +- Java version of LZMA SDK was included + + +4.30 2005-11-20 +------------------------- +- Compression ratio was improved in -a2 mode +- Speed optimizations for compressing in -a2 mode +- -fb switch now supports values up to 273 +- The bug in 7z_C (7zIn.c) was fixed: + It used Alloc/Free functions from different memory pools. + So if program used two memory pools, it worked incorrectly. +- 7z_C: .7z format supporting was improved +- LZMA# SDK (C#.NET version) was included + + +4.27 (Updated) 2005-09-21 +------------------------- +- Some GUIDs/interfaces in C++ were changed. + IStream.h: + ISequentialInStream::Read now works as old ReadPart + ISequentialOutStream::Write now works as old WritePart + + +4.27 2005-08-07 +------------------------- +- The bug in LzmaDecodeSize.c was fixed: + if _LZMA_IN_CB and _LZMA_OUT_READ were defined, + decompressing worked incorrectly. + + +4.26 2005-08-05 +------------------------- +- Fixes in 7z_C code and LzmaTest.c: + previous versions could work incorrectly, + if malloc(0) returns 0 + + +4.23 2005-06-29 +------------------------- +- Small fixes in C++ code + + +4.22 2005-06-10 +------------------------- +- Small fixes + + +4.21 2005-06-08 +------------------------- +- Interfaces for ANSI-C LZMA Decoder (LzmaDecode.c) were changed +- New additional version of ANSI-C LZMA Decoder with zlib-like interface: + - LzmaStateDecode.h + - LzmaStateDecode.c + - LzmaStateTest.c +- ANSI-C LZMA Decoder now can decompress files larger than 4 GB + + +4.17 2005-04-18 +------------------------- +- New example for RAM->RAM compressing/decompressing: + LZMA + BCJ (filter for x86 code): + - LzmaRam.h + - LzmaRam.cpp + - LzmaRamDecode.h + - LzmaRamDecode.c + - -f86 switch for lzma.exe + + +4.16 2005-03-29 +------------------------- +- The bug was fixed in LzmaDecode.c (ANSI-C LZMA Decoder): + If _LZMA_OUT_READ was defined, and if encoded stream was corrupted, + decoder could access memory outside of allocated range. +- Speed optimization of ANSI-C LZMA Decoder (now it's about 20% faster). + Old version of LZMA Decoder now is in file LzmaDecodeSize.c. + LzmaDecodeSize.c can provide slightly smaller code than LzmaDecode.c +- Small speed optimization in LZMA C++ code +- filter for SPARC's code was added +- Simplified version of .7z ANSI-C Decoder was included + + +4.06 2004-09-05 +------------------------- +- The bug in v4.05 was fixed: + LZMA-Encoder didn't release output stream in some cases. + + +4.05 2004-08-25 +------------------------- +- Source code of filters for x86, IA-64, ARM, ARM-Thumb + and PowerPC code was included to SDK +- Some internal minor changes + + +4.04 2004-07-28 +------------------------- +- More compatibility with some C++ compilers + + +4.03 2004-06-18 +------------------------- +- "Benchmark" command was added. It measures compressing + and decompressing speed and shows rating values. + Also it checks hardware errors. + + +4.02 2004-06-10 +------------------------- +- C++ LZMA Encoder/Decoder code now is more portable + and it can be compiled by GCC on Linux. + + +4.01 2004-02-15 +------------------------- +- Some detection of data corruption was enabled. + LzmaDecode.c / RangeDecoderReadByte + ..... + { + rd->ExtraBytes = 1; + return 0xFF; + } + + +4.00 2004-02-13 +------------------------- +- Original version of LZMA SDK + + + +HISTORY of the LZMA +------------------- + 2001-2008: Improvements to LZMA compressing/decompressing code, + keeping compatibility with original LZMA format + 1996-2001: Development of LZMA compression format + + Some milestones: + + 2001-08-30: LZMA compression was added to 7-Zip + 1999-01-02: First version of 7-Zip was released + + +End of document diff --git a/MdeModulePkg/Library/LzmaCustomDecompressLib/Sdk/DOC/lzma-sdk.txt b/MdeModulePkg/Library/LzmaCustomDecompressLib/Sdk/DOC/lzma-sdk.txt index 6bb6fa194e..28e05a7d71 100644 --- a/MdeModulePkg/Library/LzmaCustomDecompressLib/Sdk/DOC/lzma-sdk.txt +++ b/MdeModulePkg/Library/LzmaCustomDecompressLib/Sdk/DOC/lzma-sdk.txt @@ -1,357 +1,357 @@ -LZMA SDK 19.00
---------------
-
-LZMA SDK provides the documentation, samples, header files,
-libraries, and tools you need to develop applications that
-use 7z / LZMA / LZMA2 / XZ compression.
-
-LZMA is an improved version of famous LZ77 compression algorithm.
-It was improved in way of maximum increasing of compression ratio,
-keeping high decompression speed and low memory requirements for
-decompressing.
-
-LZMA2 is a LZMA based compression method. LZMA2 provides better
-multithreading support for compression than LZMA and some other improvements.
-
-7z is a file format for data compression and file archiving.
-7z is a main file format for 7-Zip compression program (www.7-zip.org).
-7z format supports different compression methods: LZMA, LZMA2 and others.
-7z also supports AES-256 based encryption.
-
-XZ is a file format for data compression that uses LZMA2 compression.
-XZ format provides additional features: SHA/CRC check, filters for
-improved compression ratio, splitting to blocks and streams,
-
-
-
-LICENSE
--------
-
-LZMA SDK is written and placed in the public domain by Igor Pavlov.
-
-Some code in LZMA SDK is based on public domain code from another developers:
- 1) PPMd var.H (2001): Dmitry Shkarin
- 2) SHA-256: Wei Dai (Crypto++ library)
-
-Anyone is free to copy, modify, publish, use, compile, sell, or distribute the
-original LZMA SDK code, either in source code form or as a compiled binary, for
-any purpose, commercial or non-commercial, and by any means.
-
-LZMA SDK code is compatible with open source licenses, for example, you can
-include it to GNU GPL or GNU LGPL code.
-
-
-LZMA SDK Contents
------------------
-
- Source code:
-
- - C / C++ / C# / Java - LZMA compression and decompression
- - C / C++ - LZMA2 compression and decompression
- - C / C++ - XZ compression and decompression
- - C - 7z decompression
- - C++ - 7z compression and decompression
- - C - small SFXs for installers (7z decompression)
- - C++ - SFXs and SFXs for installers (7z decompression)
-
- Precomiled binaries:
-
- - console programs for lzma / 7z / xz compression and decompression
- - SFX modules for installers.
-
-
-UNIX/Linux version
-------------------
-To compile C++ version of file->file LZMA encoding, go to directory
-CPP/7zip/Bundles/LzmaCon
-and call make to recompile it:
- make -f makefile.gcc clean all
-
-In some UNIX/Linux versions you must compile LZMA with static libraries.
-To compile with static libraries, you can use
-LIB = -lm -static
-
-Also you can use p7zip (port of 7-Zip for POSIX systems like Unix or Linux):
-
- http://p7zip.sourceforge.net/
-
-
-Files
------
-
-DOC/7zC.txt - 7z ANSI-C Decoder description
-DOC/7zFormat.txt - 7z Format description
-DOC/installer.txt - information about 7-Zip for installers
-DOC/lzma.txt - LZMA compression description
-DOC/lzma-sdk.txt - LZMA SDK description (this file)
-DOC/lzma-history.txt - history of LZMA SDK
-DOC/lzma-specification.txt - Specification of LZMA
-DOC/Methods.txt - Compression method IDs for .7z
-
-bin/installer/ - example script to create installer that uses SFX module,
-
-bin/7zdec.exe - simplified 7z archive decoder
-bin/7zr.exe - 7-Zip console program (reduced version)
-bin/x64/7zr.exe - 7-Zip console program (reduced version) (x64 version)
-bin/lzma.exe - file->file LZMA encoder/decoder for Windows
-bin/7zS2.sfx - small SFX module for installers (GUI version)
-bin/7zS2con.sfx - small SFX module for installers (Console version)
-bin/7zSD.sfx - SFX module for installers.
-
-
-7zDec.exe
----------
-7zDec.exe is simplified 7z archive decoder.
-It supports only LZMA, LZMA2, and PPMd methods.
-7zDec decodes whole solid block from 7z archive to RAM.
-The RAM consumption can be high.
-
-
-
-
-Source code structure
----------------------
-
-
-Asm/ - asm files (optimized code for CRC calculation and Intel-AES encryption)
-
-C/ - C files (compression / decompression and other)
- Util/
- 7z - 7z decoder program (decoding 7z files)
- Lzma - LZMA program (file->file LZMA encoder/decoder).
- LzmaLib - LZMA library (.DLL for Windows)
- SfxSetup - small SFX module for installers
-
-CPP/ -- CPP files
-
- Common - common files for C++ projects
- Windows - common files for Windows related code
-
- 7zip - files related to 7-Zip
-
- Archive - files related to archiving
-
- Common - common files for archive handling
- 7z - 7z C++ Encoder/Decoder
-
- Bundles - Modules that are bundles of other modules (files)
-
- Alone7z - 7zr.exe: Standalone 7-Zip console program (reduced version)
- Format7zExtractR - 7zxr.dll: Reduced version of 7z DLL: extracting from 7z/LZMA/BCJ/BCJ2.
- Format7zR - 7zr.dll: Reduced version of 7z DLL: extracting/compressing to 7z/LZMA/BCJ/BCJ2
- LzmaCon - lzma.exe: LZMA compression/decompression
- LzmaSpec - example code for LZMA Specification
- SFXCon - 7zCon.sfx: Console 7z SFX module
- SFXSetup - 7zS.sfx: 7z SFX module for installers
- SFXWin - 7z.sfx: GUI 7z SFX module
-
- Common - common files for 7-Zip
-
- Compress - files for compression/decompression
-
- Crypto - files for encryption / decompression
-
- UI - User Interface files
-
- Client7z - Test application for 7za.dll, 7zr.dll, 7zxr.dll
- Common - Common UI files
- Console - Code for console program (7z.exe)
- Explorer - Some code from 7-Zip Shell extension
- FileManager - Some GUI code from 7-Zip File Manager
- GUI - Some GUI code from 7-Zip
-
-
-CS/ - C# files
- 7zip
- Common - some common files for 7-Zip
- Compress - files related to compression/decompression
- LZ - files related to LZ (Lempel-Ziv) compression algorithm
- LZMA - LZMA compression/decompression
- LzmaAlone - file->file LZMA compression/decompression
- RangeCoder - Range Coder (special code of compression/decompression)
-
-Java/ - Java files
- SevenZip
- Compression - files related to compression/decompression
- LZ - files related to LZ (Lempel-Ziv) compression algorithm
- LZMA - LZMA compression/decompression
- RangeCoder - Range Coder (special code of compression/decompression)
-
-
-Note:
- Asm / C / C++ source code of LZMA SDK is part of 7-Zip's source code.
- 7-Zip's source code can be downloaded from 7-Zip's SourceForge page:
-
- http://sourceforge.net/projects/sevenzip/
-
-
-
-LZMA features
--------------
- - Variable dictionary size (up to 1 GB)
- - Estimated compressing speed: about 2 MB/s on 2 GHz CPU
- - Estimated decompressing speed:
- - 20-30 MB/s on modern 2 GHz cpu
- - 1-2 MB/s on 200 MHz simple RISC cpu: (ARM, MIPS, PowerPC)
- - Small memory requirements for decompressing (16 KB + DictionarySize)
- - Small code size for decompressing: 5-8 KB
-
-LZMA decoder uses only integer operations and can be
-implemented in any modern 32-bit CPU (or on 16-bit CPU with some conditions).
-
-Some critical operations that affect the speed of LZMA decompression:
- 1) 32*16 bit integer multiply
- 2) Mispredicted branches (penalty mostly depends from pipeline length)
- 3) 32-bit shift and arithmetic operations
-
-The speed of LZMA decompressing mostly depends from CPU speed.
-Memory speed has no big meaning. But if your CPU has small data cache,
-overall weight of memory speed will slightly increase.
-
-
-How To Use
-----------
-
-Using LZMA encoder/decoder executable
---------------------------------------
-
-Usage: LZMA <e|d> inputFile outputFile [<switches>...]
-
- e: encode file
-
- d: decode file
-
- b: Benchmark. There are two tests: compressing and decompressing
- with LZMA method. Benchmark shows rating in MIPS (million
- instructions per second). Rating value is calculated from
- measured speed and it is normalized with Intel's Core 2 results.
- Also Benchmark checks possible hardware errors (RAM
- errors in most cases). Benchmark uses these settings:
- (-a1, -d21, -fb32, -mfbt4). You can change only -d parameter.
- Also you can change the number of iterations. Example for 30 iterations:
- LZMA b 30
- Default number of iterations is 10.
-
-<Switches>
-
-
- -a{N}: set compression mode 0 = fast, 1 = normal
- default: 1 (normal)
-
- d{N}: Sets Dictionary size - [0, 30], default: 23 (8MB)
- The maximum value for dictionary size is 1 GB = 2^30 bytes.
- Dictionary size is calculated as DictionarySize = 2^N bytes.
- For decompressing file compressed by LZMA method with dictionary
- size D = 2^N you need about D bytes of memory (RAM).
-
- -fb{N}: set number of fast bytes - [5, 273], default: 128
- Usually big number gives a little bit better compression ratio
- and slower compression process.
-
- -lc{N}: set number of literal context bits - [0, 8], default: 3
- Sometimes lc=4 gives gain for big files.
-
- -lp{N}: set number of literal pos bits - [0, 4], default: 0
- lp switch is intended for periodical data when period is
- equal 2^N. For example, for 32-bit (4 bytes)
- periodical data you can use lp=2. Often it's better to set lc0,
- if you change lp switch.
-
- -pb{N}: set number of pos bits - [0, 4], default: 2
- pb switch is intended for periodical data
- when period is equal 2^N.
-
- -mf{MF_ID}: set Match Finder. Default: bt4.
- Algorithms from hc* group doesn't provide good compression
- ratio, but they often works pretty fast in combination with
- fast mode (-a0).
-
- Memory requirements depend from dictionary size
- (parameter "d" in table below).
-
- MF_ID Memory Description
-
- bt2 d * 9.5 + 4MB Binary Tree with 2 bytes hashing.
- bt3 d * 11.5 + 4MB Binary Tree with 3 bytes hashing.
- bt4 d * 11.5 + 4MB Binary Tree with 4 bytes hashing.
- hc4 d * 7.5 + 4MB Hash Chain with 4 bytes hashing.
-
- -eos: write End Of Stream marker. By default LZMA doesn't write
- eos marker, since LZMA decoder knows uncompressed size
- stored in .lzma file header.
-
- -si: Read data from stdin (it will write End Of Stream marker).
- -so: Write data to stdout
-
-
-Examples:
-
-1) LZMA e file.bin file.lzma -d16 -lc0
-
-compresses file.bin to file.lzma with 64 KB dictionary (2^16=64K)
-and 0 literal context bits. -lc0 allows to reduce memory requirements
-for decompression.
-
-
-2) LZMA e file.bin file.lzma -lc0 -lp2
-
-compresses file.bin to file.lzma with settings suitable
-for 32-bit periodical data (for example, ARM or MIPS code).
-
-3) LZMA d file.lzma file.bin
-
-decompresses file.lzma to file.bin.
-
-
-Compression ratio hints
------------------------
-
-Recommendations
----------------
-
-To increase the compression ratio for LZMA compressing it's desirable
-to have aligned data (if it's possible) and also it's desirable to locate
-data in such order, where code is grouped in one place and data is
-grouped in other place (it's better than such mixing: code, data, code,
-data, ...).
-
-
-Filters
--------
-You can increase the compression ratio for some data types, using
-special filters before compressing. For example, it's possible to
-increase the compression ratio on 5-10% for code for those CPU ISAs:
-x86, IA-64, ARM, ARM-Thumb, PowerPC, SPARC.
-
-You can find C source code of such filters in C/Bra*.* files
-
-You can check the compression ratio gain of these filters with such
-7-Zip commands (example for ARM code):
-No filter:
- 7z a a1.7z a.bin -m0=lzma
-
-With filter for little-endian ARM code:
- 7z a a2.7z a.bin -m0=arm -m1=lzma
-
-It works in such manner:
-Compressing = Filter_encoding + LZMA_encoding
-Decompressing = LZMA_decoding + Filter_decoding
-
-Compressing and decompressing speed of such filters is very high,
-so it will not increase decompressing time too much.
-Moreover, it reduces decompression time for LZMA_decoding,
-since compression ratio with filtering is higher.
-
-These filters convert CALL (calling procedure) instructions
-from relative offsets to absolute addresses, so such data becomes more
-compressible.
-
-For some ISAs (for example, for MIPS) it's impossible to get gain from such filter.
-
-
-
----
-
-http://www.7-zip.org
-http://www.7-zip.org/sdk.html
-http://www.7-zip.org/support.html
+LZMA SDK 19.00 +-------------- + +LZMA SDK provides the documentation, samples, header files, +libraries, and tools you need to develop applications that +use 7z / LZMA / LZMA2 / XZ compression. + +LZMA is an improved version of famous LZ77 compression algorithm. +It was improved in way of maximum increasing of compression ratio, +keeping high decompression speed and low memory requirements for +decompressing. + +LZMA2 is a LZMA based compression method. LZMA2 provides better +multithreading support for compression than LZMA and some other improvements. + +7z is a file format for data compression and file archiving. +7z is a main file format for 7-Zip compression program (www.7-zip.org). +7z format supports different compression methods: LZMA, LZMA2 and others. +7z also supports AES-256 based encryption. + +XZ is a file format for data compression that uses LZMA2 compression. +XZ format provides additional features: SHA/CRC check, filters for +improved compression ratio, splitting to blocks and streams, + + + +LICENSE +------- + +LZMA SDK is written and placed in the public domain by Igor Pavlov. + +Some code in LZMA SDK is based on public domain code from another developers: + 1) PPMd var.H (2001): Dmitry Shkarin + 2) SHA-256: Wei Dai (Crypto++ library) + +Anyone is free to copy, modify, publish, use, compile, sell, or distribute the +original LZMA SDK code, either in source code form or as a compiled binary, for +any purpose, commercial or non-commercial, and by any means. + +LZMA SDK code is compatible with open source licenses, for example, you can +include it to GNU GPL or GNU LGPL code. + + +LZMA SDK Contents +----------------- + + Source code: + + - C / C++ / C# / Java - LZMA compression and decompression + - C / C++ - LZMA2 compression and decompression + - C / C++ - XZ compression and decompression + - C - 7z decompression + - C++ - 7z compression and decompression + - C - small SFXs for installers (7z decompression) + - C++ - SFXs and SFXs for installers (7z decompression) + + Precomiled binaries: + + - console programs for lzma / 7z / xz compression and decompression + - SFX modules for installers. + + +UNIX/Linux version +------------------ +To compile C++ version of file->file LZMA encoding, go to directory +CPP/7zip/Bundles/LzmaCon +and call make to recompile it: + make -f makefile.gcc clean all + +In some UNIX/Linux versions you must compile LZMA with static libraries. +To compile with static libraries, you can use +LIB = -lm -static + +Also you can use p7zip (port of 7-Zip for POSIX systems like Unix or Linux): + + http://p7zip.sourceforge.net/ + + +Files +----- + +DOC/7zC.txt - 7z ANSI-C Decoder description +DOC/7zFormat.txt - 7z Format description +DOC/installer.txt - information about 7-Zip for installers +DOC/lzma.txt - LZMA compression description +DOC/lzma-sdk.txt - LZMA SDK description (this file) +DOC/lzma-history.txt - history of LZMA SDK +DOC/lzma-specification.txt - Specification of LZMA +DOC/Methods.txt - Compression method IDs for .7z + +bin/installer/ - example script to create installer that uses SFX module, + +bin/7zdec.exe - simplified 7z archive decoder +bin/7zr.exe - 7-Zip console program (reduced version) +bin/x64/7zr.exe - 7-Zip console program (reduced version) (x64 version) +bin/lzma.exe - file->file LZMA encoder/decoder for Windows +bin/7zS2.sfx - small SFX module for installers (GUI version) +bin/7zS2con.sfx - small SFX module for installers (Console version) +bin/7zSD.sfx - SFX module for installers. + + +7zDec.exe +--------- +7zDec.exe is simplified 7z archive decoder. +It supports only LZMA, LZMA2, and PPMd methods. +7zDec decodes whole solid block from 7z archive to RAM. +The RAM consumption can be high. + + + + +Source code structure +--------------------- + + +Asm/ - asm files (optimized code for CRC calculation and Intel-AES encryption) + +C/ - C files (compression / decompression and other) + Util/ + 7z - 7z decoder program (decoding 7z files) + Lzma - LZMA program (file->file LZMA encoder/decoder). + LzmaLib - LZMA library (.DLL for Windows) + SfxSetup - small SFX module for installers + +CPP/ -- CPP files + + Common - common files for C++ projects + Windows - common files for Windows related code + + 7zip - files related to 7-Zip + + Archive - files related to archiving + + Common - common files for archive handling + 7z - 7z C++ Encoder/Decoder + + Bundles - Modules that are bundles of other modules (files) + + Alone7z - 7zr.exe: Standalone 7-Zip console program (reduced version) + Format7zExtractR - 7zxr.dll: Reduced version of 7z DLL: extracting from 7z/LZMA/BCJ/BCJ2. + Format7zR - 7zr.dll: Reduced version of 7z DLL: extracting/compressing to 7z/LZMA/BCJ/BCJ2 + LzmaCon - lzma.exe: LZMA compression/decompression + LzmaSpec - example code for LZMA Specification + SFXCon - 7zCon.sfx: Console 7z SFX module + SFXSetup - 7zS.sfx: 7z SFX module for installers + SFXWin - 7z.sfx: GUI 7z SFX module + + Common - common files for 7-Zip + + Compress - files for compression/decompression + + Crypto - files for encryption / decompression + + UI - User Interface files + + Client7z - Test application for 7za.dll, 7zr.dll, 7zxr.dll + Common - Common UI files + Console - Code for console program (7z.exe) + Explorer - Some code from 7-Zip Shell extension + FileManager - Some GUI code from 7-Zip File Manager + GUI - Some GUI code from 7-Zip + + +CS/ - C# files + 7zip + Common - some common files for 7-Zip + Compress - files related to compression/decompression + LZ - files related to LZ (Lempel-Ziv) compression algorithm + LZMA - LZMA compression/decompression + LzmaAlone - file->file LZMA compression/decompression + RangeCoder - Range Coder (special code of compression/decompression) + +Java/ - Java files + SevenZip + Compression - files related to compression/decompression + LZ - files related to LZ (Lempel-Ziv) compression algorithm + LZMA - LZMA compression/decompression + RangeCoder - Range Coder (special code of compression/decompression) + + +Note: + Asm / C / C++ source code of LZMA SDK is part of 7-Zip's source code. + 7-Zip's source code can be downloaded from 7-Zip's SourceForge page: + + http://sourceforge.net/projects/sevenzip/ + + + +LZMA features +------------- + - Variable dictionary size (up to 1 GB) + - Estimated compressing speed: about 2 MB/s on 2 GHz CPU + - Estimated decompressing speed: + - 20-30 MB/s on modern 2 GHz cpu + - 1-2 MB/s on 200 MHz simple RISC cpu: (ARM, MIPS, PowerPC) + - Small memory requirements for decompressing (16 KB + DictionarySize) + - Small code size for decompressing: 5-8 KB + +LZMA decoder uses only integer operations and can be +implemented in any modern 32-bit CPU (or on 16-bit CPU with some conditions). + +Some critical operations that affect the speed of LZMA decompression: + 1) 32*16 bit integer multiply + 2) Mispredicted branches (penalty mostly depends from pipeline length) + 3) 32-bit shift and arithmetic operations + +The speed of LZMA decompressing mostly depends from CPU speed. +Memory speed has no big meaning. But if your CPU has small data cache, +overall weight of memory speed will slightly increase. + + +How To Use +---------- + +Using LZMA encoder/decoder executable +-------------------------------------- + +Usage: LZMA <e|d> inputFile outputFile [<switches>...] + + e: encode file + + d: decode file + + b: Benchmark. There are two tests: compressing and decompressing + with LZMA method. Benchmark shows rating in MIPS (million + instructions per second). Rating value is calculated from + measured speed and it is normalized with Intel's Core 2 results. + Also Benchmark checks possible hardware errors (RAM + errors in most cases). Benchmark uses these settings: + (-a1, -d21, -fb32, -mfbt4). You can change only -d parameter. + Also you can change the number of iterations. Example for 30 iterations: + LZMA b 30 + Default number of iterations is 10. + +<Switches> + + + -a{N}: set compression mode 0 = fast, 1 = normal + default: 1 (normal) + + d{N}: Sets Dictionary size - [0, 30], default: 23 (8MB) + The maximum value for dictionary size is 1 GB = 2^30 bytes. + Dictionary size is calculated as DictionarySize = 2^N bytes. + For decompressing file compressed by LZMA method with dictionary + size D = 2^N you need about D bytes of memory (RAM). + + -fb{N}: set number of fast bytes - [5, 273], default: 128 + Usually big number gives a little bit better compression ratio + and slower compression process. + + -lc{N}: set number of literal context bits - [0, 8], default: 3 + Sometimes lc=4 gives gain for big files. + + -lp{N}: set number of literal pos bits - [0, 4], default: 0 + lp switch is intended for periodical data when period is + equal 2^N. For example, for 32-bit (4 bytes) + periodical data you can use lp=2. Often it's better to set lc0, + if you change lp switch. + + -pb{N}: set number of pos bits - [0, 4], default: 2 + pb switch is intended for periodical data + when period is equal 2^N. + + -mf{MF_ID}: set Match Finder. Default: bt4. + Algorithms from hc* group doesn't provide good compression + ratio, but they often works pretty fast in combination with + fast mode (-a0). + + Memory requirements depend from dictionary size + (parameter "d" in table below). + + MF_ID Memory Description + + bt2 d * 9.5 + 4MB Binary Tree with 2 bytes hashing. + bt3 d * 11.5 + 4MB Binary Tree with 3 bytes hashing. + bt4 d * 11.5 + 4MB Binary Tree with 4 bytes hashing. + hc4 d * 7.5 + 4MB Hash Chain with 4 bytes hashing. + + -eos: write End Of Stream marker. By default LZMA doesn't write + eos marker, since LZMA decoder knows uncompressed size + stored in .lzma file header. + + -si: Read data from stdin (it will write End Of Stream marker). + -so: Write data to stdout + + +Examples: + +1) LZMA e file.bin file.lzma -d16 -lc0 + +compresses file.bin to file.lzma with 64 KB dictionary (2^16=64K) +and 0 literal context bits. -lc0 allows to reduce memory requirements +for decompression. + + +2) LZMA e file.bin file.lzma -lc0 -lp2 + +compresses file.bin to file.lzma with settings suitable +for 32-bit periodical data (for example, ARM or MIPS code). + +3) LZMA d file.lzma file.bin + +decompresses file.lzma to file.bin. + + +Compression ratio hints +----------------------- + +Recommendations +--------------- + +To increase the compression ratio for LZMA compressing it's desirable +to have aligned data (if it's possible) and also it's desirable to locate +data in such order, where code is grouped in one place and data is +grouped in other place (it's better than such mixing: code, data, code, +data, ...). + + +Filters +------- +You can increase the compression ratio for some data types, using +special filters before compressing. For example, it's possible to +increase the compression ratio on 5-10% for code for those CPU ISAs: +x86, IA-64, ARM, ARM-Thumb, PowerPC, SPARC. + +You can find C source code of such filters in C/Bra*.* files + +You can check the compression ratio gain of these filters with such +7-Zip commands (example for ARM code): +No filter: + 7z a a1.7z a.bin -m0=lzma + +With filter for little-endian ARM code: + 7z a a2.7z a.bin -m0=arm -m1=lzma + +It works in such manner: +Compressing = Filter_encoding + LZMA_encoding +Decompressing = LZMA_decoding + Filter_decoding + +Compressing and decompressing speed of such filters is very high, +so it will not increase decompressing time too much. +Moreover, it reduces decompression time for LZMA_decoding, +since compression ratio with filtering is higher. + +These filters convert CALL (calling procedure) instructions +from relative offsets to absolute addresses, so such data becomes more +compressible. + +For some ISAs (for example, for MIPS) it's impossible to get gain from such filter. + + + +--- + +http://www.7-zip.org +http://www.7-zip.org/sdk.html +http://www.7-zip.org/support.html diff --git a/MdeModulePkg/Library/LzmaCustomDecompressLib/UefiLzma.h b/MdeModulePkg/Library/LzmaCustomDecompressLib/UefiLzma.h index b1941bd403..e70c1ddebb 100644 --- a/MdeModulePkg/Library/LzmaCustomDecompressLib/UefiLzma.h +++ b/MdeModulePkg/Library/LzmaCustomDecompressLib/UefiLzma.h @@ -1,36 +1,36 @@ -/** @file
- LZMA UEFI header file
-
- Allows LZMA code to build under UEFI (edk2) build environment
-
- Copyright (c) 2009, Intel Corporation. All rights reserved.<BR>
- SPDX-License-Identifier: BSD-2-Clause-Patent
-
-**/
-
-#ifndef __UEFILZMA_H__
-#define __UEFILZMA_H__
-
-#include <Uefi.h>
-#include <Library/BaseMemoryLib.h>
-
-#ifdef _WIN32
- #undef _WIN32
-#endif
-
-typedef UINTN size_t;
-
-#ifdef _WIN64
- #undef _WIN64
-#endif
-
-#ifndef _PTRDIFF_T_DEFINED
-typedef int ptrdiff_t;
-#endif
-
-#define memcpy CopyMem
-#define memmove CopyMem
-
-#define _LZMA_SIZE_OPT
-
-#endif // __UEFILZMA_H__
+/** @file + LZMA UEFI header file + + Allows LZMA code to build under UEFI (edk2) build environment + + Copyright (c) 2009, Intel Corporation. All rights reserved.<BR> + SPDX-License-Identifier: BSD-2-Clause-Patent + +**/ + +#ifndef __UEFILZMA_H__ +#define __UEFILZMA_H__ + +#include <Uefi.h> +#include <Library/BaseMemoryLib.h> + +#ifdef _WIN32 + #undef _WIN32 +#endif + +typedef UINTN size_t; + +#ifdef _WIN64 + #undef _WIN64 +#endif + +#ifndef _PTRDIFF_T_DEFINED +typedef int ptrdiff_t; +#endif + +#define memcpy CopyMem +#define memmove CopyMem + +#define _LZMA_SIZE_OPT + +#endif // __UEFILZMA_H__ |
