/** @file\r
-Compression routine. The compression algorithm is a mixture of LZ77 and Huffman \r
-coding. LZ77 transforms the source data into a sequence of Original Characters \r
-and Pointers to repeated strings. This sequence is further divided into Blocks \r
+Compression routine. The compression algorithm is a mixture of LZ77 and Huffman\r
+coding. LZ77 transforms the source data into a sequence of Original Characters\r
+and Pointers to repeated strings. This sequence is further divided into Blocks\r
and Huffman codings are applied to each Block.\r
- \r
-Copyright (c) 2006 - 2014, 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
+\r
+Copyright (c) 2006 - 2018, 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
\r
**/\r
\r
//\r
\r
STATIC\r
-VOID \r
+VOID\r
PutDword(\r
IN UINT32 Data\r
);\r
\r
STATIC\r
-EFI_STATUS \r
+EFI_STATUS\r
AllocateMemory (\r
);\r
\r
FreeMemory (\r
);\r
\r
-STATIC \r
-VOID \r
+STATIC\r
+VOID\r
InitSlide (\r
);\r
\r
-STATIC \r
-NODE \r
+STATIC\r
+NODE\r
Child (\r
- IN NODE q, \r
+ IN NODE q,\r
IN UINT8 c\r
);\r
\r
-STATIC \r
-VOID \r
+STATIC\r
+VOID\r
MakeChild (\r
- IN NODE q, \r
- IN UINT8 c, \r
+ IN NODE q,\r
+ IN UINT8 c,\r
IN NODE r\r
);\r
- \r
-STATIC \r
-VOID \r
+\r
+STATIC\r
+VOID\r
Split (\r
IN NODE Old\r
);\r
\r
-STATIC \r
-VOID \r
+STATIC\r
+VOID\r
InsertNode (\r
);\r
- \r
-STATIC \r
-VOID \r
+\r
+STATIC\r
+VOID\r
DeleteNode (\r
);\r
\r
-STATIC \r
-VOID \r
+STATIC\r
+VOID\r
GetNextMatch (\r
);\r
- \r
-STATIC \r
-EFI_STATUS \r
+\r
+STATIC\r
+EFI_STATUS\r
Encode (\r
);\r
\r
-STATIC \r
-VOID \r
+STATIC\r
+VOID\r
CountTFreq (\r
);\r
\r
-STATIC \r
-VOID \r
+STATIC\r
+VOID\r
WritePTLen (\r
- IN INT32 n, \r
- IN INT32 nbit, \r
+ IN INT32 n,\r
+ IN INT32 nbit,\r
IN INT32 Special\r
);\r
\r
-STATIC \r
-VOID \r
+STATIC\r
+VOID\r
WriteCLen (\r
);\r
- \r
-STATIC \r
-VOID \r
+\r
+STATIC\r
+VOID\r
EncodeC (\r
IN INT32 c\r
);\r
\r
-STATIC \r
-VOID \r
+STATIC\r
+VOID\r
EncodeP (\r
IN UINT32 p\r
);\r
\r
-STATIC \r
-VOID \r
+STATIC\r
+VOID\r
SendBlock (\r
);\r
- \r
-STATIC \r
-VOID \r
+\r
+STATIC\r
+VOID\r
Output (\r
- IN UINT32 c, \r
+ IN UINT32 c,\r
IN UINT32 p\r
);\r
\r
-STATIC \r
-VOID \r
+STATIC\r
+VOID\r
HufEncodeStart (\r
);\r
- \r
-STATIC \r
-VOID \r
+\r
+STATIC\r
+VOID\r
HufEncodeEnd (\r
);\r
- \r
-STATIC \r
-VOID \r
+\r
+STATIC\r
+VOID\r
MakeCrcTable (\r
);\r
- \r
-STATIC \r
-VOID \r
+\r
+STATIC\r
+VOID\r
PutBits (\r
- IN INT32 n, \r
+ IN INT32 n,\r
IN UINT32 x\r
);\r
- \r
-STATIC \r
-INT32 \r
+\r
+STATIC\r
+INT32\r
FreadCrc (\r
- OUT UINT8 *p, \r
+ OUT UINT8 *p,\r
IN INT32 n\r
);\r
- \r
-STATIC \r
-VOID \r
+\r
+STATIC\r
+VOID\r
InitPutBits (\r
);\r
- \r
-STATIC \r
-VOID \r
+\r
+STATIC\r
+VOID\r
CountLen (\r
IN INT32 i\r
);\r
\r
-STATIC \r
-VOID \r
+STATIC\r
+VOID\r
MakeLen (\r
IN INT32 Root\r
);\r
- \r
-STATIC \r
-VOID \r
+\r
+STATIC\r
+VOID\r
DownHeap (\r
IN INT32 i\r
);\r
\r
-STATIC \r
-VOID \r
+STATIC\r
+VOID\r
MakeCode (\r
- IN INT32 n, \r
- IN UINT8 Len[], \r
+ IN INT32 n,\r
+ IN UINT8 Len[],\r
OUT UINT16 Code[]\r
);\r
- \r
-STATIC \r
-INT32 \r
+\r
+STATIC\r
+INT32\r
MakeTree (\r
- IN INT32 NParm, \r
- IN UINT16 FreqParm[], \r
- OUT UINT8 LenParm[], \r
+ IN INT32 NParm,\r
+ IN UINT16 FreqParm[],\r
+ OUT UINT8 LenParm[],\r
OUT UINT16 CodeParm[]\r
);\r
\r
--*/\r
{\r
EFI_STATUS Status = EFI_SUCCESS;\r
- \r
+\r
//\r
// Initializations\r
//\r
mPrev = NULL;\r
mNext = NULL;\r
\r
- \r
+\r
mSrc = SrcBuffer;\r
mSrcUpperLimit = mSrc + SrcSize;\r
mDst = DstBuffer;\r
\r
PutDword(0L);\r
PutDword(0L);\r
- \r
+\r
MakeCrcTable ();\r
\r
mOrigSize = mCompSize = 0;\r
mCrc = INIT_CRC;\r
- \r
+\r
//\r
// Compress it\r
//\r
- \r
+\r
Status = Encode();\r
if (EFI_ERROR (Status)) {\r
return EFI_OUT_OF_RESOURCES;\r
}\r
- \r
+\r
//\r
// Null terminate the compressed data\r
//\r
if (mDst < mDstUpperLimit) {\r
*mDst++ = 0;\r
}\r
- \r
+\r
//\r
// Fill in compressed size and original size\r
//\r
//\r
// Return\r
//\r
- \r
+\r
if (mCompSize + 1 + 8 > *DstSize) {\r
*DstSize = mCompSize + 1 + 8;\r
return EFI_BUFFER_TOO_SMALL;\r
\r
}\r
\r
-STATIC \r
-VOID \r
+STATIC\r
+VOID\r
PutDword(\r
IN UINT32 Data\r
)\r
Routine Description:\r
\r
Put a dword to output stream\r
- \r
+\r
Arguments:\r
\r
Data - the dword to put\r
- \r
+\r
Returns: (VOID)\r
- \r
+\r
--*/\r
{\r
if (mDst < mDstUpperLimit) {\r
Routine Description:\r
\r
Allocate memory spaces for data structures used in compression process\r
- \r
+\r
Argements: (VOID)\r
\r
Returns:\r
--*/\r
{\r
UINT32 i;\r
- \r
+\r
mText = malloc (WNDSIZ * 2 + MAXMATCH);\r
if (mText == NULL) {\r
return EFI_OUT_OF_RESOURCES;\r
mParent == NULL || mPrev == NULL || mNext == NULL) {\r
return EFI_OUT_OF_RESOURCES;\r
}\r
- \r
+\r
mBufSiz = 16 * 1024U;\r
while ((mBuf = malloc(mBufSiz)) == NULL) {\r
mBufSiz = (mBufSiz / 10U) * 9U;\r
}\r
}\r
mBuf[0] = 0;\r
- \r
+\r
return EFI_SUCCESS;\r
}\r
\r
Routine Description:\r
\r
Called when compression is completed to free memory previously allocated.\r
- \r
+\r
Arguments: (VOID)\r
\r
Returns: (VOID)\r
if (mText) {\r
free (mText);\r
}\r
- \r
+\r
if (mLevel) {\r
free (mLevel);\r
}\r
- \r
+\r
if (mChildCount) {\r
free (mChildCount);\r
}\r
- \r
+\r
if (mPosition) {\r
free (mPosition);\r
}\r
- \r
+\r
if (mParent) {\r
free (mParent);\r
}\r
- \r
+\r
if (mPrev) {\r
free (mPrev);\r
}\r
- \r
+\r
if (mNext) {\r
free (mNext);\r
}\r
- \r
+\r
if (mBuf) {\r
free (mBuf);\r
- } \r
+ }\r
\r
return;\r
}\r
\r
\r
-STATIC \r
-VOID \r
+STATIC\r
+VOID\r
InitSlide ()\r
/*++\r
\r
Routine Description:\r
\r
Initialize String Info Log data structures\r
- \r
+\r
Arguments: (VOID)\r
\r
Returns: (VOID)\r
}\r
for (i = WNDSIZ; i < WNDSIZ * 2; i++) {\r
mParent[i] = NIL;\r
- } \r
+ }\r
mAvail = 1;\r
for (i = 1; i < WNDSIZ - 1; i++) {\r
mNext[i] = (NODE)(i + 1);\r
}\r
- \r
+\r
mNext[WNDSIZ - 1] = NIL;\r
for (i = WNDSIZ * 2; i <= MAX_HASH_VAL; i++) {\r
mNext[i] = NIL;\r
- } \r
+ }\r
}\r
\r
\r
-STATIC \r
-NODE \r
+STATIC\r
+NODE\r
Child (\r
- IN NODE q, \r
+ IN NODE q,\r
IN UINT8 c\r
)\r
/*++\r
Routine Description:\r
\r
Find child node given the parent node and the edge character\r
- \r
+\r
Arguments:\r
\r
q - the parent node\r
c - the edge character\r
- \r
+\r
Returns:\r
\r
- The child node (NIL if not found) \r
- \r
+ The child node (NIL if not found)\r
+\r
--*/\r
{\r
NODE r;\r
- \r
+\r
r = mNext[HASH(q, c)];\r
mParent[NIL] = q; /* sentinel */\r
while (mParent[r] != q) {\r
r = mNext[r];\r
}\r
- \r
+\r
return r;\r
}\r
\r
-STATIC \r
-VOID \r
+STATIC\r
+VOID\r
MakeChild (\r
- IN NODE q, \r
- IN UINT8 c, \r
+ IN NODE q,\r
+ IN UINT8 c,\r
IN NODE r\r
)\r
/*++\r
Routine Description:\r
\r
Create a new child for a given parent node.\r
- \r
+\r
Arguments:\r
\r
q - the parent node\r
c - the edge character\r
r - the child node\r
- \r
+\r
Returns: (VOID)\r
\r
--*/\r
{\r
NODE h, t;\r
- \r
+\r
h = (NODE)HASH(q, c);\r
t = mNext[h];\r
mNext[h] = r;\r
mChildCount[q]++;\r
}\r
\r
-STATIC \r
-VOID \r
+STATIC\r
+VOID\r
Split (\r
NODE Old\r
)\r
Routine Description:\r
\r
Split a node.\r
- \r
+\r
Arguments:\r
\r
Old - the node to split\r
- \r
+\r
Returns: (VOID)\r
\r
--*/\r
MakeChild(New, mText[mPos + mMatchLen], mPos);\r
}\r
\r
-STATIC \r
-VOID \r
+STATIC\r
+VOID\r
InsertNode ()\r
/*++\r
\r
Routine Description:\r
\r
Insert string info for current position into the String Info Log\r
- \r
+\r
Arguments: (VOID)\r
\r
Returns: (VOID)\r
UINT8 c, *t1, *t2;\r
\r
if (mMatchLen >= 4) {\r
- \r
+\r
//\r
// We have just got a long match, the target tree\r
// can be located by MatchPos + 1. Travese the tree\r
// The usage of PERC_FLAG ensures proper node deletion\r
// in DeleteNode() later.\r
//\r
- \r
+\r
mMatchLen--;\r
r = (INT16)((mMatchPos + 1) | WNDSIZ);\r
while ((q = mParent[r]) == NIL) {\r
}\r
if (t < WNDSIZ) {\r
mPosition[t] = (NODE)(mPos | PERC_FLAG);\r
- } \r
+ }\r
} else {\r
- \r
+\r
//\r
// Locate the target tree\r
//\r
- \r
+\r
q = (INT16)(mText[mPos] + WNDSIZ);\r
c = mText[mPos + 1];\r
if ((r = Child(q, c)) == NIL) {\r
}\r
mMatchLen = 2;\r
}\r
- \r
+\r
//\r
// Traverse down the tree to find a match.\r
// Update Position value along the route.\r
// Node split or creation is involved.\r
//\r
- \r
+\r
for ( ; ; ) {\r
if (r >= WNDSIZ) {\r
j = MAXMATCH;\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
mPrev[t] = mPos;\r
mParent[mPos] = q;\r
mParent[r] = NIL;\r
- \r
+\r
//\r
// Special usage of 'next'\r
//\r
mNext[r] = mPos;\r
- \r
+\r
}\r
\r
-STATIC \r
-VOID \r
+STATIC\r
+VOID\r
DeleteNode ()\r
/*++\r
\r
\r
Delete outdated string info. (The Usage of PERC_FLAG\r
ensures a clean deletion)\r
- \r
+\r
Arguments: (VOID)\r
\r
Returns: (VOID)\r
if (mParent[mPos] == NIL) {\r
return;\r
}\r
- \r
+\r
r = mPrev[mPos];\r
s = mNext[mPos];\r
mNext[r] = s;\r
mAvail = r;\r
}\r
\r
-STATIC \r
-VOID \r
+STATIC\r
+VOID\r
GetNextMatch ()\r
/*++\r
\r
Arguments: (VOID)\r
\r
Returns:\r
- \r
+\r
EFI_SUCCESS - The compression is successful\r
EFI_OUT_0F_RESOURCES - Not enough memory for compression process\r
\r
}\r
\r
InitSlide();\r
- \r
+\r
HufEncodeStart();\r
\r
mRemainder = FreadCrc(&mText[WNDSIZ], WNDSIZ + MAXMATCH);\r
- \r
+\r
mMatchLen = 0;\r
mPos = WNDSIZ;\r
InsertNode();\r
if (mMatchLen > mRemainder) {\r
mMatchLen = mRemainder;\r
}\r
- \r
+\r
if (mMatchLen > LastMatchLen || LastMatchLen < THRESHOLD) {\r
- \r
+\r
//\r
// Not enough benefits are gained by outputting a pointer,\r
// so just output the original character\r
//\r
- \r
+\r
Output(mText[mPos - 1], 0);\r
} else {\r
- \r
+\r
//\r
// Outputting a pointer is beneficial enough, do it.\r
//\r
- \r
+\r
Output(LastMatchLen + (UINT8_MAX + 1 - THRESHOLD),\r
(mPos - LastMatchPos - 2) & (WNDSIZ - 1));\r
while (--LastMatchLen > 0) {\r
}\r
}\r
}\r
- \r
+\r
HufEncodeEnd();\r
FreeMemory();\r
return EFI_SUCCESS;\r
}\r
\r
-STATIC \r
-VOID \r
+STATIC\r
+VOID\r
CountTFreq ()\r
/*++\r
\r
Routine Description:\r
\r
Count the frequencies for the Extra Set\r
- \r
+\r
Arguments: (VOID)\r
\r
Returns: (VOID)\r
}\r
}\r
\r
-STATIC \r
-VOID \r
+STATIC\r
+VOID\r
WritePTLen (\r
- IN INT32 n, \r
- IN INT32 nbit, \r
+ IN INT32 n,\r
+ IN INT32 nbit,\r
IN INT32 Special\r
)\r
/*++\r
Routine Description:\r
\r
Outputs the code length array for the Extra Set or the Position Set.\r
- \r
+\r
Arguments:\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
+\r
Returns: (VOID)\r
\r
--*/\r
}\r
}\r
\r
-STATIC \r
-VOID \r
+STATIC\r
+VOID\r
WriteCLen ()\r
/*++\r
\r
Routine Description:\r
\r
Outputs the code length array for Char&Length Set\r
- \r
+\r
Arguments: (VOID)\r
\r
Returns: (VOID)\r
}\r
}\r
\r
-STATIC \r
-VOID \r
+STATIC\r
+VOID\r
EncodeC (\r
IN INT32 c\r
)\r
PutBits(mCLen[c], mCCode[c]);\r
}\r
\r
-STATIC \r
-VOID \r
+STATIC\r
+VOID\r
EncodeP (\r
IN UINT32 p\r
)\r
}\r
}\r
\r
-STATIC \r
-VOID \r
+STATIC\r
+VOID\r
SendBlock ()\r
/*++\r
\r
Routine Description:\r
\r
Huffman code the block and output it.\r
- \r
+\r
Argument: (VOID)\r
\r
Returns: (VOID)\r
}\r
\r
\r
-STATIC \r
-VOID \r
+STATIC\r
+VOID\r
Output (\r
- IN UINT32 c, \r
+ IN UINT32 c,\r
IN UINT32 p\r
)\r
/*++\r
SendBlock();\r
mOutputPos = 0;\r
}\r
- CPos = mOutputPos++; \r
+ CPos = mOutputPos++;\r
mBuf[CPos] = 0;\r
}\r
mBuf[mOutputPos++] = (UINT8) c;\r
return;\r
}\r
\r
-STATIC \r
-VOID \r
+STATIC\r
+VOID\r
HufEncodeEnd ()\r
{\r
SendBlock();\r
- \r
+\r
//\r
// Flush remaining bits\r
//\r
PutBits(UINT8_BIT - 1, 0);\r
- \r
+\r
return;\r
}\r
\r
\r
-STATIC \r
-VOID \r
+STATIC\r
+VOID\r
MakeCrcTable ()\r
{\r
UINT32 i, j, r;\r
r >>= 1;\r
}\r
}\r
- mCrcTable[i] = (UINT16)r; \r
+ mCrcTable[i] = (UINT16)r;\r
}\r
}\r
\r
-STATIC \r
-VOID \r
+STATIC\r
+VOID\r
PutBits (\r
- IN INT32 n, \r
+ IN INT32 n,\r
IN UINT32 x\r
)\r
/*++\r
Argments:\r
\r
n - the rightmost n bits of the data is used\r
- x - the data \r
+ x - the data\r
\r
Returns: (VOID)\r
\r
--*/\r
{\r
- UINT8 Temp; \r
- \r
+ UINT8 Temp;\r
+\r
if (n < mBitCount) {\r
mSubBitBuf |= x << (mBitCount -= n);\r
} else {\r
- \r
+\r
Temp = (UINT8)(mSubBitBuf | (x >> (n -= mBitCount)));\r
if (mDst < mDstUpperLimit) {\r
*mDst++ = Temp;\r
if (n < UINT8_BIT) {\r
mSubBitBuf = x << (mBitCount = UINT8_BIT - n);\r
} else {\r
- \r
+\r
Temp = (UINT8)(x >> (n - UINT8_BIT));\r
if (mDst < mDstUpperLimit) {\r
*mDst++ = Temp;\r
}\r
mCompSize++;\r
- \r
+\r
mSubBitBuf = x << (mBitCount = 2 * UINT8_BIT - n);\r
}\r
}\r
}\r
\r
-STATIC \r
-INT32 \r
+STATIC\r
+INT32\r
FreadCrc (\r
- OUT UINT8 *p, \r
+ OUT UINT8 *p,\r
IN INT32 n\r
)\r
/*++\r
Routine Description:\r
\r
Read in source data\r
- \r
+\r
Arguments:\r
\r
p - the buffer to hold the data\r
Returns:\r
\r
number of bytes actually read\r
- \r
+\r
--*/\r
{\r
INT32 i;\r
}\r
\r
\r
-STATIC \r
-VOID \r
+STATIC\r
+VOID\r
InitPutBits ()\r
{\r
- mBitCount = UINT8_BIT; \r
+ mBitCount = UINT8_BIT;\r
mSubBitBuf = 0;\r
}\r
\r
-STATIC \r
-VOID \r
+STATIC\r
+VOID\r
CountLen (\r
IN INT32 i\r
)\r
Routine Description:\r
\r
Count the number of each code length for a Huffman tree.\r
- \r
+\r
Arguments:\r
\r
i - the top node\r
- \r
+\r
Returns: (VOID)\r
\r
--*/\r
}\r
}\r
\r
-STATIC \r
-VOID \r
+STATIC\r
+VOID\r
MakeLen (\r
IN INT32 Root\r
)\r
Routine Description:\r
\r
Create code length array for a Huffman tree\r
- \r
+\r
Arguments:\r
\r
Root - the root of the tree\r
mLenCnt[i] = 0;\r
}\r
CountLen(Root);\r
- \r
+\r
//\r
// Adjust the length count array so that\r
// no code will be generated longer than its designated length\r
//\r
- \r
+\r
Cum = 0;\r
for (i = 16; i > 0; i--) {\r
Cum += mLenCnt[i] << (16 - i);\r
}\r
}\r
\r
-STATIC \r
-VOID \r
+STATIC\r
+VOID\r
DownHeap (\r
IN INT32 i\r
)\r
//\r
// priority queue: send i-th entry down heap\r
//\r
- \r
+\r
k = mHeap[i];\r
while ((j = 2 * i) <= mHeapSize) {\r
if (j < mHeapSize && mFreq[mHeap[j]] > mFreq[mHeap[j + 1]]) {\r
mHeap[i] = (INT16)k;\r
}\r
\r
-STATIC \r
-VOID \r
+STATIC\r
+VOID\r
MakeCode (\r
- IN INT32 n, \r
- IN UINT8 Len[], \r
+ IN INT32 n,\r
+ IN UINT8 Len[],\r
OUT UINT16 Code[]\r
)\r
/*++\r
Routine Description:\r
\r
Assign code to each symbol based on the code length array\r
- \r
+\r
Arguments:\r
\r
n - number of symbols\r
}\r
}\r
\r
-STATIC \r
-INT32 \r
+STATIC\r
+INT32\r
MakeTree (\r
- IN INT32 NParm, \r
- IN UINT16 FreqParm[], \r
- OUT UINT8 LenParm[], \r
+ IN INT32 NParm,\r
+ IN UINT16 FreqParm[],\r
+ OUT UINT8 LenParm[],\r
OUT UINT16 CodeParm[]\r
)\r
/*++\r
Routine Description:\r
\r
Generates Huffman codes given a frequency distribution of symbols\r
- \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
+\r
Returns:\r
\r
Root of the Huffman tree.\r
- \r
+\r
--*/\r
{\r
INT32 i, j, k, Avail;\r
- \r
+\r
//\r
// make tree, calculate len[], return root\r
//\r
mLen[i] = 0;\r
if (mFreq[i]) {\r
mHeap[++mHeapSize] = (INT16)i;\r
- } \r
+ }\r
}\r
if (mHeapSize < 2) {\r
CodeParm[mHeap[1]] = 0;\r
return mHeap[1];\r
}\r
for (i = mHeapSize / 2; i >= 1; i--) {\r
- \r
+\r
//\r
- // make priority queue \r
+ // make priority queue\r
//\r
DownHeap(i);\r
}\r
mLeft[k] = (UINT16)i;\r
mRight[k] = (UINT16)j;\r
} while (mHeapSize > 1);\r
- \r
+\r
mSortPtr = CodeParm;\r
MakeLen(k);\r
MakeCode(NParm, LenParm, CodeParm);\r
- \r
+\r
//\r
// return root\r
//\r