]> git.proxmox.com Git - mirror_edk2.git/blobdiff - BaseTools/Source/C/LzmaCompress/LzmaCompress.c
BaseTools/LzmaCompress: Add two switches
[mirror_edk2.git] / BaseTools / Source / C / LzmaCompress / LzmaCompress.c
index 1de07a35411ad1bdea5d7ce5241e21747d117b2f..856fcf9ffb17bacce3143840a6f3ecdd9ebf218d 100644 (file)
@@ -1,18 +1,12 @@
 /** @file\r
   LZMA Compress/Decompress tool (LzmaCompress)\r
 \r
-  Based on LZMA SDK 4.65:\r
+  Based on LZMA SDK 18.05:\r
     LzmaUtil.c -- Test application for LZMA compression\r
-    2008-11-23 : Igor Pavlov : Public domain\r
+    2018-04-30 : Igor Pavlov : Public domain\r
 \r
-  Copyright (c) 2006 - 2012, Intel Corporation. All rights reserved.<BR>\r
-  This program and the accompanying materials\r
-  are licensed and made available under the terms and conditions of the BSD License\r
-  which accompanies this distribution.  The full text of the license may be found at\r
-  http://opensource.org/licenses/bsd-license.php\r
-\r
-  THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,\r
-  WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.\r
+  Copyright (c) 2006 - 2019, Intel Corporation. All rights reserved.<BR>\r
+  SPDX-License-Identifier: BSD-2-Clause-Patent\r
 \r
 **/\r
 \r
 #include "Sdk/C/LzmaEnc.h"\r
 #include "Sdk/C/Bra.h"\r
 #include "CommonLib.h"\r
+#include "ParseInf.h"\r
 \r
 #define LZMA_HEADER_SIZE (LZMA_PROPS_SIZE + 8)\r
 \r
 typedef enum {\r
-  NoConverter, \r
+  NoConverter,\r
   X86Converter,\r
   MaxConverter\r
 } CONVERTER_TYPE;\r
@@ -42,19 +37,19 @@ const char *kCantReadMessage = "Can not read input file";
 const char *kCantWriteMessage = "Can not write output file";\r
 const char *kCantAllocateMessage = "Can not allocate memory";\r
 const char *kDataErrorMessage = "Data error";\r
-\r
-static void *SzAlloc(void *p, size_t size) { (void)p; return MyAlloc(size); }\r
-static void SzFree(void *p, void *address) { (void)p; MyFree(address); }\r
-static ISzAlloc g_Alloc = { SzAlloc, SzFree };\r
+const char *kInvalidParamValMessage = "Invalid parameter value";\r
 \r
 static Bool mQuietMode = False;\r
 static CONVERTER_TYPE mConType = NoConverter;\r
 \r
+UINT64 mDictionarySize = 31;\r
+UINT64 mCompressionMode = 2;\r
+\r
 #define UTILITY_NAME "LzmaCompress"\r
 #define UTILITY_MAJOR_VERSION 0\r
 #define UTILITY_MINOR_VERSION 2\r
 #define INTEL_COPYRIGHT \\r
-  "Copyright (c) 2009-2012, Intel Corporation. All rights reserved."\r
+  "Copyright (c) 2009-2018, Intel Corporation. All rights reserved."\r
 void PrintHelp(char *buffer)\r
 {\r
   strcat(buffer,\r
@@ -68,6 +63,8 @@ void PrintHelp(char *buffer)
              "  -v, --verbose: increase output messages\n"\r
              "  -q, --quiet: reduce output messages\n"\r
              "  --debug [0-9]: set debug level\n"\r
+             "  -a: set compression mode 0 = fast, 1 = normal, default: 1 (normal)\n"\r
+             "  d: sets Dictionary size - [0, 30], default: 23 (8MB)\n"\r
              "  --version: display the program version and exit\n"\r
              "  -h, --help: display this help text\n"\r
              );\r
@@ -97,7 +94,7 @@ void PrintVersion(char *buffer)
   sprintf (buffer, "%s Version %d.%d %s ", UTILITY_NAME, UTILITY_MAJOR_VERSION, UTILITY_MINOR_VERSION, __BUILD_VERSION);\r
 }\r
 \r
