]> git.proxmox.com Git - mirror_edk2.git/blobdiff - ShellPkg/Library/UefiShellDebug1CommandsLib/Compress.c
ShellPkg/UefiShellDebug1CommandsLib: sync Compress() definition with decl.
[mirror_edk2.git] / ShellPkg / Library / UefiShellDebug1CommandsLib / Compress.c
index 9e880e6d6b5eecc13db7d061f6a56037c96c07fa..cde2c54f1b45edd5ebdfb2de952a544bd56f9c21 100644 (file)
@@ -7,7 +7,7 @@
   This sequence is further divided into Blocks and Huffman codings\r
   are applied to each Block.\r
 \r
-  Copyright (c) 2007 - 2010, Intel Corporation. All rights reserved.<BR>\r
+  Copyright (c) 2007 - 2016, 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
   WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.\r
 \r
 **/\r
-\r
+#include <Uefi.h>\r
 #include <Library/MemoryAllocationLib.h>\r
 #include <Library/BaseMemoryLib.h>\r
 #include <Library/DebugLib.h>\r
-#include <ShellBase.h>\r
+#include <Library/ShellLib.h>\r
+\r
+#include "Compress.h"\r
 \r
 //\r
 // Macro Definitions\r
@@ -39,9 +41,9 @@ typedef INT16             NODE;
 #define CODE_BIT          16\r
 #define NIL               0\r
 #define MAX_HASH_VAL      (3 * WNDSIZ + (WNDSIZ / 512 + 1) * UINT8_MAX)\r
-#define HASH(p, c)        ((p) + ((c) << (WNDBIT - 9)) + WNDSIZ * 2)\r
+#define HASH(LoopVar7, LoopVar5)        ((LoopVar7) + ((LoopVar5) << (WNDBIT - 9)) + WNDSIZ * 2)\r
 #define CRCPOLY           0xA001\r
-#define UPDATE_CRC(c)     mCrc = mCrcTable[(mCrc ^ (c)) & 0xFF] ^ (mCrc >> UINT8_BIT)\r
+#define UPDATE_CRC(LoopVar5)     mCrc = mCrcTable[(mCrc ^ (LoopVar5)) & 0xFF] ^ (mCrc >> UINT8_BIT)\r
 \r
 //\r
 // C: the Char&Len Set; P: the Position Set; T: the exTra Set\r
@@ -67,292 +69,87 @@ typedef INT16             NODE;
   @param[in] Data    The dword to put.\r
 **/\r
 VOID\r
-EFIAPI\r
 PutDword(\r
   IN UINT32 Data\r
   );\r
 \r
-EFI_STATUS\r
-EFIAPI\r
-AllocateMemory (\r
-  VOID\r
-  );\r
-\r
-VOID\r
-EFIAPI\r
-FreeMemory (\r
-  VOID\r
-  );\r
-\r
-VOID\r
-EFIAPI\r
-InitSlide (\r
-  VOID\r
-  );\r
-\r
-NODE\r
-EFIAPI\r
-Child (\r
-  IN NODE   q,\r
-  IN UINT8  c\r
-  );\r
-\r
-VOID\r
-EFIAPI\r
-MakeChild (\r
-  IN NODE   q,\r
-  IN UINT8  c,\r
-  IN NODE   r\r
-  );\r
-\r
-VOID\r
-EFIAPI\r
-Split (\r
-  IN NODE Old\r
-  );\r
-\r
-VOID\r
-EFIAPI\r
-InsertNode (\r
-  VOID\r
-  );\r
-\r
-VOID\r
-EFIAPI\r
-DeleteNode (\r
-  VOID\r
-  );\r
-\r
-VOID\r
-EFIAPI\r
-GetNextMatch (\r
-  VOID\r
-  );\r
-\r
-EFI_STATUS\r
-EFIAPI\r
-Encode (\r
-  VOID\r
-  );\r
-\r
-VOID\r
-EFIAPI\r
-CountTFreq (\r
-  VOID\r
-  );\r
-\r
-VOID\r
-EFIAPI\r
-WritePTLen (\r
-  IN INT32 n,\r
-  IN INT32 nbit,\r
-  IN INT32 Special\r
-  );\r
-\r
-VOID\r
-EFIAPI\r
-WriteCLen (\r
-  VOID\r
-  );\r
-\r
-VOID\r
-EFIAPI\r
-EncodeC (\r
-  IN INT32 c\r
-  );\r
-\r
-VOID\r
-EFIAPI\r
-EncodeP (\r
-  IN UINT32 p\r
-  );\r
-\r
-VOID\r
-EFIAPI\r
-SendBlock (\r
-  VOID\r
-  );\r
-\r
-VOID\r
-EFIAPI\r
-CompressOutput (\r
-  IN UINT32 c,\r
-  IN UINT32 p\r
-  );\r
-\r
-VOID\r
-EFIAPI\r
-HufEncodeStart (\r
-  VOID\r
-  );\r
-\r
-VOID\r
-EFIAPI\r
-HufEncodeEnd (\r
-  VOID\r
-  );\r
-\r
-VOID\r
-EFIAPI\r
-MakeCrcTable (\r
-  VOID\r
-  );\r
-\r
-VOID\r
-EFIAPI\r
-PutBits (\r
-  IN INT32    n,\r
-  IN UINT32   x\r
-  );\r
-\r
-INT32\r
-EFIAPI\r
-FreadCrc (\r
-  OUT UINT8 *p,\r
-  IN  INT32 n\r
-  );\r
-\r
-VOID\r
-EFIAPI\r
-InitPutBits (\r
-  VOID\r
-  );\r
-\r
-VOID\r
-EFIAPI\r
-CountLen (\r
-  IN INT32 i\r
-  );\r
-\r
-VOID\r
-EFIAPI\r
-MakeLen (\r
-  IN INT32 Root\r
-  );\r
-\r
-VOID\r
-EFIAPI\r
-DownHeap (\r
-  IN INT32 i\r
-  );\r
-\r
-VOID\r
-EFIAPI\r
-MakeCode (\r
-  IN  INT32         n,\r
-  IN  UINT8 Len[    ],\r
-  OUT UINT16 Code[  ]\r
-  );\r
-\r
-INT32\r
-EFIAPI\r
-MakeTree (\r
-  IN  INT32             NParm,\r
-  IN  UINT16  FreqParm[ ],\r
-  OUT UINT8   LenParm[  ],\r
-  OUT UINT16  CodeParm[ ]\r
-  );\r
-\r
 //\r
 //  Global Variables\r
 //\r
-STATIC UINT8  *mSrc, *mDst, *mSrcUpperLimit, *mDstUpperLimit;\r
-\r
-STATIC UINT8  *mLevel, *mText, *mChildCount, *mBuf, mCLen[NC], mPTLen[NPT], *mLen;\r
+STATIC UINT8  *mSrc;\r
+STATIC UINT8  *mDst;\r
+STATIC UINT8  *mSrcUpperLimit;\r
+STATIC UINT8  *mDstUpperLimit;\r
+\r
+STATIC UINT8  *mLevel;\r
+STATIC UINT8  *mText;\r
+STATIC UINT8  *mChildCount;\r
+STATIC UINT8  *mBuf;\r
+STATIC UINT8  mCLen[NC];\r
+STATIC UINT8  mPTLen[NPT];\r
+STATIC UINT8  *mLen;\r
 STATIC INT16  mHeap[NC + 1];\r
-STATIC INT32  mRemainder, mMatchLen, mBitCount, mHeapSize, mN;\r
-STATIC UINT32 mBufSiz = 0, mOutputPos, mOutputMask, mSubBitBuf, mCrc;\r
-STATIC UINT32 mCompSize, mOrigSize;\r
-\r
-STATIC UINT16 *mFreq, *mSortPtr, mLenCnt[17], mLeft[2 * NC - 1], mRight[2 * NC - 1],\r
-              mCrcTable[UINT8_MAX + 1], mCFreq[2 * NC - 1], mCTable[4096], mCCode[NC],\r
-              mPFreq[2 * NP - 1], mPTCode[NPT], mTFreq[2 * NT - 1];\r
+STATIC INT32  mRemainder;\r
+STATIC INT32  mMatchLen;\r
+STATIC INT32  mBitCount;\r
+STATIC INT32  mHeapSize;\r
+STATIC INT32  mTempInt32;\r
+STATIC UINT32 mBufSiz = 0;\r
+STATIC UINT32 mOutputPos;\r
+STATIC UINT32 mOutputMask;\r
+STATIC UINT32 mSubBitBuf;\r
+STATIC UINT32 mCrc;\r
+STATIC UINT32 mCompSize;\r
+STATIC UINT32 mOrigSize;\r
+\r
+STATIC UINT16 *mFreq;\r
+STATIC UINT16 *mSortPtr;\r
+STATIC UINT16 mLenCnt[17];\r
+STATIC UINT16 mLeft[2 * NC - 1];\r
+STATIC UINT16 mRight[2 * NC - 1];\r
+STATIC UINT16 mCrcTable[UINT8_MAX + 1];\r
+STATIC UINT16 mCFreq[2 * NC - 1];\r
+STATIC UINT16 mCCode[NC];\r
+STATIC UINT16 mPFreq[2 * NP - 1];\r
+STATIC UINT16 mPTCode[NPT];\r
+STATIC UINT16 mTFreq[2 * NT - 1];\r
+\r
+STATIC NODE   mPos;\r
+STATIC NODE   mMatchPos;\r
+STATIC NODE   mAvail;\r
+STATIC NODE   *mPosition;\r
+STATIC NODE   *mParent;\r
+STATIC NODE   *mPrev;\r
+STATIC NODE   *mNext = NULL;\r
+INT32         mHuffmanDepth = 0;\r
 \r
-STATIC NODE   mPos, mMatchPos, mAvail, *mPosition, *mParent, *mPrev, *mNext = NULL;\r
-\r
-//\r
-// functions\r
-//\r
 /**\r
-  The compression routine.\r
+  Make a CRC table.\r
 \r
-  @param[in]      SrcBuffer     The buffer containing the source data.\r
-  @param[in]      SrcSizae      Number of bytes in SrcBuffer.\r
-  @param[in]      DstBuffer     The buffer to put the compressed image in.\r
-  @param[in,out]  DstSize       On input the size (in bytes) of DstBuffer, on\r
-                                return the number of bytes placed in DstBuffer.\r
-\r
-  @retval EFI_SUCCESS           The compression was sucessful.\r
-  @retval EFI_BUFFER_TOO_SMALL  The buffer was too small.  DstSize is required.\r
 **/\r
