Changed the interface parameters to be more general
authorjwang36 <jwang36@7335b38e-4728-0410-8992-fb3ffe349368>
Wed, 30 Apr 2008 07:50:30 +0000 (07:50 +0000)
committerjwang36 <jwang36@7335b38e-4728-0410-8992-fb3ffe349368>
Wed, 30 Apr 2008 07:50:30 +0000 (07:50 +0000)
git-svn-id: https://buildtools.tianocore.org/svn/buildtools/trunk/BaseTools@1186 7335b38e-4728-0410-8992-fb3ffe349368

Source/C/Common/Decompress.c
Source/C/PyEfiCompressor/EfiCompressor.c

index f452223..f1acd75 100644 (file)
@@ -1,23 +1,23 @@
 /** @file\r
 \r
-Copyright (c) 2004 - 2008, Intel Corporation                                                         \r
-All rights reserved. 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) 2004 - 2008, Intel Corporation\r
+All rights reserved. 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
 \r
 Module Name:\r
-  \r
+\r
   Decompress.c\r
 \r
 Abstract:\r
 \r
-  Decompressor. Algorithm Ported from OPSD code (Decomp.asm) \r
+  Decompressor. Algorithm Ported from OPSD code (Decomp.asm)\r
   for Efi and Tiano compress algorithm.\r
-  \r
+\r
 --*/\r
 \r
 #include "Decompress.h"\r
@@ -71,7 +71,7 @@ typedef struct {
 } SCRATCH_DATA;\r
 \r
 STATIC UINT16 mPbit = EFIPBIT;\r