-static SRes Encode(ISeqOutStream *outStream, ISeqInStream *inStream, UInt64 fileSize)\r
+static SRes Encode(ISeqOutStream *outStream, ISeqInStream *inStream, UInt64 fileSize, CLzmaEncProps *props)\r
 {\r
   SRes res;\r
   size_t inSize = (size_t)fileSize;\r
@@ -105,10 +102,6 @@ static SRes Encode(ISeqOutStream *outStream, ISeqInStream *inStream, UInt64 file
   Byte *outBuffer = 0;\r
   Byte *filteredStream = 0;\r
   size_t outSize;\r
-  CLzmaEncProps props;\r
-\r
-  LzmaEncProps_Init(&props);\r
-  LzmaEncProps_Normalize(&props);\r
 \r
   if (inSize != 0) {\r
     inBuffer = (Byte *)MyAlloc(inSize);\r
@@ -117,7 +110,7 @@ static SRes Encode(ISeqOutStream *outStream, ISeqInStream *inStream, UInt64 file
   } else {\r
     return SZ_ERROR_INPUT_EOF;\r
   }\r
-  \r
+\r
   if (SeqInStream_Read(inStream, inBuffer, inSize) != SZ_OK) {\r
     res = SZ_ERROR_READ;\r
     goto Done;\r
@@ -130,7 +123,7 @@ static SRes Encode(ISeqOutStream *outStream, ISeqInStream *inStream, UInt64 file
     res = SZ_ERROR_MEM;\r
     goto Done;\r
   }\r
-  \r
+\r
   {\r
     int i;\r
     for (i = 0; i < 8; i++)\r
@@ -145,7 +138,7 @@ static SRes Encode(ISeqOutStream *outStream, ISeqInStream *inStream, UInt64 file
       goto Done;\r
     }\r
     memcpy(filteredStream, inBuffer, inSize);\r
-    \r
+\r
     if (mConType == X86Converter) {\r
       {\r
         UInt32 x86State;\r
@@ -158,12 +151,12 @@ static SRes Encode(ISeqOutStream *outStream, ISeqInStream *inStream, UInt64 file
   {\r
     size_t outSizeProcessed = outSize - LZMA_HEADER_SIZE;\r
     size_t outPropsSize = LZMA_PROPS_SIZE;\r
-    \r
+\r
     res = LzmaEncode(outBuffer + LZMA_HEADER_SIZE, &outSizeProcessed,\r
         mConType != NoConverter ? filteredStream : inBuffer, inSize,\r
-        &props, outBuffer, &outPropsSize, 0,\r
+        props, outBuffer, &outPropsSize, 0,\r
         NULL, &g_Alloc, &g_Alloc);\r
-    \r
+\r
     if (res != SZ_OK)\r
       goto Done;\r
 \r
@@ -194,13 +187,13 @@ static SRes Decode(ISeqOutStream *outStream, ISeqInStream *inStream, UInt64 file
 \r
   int i;\r
 \r
-  if (inSize < LZMA_HEADER_SIZE) \r
+  if (inSize < LZMA_HEADER_SIZE)\r
     return SZ_ERROR_INPUT_EOF;\r
 \r
   inBuffer = (Byte *)MyAlloc(inSize);\r
   if (inBuffer == 0)\r
     return SZ_ERROR_MEM;\r
-  \r
+\r
   if (SeqInStream_Read(inStream, inBuffer, inSize) != SZ_OK) {\r
     res = SZ_ERROR_READ;\r
     goto Done;\r
@@ -256,6 +249,10 @@ int main2(int numArgs, const char *args[], char *rs)
   const char *outputFile = "file.tmp";\r
   int param;\r
   UInt64 fileSize;\r
+  CLzmaEncProps props;\r
+\r
+  LzmaEncProps_Init(&props);\r
+  LzmaEncProps_Normalize(&props);\r
 \r
   FileSeqInStream_CreateVTable(&inStream);\r
   File_Construct(&inStream.file);\r
@@ -290,6 +287,24 @@ int main2(int numArgs, const char *args[], char *rs)
       // parameter compatibility with other build tools.\r
       //\r
       param++;\r
+    } else if (strcmp(args[param], "-a") == 0) {\r
+      AsciiStringToUint64(args[param + 1],FALSE,&mCompressionMode);\r
+      if ((mCompressionMode == 0)||(mCompressionMode == 1)){\r
+        props.algo = (int)mCompressionMode;\r
+        param++;\r
+        continue;\r
+      } else {\r
+        return PrintError(rs, kInvalidParamValMessage);\r
+      }\r
+    } else if (strcmp(args[param], "d") == 0) {\r
+      AsciiStringToUint64(args[param + 1],FALSE,&mDictionarySize);\r
+      if (mDictionarySize <= 30){\r
+        props.dictSize = (UINT32)mDictionarySize;\r
+        param++;\r
+        continue;\r
+      } else {\r
+        return PrintError(rs, kInvalidParamValMessage);\r
+      }\r
     } else if (\r
                 strcmp(args[param], "-h") == 0 ||\r
                 strcmp(args[param], "--help") == 0\r
@@ -333,8 +348,10 @@ int main2(int numArgs, const char *args[], char *rs)
   if (InFile_Open(&inStream.file, inputFile) != 0)\r
     return PrintError(rs, "Can not open input file");\r
 \r
-  if (OutFile_Open(&outStream.file, outputFile) != 0)\r
+  if (OutFile_Open(&outStream.file, outputFile) != 0) {\r
+    File_Close(&inStream.file);\r
     return PrintError(rs, "Can not open output file");\r
+  }\r
 \r
   File_GetLength(&inStream.file, &fileSize);\r
 \r
@@ -343,14 +360,14 @@ int main2(int numArgs, const char *args[], char *rs)
     if (!mQuietMode) {\r
       printf("Encoding\n");\r
     }\r
-    res = Encode(&outStream.s, &inStream.s, fileSize);\r
+    res = Encode(&outStream.vt, &inStream.vt, fileSize, &props);\r
   }\r
   else\r
   {\r
     if (!mQuietMode) {\r
       printf("Decoding\n");\r
     }\r
-    res = Decode(&outStream.s, &inStream.s, fileSize);\r
+    res = Decode(&outStream.vt, &inStream.vt, fileSize);\r
   }\r
 \r
   File_Close(&outStream.file);\r