-EFI_STATUS\r
-EFIAPI\r
-Compress (\r
-  IN       VOID   *SrcBuffer,\r
-  IN       UINT64 SrcSize,\r
-  IN       VOID   *DstBuffer,\r
-  IN OUT   UINT64 *DstSize\r
+VOID\r
+MakeCrcTable (\r
+  VOID\r
   )\r
 {\r
-  EFI_STATUS  Status;\r
-\r
-  //\r
-  // Initializations\r
-  //\r
-  mBufSiz         = 0;\r
-  mBuf            = NULL;\r
-  mText           = NULL;\r
-  mLevel          = NULL;\r
-  mChildCount     = NULL;\r
-  mPosition       = NULL;\r
-  mParent         = NULL;\r
-  mPrev           = NULL;\r
-  mNext           = NULL;\r
-\r
-  mSrc            = SrcBuffer;\r
-  mSrcUpperLimit  = mSrc + SrcSize;\r
-  mDst            = DstBuffer;\r
-  mDstUpperLimit  = mDst +*DstSize;\r
-\r
-  PutDword (0L);\r
-  PutDword (0L);\r
+  UINT32  LoopVar1;\r
 \r
-  MakeCrcTable ();\r
+  UINT32  LoopVar2;\r
 \r
-  mOrigSize             = mCompSize = 0;\r
-  mCrc                  = INIT_CRC;\r
+  UINT32  LoopVar4;\r
 \r
-  //\r
-  // Compress it\r
-  //\r
-  Status = Encode ();\r
-  if (EFI_ERROR (Status)) {\r
-    return EFI_OUT_OF_RESOURCES;\r
-  }\r
-  //\r
-  // Null terminate the compressed data\r
-  //\r
-  if (mDst < mDstUpperLimit) {\r
-    *mDst++ = 0;\r
-  }\r
-  //\r
-  // Fill in compressed size and original size\r
-  //\r
-  mDst = DstBuffer;\r
-  PutDword (mCompSize + 1);\r
-  PutDword (mOrigSize);\r
+  for (LoopVar1 = 0; LoopVar1 <= UINT8_MAX; LoopVar1++) {\r
+    LoopVar4 = LoopVar1;\r
+    for (LoopVar2 = 0; LoopVar2 < UINT8_BIT; LoopVar2++) {\r
+      if ((LoopVar4 & 1) != 0) {\r
+        LoopVar4 = (LoopVar4 >> 1) ^ CRCPOLY;\r
+      } else {\r
+        LoopVar4 >>= 1;\r
+      }\r
+    }\r
 \r
-  //\r
-  // Return\r
-  //\r
-  if (mCompSize + 1 + 8 > *DstSize) {\r
-    *DstSize = mCompSize + 1 + 8;\r
-    return EFI_BUFFER_TOO_SMALL;\r
-  } else {\r
-    *DstSize = mCompSize + 1 + 8;\r
-    return EFI_SUCCESS;\r
+    mCrcTable[LoopVar1] = (UINT16) LoopVar4;\r
   }\r
-\r
 }\r
 \r
 /**\r
@@ -361,7 +158,6 @@ Compress (
   @param[in] Data    The dword to put.\r
 **/\r
 VOID\r
-EFIAPI\r
 PutDword (\r
   IN UINT32 Data\r
   )\r
@@ -383,45 +179,34 @@ PutDword (
   }\r
 }\r
 \r
+/**\r
+  Allocate memory spaces for data structures used in compression process.\r
+  \r
+  @retval EFI_SUCCESS           Memory was allocated successfully.\r
+  @retval EFI_OUT_OF_RESOURCES  A memory allocation failed.\r
+**/\r
 EFI_STATUS\r
-EFIAPI\r
 AllocateMemory (\r
   VOID\r
   )\r
-/*++\r
-\r
-Routine Description:\r
-\r
-  Allocate memory spaces for data structures used in compression process\r
-\r
-Arguments:\r
-\r
-  None\r
-\r
-Returns:\r
-\r
-  EFI_SUCCESS           - Memory is allocated successfully\r
-  EFI_OUT_OF_RESOURCES  - Allocation fails\r
-\r
-**/\r
 {\r
   mText       = AllocateZeroPool (WNDSIZ * 2 + MAXMATCH);\r
-  mLevel      = AllocatePool ((WNDSIZ + UINT8_MAX + 1) * sizeof (*mLevel));\r
-  mChildCount = AllocatePool ((WNDSIZ + UINT8_MAX + 1) * sizeof (*mChildCount));\r
-  mPosition   = AllocatePool ((WNDSIZ + UINT8_MAX + 1) * sizeof (*mPosition));\r
-  mParent     = AllocatePool (WNDSIZ * 2 * sizeof (*mParent));\r
-  mPrev       = AllocatePool (WNDSIZ * 2 * sizeof (*mPrev));\r
-  mNext       = AllocatePool ((MAX_HASH_VAL + 1) * sizeof (*mNext));\r
+  mLevel      = AllocateZeroPool ((WNDSIZ + UINT8_MAX + 1) * sizeof (*mLevel));\r
+  mChildCount = AllocateZeroPool ((WNDSIZ + UINT8_MAX + 1) * sizeof (*mChildCount));\r
+  mPosition   = AllocateZeroPool ((WNDSIZ + UINT8_MAX + 1) * sizeof (*mPosition));\r
+  mParent     = AllocateZeroPool (WNDSIZ * 2 * sizeof (*mParent));\r
+  mPrev       = AllocateZeroPool (WNDSIZ * 2 * sizeof (*mPrev));\r
+  mNext       = AllocateZeroPool ((MAX_HASH_VAL + 1) * sizeof (*mNext));\r
 \r
   mBufSiz     = BLKSIZ;\r
-  mBuf        = AllocatePool (mBufSiz);\r
+  mBuf        = AllocateZeroPool (mBufSiz);\r
   while (mBuf == NULL) {\r
     mBufSiz = (mBufSiz / 10U) * 9U;\r
     if (mBufSiz < 4 * 1024U) {\r
       return EFI_OUT_OF_RESOURCES;\r
     }\r
 \r
-    mBuf = AllocatePool (mBufSiz);\r
+    mBuf = AllocateZeroPool (mBufSiz);\r
   }\r
 \r
   mBuf[0] = 0;\r
@@ -429,22 +214,14 @@ Returns:
   return EFI_SUCCESS;\r
 }\r
 \r
+/**\r
+  Called when compression is completed to free memory previously allocated.\r
+\r
+**/\r
 VOID\r
-EFIAPI\r
 FreeMemory (\r
   VOID\r
   )\r
-/*++\r
-\r
-Routine Description:\r
-\r
-  Called when compression is completed to free memory previously allocated.\r
-\r
-Arguments: (VOID)\r
-\r
-Returns: (VOID)\r
-\r
-**/\r
 {\r
   SHELL_FREE_NON_NULL (mText);\r
   SHELL_FREE_NON_NULL (mLevel);\r
@@ -456,24 +233,15 @@ Returns: (VOID)
   SHELL_FREE_NON_NULL (mBuf);\r
 }\r
 \r
+/**\r
+  Initialize String Info Log data structures.\r
+**/\r
 VOID\r
-EFIAPI\r
 InitSlide (\r
   VOID\r
   )\r
-/*++\r
-\r
-Routine Description:\r
-\r
-  Initialize String Info Log data structures\r
-\r
-Arguments: (VOID)\r
-\r
-Returns: (VOID)\r
-\r
-**/\r
 {\r
-  NODE  i;\r
+  NODE  LoopVar1;\r
 \r
   SetMem (mLevel + WNDSIZ, (UINT8_MAX + 1) * sizeof (UINT8), 1);\r
   SetMem (mPosition + WNDSIZ, (UINT8_MAX + 1) * sizeof (NODE), 0);\r
@@ -481,117 +249,92 @@ Returns: (VOID)
   SetMem (mParent + WNDSIZ, WNDSIZ * sizeof (NODE), 0);\r
 \r
   mAvail = 1;\r
-  for (i = 1; i < WNDSIZ - 1; i++) {\r
-    mNext[i] = (NODE) (i + 1);\r
+  for (LoopVar1 = 1; LoopVar1 < WNDSIZ - 1; LoopVar1++) {\r
+    mNext[LoopVar1] = (NODE) (LoopVar1 + 1);\r
   }\r
 \r
   mNext[WNDSIZ - 1] = NIL;\r
   SetMem (mNext + WNDSIZ * 2, (MAX_HASH_VAL - WNDSIZ * 2 + 1) * sizeof (NODE), 0);\r
 }\r
 \r
-NODE\r
-EFIAPI\r
-Child (\r
-  IN NODE   q,\r
-  IN UINT8  c\r
-  )\r
-/*++\r
-\r
-Routine Description:\r
-\r
+/**\r
   Find child node given the parent node and the edge character\r
 \r
-Arguments:\r
-\r
-  q       - the parent node\r
-  c       - the edge character\r
-\r
-Returns:\r
+  @param[in] LoopVar6       The parent node.\r
+  @param[in] LoopVar5       The edge character.\r
 \r
-  The child node (NIL if not found)\r
+  @return             The child node.\r
+  @retval NIL(Zero)   No child could be found.\r
 \r
 **/\r
+NODE\r
+Child (\r
+  IN NODE   LoopVar6,\r
+  IN UINT8  LoopVar5\r
+  )\r
 {\r
-  NODE  r;\r
+  NODE  LoopVar4;\r
 \r
-  r             = mNext[HASH (q, c)];\r
-  mParent[NIL]  = q;  /* sentinel */\r
-  while (mParent[r] != q) {\r
-    r = mNext[r];\r
+  LoopVar4             = mNext[HASH (LoopVar6, LoopVar5)];\r
+  mParent[NIL]  = LoopVar6;  /* sentinel */\r
+  while (mParent[LoopVar4] != LoopVar6) {\r
+    LoopVar4 = mNext[LoopVar4];\r
   }\r
 \r
-  return r;\r
+  return LoopVar4;\r
 }\r
 \r
+/**\r
+  Create a new child for a given parent node.\r
+\r
+  @param[in] LoopVar6       The parent node.\r
+  @param[in] LoopVar5       The edge character.\r
+  @param[in] LoopVar4       The child node.\r
+**/\r
 VOID\r
-EFIAPI\r
 MakeChild (\r
-  IN NODE   q,\r
-  IN UINT8  c,\r
-  IN NODE   r\r
+  IN NODE   LoopVar6,\r
+  IN UINT8  LoopVar5,\r
+  IN NODE   LoopVar4\r
   )\r
-/*++\r
-\r
-Routine Description:\r
-\r
-  Create a new child for a given parent node.\r
-\r
-Arguments:\r
-\r
-  q       - the parent node\r
-  c       - the edge character\r
-  r       - the child node\r
-\r
-Returns: (VOID)\r
-\r
-**/\r
 {\r
-  NODE  h;\r
-\r
-  NODE  t;\r
-\r
-  h           = (NODE) HASH (q, c);\r
-  t           = mNext[h];\r
-  mNext[h]    = r;\r
-  mNext[r]    = t;\r
-  mPrev[t]    = r;\r
-  mPrev[r]    = h;\r
-  mParent[r]  = q;\r
-  mChildCount[q]++;\r
+  NODE  LoopVar12;\r
+\r
+  NODE  LoopVar10;\r
+\r
+  LoopVar12          = (NODE) HASH (LoopVar6, LoopVar5);\r
+  LoopVar10          = mNext[LoopVar12];\r
+  mNext[LoopVar12]   = LoopVar4;\r
+  mNext[LoopVar4]    = LoopVar10;\r
+  mPrev[LoopVar10]   = LoopVar4;\r
+  mPrev[LoopVar4]    = LoopVar12;\r
+  mParent[LoopVar4]  = LoopVar6;\r
+  mChildCount[LoopVar6]++;\r
 }\r
 \r
-VOID\r
-EFIAPI\r
-Split (\r
-  NODE Old\r
-  )\r
-/*++\r
-\r
-Routine Description:\r
-\r
+/**\r
   Split a node.\r
 \r
-Arguments:\r
-\r
-  Old     - the node to split\r
-\r
-Returns: (VOID)\r
-\r
+  @param[in] Old     The node to split.\r
 **/\r
+VOID\r
+Split (\r
+  IN NODE Old\r
+  )\r
 {\r
   NODE  New;\r
 \r
-  NODE  t;\r
+  NODE  LoopVar10;\r
 \r
   New               = mAvail;\r
   mAvail            = mNext[New];\r
   mChildCount[New]  = 0;\r
-  t                 = mPrev[Old];\r
-  mPrev[New]        = t;\r
-  mNext[t]          = New;\r
-  t                 = mNext[Old];\r
-  mNext[New]        = t;\r
-  mPrev[t]          = New;\r
+  LoopVar10                 = mPrev[Old];\r
+  mPrev[New]        = LoopVar10;\r
+  mNext[LoopVar10]          = New;\r
+  LoopVar10                 = mNext[Old];\r
+  mNext[New]        = LoopVar10;\r
+  mPrev[LoopVar10]          = New;\r
   mParent[New]      = mParent[Old];\r
   mLevel[New]       = (UINT8) mMatchLen;\r
   mPosition[New]    = mPos;\r
@@ -599,33 +342,25 @@ Returns: (VOID)
   MakeChild (New, mText[mPos + mMatchLen], mPos);\r
 }\r
 \r
+/**\r
+  Insert string info for current position into the String Info Log.\r
+\r
+**/\r
 VOID\r
-EFIAPI\r
 InsertNode (\r
   VOID\r
   )\r
-/*++\r
-\r
-Routine Description:\r
-\r
-  Insert string info for current position into the String Info Log\r
-\r
-Arguments: (VOID)\r
-\r
-Returns: (VOID)\r
-\r
-**/\r
 {\r
-  NODE  q;\r
+  NODE  LoopVar6;\r
 \r
-  NODE  r;\r
+  NODE  LoopVar4;\r
 \r
-  NODE  j;\r
+  NODE  LoopVar2;\r
 \r
-  NODE  t;\r
-  UINT8 c;\r
-  UINT8 *t1;\r
-  UINT8 *t2;\r
+  NODE  LoopVar10;\r
+  UINT8 LoopVar5;\r
+  UINT8 *TempString3;\r
+  UINT8 *TempString2;\r
 \r
   if (mMatchLen >= 4) {\r
     //\r
@@ -636,36 +371,36 @@ Returns: (VOID)
     // in DeleteNode() later.\r
     //\r
     mMatchLen--;\r
-    r = (NODE) ((mMatchPos + 1) | WNDSIZ);\r
-    q = mParent[r];\r
-    while (q == NIL) {\r
-      r = mNext[r];\r
-      q = mParent[r];\r
+    LoopVar4 = (NODE) ((mMatchPos + 1) | WNDSIZ);\r
+    LoopVar6 = mParent[LoopVar4];\r
+    while (LoopVar6 == NIL) {\r
+      LoopVar4 = mNext[LoopVar4];\r
+      LoopVar6 = mParent[LoopVar4];\r
     }\r
 \r
-    while (mLevel[q] >= mMatchLen) {\r
-      r = q;\r
-      q = mParent[q];\r
+    while (mLevel[LoopVar6] >= mMatchLen) {\r
+      LoopVar4 = LoopVar6;\r
+      LoopVar6 = mParent[LoopVar6];\r
     }\r
 \r
-    t = q;\r
-    while (mPosition[t] < 0) {\r
-      mPosition[t]  = mPos;\r
-      t             = mParent[t];\r
+    LoopVar10 = LoopVar6;\r
+    while (mPosition[LoopVar10] < 0) {\r
+      mPosition[LoopVar10]  = mPos;\r
+      LoopVar10             = mParent[LoopVar10];\r
     }\r
 \r
-    if (t < WNDSIZ) {\r
-      mPosition[t] = (NODE) (mPos | PERC_FLAG);\r
+    if (LoopVar10 < WNDSIZ) {\r
+      mPosition[LoopVar10] = (NODE) (mPos | PERC_FLAG);\r
     }\r
   } else {\r
     //\r
     // Locate the target tree\r
     //\r
-    q = (NODE) (mText[mPos] + WNDSIZ);\r
-    c = mText[mPos + 1];\r
-    r = Child (q, c);\r
-    if (r == NIL) {\r
-      MakeChild (q, c, mPos);\r
+    LoopVar6 = (NODE) (mText[mPos] + WNDSIZ);\r
+    LoopVar5 = mText[mPos + 1];\r
+    LoopVar4 = Child (LoopVar6, LoopVar5);\r
+    if (LoopVar4 == NIL) {\r
+      MakeChild (LoopVar6, LoopVar5, mPos);\r
       mMatchLen = 1;\r
       return ;\r
     }\r
@@ -678,510 +413,686 @@ Returns: (VOID)
   // Node split or creation is involved.\r
   //\r
   for (;;) {\r
-    if (r >= WNDSIZ) {\r
-      j         = MAXMATCH;\r
-      mMatchPos = r;\r
+    if (LoopVar4 >= WNDSIZ) {\r
+      LoopVar2         = MAXMATCH;\r
+      mMatchPos = LoopVar4;\r
     } else {\r
-      j         = mLevel[r];\r
-      mMatchPos = (NODE) (mPosition[r] & ~PERC_FLAG);\r
+      LoopVar2         = mLevel[LoopVar4];\r
+      mMatchPos = (NODE) (mPosition[LoopVar4] & ~PERC_FLAG);\r
     }\r
 \r
     if (mMatchPos >= mPos) {\r
       mMatchPos -= WNDSIZ;\r
     }\r
 \r
-    t1  = &mText[mPos + mMatchLen];\r
-    t2  = &mText[mMatchPos + mMatchLen];\r
-    while (mMatchLen < j) {\r
-      if (*t1 != *t2) {\r
-        Split (r);\r
+    TempString3  = &mText[mPos + mMatchLen];\r
+    TempString2  = &mText[mMatchPos + mMatchLen];\r
+    while (mMatchLen < LoopVar2) {\r
+      if (*TempString3 != *TempString2) {\r
+        Split (LoopVar4);\r
         return ;\r
       }\r
 \r
       mMatchLen++;\r
-      t1++;\r
-      t2++;\r
+      TempString3++;\r
+      TempString2++;\r
     }\r
 \r
     if (mMatchLen >= MAXMATCH) {\r
       break;\r
     }\r
 \r
-    mPosition[r]  = mPos;\r
-    q             = r;\r
-    r             = Child (q, *t1);\r
-    if (r == NIL) {\r
-      MakeChild (q, *t1, mPos);\r
+    mPosition[LoopVar4]  = mPos;\r
+    LoopVar6             = LoopVar4;\r
+    LoopVar4             = Child (LoopVar6, *TempString3);\r
+    if (LoopVar4 == NIL) {\r
+      MakeChild (LoopVar6, *TempString3, mPos);\r
       return ;\r
     }\r
 \r
     mMatchLen++;\r
   }\r
 \r
-  t             = mPrev[r];\r
-  mPrev[mPos]   = t;\r
-  mNext[t]      = mPos;\r
-  t             = mNext[r];\r
-  mNext[mPos]   = t;\r
-  mPrev[t]      = mPos;\r
-  mParent[mPos] = q;\r
-  mParent[r]    = NIL;\r
+  LoopVar10             = mPrev[LoopVar4];\r
+  mPrev[mPos]   = LoopVar10;\r
+  mNext[LoopVar10]      = mPos;\r
+  LoopVar10             = mNext[LoopVar4];\r
+  mNext[mPos]   = LoopVar10;\r
+  mPrev[LoopVar10]      = mPos;\r
+  mParent[mPos] = LoopVar6;\r
+  mParent[LoopVar4]    = NIL;\r
 \r
   //\r
   // Special usage of 'next'\r
   //\r
-  mNext[r] = mPos;\r
+  mNext[LoopVar4] = mPos;\r
 \r
 }\r
 \r
+/**\r
+  Delete outdated string info. (The Usage of PERC_FLAG\r
+  ensures a clean deletion).\r
+\r
+**/\r
 VOID\r
-EFIAPI\r
 DeleteNode (\r
   VOID\r
   )\r
-/*++\r
-\r
-Routine Description:\r
-\r
-  Delete outdated string info. (The Usage of PERC_FLAG\r
-  ensures a clean deletion)\r
-\r
-Arguments: (VOID)\r
-\r
-Returns: (VOID)\r
-\r
-**/\r
 {\r
-  NODE  q;\r
+  NODE  LoopVar6;\r
 \r
-  NODE  r;\r
+  NODE  LoopVar4;\r
 \r
-  NODE  s;\r
+  NODE  LoopVar11;\r
 \r
-  NODE  t;\r
+  NODE  LoopVar10;\r
 \r
-  NODE  u;\r
+  NODE  LoopVar9;\r
 \r
   if (mParent[mPos] == NIL) {\r
     return ;\r
   }\r
 \r
-  r             = mPrev[mPos];\r
-  s             = mNext[mPos];\r
-  mNext[r]      = s;\r
-  mPrev[s]      = r;\r
-  r             = mParent[mPos];\r
+  LoopVar4             = mPrev[mPos];\r
+  LoopVar11             = mNext[mPos];\r
+  mNext[LoopVar4]      = LoopVar11;\r
+  mPrev[LoopVar11]      = LoopVar4;\r
+  LoopVar4             = mParent[mPos];\r
   mParent[mPos] = NIL;\r
-  if (r >= WNDSIZ) {\r
+  if (LoopVar4 >= WNDSIZ) {\r
     return ;\r
   }\r
 \r
-  mChildCount[r]--;\r
-  if (mChildCount[r] > 1) {\r
+  mChildCount[LoopVar4]--;\r
+  if (mChildCount[LoopVar4] > 1) {\r
     return ;\r
   }\r
 \r
-  t = (NODE) (mPosition[r] & ~PERC_FLAG);\r
-  if (t >= mPos) {\r
-    t -= WNDSIZ;\r
+  LoopVar10 = (NODE) (mPosition[LoopVar4] & ~PERC_FLAG);\r
+  if (LoopVar10 >= mPos) {\r
+    LoopVar10 -= WNDSIZ;\r
   }\r
 \r
-  s = t;\r
-  q = mParent[r];\r
-  u = mPosition[q];\r
-  while ((u & PERC_FLAG) != 0){\r
-    u &= ~PERC_FLAG;\r
-    if (u >= mPos) {\r
-      u -= WNDSIZ;\r
+  LoopVar11 = LoopVar10;\r
+  LoopVar6 = mParent[LoopVar4];\r
+  LoopVar9 = mPosition[LoopVar6];\r
+  while ((LoopVar9 & PERC_FLAG) != 0){\r
+    LoopVar9 &= ~PERC_FLAG;\r
+    if (LoopVar9 >= mPos) {\r
+      LoopVar9 -= WNDSIZ;\r
     }\r
 \r
-    if (u > s) {\r
-      s = u;\r
+    if (LoopVar9 > LoopVar11) {\r
+      LoopVar11 = LoopVar9;\r
     }\r
 \r
-    mPosition[q]  = (NODE) (s | WNDSIZ);\r
-    q             = mParent[q];\r
-    u             = mPosition[q];\r
+    mPosition[LoopVar6]  = (NODE) (LoopVar11 | WNDSIZ);\r
+    LoopVar6             = mParent[LoopVar6];\r
+    LoopVar9             = mPosition[LoopVar6];\r
   }\r
 \r
-  if (q < WNDSIZ) {\r
-    if (u >= mPos) {\r
-      u -= WNDSIZ;\r
+  if (LoopVar6 < WNDSIZ) {\r
+    if (LoopVar9 >= mPos) {\r
+      LoopVar9 -= WNDSIZ;\r
     }\r
 \r
-    if (u > s) {\r
-      s = u;\r
+    if (LoopVar9 > LoopVar11) {\r
+      LoopVar11 = LoopVar9;\r
     }\r
 \r
-    mPosition[q] = (NODE) (s | WNDSIZ | PERC_FLAG);\r
+    mPosition[LoopVar6] = (NODE) (LoopVar11 | WNDSIZ | PERC_FLAG);\r
   }\r
 \r
-  s           = Child (r, mText[t + mLevel[r]]);\r
-  t           = mPrev[s];\r
-  u           = mNext[s];\r
-  mNext[t]    = u;\r
-  mPrev[u]    = t;\r
-  t           = mPrev[r];\r
-  mNext[t]    = s;\r
-  mPrev[s]    = t;\r
-  t           = mNext[r];\r
-  mPrev[t]    = s;\r
-  mNext[s]    = t;\r
-  mParent[s]  = mParent[r];\r
-  mParent[r]  = NIL;\r
-  mNext[r]    = mAvail;\r
-  mAvail      = r;\r
+  LoopVar11           = Child (LoopVar4, mText[LoopVar10 + mLevel[LoopVar4]]);\r
+  LoopVar10           = mPrev[LoopVar11];\r
+  LoopVar9           = mNext[LoopVar11];\r
+  mNext[LoopVar10]    = LoopVar9;\r
+  mPrev[LoopVar9]    = LoopVar10;\r
+  LoopVar10           = mPrev[LoopVar4];\r
+  mNext[LoopVar10]    = LoopVar11;\r
+  mPrev[LoopVar11]    = LoopVar10;\r
+  LoopVar10           = mNext[LoopVar4];\r
+  mPrev[LoopVar10]    = LoopVar11;\r
+  mNext[LoopVar11]    = LoopVar10;\r
+  mParent[LoopVar11]  = mParent[LoopVar4];\r
+  mParent[LoopVar4]  = NIL;\r
+  mNext[LoopVar4]    = mAvail;\r
+  mAvail      = LoopVar4;\r
 }\r
 \r
-VOID\r
-EFIAPI\r
-GetNextMatch (\r
-  VOID\r
+/**\r
+  Read in source data\r
+\r
+  @param[out] LoopVar7   The buffer to hold the data.\r
+  @param[in] LoopVar8    The number of bytes to read.\r
+\r
+  @return The number of bytes actually read.\r
+**/\r
+INT32\r
+FreadCrc (\r
+  OUT UINT8 *LoopVar7,\r
+  IN  INT32 LoopVar8\r
   )\r
-/*++\r
+{\r
+  INT32 LoopVar1;\r
+\r
+  for (LoopVar1 = 0; mSrc < mSrcUpperLimit && LoopVar1 < LoopVar8; LoopVar1++) {\r
+    *LoopVar7++ = *mSrc++;\r
+  }\r
 \r
-Routine Description:\r
+  LoopVar8 = LoopVar1;\r
 \r
-  Advance the current position (read in new data if needed).\r
-  Delete outdated string info. Find a match string for current position.\r
+  LoopVar7 -= LoopVar8;\r
+  mOrigSize += LoopVar8;\r
+  LoopVar1--;\r
+  while (LoopVar1 >= 0) {\r
+    UPDATE_CRC (*LoopVar7++);\r
+    LoopVar1--;\r
+  }\r
 \r
-Arguments: (VOID)\r
+  return LoopVar8;\r
+}\r
 \r
-Returns: (VOID)\r
+/**\r
+  Advance the current position (read in new data if needed).\r
+  Delete outdated string info. Find a match string for current position.\r
 \r
+  @retval TRUE      The operation was successful.\r
+  @retval FALSE     The operation failed due to insufficient memory.\r
 **/\r
+BOOLEAN\r
+GetNextMatch (\r
+  VOID\r
+  )\r
 {\r
-  INT32 n;\r
+  INT32 LoopVar8;\r
   VOID  *Temp;\r
 \r
   mRemainder--;\r
   mPos++;\r
   if (mPos == WNDSIZ * 2) {\r
-    Temp = AllocatePool (WNDSIZ + MAXMATCH);\r
+    Temp = AllocateZeroPool (WNDSIZ + MAXMATCH);\r
+    if (Temp == NULL) {\r
+      return (FALSE);\r
+    }\r
     CopyMem (Temp, &mText[WNDSIZ], WNDSIZ + MAXMATCH);\r
     CopyMem (&mText[0], Temp, WNDSIZ + MAXMATCH);\r
     FreePool (Temp);\r
-    n = FreadCrc (&mText[WNDSIZ + MAXMATCH], WNDSIZ);\r
-    mRemainder += n;\r
+    LoopVar8 = FreadCrc (&mText[WNDSIZ + MAXMATCH], WNDSIZ);\r
+    mRemainder += LoopVar8;\r
     mPos = WNDSIZ;\r
   }\r
 \r
   DeleteNode ();\r
   InsertNode ();\r
+\r
+  return (TRUE);\r
 }\r
 \r
-EFI_STATUS\r
-EFIAPI\r
-Encode (\r
-  VOID\r
+/**\r
+  Send entry LoopVar1 down the queue.\r
+\r
+  @param[in] LoopVar1    The index of the item to move.\r
+**/\r
+VOID\r
+DownHeap (\r
+  IN INT32 i\r
   )\r
-/*++\r
+{\r
+  INT32 LoopVar1;\r
 \r
-Routine Description:\r
+  INT32 LoopVar2;\r
 \r
-  The main controlling routine for compression process.\r
+  //\r
+  // priority queue: send i-th entry down heap\r
+  //\r
+  LoopVar2 = mHeap[i];\r
+  LoopVar1 = 2 * i;\r
+  while (LoopVar1 <= mHeapSize) {\r
+    if (LoopVar1 < mHeapSize && mFreq[mHeap[LoopVar1]] > mFreq[mHeap[LoopVar1 + 1]]) {\r
+      LoopVar1++;\r
+    }\r
 \r
-Arguments: (VOID)\r
+    if (mFreq[LoopVar2] <= mFreq[mHeap[LoopVar1]]) {\r
+      break;\r
+    }\r
+\r
+    mHeap[i]  = mHeap[LoopVar1];\r
+    i         = LoopVar1;\r
+    LoopVar1         = 2 * i;\r
+  }\r
 \r
-Returns:\r
+  mHeap[i] = (INT16) LoopVar2;\r
+}\r
 \r
-  EFI_SUCCESS           - The compression is successful\r
-  EFI_OUT_0F_RESOURCES  - Not enough memory for compression process\r
+/**\r
+  Count the number of each code length for a Huffman tree.\r
 \r
+  @param[in] LoopVar1      The top node.\r
 **/\r
+VOID\r
+CountLen (\r
+  IN INT32 LoopVar1\r
+  )\r
 {\r
-  EFI_STATUS  Status;\r
-  INT32       LastMatchLen;\r
-  NODE        LastMatchPos;\r
-\r
-  Status = AllocateMemory ();\r
-  if (EFI_ERROR (Status)) {\r
-    FreeMemory ();\r
-    return Status;\r
+  if (LoopVar1 < mTempInt32) {\r
+    mLenCnt[(mHuffmanDepth < 16) ? mHuffmanDepth : 16]++;\r
+  } else {\r
+    mHuffmanDepth++;\r
+    CountLen (mLeft[LoopVar1]);\r
+    CountLen (mRight[LoopVar1]);\r
+    mHuffmanDepth--;\r
   }\r
+}\r
 \r
-  InitSlide ();\r
+/**\r
+  Create code length array for a Huffman tree.\r
 \r
-  HufEncodeStart ();\r
+  @param[in] Root   The root of the tree.\r
+**/\r
+VOID\r
+MakeLen (\r
+  IN INT32 Root\r
+  )\r
+{\r
+  INT32   LoopVar1;\r
 \r
-  mRemainder  = FreadCrc (&mText[WNDSIZ], WNDSIZ + MAXMATCH);\r
+  INT32   LoopVar2;\r
+  UINT32  Cum;\r
 \r
-  mMatchLen   = 0;\r
-  mPos        = WNDSIZ;\r
-  InsertNode ();\r
-  if (mMatchLen > mRemainder) {\r
-    mMatchLen = mRemainder;\r
+  for (LoopVar1 = 0; LoopVar1 <= 16; LoopVar1++) {\r
+    mLenCnt[LoopVar1] = 0;\r
   }\r
 \r
-  while (mRemainder > 0) {\r
-    LastMatchLen  = mMatchLen;\r
-    LastMatchPos  = mMatchPos;\r
-    GetNextMatch ();\r
-    if (mMatchLen > mRemainder) {\r
-      mMatchLen = mRemainder;\r
-    }\r
-\r
-    if (mMatchLen > LastMatchLen || LastMatchLen < THRESHOLD) {\r
-      //\r
-      // Not enough benefits are gained by outputting a pointer,\r
-      // so just output the original character\r
-      //\r
-      CompressOutput(mText[mPos - 1], 0);\r
-    } else {\r
-      //\r
-      // Outputting a pointer is beneficial enough, do it.\r
-      //\r
+  CountLen (Root);\r
 \r
-      CompressOutput(LastMatchLen + (UINT8_MAX + 1 - THRESHOLD),\r
-             (mPos - LastMatchPos - 2) & (WNDSIZ - 1));\r
-      LastMatchLen--;\r
-      while (LastMatchLen > 0) {\r
-        GetNextMatch ();\r
-        LastMatchLen--;\r
-      }\r
+  //\r
+  // Adjust the length count array so that\r
+  // no code will be generated longer than its designated length\r
+  //\r
+  Cum = 0;\r
+  for (LoopVar1 = 16; LoopVar1 > 0; LoopVar1--) {\r
+    Cum += mLenCnt[LoopVar1] << (16 - LoopVar1);\r
+  }\r
 \r
-      if (mMatchLen > mRemainder) {\r
-        mMatchLen = mRemainder;\r
+  while (Cum != (1U << 16)) {\r
+    mLenCnt[16]--;\r
+    for (LoopVar1 = 15; LoopVar1 > 0; LoopVar1--) {\r
+      if (mLenCnt[LoopVar1] != 0) {\r
+        mLenCnt[LoopVar1]--;\r
+        mLenCnt[LoopVar1 + 1] += 2;\r
+        break;\r
       }\r
     }\r
+\r
+    Cum--;\r
   }\r
 \r
-  HufEncodeEnd ();\r
-  FreeMemory ();\r
-  return EFI_SUCCESS;\r
+  for (LoopVar1 = 16; LoopVar1 > 0; LoopVar1--) {\r
+    LoopVar2 = mLenCnt[LoopVar1];\r
+    LoopVar2--;\r
+    while (LoopVar2 >= 0) {\r
+      mLen[*mSortPtr++] = (UINT8) LoopVar1;\r
+      LoopVar2--;\r
+    }\r
+  }\r
 }\r
 \r
+/**\r
+  Assign code to each symbol based on the code length array.\r
+  \r
+  @param[in] LoopVar8      The number of symbols.\r
+  @param[in] Len    The code length array.\r
+  @param[out] Code  The stores codes for each symbol.\r
+**/\r
 VOID\r
-EFIAPI\r
-CountTFreq (\r
-  VOID\r
+MakeCode (\r
+  IN  INT32         LoopVar8,\r
+  IN  UINT8 Len[    ],\r
+  OUT UINT16 Code[  ]\r
   )\r
-/*++\r
-\r
-Routine Description:\r
+{\r
+  INT32   LoopVar1;\r
+  UINT16  Start[18];\r
 \r
-  Count the frequencies for the Extra Set\r
+  Start[1] = 0;\r
+  for (LoopVar1 = 1; LoopVar1 <= 16; LoopVar1++) {\r
+    Start[LoopVar1 + 1] = (UINT16) ((Start[LoopVar1] + mLenCnt[LoopVar1]) << 1);\r
+  }\r
 \r
-Arguments: (VOID)\r
+  for (LoopVar1 = 0; LoopVar1 < LoopVar8; LoopVar1++) {\r
+    Code[LoopVar1] = Start[Len[LoopVar1]]++;\r
+  }\r
+}\r
+  \r
+/**\r
+  Generates Huffman codes given a frequency distribution of symbols.\r
 \r
-Returns: (VOID)\r
+  @param[in] NParm      The number of symbols.\r
+  @param[in] FreqParm   The frequency of each symbol.\r
+  @param[out] LenParm   The code length for each symbol.\r
+  @param[out] CodeParm  The code for each symbol.\r
 \r
+  @return The root of the Huffman tree.\r
 **/\r
+INT32\r
+MakeTree (\r
+  IN  INT32             NParm,\r
+  IN  UINT16  FreqParm[ ],\r
+  OUT UINT8   LenParm[  ],\r
+  OUT UINT16  CodeParm[ ]\r
+  )\r
 {\r
-  INT32 i;\r
+  INT32 LoopVar1;\r
 \r
-  INT32 k;\r
+  INT32 LoopVar2;\r
 \r
-  INT32 n;\r
+  INT32 LoopVar3;\r
 \r
-  INT32 Count;\r
+  INT32 Avail;\r
 \r
-  for (i = 0; i < NT; i++) {\r
-    mTFreq[i] = 0;\r
+  //\r
+  // make tree, calculate len[], return root\r
+  //\r
+  mTempInt32        = NParm;\r
+  mFreq     = FreqParm;\r
+  mLen      = LenParm;\r
+  Avail     = mTempInt32;\r
+  mHeapSize = 0;\r
+  mHeap[1]  = 0;\r
+  for (LoopVar1 = 0; LoopVar1 < mTempInt32; LoopVar1++) {\r
+    mLen[LoopVar1] = 0;\r
+    if ((mFreq[LoopVar1]) != 0) {\r
+      mHeapSize++;\r
+      mHeap[mHeapSize] = (INT16) LoopVar1;\r
+    }\r
   }\r
 \r
-  n = NC;\r
-  while (n > 0 && mCLen[n - 1] == 0) {\r
-    n--;\r
+  if (mHeapSize < 2) {\r
+    CodeParm[mHeap[1]] = 0;\r
+    return mHeap[1];\r
   }\r
 \r
-  i = 0;\r
-  while (i < n) {\r
-    k = mCLen[i++];\r
-    if (k == 0) {\r
-      Count = 1;\r
-      while (i < n && mCLen[i] == 0) {\r
-        i++;\r
-        Count++;\r
-      }\r
-\r
-      if (Count <= 2) {\r
-        mTFreq[0] = (UINT16) (mTFreq[0] + Count);\r
-      } else if (Count <= 18) {\r
-        mTFreq[1]++;\r
-      } else if (Count == 19) {\r
-        mTFreq[0]++;\r
-        mTFreq[1]++;\r
-      } else {\r
-        mTFreq[2]++;\r
-      }\r
-    } else {\r
-      ASSERT((k+2)<(2 * NT - 1));\r
-      mTFreq[k + 2]++;\r
-    }\r
+  for (LoopVar1 = mHeapSize / 2; LoopVar1 >= 1; LoopVar1--) {\r
+    //\r
+    // make priority queue\r
+    //\r
+    DownHeap (LoopVar1);\r
   }\r
-}\r
 \r
-VOID\r
-EFIAPI\r
-WritePTLen (\r
-  IN INT32 n,\r
-  IN INT32 nbit,\r
-  IN INT32 Special\r
-  )\r
-/*++\r
+  mSortPtr = CodeParm;\r
+  do {\r
+    LoopVar1 = mHeap[1];\r
+    if (LoopVar1 < mTempInt32) {\r
+      *mSortPtr++ = (UINT16) LoopVar1;\r
+    }\r
 \r
-Routine Description:\r
+    mHeap[1] = mHeap[mHeapSize--];\r
+    DownHeap (1);\r
+    LoopVar2 = mHeap[1];\r
+    if (LoopVar2 < mTempInt32) {\r
+      *mSortPtr++ = (UINT16) LoopVar2;\r
+    }\r
 \r
-  Outputs the code length array for the Extra Set or the Position Set.\r
+    LoopVar3         = Avail++;\r
+    mFreq[LoopVar3]  = (UINT16) (mFreq[LoopVar1] + mFreq[LoopVar2]);\r
+    mHeap[1]  = (INT16) LoopVar3;\r
+    DownHeap (1);\r
+    mLeft[LoopVar3]  = (UINT16) LoopVar1;\r
+    mRight[LoopVar3] = (UINT16) LoopVar2;\r
+  } while (mHeapSize > 1);\r
 \r
-Arguments:\r
+  mSortPtr = CodeParm;\r
+  MakeLen (LoopVar3);\r
+  MakeCode (NParm, LenParm, CodeParm);\r
 \r
-  n       - the number of symbols\r
-  nbit    - the number of bits needed to represent 'n'\r
-  Special - the special symbol that needs to be take care of\r
+  //\r
+  // return root\r
+  //\r
+  return LoopVar3;\r
+}\r
 \r
-Returns: (VOID)\r
+/**\r
+  Outputs rightmost LoopVar8 bits of x\r
 \r
+  @param[in] LoopVar8   The rightmost LoopVar8 bits of the data is used.\r
+  @param[in] x   The data.\r
 **/\r
+VOID\r
+PutBits (\r
+  IN INT32    LoopVar8,\r
+  IN UINT32   x\r
+  )\r
 {\r
-  INT32 i;\r
+  UINT8 Temp;\r
 \r
-  INT32 k;\r
+  if (LoopVar8 < mBitCount) {\r
+    mSubBitBuf |= x << (mBitCount -= LoopVar8);\r
+  } else {\r
 \r
-  while (n > 0 && mPTLen[n - 1] == 0) {\r
-    n--;\r
-  }\r
+    Temp = (UINT8)(mSubBitBuf | (x >> (LoopVar8 -= mBitCount)));\r
+    if (mDst < mDstUpperLimit) {\r
+      *mDst++ = Temp;\r
+    }\r
+    mCompSize++;\r
 \r
-  PutBits (nbit, n);\r
-  i = 0;\r
-  while (i < n) {\r
-    k = mPTLen[i++];\r
-    if (k <= 6) {\r
-      PutBits (3, k);\r
+    if (LoopVar8 < UINT8_BIT) {\r
+      mSubBitBuf = x << (mBitCount = UINT8_BIT - LoopVar8);\r
     } else {\r
-      PutBits (k - 3, (1U << (k - 3)) - 2);\r
-    }\r
 \r
-    if (i == Special) {\r
-      while (i < 6 && mPTLen[i] == 0) {\r
-        i++;\r
+      Temp = (UINT8)(x >> (LoopVar8 - UINT8_BIT));\r
+      if (mDst < mDstUpperLimit) {\r
+        *mDst++ = Temp;\r
       }\r
+      mCompSize++;\r
 \r
-      PutBits (2, (i - 3) & 3);\r
+      mSubBitBuf = x << (mBitCount = 2 * UINT8_BIT - LoopVar8);\r
     }\r
   }\r
 }\r
 \r
+/**\r
+  Encode a signed 32 bit number.\r
+\r
+  @param[in] LoopVar5     The number to encode.\r
+**/\r
 VOID\r
-EFIAPI\r
-WriteCLen (\r
-  VOID\r
+EncodeC (\r
+  IN INT32 LoopVar5\r
   )\r
-/*++\r
+{\r
+  PutBits (mCLen[LoopVar5], mCCode[LoopVar5]);\r
+}\r
 \r
-Routine Description:\r
+/**\r
+  Encode a unsigned 32 bit number.\r
 \r
-  Outputs the code length array for Char&Length Set\r
+  @param[in] LoopVar7     The number to encode.\r
+**/\r
+VOID\r
+EncodeP (\r
+  IN UINT32 LoopVar7\r
+  )\r
+{\r
+  UINT32  LoopVar5;\r
+\r
+  UINT32  LoopVar6;\r
+\r
+  LoopVar5 = 0;\r
+  LoopVar6 = LoopVar7;\r
+  while (LoopVar6 != 0) {\r
+    LoopVar6 >>= 1;\r
+    LoopVar5++;\r
+  }\r
 \r
-Arguments: (VOID)\r
+  PutBits (mPTLen[LoopVar5], mPTCode[LoopVar5]);\r
+  if (LoopVar5 > 1) {\r
+    PutBits(LoopVar5 - 1, LoopVar7 & (0xFFFFU >> (17 - LoopVar5)));\r
+  }\r
+}\r
 \r
-Returns: (VOID)\r
+/**\r
+  Count the frequencies for the Extra Set.\r
 \r
 **/\r
+VOID\r
+CountTFreq (\r
+  VOID\r
+  )\r
 {\r
-  INT32 i;\r
+  INT32 LoopVar1;\r
 \r
-  INT32 k;\r
+  INT32 LoopVar3;\r
 \r
-  INT32 n;\r
+  INT32 LoopVar8;\r
 \r
   INT32 Count;\r
 \r
-  n = NC;\r
-  while (n > 0 && mCLen[n - 1] == 0) {\r
-    n--;\r
+  for (LoopVar1 = 0; LoopVar1 < NT; LoopVar1++) {\r
+    mTFreq[LoopVar1] = 0;\r
+  }\r
+\r
+  LoopVar8 = NC;\r
+  while (LoopVar8 > 0 && mCLen[LoopVar8 - 1] == 0) {\r
+    LoopVar8--;\r
   }\r
 \r
-  PutBits (CBIT, n);\r
-  i = 0;\r
-  while (i < n) {\r
-    k = mCLen[i++];\r
-    if (k == 0) {\r
+  LoopVar1 = 0;\r
+  while (LoopVar1 < LoopVar8) {\r
+    LoopVar3 = mCLen[LoopVar1++];\r
+    if (LoopVar3 == 0) {\r
       Count = 1;\r
-      while (i < n && mCLen[i] == 0) {\r
-        i++;\r
+      while (LoopVar1 < LoopVar8 && mCLen[LoopVar1] == 0) {\r
+        LoopVar1++;\r
         Count++;\r
       }\r
 \r
       if (Count <= 2) {\r
-        for (k = 0; k < Count; k++) {\r
-          PutBits (mPTLen[0], mPTCode[0]);\r
-        }\r
+        mTFreq[0] = (UINT16) (mTFreq[0] + Count);\r
       } else if (Count <= 18) {\r
-        PutBits (mPTLen[1], mPTCode[1]);\r
-        PutBits (4, Count - 3);\r
+        mTFreq[1]++;\r
       } else if (Count == 19) {\r
-        PutBits (mPTLen[0], mPTCode[0]);\r
-        PutBits (mPTLen[1], mPTCode[1]);\r
-        PutBits (4, 15);\r
+        mTFreq[0]++;\r
+        mTFreq[1]++;\r
       } else {\r
-        PutBits (mPTLen[2], mPTCode[2]);\r
-        PutBits (CBIT, Count - 20);\r
+        mTFreq[2]++;\r
       }\r
     } else {\r
-      ASSERT((k+2)<NPT);\r
-      PutBits (mPTLen[k + 2], mPTCode[k + 2]);\r
+      ASSERT((LoopVar3+2)<(2 * NT - 1));\r
+      mTFreq[LoopVar3 + 2]++;\r
     }\r
   }\r
 }\r
 \r
-VOID\r
-EFIAPI\r
-EncodeC (\r
-  IN INT32 c\r
-  )\r
-{\r
-  PutBits (mCLen[c], mCCode[c]);\r
-}\r
+/**\r
+  Outputs the code length array for the Extra Set or the Position Set.\r
 \r
+  @param[in] LoopVar8       The number of symbols.\r
+  @param[in] nbit           The number of bits needed to represent 'LoopVar8'.\r
+  @param[in] Special        The special symbol that needs to be take care of.\r
+\r
+**/\r
 VOID\r
-EFIAPI\r
-EncodeP (\r
-  IN UINT32 p\r
+WritePTLen (\r
+  IN INT32 LoopVar8,\r
+  IN INT32 nbit,\r
+  IN INT32 Special\r
   )\r
 {\r
-  UINT32  c;\r
+  INT32 LoopVar1;\r
 \r
-  UINT32  q;\r
+  INT32 LoopVar3;\r
 \r
-  c = 0;\r
-  q = p;\r
-  while (q != 0) {\r
-    q >>= 1;\r
-    c++;\r
+  while (LoopVar8 > 0 && mPTLen[LoopVar8 - 1] == 0) {\r
+    LoopVar8--;\r
   }\r
 \r
-  PutBits (mPTLen[c], mPTCode[c]);\r
-  if (c > 1) {\r
-    PutBits(c - 1, p & (0xFFFFU >> (17 - c)));\r
+  PutBits (nbit, LoopVar8);\r
+  LoopVar1 = 0;\r
+  while (LoopVar1 < LoopVar8) {\r
+    LoopVar3 = mPTLen[LoopVar1++];\r
+    if (LoopVar3 <= 6) {\r
+      PutBits (3, LoopVar3);\r
+    } else {\r
+      PutBits (LoopVar3 - 3, (1U << (LoopVar3 - 3)) - 2);\r
+    }\r
+\r
+    if (LoopVar1 == Special) {\r
+      while (LoopVar1 < 6 && mPTLen[LoopVar1] == 0) {\r
+        LoopVar1++;\r
+      }\r
+\r
+      PutBits (2, (LoopVar1 - 3) & 3);\r
+    }\r
   }\r
 }\r
 \r
+/**\r
+  Outputs the code length array for Char&Length Set.\r
+**/\r
 VOID\r
-EFIAPI\r
-SendBlock (\r
+WriteCLen (\r
   VOID\r
   )\r
-/*++\r
+{\r
+  INT32 LoopVar1;\r
 \r
-Routine Description:\r
+  INT32 LoopVar3;\r
 \r
-  Huffman code the block and output it.\r
+  INT32 LoopVar8;\r
 \r
-Arguments:\r
+  INT32 Count;\r
 \r
-  None\r
+  LoopVar8 = NC;\r
+  while (LoopVar8 > 0 && mCLen[LoopVar8 - 1] == 0) {\r
+    LoopVar8--;\r
+  }\r
 \r
-Returns:\r
+  PutBits (CBIT, LoopVar8);\r
+  LoopVar1 = 0;\r
+  while (LoopVar1 < LoopVar8) {\r
+    LoopVar3 = mCLen[LoopVar1++];\r
+    if (LoopVar3 == 0) {\r
+      Count = 1;\r
+      while (LoopVar1 < LoopVar8 && mCLen[LoopVar1] == 0) {\r
+        LoopVar1++;\r
+        Count++;\r
+      }\r
 \r
-  None\r
+      if (Count <= 2) {\r
+        for (LoopVar3 = 0; LoopVar3 < Count; LoopVar3++) {\r
+          PutBits (mPTLen[0], mPTCode[0]);\r
+        }\r
+      } else if (Count <= 18) {\r
+        PutBits (mPTLen[1], mPTCode[1]);\r
+        PutBits (4, Count - 3);\r
+      } else if (Count == 19) {\r
+        PutBits (mPTLen[0], mPTCode[0]);\r
+        PutBits (mPTLen[1], mPTCode[1]);\r
+        PutBits (4, 15);\r
+      } else {\r
+        PutBits (mPTLen[2], mPTCode[2]);\r
+        PutBits (CBIT, Count - 20);\r
+      }\r
+    } else {\r
+      ASSERT((LoopVar3+2)<NPT);\r
+      PutBits (mPTLen[LoopVar3 + 2], mPTCode[LoopVar3 + 2]);\r
+    }\r
+  }\r
+}\r
+\r
+/**\r
+  Huffman code the block and output it.\r
 \r
 **/\r
+VOID\r
+SendBlock (\r
+  VOID\r
+  )\r
 {\r
-  UINT32  i;\r
+  UINT32  LoopVar1;\r
 \r
-  UINT32  k;\r
+  UINT32  LoopVar3;\r
 \r
   UINT32  Flags;\r
 \r
@@ -1222,18 +1133,18 @@ Returns:
   }\r
 \r
   Pos = 0;\r
-  for (i = 0; i < Size; i++) {\r
-    if (i % UINT8_BIT == 0) {\r
+  for (LoopVar1 = 0; LoopVar1 < Size; LoopVar1++) {\r
+    if (LoopVar1 % UINT8_BIT == 0) {\r
       Flags = mBuf[Pos++];\r
     } else {\r
       Flags <<= 1;\r
     }\r
     if ((Flags & (1U << (UINT8_BIT - 1))) != 0){\r
       EncodeC(mBuf[Pos++] + (1U << UINT8_BIT));\r
-      k = mBuf[Pos++] << UINT8_BIT;\r
-      k += mBuf[Pos++];\r
+      LoopVar3 = mBuf[Pos++] << UINT8_BIT;\r
+      LoopVar3 += mBuf[Pos++];\r
 \r
-      EncodeP (k);\r
+      EncodeP (LoopVar3);\r
     } else {\r
       EncodeC (mBuf[Pos++]);\r
     }\r
@@ -1243,26 +1154,36 @@ Returns:
   SetMem (mPFreq, NP * sizeof (UINT16), 0);\r
 }\r
 \r
+/**\r
+  Start the huffman encoding.\r
+\r
+**/\r
 VOID\r
-EFIAPI\r
-CompressOutput (\r
-  IN UINT32 c,\r
-  IN UINT32 p\r
+HufEncodeStart (\r
+  VOID\r
   )\r
-/*++\r
-\r
-Routine Description:\r
-\r
-  Outputs an Original Character or a Pointer\r
+{\r
+  SetMem (mCFreq, NC * sizeof (UINT16), 0);\r
+  SetMem (mPFreq, NP * sizeof (UINT16), 0);\r
 \r
-Arguments:\r
+  mOutputPos = mOutputMask = 0;\r
 \r
-  c     - The original character or the 'String Length' element of a Pointer\r
-  p     - The 'Position' field of a Pointer\r
+  mBitCount   = UINT8_BIT;\r
+  mSubBitBuf  = 0;\r
+}\r
 \r
-Returns: (VOID)\r
+/**\r
+  Outputs an Original Character or a Pointer.\r
 \r
+  @param[in] LoopVar5     The original character or the 'String Length' element of \r
+                   a Pointer.\r
+  @param[in] LoopVar7     The 'Position' field of a Pointer.\r
 **/\r
+VOID\r
+CompressOutput (\r
+  IN UINT32 LoopVar5,\r
+  IN UINT32 LoopVar7\r
+  )\r
 {\r
   STATIC UINT32 CPos;\r
 \r
@@ -1276,37 +1197,26 @@ Returns: (VOID)
     CPos        = mOutputPos++;\r
     mBuf[CPos]  = 0;\r
   }\r
-  mBuf[mOutputPos++] = (UINT8) c;\r
-  mCFreq[c]++;\r
-  if (c >= (1U << UINT8_BIT)) {\r
+  mBuf[mOutputPos++] = (UINT8) LoopVar5;\r
+  mCFreq[LoopVar5]++;\r
+  if (LoopVar5 >= (1U << UINT8_BIT)) {\r
     mBuf[CPos] = (UINT8)(mBuf[CPos]|mOutputMask);\r
-    mBuf[mOutputPos++] = (UINT8)(p >> UINT8_BIT);\r
-    mBuf[mOutputPos++] = (UINT8) p;\r
-    c                  = 0;\r
-    while (p!=0) {\r
-      p >>= 1;\r
-      c++;\r
+    mBuf[mOutputPos++] = (UINT8)(LoopVar7 >> UINT8_BIT);\r
+    mBuf[mOutputPos++] = (UINT8) LoopVar7;\r
+    LoopVar5                  = 0;\r
+    while (LoopVar7!=0) {\r
+      LoopVar7 >>= 1;\r
+      LoopVar5++;\r
     }\r
-    mPFreq[c]++;\r
+    mPFreq[LoopVar5]++;\r
   }\r
 }\r
 \r
-VOID\r
-EFIAPI\r
-HufEncodeStart (\r
-  VOID\r
-  )\r
-{\r
-  SetMem (mCFreq, NC * sizeof (UINT16), 0);\r
-  SetMem (mPFreq, NP * sizeof (UINT16), 0);\r
-\r
-  mOutputPos = mOutputMask = 0;\r
-  InitPutBits ();\r
-  return ;\r
-}\r
+/**\r
+  End the huffman encoding.\r
 \r
+**/\r
 VOID\r
-EFIAPI\r
 HufEncodeEnd (\r
   VOID\r
   )\r
@@ -1317,395 +1227,162 @@ HufEncodeEnd (
   // Flush remaining bits\r
   //\r
   PutBits (UINT8_BIT - 1, 0);\r
-\r
-  return ;\r
 }\r
 \r
-VOID\r
-EFIAPI\r
-MakeCrcTable (\r
+/**\r
+  The main controlling routine for compression process.\r
+\r
+  @retval EFI_SUCCESS           The compression is successful.\r
+  @retval EFI_OUT_0F_RESOURCES  Not enough memory for compression process.\r
+**/\r
+EFI_STATUS\r
+Encode (\r
   VOID\r
   )\r
 {\r
-  UINT32  i;\r
-\r
-  UINT32  j;\r
-\r
-  UINT32  r;\r
-\r
-  for (i = 0; i <= UINT8_MAX; i++) {\r
-    r = i;\r
-    for (j = 0; j < UINT8_BIT; j++) {\r
-      if ((r & 1) != 0) {\r
-        r = (r >> 1) ^ CRCPOLY;\r
-      } else {\r
-        r >>= 1;\r
-      }\r
-    }\r
+  EFI_STATUS  Status;\r
+  INT32       LastMatchLen;\r
+  NODE        LastMatchPos;\r
 \r
-    mCrcTable[i] = (UINT16) r;\r
+  Status = AllocateMemory ();\r
+  if (EFI_ERROR (Status)) {\r
+    FreeMemory ();\r
+    return Status;\r
   }\r
-}\r
-\r
-VOID\r
-EFIAPI\r
-PutBits (\r
-  IN INT32    n,\r
-  IN UINT32   x\r
-  )\r
-/*++\r
 \r
-Routine Description:\r
-\r
-  Outputs rightmost n bits of x\r
-\r
-Arguments:\r
-\r
-  n   - the rightmost n bits of the data is used\r
-  x   - the data\r
-\r
-Returns:\r
+  InitSlide ();\r
 \r
-  None\r
+  HufEncodeStart ();\r
 \r
-**/\r
-{\r
-  UINT8 Temp;\r
+  mRemainder  = FreadCrc (&mText[WNDSIZ], WNDSIZ + MAXMATCH);\r
 \r
-  if (n < mBitCount) {\r
-    mSubBitBuf |= x << (mBitCount -= n);\r
-  } else {\r
+  mMatchLen   = 0;\r
+  mPos        = WNDSIZ;\r
+  InsertNode ();\r
+  if (mMatchLen > mRemainder) {\r
+    mMatchLen = mRemainder;\r
+  }\r
 \r
-    Temp = (UINT8)(mSubBitBuf | (x >> (n -= mBitCount)));\r
-    if (mDst < mDstUpperLimit) {\r
-      *mDst++ = Temp;\r
+  while (mRemainder > 0) {\r
+    LastMatchLen  = mMatchLen;\r
+    LastMatchPos  = mMatchPos;\r
+    if (!GetNextMatch ()) {\r
+      Status = EFI_OUT_OF_RESOURCES;\r
+    }\r
+    if (mMatchLen > mRemainder) {\r
+      mMatchLen = mRemainder;\r
     }\r
-    mCompSize++;\r
 \r
-    if (n < UINT8_BIT) {\r
-      mSubBitBuf = x << (mBitCount = UINT8_BIT - n);\r
+    if (mMatchLen > LastMatchLen || LastMatchLen < THRESHOLD) {\r
+      //\r
+      // Not enough benefits are gained by outputting a pointer,\r
+      // so just output the original character\r
+      //\r
+      CompressOutput(mText[mPos - 1], 0);\r
     } else {\r
+      //\r
+      // Outputting a pointer is beneficial enough, do it.\r
+      //\r
 \r
-      Temp = (UINT8)(x >> (n - UINT8_BIT));\r
-      if (mDst < mDstUpperLimit) {\r
-        *mDst++ = Temp;\r
+      CompressOutput(LastMatchLen + (UINT8_MAX + 1 - THRESHOLD),\r
+             (mPos - LastMatchPos - 2) & (WNDSIZ - 1));\r
+      LastMatchLen--;\r
+      while (LastMatchLen > 0) {\r
+        if (!GetNextMatch ()) {\r
+          Status = EFI_OUT_OF_RESOURCES;\r
+        }\r
+        LastMatchLen--;\r
       }\r
-      mCompSize++;\r
 \r
-      mSubBitBuf = x << (mBitCount = 2 * UINT8_BIT - n);\r
+      if (mMatchLen > mRemainder) {\r
+        mMatchLen = mRemainder;\r
+      }\r
     }\r
   }\r
-}\r
-\r
-INT32\r
-EFIAPI\r
-FreadCrc (\r
-  OUT UINT8 *p,\r
-  IN  INT32 n\r
-  )\r
-/*++\r
-\r
-Routine Description:\r
-\r
-  Read in source data\r
-\r
-Arguments:\r
-\r
-  p   - the buffer to hold the data\r
-  n   - number of bytes to read\r
-\r
-Returns:\r
-\r
-  number of bytes actually read\r
-\r
-**/\r
-{\r
-  INT32 i;\r
-\r
-  for (i = 0; mSrc < mSrcUpperLimit && i < n; i++) {\r
-    *p++ = *mSrc++;\r
-  }\r
 \r
-  n = i;\r
-\r
-  p -= n;\r
-  mOrigSize += n;\r
-  i--;\r
-  while (i >= 0) {\r
-    UPDATE_CRC (*p++);\r
-    i--;\r
-  }\r
-\r
-  return n;\r
-}\r
-\r
-VOID\r
-EFIAPI\r
-InitPutBits (\r
-  VOID\r
-  )\r
-{\r
-  mBitCount   = UINT8_BIT;\r
-  mSubBitBuf  = 0;\r
+  HufEncodeEnd ();\r
+  FreeMemory ();\r
+  return (Status);\r
 }\r
 \r
-VOID\r
-EFIAPI\r
-CountLen (\r
-  IN INT32 i\r
-  )\r
-/*++\r
-\r
-Routine Description:\r
-\r
-  Count the number of each code length for a Huffman tree.\r
-\r
-Arguments:\r
-\r
-  i   - the top node\r
+/**\r
+  The compression routine.\r
 \r
-Returns: (VOID)\r
+  @param[in]       SrcBuffer     The buffer containing the source data.\r
+  @param[in]       SrcSize       Number of bytes in SrcBuffer.\r
+  @param[in]       DstBuffer     The buffer to put the compressed image in.\r
+  @param[in, out]  DstSize       On input the size (in bytes) of DstBuffer, on\r
+                                 return the number of bytes placed in DstBuffer.\r
 \r
+  @retval EFI_SUCCESS           The compression was sucessful.\r
+  @retval EFI_BUFFER_TOO_SMALL  The buffer was too small.  DstSize is required.\r
 **/\r
-{\r
-  STATIC INT32  Depth = 0;\r
-\r
-  if (i < mN) {\r
-    mLenCnt[(Depth < 16) ? Depth : 16]++;\r
-  } else {\r
-    Depth++;\r
-    CountLen (mLeft[i]);\r
-    CountLen (mRight[i]);\r
-    Depth--;\r
-  }\r
-}\r
-\r
-VOID\r
-EFIAPI\r
-MakeLen (\r
-  IN INT32 Root\r
+EFI_STATUS\r
+Compress (\r
+  IN      VOID    *SrcBuffer,\r
+  IN      UINT64  SrcSize,\r
+  IN      VOID    *DstBuffer,\r
+  IN OUT  UINT64  *DstSize\r
   )\r
-/*++\r
-\r
-Routine Description:\r
-\r
-  Create code length array for a Huffman tree\r
-\r
-Arguments:\r
-\r
-  Root   - the root of the tree\r
-\r
-Returns:\r
-\r
-  None\r
-\r
-**/\r
 {\r
-  INT32   i;\r
-\r
-  INT32   k;\r
-  UINT32  Cum;\r
-\r
-  for (i = 0; i <= 16; i++) {\r
-    mLenCnt[i] = 0;\r
-  }\r
-\r
-  CountLen (Root);\r
+  EFI_STATUS  Status;\r
 \r
   //\r
-  // Adjust the length count array so that\r
-  // no code will be generated longer than its designated length\r
+  // Initializations\r
   //\r
-  Cum = 0;\r
-  for (i = 16; i > 0; i--) {\r
-    Cum += mLenCnt[i] << (16 - i);\r
-  }\r
-\r
-  while (Cum != (1U << 16)) {\r
-    mLenCnt[16]--;\r
-    for (i = 15; i > 0; i--) {\r
-      if (mLenCnt[i] != 0) {\r
-        mLenCnt[i]--;\r
-        mLenCnt[i + 1] += 2;\r
-        break;\r
-      }\r
-    }\r
+  mBufSiz         = 0;\r
+  mBuf            = NULL;\r
+  mText           = NULL;\r
+  mLevel          = NULL;\r
+  mChildCount     = NULL;\r
+  mPosition       = NULL;\r
+  mParent         = NULL;\r
+  mPrev           = NULL;\r
+  mNext           = NULL;\r
 \r
-    Cum--;\r
-  }\r
+  mSrc            = SrcBuffer;\r
+  mSrcUpperLimit  = mSrc + SrcSize;\r
+  mDst            = DstBuffer;\r
+  mDstUpperLimit  = mDst +*DstSize;\r
 \r
-  for (i = 16; i > 0; i--) {\r
-    k = mLenCnt[i];\r
-    k--;\r
-    while (k >= 0) {\r
-      mLen[*mSortPtr++] = (UINT8) i;\r
-      k--;\r
-    }\r
-  }\r
-}\r
+  PutDword (0L);\r
+  PutDword (0L);\r
 \r
-VOID\r
-EFIAPI\r
-DownHeap (\r
-  IN INT32 i\r
-  )\r
-{\r
-  INT32 j;\r
+  MakeCrcTable ();\r
 \r
-  INT32 k;\r
+  mOrigSize             = mCompSize = 0;\r
+  mCrc                  = INIT_CRC;\r
 \r
   //\r
-  // priority queue: send i-th entry down heap\r
+  // Compress it\r
   //\r
-  k = mHeap[i];\r
-  j = 2 * i;\r
-  while (j <= mHeapSize) {\r
-    if (j < mHeapSize && mFreq[mHeap[j]] > mFreq[mHeap[j + 1]]) {\r
-      j++;\r
-    }\r
-\r
-    if (mFreq[k] <= mFreq[mHeap[j]]) {\r
-      break;\r
-    }\r
-\r
-    mHeap[i]  = mHeap[j];\r
-    i         = j;\r
-    j         = 2 * i;\r
-  }\r
-\r
-  mHeap[i] = (INT16) k;\r
-}\r
-\r
-VOID\r
-EFIAPI\r
-MakeCode (\r
-  IN  INT32         n,\r
-  IN  UINT8 Len[    ],\r
-  OUT UINT16 Code[  ]\r
-  )\r
-/*++\r
-\r
-Routine Description:\r
-\r
-  Assign code to each symbol based on the code length array\r
-\r
-Arguments:\r
-\r
-  n     - number of symbols\r
-  Len   - the code length array\r
-  Code  - stores codes for each symbol\r
-\r
-Returns:\r
-\r
-  None\r
-\r
-**/\r
-{\r
-  INT32   i;\r
-  UINT16  Start[18];\r
-\r
-  Start[1] = 0;\r
-  for (i = 1; i <= 16; i++) {\r
-    Start[i + 1] = (UINT16) ((Start[i] + mLenCnt[i]) << 1);\r
-  }\r
-\r
-  for (i = 0; i < n; i++) {\r
-    Code[i] = Start[Len[i]]++;\r
+  Status = Encode ();\r
+  if (EFI_ERROR (Status)) {\r
+    return EFI_OUT_OF_RESOURCES;\r
   }\r
-}\r
-\r
-INT32\r
-EFIAPI\r
-MakeTree (\r
-  IN  INT32             NParm,\r
-  IN  UINT16  FreqParm[ ],\r
-  OUT UINT8   LenParm[  ],\r
-  OUT UINT16  CodeParm[ ]\r
-  )\r
-/*++\r
-\r
-Routine Description:\r
-\r
-  Generates Huffman codes given a frequency distribution of symbols\r
-\r
-Arguments:\r
-\r
-  NParm    - number of symbols\r
-  FreqParm - frequency of each symbol\r
-  LenParm  - code length for each symbol\r
-  CodeParm - code for each symbol\r
-\r
-Returns:\r
-\r
-  Root of the Huffman tree.\r
-\r
-**/\r
-{\r
-  INT32 i;\r
-\r
-  INT32 j;\r
-\r
-  INT32 k;\r
-\r
-  INT32 Avail;\r
-\r
   //\r
-  // make tree, calculate len[], return root\r
+  // Null terminate the compressed data\r
   //\r
-  mN        = NParm;\r
-  mFreq     = FreqParm;\r
-  mLen      = LenParm;\r
-  Avail     = mN;\r
-  mHeapSize = 0;\r
-  mHeap[1]  = 0;\r
-  for (i = 0; i < mN; i++) {\r
-    mLen[i] = 0;\r
-    if ((mFreq[i]) != 0) {\r
-      mHeapSize++;\r
-      mHeap[mHeapSize] = (INT16) i;\r
-    }\r
-  }\r
-\r
-  if (mHeapSize < 2) {\r
-    CodeParm[mHeap[1]] = 0;\r
-    return mHeap[1];\r
-  }\r
-\r
-  for (i = mHeapSize / 2; i >= 1; i--) {\r
-    //\r
-    // make priority queue\r
-    //\r
-    DownHeap (i);\r
+  if (mDst < mDstUpperLimit) {\r
+    *mDst++ = 0;\r
   }\r
-\r
-  mSortPtr = CodeParm;\r
-  do {\r
-    i = mHeap[1];\r
-    if (i < mN) {\r
-      *mSortPtr++ = (UINT16) i;\r
-    }\r
-\r
-    mHeap[1] = mHeap[mHeapSize--];\r
-    DownHeap (1);\r
-    j = mHeap[1];\r
-    if (j < mN) {\r
-      *mSortPtr++ = (UINT16) j;\r
-    }\r
-\r
-    k         = Avail++;\r
-    mFreq[k]  = (UINT16) (mFreq[i] + mFreq[j]);\r
-    mHeap[1]  = (INT16) k;\r
-    DownHeap (1);\r
-    mLeft[k]  = (UINT16) i;\r
-    mRight[k] = (UINT16) j;\r
-  } while (mHeapSize > 1);\r
-\r
-  mSortPtr = CodeParm;\r
-  MakeLen (k);\r
-  MakeCode (NParm, LenParm, CodeParm);\r
+  //\r
+  // Fill in compressed size and original size\r
+  //\r
+  mDst = DstBuffer;\r
+  PutDword (mCompSize + 1);\r
+  PutDword (mOrigSize);\r
 \r
   //\r
-  // return root\r
+  // Return\r
   //\r
-  return k;\r
+  if (mCompSize + 1 + 8 > *DstSize) {\r
+    *DstSize = mCompSize + 1 + 8;\r
+    return EFI_BUFFER_TOO_SMALL;\r
+  } else {\r
+    *DstSize = mCompSize + 1 + 8;\r
+    return EFI_SUCCESS;\r
+  }\r
+\r
 }\r
+\r