-  \r
+\r
 STATIC\r
 VOID\r
 FillBuf (\r
@@ -132,8 +132,8 @@ GetBits (
 \r
 Routine Description:\r
 \r
-  Get NumOfBits of bits out from mBitBuf. Fill mBitBuf with subsequent \r
-  NumOfBits of bits from source. Returns NumOfBits of bits that are \r
+  Get NumOfBits of bits out from mBitBuf. Fill mBitBuf with subsequent\r
+  NumOfBits of bits from source. Returns NumOfBits of bits that are\r
   popped out.\r
 \r
 Arguments:\r
@@ -178,9 +178,9 @@ Arguments:
   BitLen    - Code length array\r
   TableBits - The width of the mapping table\r
   Table     - The table\r
-  \r
+\r
 Returns:\r
-  \r
+\r
   0         - OK.\r
   BAD_TABLE - The table is corrupted.\r
 \r
@@ -363,7 +363,7 @@ Arguments:
   Sd        - The global scratch data\r
   nn        - Number of symbols\r
   nbit      - Number of bits needed to represent nn\r
-  Special   - The special symbol that needs to be taken care of \r
+  Special   - The special symbol that needs to be taken care of\r
 \r
 Returns:\r
 \r
@@ -926,30 +926,51 @@ EFI_STATUS
 Extract (\r
   IN      VOID    *Source,\r
   IN      UINT32  SrcSize,\r
-  IN OUT  VOID    *Destination,\r
-  IN      UINT32  DstSize,\r
+     OUT  VOID    **Destination,\r
+     OUT  UINT32  *DstSize,\r
   IN      UINTN   Algorithm\r
   )\r
 {\r
-  SCRATCH_DATA  Scratch;\r
+  VOID          *Scratch;\r
+  UINT32        ScratchSize;\r
   EFI_STATUS    Status;\r
 \r
   Status = EFI_SUCCESS;\r
   switch (Algorithm) {\r
   case 0:\r
-    if (SrcSize != DstSize) {\r
-      return EFI_INVALID_PARAMETER;\r
+    *Destination = malloc(SrcSize)\r
+    if (*Destination != NULL) {\r
+      memcpy(*Destination, Source, SrcSize);\r
+    } else {\r
+      Status = EFI_OUT_OF_RESOURCES;\r
     }\r
-    memcpy(Destination, Source, DstSize);\r
     break;\r
   case 1:\r
-    Status = EfiDecompress(Source, SrcSize, Destination, DstSize, &Scratch, sizeof(SCRATCH_DATA));\r
+    Status = EfiGetInfo(Source, SrcSize, DstSize, &ScratchSize);\r
+    if (Status == EFI_SUCCESS) {\r
+      Scratch = malloc(ScratchSize)\r
+      *Destination = malloc(*DstSize)\r
+      if (Scratch != NULL and *Destination != NULL) {\r
+        Status = EfiDecompress(Source, SrcSize, Destination, *DstSize, Scratch, ScratchSize);\r
+      } else {\r
+        Status = EFI_OUT_OF_RESOURCES;\r
+      }\r
+    }\r
     break;\r
   case 2:\r
-    Status = TianoDecompress(Source, SrcSize, Destination, DstSize, &Scratch, sizeof(SCRATCH_DATA));\r
+    Status = TianoGetInfo(Source, SrcSize, DstSize, &ScratchSize);\r
+    if (Status == EFI_SUCCESS) {\r
+      Scratch = malloc(ScratchSize)\r
+      *Destination = malloc(*DstSize)\r
+      if (Scratch != NULL and *Destination != NULL) {\r
+        Status = TianoDecompress(Source, SrcSize, *Destination, *DstSize, Scratch, ScratchSize);\r
+      } else {\r
+        Status = EFI_OUT_OF_RESOURCES;\r
+      }\r
+    }\r
     break;\r
   default:\r
-    Status = EFI_INVALID_PARAMETER;    \r
+    Status = EFI_INVALID_PARAMETER;\r
   }\r
 \r
   return Status;\r
index 10e571b..6760191 100644 (file)
@@ -9,7 +9,7 @@ PyObject*
 UefiDecompress(\r
   PyObject    *Self,\r
   PyObject    *Args\r
-  ) \r
+  )\r
 {\r
   PyObject      *SrcData;\r
   UINT32        SrcDataSize;\r
@@ -42,8 +42,7 @@ UefiDecompress(
   // Because some Python objects which support "buffer" protocol have more than one\r
   // memory segment, we have to copy them into a contiguous memory.\r
   SrcBuf = malloc(SrcDataSize);\r
-  DstBuf = malloc(DstDataSize);\r
-  if (SrcBuf == NULL || DstBuf == NULL) {\r
+  if (SrcBuf == NULL) {\r
     PyErr_SetString(PyExc_Exception, "Not enough memory\n");\r
     goto ERROR;\r
   }\r
@@ -63,7 +62,7 @@ UefiDecompress(
     TmpBuf += Len;\r
   }\r
 \r
-  Status = Extract((VOID *)SrcBuf, SrcDataSize, (VOID *)DstBuf, DstDataSize, 1);\r
+  Status = Extract((VOID *)SrcBuf, SrcDataSize, (VOID **)&DstBuf, &DstDataSize, 1);\r
   if (Status != EFI_SUCCESS) {\r
     PyErr_SetString(PyExc_Exception, "Failed to decompress\n");\r
     goto ERROR;\r
@@ -121,8 +120,7 @@ FrameworkDecompress(
   // Because some Python objects which support "buffer" protocol have more than one\r
   // memory segment, we have to copy them into a contiguous memory.\r
   SrcBuf = malloc(SrcDataSize);\r
-  DstBuf = malloc(DstDataSize);\r
-  if (SrcBuf == NULL || DstBuf == NULL) {\r
+  if (SrcBuf == NULL) {\r
     PyErr_SetString(PyExc_Exception, "Not enough memory\n");\r
     goto ERROR;\r
   }\r
@@ -142,7 +140,7 @@ FrameworkDecompress(
     TmpBuf += Len;\r
   }\r
 \r
-  Status = Extract((VOID *)SrcBuf, SrcDataSize, (VOID *)DstBuf, DstDataSize, 2);\r
+  Status = Extract((VOID *)SrcBuf, SrcDataSize, (VOID **)&DstBuf, &DstDataSize, 2);\r
   if (Status != EFI_SUCCESS) {\r
     PyErr_SetString(PyExc_Exception, "Failed to decompress\n");\r
     goto ERROR;\r
@@ -167,7 +165,7 @@ PyObject*
 UefiCompress(\r
   PyObject    *Self,\r
   PyObject    *Args\r
-  ) \r
+  )\r
 {\r
   return NULL;\r
 }\r