4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync/** @file
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Main file for compression routine.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Compression routine. The compression algorithm is a mixture of
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync LZ77 and Huffman coding. LZ77 transforms the source data into a
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync sequence of Original Characters and Pointers to repeated strings.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync This sequence is further divided into Blocks and Huffman codings
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync are applied to each Block.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Copyright (c) 2007 - 2011, Intel Corporation. All rights reserved.<BR>
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync This program and the accompanying materials
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync are licensed and made available under the terms and conditions of the BSD License
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync which accompanies this distribution. The full text of the license may be found at
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync http://opensource.org/licenses/bsd-license.php
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync**/
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync#include <Library/MemoryAllocationLib.h>
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync#include <Library/BaseMemoryLib.h>
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync#include <Library/DebugLib.h>
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync#include <ShellBase.h>
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync//
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync// Macro Definitions
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync//
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsynctypedef INT16 NODE;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync#define UINT8_MAX 0xff
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync#define UINT8_BIT 8
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync#define THRESHOLD 3
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync#define INIT_CRC 0
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync#define WNDBIT 13
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync#define WNDSIZ (1U << WNDBIT)
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync#define MAXMATCH 256
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync#define BLKSIZ (1U << 14) // 16 * 1024U
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync#define PERC_FLAG 0x8000U
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync#define CODE_BIT 16
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync#define NIL 0
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync#define MAX_HASH_VAL (3 * WNDSIZ + (WNDSIZ / 512 + 1) * UINT8_MAX)
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync#define HASH(LoopVar7, LoopVar5) ((LoopVar7) + ((LoopVar5) << (WNDBIT - 9)) + WNDSIZ * 2)
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync#define CRCPOLY 0xA001
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync#define UPDATE_CRC(LoopVar5) mCrc = mCrcTable[(mCrc ^ (LoopVar5)) & 0xFF] ^ (mCrc >> UINT8_BIT)
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync//
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync// C: the Char&Len Set; P: the Position Set; T: the exTra Set
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync//
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync#define NC (UINT8_MAX + MAXMATCH + 2 - THRESHOLD)
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync#define CBIT 9
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync#define NP (WNDBIT + 1)
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync#define PBIT 4
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync#define NT (CODE_BIT + 3)
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync#define TBIT 5
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync#if NT > NP
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync #define NPT NT
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync#else
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync #define NPT NP
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync#endif
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync//
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync// Function Prototypes
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync//
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync/**
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Put a dword to output stream
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param[in] Data The dword to put.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync**/
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncVOID
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncEFIAPI
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncPutDword(
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN UINT32 Data
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync );
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync//
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync// Global Variables
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync//
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncSTATIC UINT8 *mSrc;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncSTATIC UINT8 *mDst;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncSTATIC UINT8 *mSrcUpperLimit;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncSTATIC UINT8 *mDstUpperLimit;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncSTATIC UINT8 *mLevel;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncSTATIC UINT8 *mText;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncSTATIC UINT8 *mChildCount;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncSTATIC UINT8 *mBuf;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncSTATIC UINT8 mCLen[NC];
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncSTATIC UINT8 mPTLen[NPT];
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncSTATIC UINT8 *mLen;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncSTATIC INT16 mHeap[NC + 1];
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncSTATIC INT32 mRemainder;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncSTATIC INT32 mMatchLen;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncSTATIC INT32 mBitCount;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncSTATIC INT32 mHeapSize;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncSTATIC INT32 mTempInt32;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncSTATIC UINT32 mBufSiz = 0;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncSTATIC UINT32 mOutputPos;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncSTATIC UINT32 mOutputMask;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncSTATIC UINT32 mSubBitBuf;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncSTATIC UINT32 mCrc;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncSTATIC UINT32 mCompSize;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncSTATIC UINT32 mOrigSize;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncSTATIC UINT16 *mFreq;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncSTATIC UINT16 *mSortPtr;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncSTATIC UINT16 mLenCnt[17];
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncSTATIC UINT16 mLeft[2 * NC - 1];
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncSTATIC UINT16 mRight[2 * NC - 1];
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncSTATIC UINT16 mCrcTable[UINT8_MAX + 1];
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncSTATIC UINT16 mCFreq[2 * NC - 1];
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncSTATIC UINT16 mCCode[NC];
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncSTATIC UINT16 mPFreq[2 * NP - 1];
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncSTATIC UINT16 mPTCode[NPT];
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncSTATIC UINT16 mTFreq[2 * NT - 1];
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncSTATIC NODE mPos;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncSTATIC NODE mMatchPos;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncSTATIC NODE mAvail;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncSTATIC NODE *mPosition;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncSTATIC NODE *mParent;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncSTATIC NODE *mPrev;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncSTATIC NODE *mNext = NULL;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncINT32 mHuffmanDepth = 0;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync/**
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Make a CRC table.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync**/
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncVOID
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncEFIAPI
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncMakeCrcTable (
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync VOID
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync )
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync{
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync UINT32 LoopVar1;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync UINT32 LoopVar2;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync UINT32 LoopVar4;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync for (LoopVar1 = 0; LoopVar1 <= UINT8_MAX; LoopVar1++) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync LoopVar4 = LoopVar1;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync for (LoopVar2 = 0; LoopVar2 < UINT8_BIT; LoopVar2++) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if ((LoopVar4 & 1) != 0) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync LoopVar4 = (LoopVar4 >> 1) ^ CRCPOLY;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync } else {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync LoopVar4 >>= 1;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync mCrcTable[LoopVar1] = (UINT16) LoopVar4;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync}
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync/**
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Put a dword to output stream
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param[in] Data The dword to put.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync**/
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncVOID
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncEFIAPI
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncPutDword (
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN UINT32 Data
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync )
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync{
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (mDst < mDstUpperLimit) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync *mDst++ = (UINT8) (((UINT8) (Data)) & 0xff);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (mDst < mDstUpperLimit) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync *mDst++ = (UINT8) (((UINT8) (Data >> 0x08)) & 0xff);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (mDst < mDstUpperLimit) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync *mDst++ = (UINT8) (((UINT8) (Data >> 0x10)) & 0xff);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (mDst < mDstUpperLimit) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync *mDst++ = (UINT8) (((UINT8) (Data >> 0x18)) & 0xff);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync}
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync/**
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Allocate memory spaces for data structures used in compression process.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @retval EFI_SUCCESS Memory was allocated successfully.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @retval EFI_OUT_OF_RESOURCES A memory allocation failed.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync**/
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncEFI_STATUS
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncEFIAPI
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncAllocateMemory (
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync VOID
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync )
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync{
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync mText = AllocateZeroPool (WNDSIZ * 2 + MAXMATCH);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync mLevel = AllocateZeroPool ((WNDSIZ + UINT8_MAX + 1) * sizeof (*mLevel));
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync mChildCount = AllocateZeroPool ((WNDSIZ + UINT8_MAX + 1) * sizeof (*mChildCount));
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync mPosition = AllocateZeroPool ((WNDSIZ + UINT8_MAX + 1) * sizeof (*mPosition));
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync mParent = AllocateZeroPool (WNDSIZ * 2 * sizeof (*mParent));
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync mPrev = AllocateZeroPool (WNDSIZ * 2 * sizeof (*mPrev));
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync mNext = AllocateZeroPool ((MAX_HASH_VAL + 1) * sizeof (*mNext));
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync mBufSiz = BLKSIZ;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync mBuf = AllocateZeroPool (mBufSiz);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync while (mBuf == NULL) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync mBufSiz = (mBufSiz / 10U) * 9U;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (mBufSiz < 4 * 1024U) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return EFI_OUT_OF_RESOURCES;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync mBuf = AllocateZeroPool (mBufSiz);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync mBuf[0] = 0;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return EFI_SUCCESS;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync}
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync/**
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Called when compression is completed to free memory previously allocated.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync**/
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncVOID
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncEFIAPI
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncFreeMemory (
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync VOID
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync )
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync{
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync SHELL_FREE_NON_NULL (mText);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync SHELL_FREE_NON_NULL (mLevel);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync SHELL_FREE_NON_NULL (mChildCount);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync SHELL_FREE_NON_NULL (mPosition);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync SHELL_FREE_NON_NULL (mParent);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync SHELL_FREE_NON_NULL (mPrev);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync SHELL_FREE_NON_NULL (mNext);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync SHELL_FREE_NON_NULL (mBuf);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync}
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync/**
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Initialize String Info Log data structures.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync**/
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncVOID
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncEFIAPI
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncInitSlide (
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync VOID
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync )
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync{
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync NODE LoopVar1;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync SetMem (mLevel + WNDSIZ, (UINT8_MAX + 1) * sizeof (UINT8), 1);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync SetMem (mPosition + WNDSIZ, (UINT8_MAX + 1) * sizeof (NODE), 0);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync SetMem (mParent + WNDSIZ, WNDSIZ * sizeof (NODE), 0);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync mAvail = 1;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync for (LoopVar1 = 1; LoopVar1 < WNDSIZ - 1; LoopVar1++) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync mNext[LoopVar1] = (NODE) (LoopVar1 + 1);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync mNext[WNDSIZ - 1] = NIL;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync SetMem (mNext + WNDSIZ * 2, (MAX_HASH_VAL - WNDSIZ * 2 + 1) * sizeof (NODE), 0);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync}
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync/**
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Find child node given the parent node and the edge character
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param[in] LoopVar6 The parent node.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param[in] LoopVar5 The edge character.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @return The child node.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @retval NIL(Zero) No child could be found.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync**/
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncNODE
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncEFIAPI
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncChild (
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN NODE LoopVar6,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN UINT8 LoopVar5
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync )
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync{
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync NODE LoopVar4;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync LoopVar4 = mNext[HASH (LoopVar6, LoopVar5)];
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync mParent[NIL] = LoopVar6; /* sentinel */
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync while (mParent[LoopVar4] != LoopVar6) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync LoopVar4 = mNext[LoopVar4];
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return LoopVar4;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync}
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync/**
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Create a new child for a given parent node.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param[in] LoopVar6 The parent node.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param[in] LoopVar5 The edge character.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param[in] LoopVar4 The child node.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync**/
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncVOID
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncEFIAPI
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncMakeChild (
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN NODE LoopVar6,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN UINT8 LoopVar5,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN NODE LoopVar4
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync )
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync{
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync NODE LoopVar12;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync NODE LoopVar10;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync LoopVar12 = (NODE) HASH (LoopVar6, LoopVar5);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync LoopVar10 = mNext[LoopVar12];
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync mNext[LoopVar12] = LoopVar4;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync mNext[LoopVar4] = LoopVar10;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync mPrev[LoopVar10] = LoopVar4;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync mPrev[LoopVar4] = LoopVar12;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync mParent[LoopVar4] = LoopVar6;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync mChildCount[LoopVar6]++;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync}
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync/**
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Split a node.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param[in] Old The node to split.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync**/
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncVOID
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncEFIAPI
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncSplit (
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN NODE Old
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync )
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync{
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync NODE New;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync NODE LoopVar10;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync New = mAvail;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync mAvail = mNext[New];
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync mChildCount[New] = 0;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync LoopVar10 = mPrev[Old];
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync mPrev[New] = LoopVar10;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync mNext[LoopVar10] = New;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync LoopVar10 = mNext[Old];
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync mNext[New] = LoopVar10;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync mPrev[LoopVar10] = New;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync mParent[New] = mParent[Old];
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync mLevel[New] = (UINT8) mMatchLen;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync mPosition[New] = mPos;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync MakeChild (New, mText[mMatchPos + mMatchLen], Old);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync MakeChild (New, mText[mPos + mMatchLen], mPos);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync}
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync/**
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Insert string info for current position into the String Info Log.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync**/
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncVOID
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncEFIAPI
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncInsertNode (
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync VOID
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync )
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync{
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync NODE LoopVar6;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync NODE LoopVar4;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync NODE LoopVar2;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync NODE LoopVar10;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync UINT8 LoopVar5;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync UINT8 *TempString3;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync UINT8 *TempString2;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (mMatchLen >= 4) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // We have just got a long match, the target tree
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // can be located by MatchPos + 1. Travese the tree
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // from bottom up to get to a proper starting point.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // The usage of PERC_FLAG ensures proper node deletion
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // in DeleteNode() later.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync mMatchLen--;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync LoopVar4 = (NODE) ((mMatchPos + 1) | WNDSIZ);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync LoopVar6 = mParent[LoopVar4];
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync while (LoopVar6 == NIL) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync LoopVar4 = mNext[LoopVar4];
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync LoopVar6 = mParent[LoopVar4];
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync while (mLevel[LoopVar6] >= mMatchLen) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync LoopVar4 = LoopVar6;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync LoopVar6 = mParent[LoopVar6];
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync LoopVar10 = LoopVar6;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync while (mPosition[LoopVar10] < 0) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync mPosition[LoopVar10] = mPos;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync LoopVar10 = mParent[LoopVar10];
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (LoopVar10 < WNDSIZ) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync mPosition[LoopVar10] = (NODE) (mPos | PERC_FLAG);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync } else {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Locate the target tree
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync LoopVar6 = (NODE) (mText[mPos] + WNDSIZ);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync LoopVar5 = mText[mPos + 1];
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync LoopVar4 = Child (LoopVar6, LoopVar5);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (LoopVar4 == NIL) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync MakeChild (LoopVar6, LoopVar5, mPos);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync mMatchLen = 1;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return ;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync mMatchLen = 2;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Traverse down the tree to find a match.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Update Position value along the route.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Node split or creation is involved.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync for (;;) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (LoopVar4 >= WNDSIZ) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync LoopVar2 = MAXMATCH;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync mMatchPos = LoopVar4;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync } else {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync LoopVar2 = mLevel[LoopVar4];
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync mMatchPos = (NODE) (mPosition[LoopVar4] & ~PERC_FLAG);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (mMatchPos >= mPos) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync mMatchPos -= WNDSIZ;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync TempString3 = &mText[mPos + mMatchLen];
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync TempString2 = &mText[mMatchPos + mMatchLen];
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync while (mMatchLen < LoopVar2) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (*TempString3 != *TempString2) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Split (LoopVar4);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return ;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync mMatchLen++;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync TempString3++;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync TempString2++;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (mMatchLen >= MAXMATCH) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync break;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync mPosition[LoopVar4] = mPos;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync LoopVar6 = LoopVar4;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync LoopVar4 = Child (LoopVar6, *TempString3);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (LoopVar4 == NIL) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync MakeChild (LoopVar6, *TempString3, mPos);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return ;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync mMatchLen++;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync LoopVar10 = mPrev[LoopVar4];
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync mPrev[mPos] = LoopVar10;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync mNext[LoopVar10] = mPos;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync LoopVar10 = mNext[LoopVar4];
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync mNext[mPos] = LoopVar10;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync mPrev[LoopVar10] = mPos;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync mParent[mPos] = LoopVar6;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync mParent[LoopVar4] = NIL;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Special usage of 'next'
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync mNext[LoopVar4] = mPos;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync}
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync/**
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Delete outdated string info. (The Usage of PERC_FLAG
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ensures a clean deletion).
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync**/
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncVOID
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncEFIAPI
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncDeleteNode (
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync VOID
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync )
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync{
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync NODE LoopVar6;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync NODE LoopVar4;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync NODE LoopVar11;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync NODE LoopVar10;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync NODE LoopVar9;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (mParent[mPos] == NIL) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return ;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync LoopVar4 = mPrev[mPos];
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync LoopVar11 = mNext[mPos];
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync mNext[LoopVar4] = LoopVar11;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync mPrev[LoopVar11] = LoopVar4;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync LoopVar4 = mParent[mPos];
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync mParent[mPos] = NIL;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (LoopVar4 >= WNDSIZ) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return ;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync mChildCount[LoopVar4]--;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (mChildCount[LoopVar4] > 1) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return ;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync LoopVar10 = (NODE) (mPosition[LoopVar4] & ~PERC_FLAG);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (LoopVar10 >= mPos) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync LoopVar10 -= WNDSIZ;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync LoopVar11 = LoopVar10;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync LoopVar6 = mParent[LoopVar4];
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync LoopVar9 = mPosition[LoopVar6];
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync while ((LoopVar9 & PERC_FLAG) != 0){
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync LoopVar9 &= ~PERC_FLAG;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (LoopVar9 >= mPos) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync LoopVar9 -= WNDSIZ;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (LoopVar9 > LoopVar11) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync LoopVar11 = LoopVar9;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync mPosition[LoopVar6] = (NODE) (LoopVar11 | WNDSIZ);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync LoopVar6 = mParent[LoopVar6];
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync LoopVar9 = mPosition[LoopVar6];
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (LoopVar6 < WNDSIZ) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (LoopVar9 >= mPos) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync LoopVar9 -= WNDSIZ;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (LoopVar9 > LoopVar11) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync LoopVar11 = LoopVar9;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync mPosition[LoopVar6] = (NODE) (LoopVar11 | WNDSIZ | PERC_FLAG);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync LoopVar11 = Child (LoopVar4, mText[LoopVar10 + mLevel[LoopVar4]]);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync LoopVar10 = mPrev[LoopVar11];
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync LoopVar9 = mNext[LoopVar11];
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync mNext[LoopVar10] = LoopVar9;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync mPrev[LoopVar9] = LoopVar10;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync LoopVar10 = mPrev[LoopVar4];
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync mNext[LoopVar10] = LoopVar11;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync mPrev[LoopVar11] = LoopVar10;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync LoopVar10 = mNext[LoopVar4];
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync mPrev[LoopVar10] = LoopVar11;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync mNext[LoopVar11] = LoopVar10;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync mParent[LoopVar11] = mParent[LoopVar4];
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync mParent[LoopVar4] = NIL;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync mNext[LoopVar4] = mAvail;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync mAvail = LoopVar4;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync}
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync/**
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Read in source data
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param[out] LoopVar7 The buffer to hold the data.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param[in] LoopVar8 The number of bytes to read.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @return The number of bytes actually read.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync**/
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncINT32
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncEFIAPI
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncFreadCrc (
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync OUT UINT8 *LoopVar7,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN INT32 LoopVar8
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync )
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync{
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync INT32 LoopVar1;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync for (LoopVar1 = 0; mSrc < mSrcUpperLimit && LoopVar1 < LoopVar8; LoopVar1++) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync *LoopVar7++ = *mSrc++;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync LoopVar8 = LoopVar1;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync LoopVar7 -= LoopVar8;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync mOrigSize += LoopVar8;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync LoopVar1--;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync while (LoopVar1 >= 0) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync UPDATE_CRC (*LoopVar7++);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync LoopVar1--;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return LoopVar8;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync}
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync/**
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Advance the current position (read in new data if needed).
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Delete outdated string info. Find a match string for current position.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @retval TRUE The operation was successful.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @retval FALSE The operation failed due to insufficient memory.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync**/
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncBOOLEAN
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncEFIAPI
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncGetNextMatch (
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync VOID
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync )
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync{
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync INT32 LoopVar8;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync VOID *Temp;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync mRemainder--;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync mPos++;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (mPos == WNDSIZ * 2) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Temp = AllocateZeroPool (WNDSIZ + MAXMATCH);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (Temp == NULL) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return (FALSE);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync CopyMem (Temp, &mText[WNDSIZ], WNDSIZ + MAXMATCH);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync CopyMem (&mText[0], Temp, WNDSIZ + MAXMATCH);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync FreePool (Temp);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync LoopVar8 = FreadCrc (&mText[WNDSIZ + MAXMATCH], WNDSIZ);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync mRemainder += LoopVar8;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync mPos = WNDSIZ;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync DeleteNode ();
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync InsertNode ();
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return (TRUE);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync}
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync/**
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Send entry LoopVar1 down the queue.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param[in] LoopVar1 The index of the item to move.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync**/
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncVOID
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncEFIAPI
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncDownHeap (
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN INT32 i
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync )
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync{
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync INT32 LoopVar1;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync INT32 LoopVar2;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // priority queue: send i-th entry down heap
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync LoopVar2 = mHeap[i];
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync LoopVar1 = 2 * i;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync while (LoopVar1 <= mHeapSize) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (LoopVar1 < mHeapSize && mFreq[mHeap[LoopVar1]] > mFreq[mHeap[LoopVar1 + 1]]) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync LoopVar1++;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (mFreq[LoopVar2] <= mFreq[mHeap[LoopVar1]]) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync break;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync mHeap[i] = mHeap[LoopVar1];
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync i = LoopVar1;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync LoopVar1 = 2 * i;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync mHeap[i] = (INT16) LoopVar2;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync}
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync/**
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Count the number of each code length for a Huffman tree.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param[in] LoopVar1 The top node.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync**/
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncVOID
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncEFIAPI
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncCountLen (
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN INT32 LoopVar1
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync )
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync{
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (LoopVar1 < mTempInt32) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync mLenCnt[(mHuffmanDepth < 16) ? mHuffmanDepth : 16]++;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync } else {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync mHuffmanDepth++;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync CountLen (mLeft[LoopVar1]);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync CountLen (mRight[LoopVar1]);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync mHuffmanDepth--;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync}
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync/**
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Create code length array for a Huffman tree.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param[in] Root The root of the tree.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync**/
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncVOID
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncEFIAPI
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncMakeLen (
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN INT32 Root
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync )
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync{
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync INT32 LoopVar1;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync INT32 LoopVar2;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync UINT32 Cum;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync for (LoopVar1 = 0; LoopVar1 <= 16; LoopVar1++) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync mLenCnt[LoopVar1] = 0;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync CountLen (Root);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Adjust the length count array so that
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // no code will be generated longer than its designated length
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Cum = 0;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync for (LoopVar1 = 16; LoopVar1 > 0; LoopVar1--) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Cum += mLenCnt[LoopVar1] << (16 - LoopVar1);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync while (Cum != (1U << 16)) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync mLenCnt[16]--;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync for (LoopVar1 = 15; LoopVar1 > 0; LoopVar1--) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (mLenCnt[LoopVar1] != 0) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync mLenCnt[LoopVar1]--;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync mLenCnt[LoopVar1 + 1] += 2;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync break;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Cum--;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync for (LoopVar1 = 16; LoopVar1 > 0; LoopVar1--) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync LoopVar2 = mLenCnt[LoopVar1];
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync LoopVar2--;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync while (LoopVar2 >= 0) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync mLen[*mSortPtr++] = (UINT8) LoopVar1;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync LoopVar2--;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync}
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync/**
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Assign code to each symbol based on the code length array.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param[in] LoopVar8 The number of symbols.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param[in] Len The code length array.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param[out] Code The stores codes for each symbol.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync**/
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncVOID
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncEFIAPI
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncMakeCode (
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN INT32 LoopVar8,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN UINT8 Len[ ],
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync OUT UINT16 Code[ ]
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync )
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync{
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync INT32 LoopVar1;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync UINT16 Start[18];
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Start[1] = 0;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync for (LoopVar1 = 1; LoopVar1 <= 16; LoopVar1++) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Start[LoopVar1 + 1] = (UINT16) ((Start[LoopVar1] + mLenCnt[LoopVar1]) << 1);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync for (LoopVar1 = 0; LoopVar1 < LoopVar8; LoopVar1++) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Code[LoopVar1] = Start[Len[LoopVar1]]++;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync}
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync/**
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Generates Huffman codes given a frequency distribution of symbols.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param[in] NParm The number of symbols.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param[in] FreqParm The frequency of each symbol.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param[out] LenParm The code length for each symbol.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param[out] CodeParm The code for each symbol.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @return The root of the Huffman tree.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync**/
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncINT32
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncEFIAPI
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncMakeTree (
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN INT32 NParm,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN UINT16 FreqParm[ ],
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync OUT UINT8 LenParm[ ],
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync OUT UINT16 CodeParm[ ]
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync )
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync{
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync INT32 LoopVar1;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync INT32 LoopVar2;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync INT32 LoopVar3;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync INT32 Avail;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // make tree, calculate len[], return root
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync mTempInt32 = NParm;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync mFreq = FreqParm;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync mLen = LenParm;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Avail = mTempInt32;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync mHeapSize = 0;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync mHeap[1] = 0;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync for (LoopVar1 = 0; LoopVar1 < mTempInt32; LoopVar1++) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync mLen[LoopVar1] = 0;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if ((mFreq[LoopVar1]) != 0) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync mHeapSize++;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync mHeap[mHeapSize] = (INT16) LoopVar1;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (mHeapSize < 2) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync CodeParm[mHeap[1]] = 0;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return mHeap[1];
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync for (LoopVar1 = mHeapSize / 2; LoopVar1 >= 1; LoopVar1--) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // make priority queue
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync DownHeap (LoopVar1);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync mSortPtr = CodeParm;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync do {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync LoopVar1 = mHeap[1];
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (LoopVar1 < mTempInt32) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync *mSortPtr++ = (UINT16) LoopVar1;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync mHeap[1] = mHeap[mHeapSize--];
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync DownHeap (1);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync LoopVar2 = mHeap[1];
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (LoopVar2 < mTempInt32) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync *mSortPtr++ = (UINT16) LoopVar2;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync LoopVar3 = Avail++;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync mFreq[LoopVar3] = (UINT16) (mFreq[LoopVar1] + mFreq[LoopVar2]);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync mHeap[1] = (INT16) LoopVar3;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync DownHeap (1);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync mLeft[LoopVar3] = (UINT16) LoopVar1;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync mRight[LoopVar3] = (UINT16) LoopVar2;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync } while (mHeapSize > 1);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync mSortPtr = CodeParm;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync MakeLen (LoopVar3);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync MakeCode (NParm, LenParm, CodeParm);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // return root
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return LoopVar3;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync}
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync/**
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Outputs rightmost LoopVar8 bits of x
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param[in] LoopVar8 The rightmost LoopVar8 bits of the data is used.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param[in] x The data.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync**/
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncVOID
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncEFIAPI
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncPutBits (
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN INT32 LoopVar8,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN UINT32 x
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync )
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync{
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync UINT8 Temp;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (LoopVar8 < mBitCount) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync mSubBitBuf |= x << (mBitCount -= LoopVar8);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync } else {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Temp = (UINT8)(mSubBitBuf | (x >> (LoopVar8 -= mBitCount)));
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (mDst < mDstUpperLimit) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync *mDst++ = Temp;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync mCompSize++;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (LoopVar8 < UINT8_BIT) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync mSubBitBuf = x << (mBitCount = UINT8_BIT - LoopVar8);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync } else {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Temp = (UINT8)(x >> (LoopVar8 - UINT8_BIT));
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (mDst < mDstUpperLimit) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync *mDst++ = Temp;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync mCompSize++;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync mSubBitBuf = x << (mBitCount = 2 * UINT8_BIT - LoopVar8);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync}
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync/**
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Encode a signed 32 bit number.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param[in] LoopVar5 The number to encode.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync**/
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncVOID
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncEFIAPI
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncEncodeC (
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN INT32 LoopVar5
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync )
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync{
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync PutBits (mCLen[LoopVar5], mCCode[LoopVar5]);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync}
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync/**
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Encode a unsigned 32 bit number.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param[in] LoopVar7 The number to encode.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync**/
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncVOID
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncEFIAPI
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncEncodeP (
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN UINT32 LoopVar7
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync )
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync{
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync UINT32 LoopVar5;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync UINT32 LoopVar6;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync LoopVar5 = 0;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync LoopVar6 = LoopVar7;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync while (LoopVar6 != 0) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync LoopVar6 >>= 1;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync LoopVar5++;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync PutBits (mPTLen[LoopVar5], mPTCode[LoopVar5]);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (LoopVar5 > 1) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync PutBits(LoopVar5 - 1, LoopVar7 & (0xFFFFU >> (17 - LoopVar5)));
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync}
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync/**
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Count the frequencies for the Extra Set.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync**/
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncVOID
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncEFIAPI
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncCountTFreq (
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync VOID
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync )
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync{
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync INT32 LoopVar1;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync INT32 LoopVar3;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync INT32 LoopVar8;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync INT32 Count;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync for (LoopVar1 = 0; LoopVar1 < NT; LoopVar1++) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync mTFreq[LoopVar1] = 0;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync LoopVar8 = NC;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync while (LoopVar8 > 0 && mCLen[LoopVar8 - 1] == 0) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync LoopVar8--;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync LoopVar1 = 0;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync while (LoopVar1 < LoopVar8) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync LoopVar3 = mCLen[LoopVar1++];
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (LoopVar3 == 0) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Count = 1;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync while (LoopVar1 < LoopVar8 && mCLen[LoopVar1] == 0) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync LoopVar1++;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Count++;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (Count <= 2) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync mTFreq[0] = (UINT16) (mTFreq[0] + Count);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync } else if (Count <= 18) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync mTFreq[1]++;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync } else if (Count == 19) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync mTFreq[0]++;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync mTFreq[1]++;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync } else {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync mTFreq[2]++;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync } else {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ASSERT((LoopVar3+2)<(2 * NT - 1));
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync mTFreq[LoopVar3 + 2]++;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync}
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync/**
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Outputs the code length array for the Extra Set or the Position Set.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param[in] LoopVar8 The number of symbols.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param[in] nbit The number of bits needed to represent 'LoopVar8'.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param[in] Special The special symbol that needs to be take care of.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync**/
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncVOID
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncEFIAPI
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncWritePTLen (
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN INT32 LoopVar8,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN INT32 nbit,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN INT32 Special
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync )
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync{
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync INT32 LoopVar1;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync INT32 LoopVar3;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync while (LoopVar8 > 0 && mPTLen[LoopVar8 - 1] == 0) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync LoopVar8--;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync PutBits (nbit, LoopVar8);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync LoopVar1 = 0;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync while (LoopVar1 < LoopVar8) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync LoopVar3 = mPTLen[LoopVar1++];
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (LoopVar3 <= 6) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync PutBits (3, LoopVar3);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync } else {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync PutBits (LoopVar3 - 3, (1U << (LoopVar3 - 3)) - 2);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (LoopVar1 == Special) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync while (LoopVar1 < 6 && mPTLen[LoopVar1] == 0) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync LoopVar1++;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync PutBits (2, (LoopVar1 - 3) & 3);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync}
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync/**
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Outputs the code length array for Char&Length Set.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync**/
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncVOID
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncEFIAPI
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncWriteCLen (
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync VOID
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync )
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync{
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync INT32 LoopVar1;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync INT32 LoopVar3;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync INT32 LoopVar8;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync INT32 Count;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync LoopVar8 = NC;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync while (LoopVar8 > 0 && mCLen[LoopVar8 - 1] == 0) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync LoopVar8--;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync PutBits (CBIT, LoopVar8);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync LoopVar1 = 0;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync while (LoopVar1 < LoopVar8) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync LoopVar3 = mCLen[LoopVar1++];
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (LoopVar3 == 0) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Count = 1;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync while (LoopVar1 < LoopVar8 && mCLen[LoopVar1] == 0) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync LoopVar1++;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Count++;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (Count <= 2) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync for (LoopVar3 = 0; LoopVar3 < Count; LoopVar3++) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync PutBits (mPTLen[0], mPTCode[0]);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync } else if (Count <= 18) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync PutBits (mPTLen[1], mPTCode[1]);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync PutBits (4, Count - 3);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync } else if (Count == 19) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync PutBits (mPTLen[0], mPTCode[0]);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync PutBits (mPTLen[1], mPTCode[1]);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync PutBits (4, 15);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync } else {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync PutBits (mPTLen[2], mPTCode[2]);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync PutBits (CBIT, Count - 20);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync } else {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ASSERT((LoopVar3+2)<NPT);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync PutBits (mPTLen[LoopVar3 + 2], mPTCode[LoopVar3 + 2]);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync}
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync/**
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Huffman code the block and output it.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync**/
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncVOID
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncEFIAPI
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncSendBlock (
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync VOID
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync )
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync{
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync UINT32 LoopVar1;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync UINT32 LoopVar3;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync UINT32 Flags;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync UINT32 Root;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync UINT32 Pos;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync UINT32 Size;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Flags = 0;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Root = MakeTree (NC, mCFreq, mCLen, mCCode);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Size = mCFreq[Root];
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync PutBits (16, Size);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (Root >= NC) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync CountTFreq ();
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Root = MakeTree (NT, mTFreq, mPTLen, mPTCode);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (Root >= NT) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync WritePTLen (NT, TBIT, 3);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync } else {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync PutBits (TBIT, 0);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync PutBits (TBIT, Root);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync WriteCLen ();
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync } else {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync PutBits (TBIT, 0);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync PutBits (TBIT, 0);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync PutBits (CBIT, 0);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync PutBits (CBIT, Root);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Root = MakeTree (NP, mPFreq, mPTLen, mPTCode);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (Root >= NP) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync WritePTLen (NP, PBIT, -1);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync } else {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync PutBits (PBIT, 0);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync PutBits (PBIT, Root);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Pos = 0;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync for (LoopVar1 = 0; LoopVar1 < Size; LoopVar1++) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (LoopVar1 % UINT8_BIT == 0) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Flags = mBuf[Pos++];
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync } else {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Flags <<= 1;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if ((Flags & (1U << (UINT8_BIT - 1))) != 0){
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync EncodeC(mBuf[Pos++] + (1U << UINT8_BIT));
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync LoopVar3 = mBuf[Pos++] << UINT8_BIT;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync LoopVar3 += mBuf[Pos++];
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync EncodeP (LoopVar3);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync } else {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync EncodeC (mBuf[Pos++]);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync SetMem (mCFreq, NC * sizeof (UINT16), 0);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync SetMem (mPFreq, NP * sizeof (UINT16), 0);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync}
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync/**
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Start the huffman encoding.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync**/
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncVOID
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncEFIAPI
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncHufEncodeStart (
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync VOID
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync )
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync{
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync SetMem (mCFreq, NC * sizeof (UINT16), 0);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync SetMem (mPFreq, NP * sizeof (UINT16), 0);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync mOutputPos = mOutputMask = 0;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync mBitCount = UINT8_BIT;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync mSubBitBuf = 0;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync}
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync/**
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Outputs an Original Character or a Pointer.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param[in] LoopVar5 The original character or the 'String Length' element of
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync a Pointer.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param[in] LoopVar7 The 'Position' field of a Pointer.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync**/
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncVOID
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncEFIAPI
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncCompressOutput (
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN UINT32 LoopVar5,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN UINT32 LoopVar7
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync )
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync{
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync STATIC UINT32 CPos;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if ((mOutputMask >>= 1) == 0) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync mOutputMask = 1U << (UINT8_BIT - 1);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (mOutputPos >= mBufSiz - 3 * UINT8_BIT) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync SendBlock ();
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync mOutputPos = 0;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync CPos = mOutputPos++;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync mBuf[CPos] = 0;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync mBuf[mOutputPos++] = (UINT8) LoopVar5;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync mCFreq[LoopVar5]++;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (LoopVar5 >= (1U << UINT8_BIT)) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync mBuf[CPos] = (UINT8)(mBuf[CPos]|mOutputMask);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync mBuf[mOutputPos++] = (UINT8)(LoopVar7 >> UINT8_BIT);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync mBuf[mOutputPos++] = (UINT8) LoopVar7;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync LoopVar5 = 0;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync while (LoopVar7!=0) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync LoopVar7 >>= 1;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync LoopVar5++;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync mPFreq[LoopVar5]++;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync}
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync/**
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync End the huffman encoding.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync**/
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncVOID
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncEFIAPI
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncHufEncodeEnd (
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync VOID
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync )
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync{
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync SendBlock ();
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Flush remaining bits
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync PutBits (UINT8_BIT - 1, 0);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync}
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync/**
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync The main controlling routine for compression process.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @retval EFI_SUCCESS The compression is successful.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @retval EFI_OUT_0F_RESOURCES Not enough memory for compression process.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync**/
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncEFI_STATUS
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncEFIAPI
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncEncode (
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync VOID
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync )
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync{
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync EFI_STATUS Status;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync INT32 LastMatchLen;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync NODE LastMatchPos;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Status = AllocateMemory ();
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (EFI_ERROR (Status)) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync FreeMemory ();
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return Status;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync InitSlide ();
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync HufEncodeStart ();
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync mRemainder = FreadCrc (&mText[WNDSIZ], WNDSIZ + MAXMATCH);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync mMatchLen = 0;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync mPos = WNDSIZ;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync InsertNode ();
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (mMatchLen > mRemainder) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync mMatchLen = mRemainder;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync while (mRemainder > 0) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync LastMatchLen = mMatchLen;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync LastMatchPos = mMatchPos;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (!GetNextMatch ()) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Status = EFI_OUT_OF_RESOURCES;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (mMatchLen > mRemainder) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync mMatchLen = mRemainder;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (mMatchLen > LastMatchLen || LastMatchLen < THRESHOLD) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Not enough benefits are gained by outputting a pointer,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // so just output the original character
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync CompressOutput(mText[mPos - 1], 0);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync } else {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Outputting a pointer is beneficial enough, do it.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync CompressOutput(LastMatchLen + (UINT8_MAX + 1 - THRESHOLD),
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync (mPos - LastMatchPos - 2) & (WNDSIZ - 1));
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync LastMatchLen--;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync while (LastMatchLen > 0) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (!GetNextMatch ()) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Status = EFI_OUT_OF_RESOURCES;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync LastMatchLen--;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (mMatchLen > mRemainder) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync mMatchLen = mRemainder;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync HufEncodeEnd ();
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync FreeMemory ();
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return (Status);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync}
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync/**
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync The compression routine.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param[in] SrcBuffer The buffer containing the source data.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param[in] SrcSize The number of bytes in SrcBuffer.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param[in] DstBuffer The buffer to put the compressed image in.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param[in, out] DstSize On input the size (in bytes) of DstBuffer, on
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return the number of bytes placed in DstBuffer.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @retval EFI_SUCCESS The compression was sucessful.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @retval EFI_BUFFER_TOO_SMALL The buffer was too small. DstSize is required.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync**/
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncEFI_STATUS
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncEFIAPI
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncCompress (
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN VOID *SrcBuffer,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN UINT64 SrcSize,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN VOID *DstBuffer,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN OUT UINT64 *DstSize
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync )
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync{
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync EFI_STATUS Status;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Initializations
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync mBufSiz = 0;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync mBuf = NULL;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync mText = NULL;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync mLevel = NULL;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync mChildCount = NULL;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync mPosition = NULL;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync mParent = NULL;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync mPrev = NULL;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync mNext = NULL;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync mSrc = SrcBuffer;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync mSrcUpperLimit = mSrc + SrcSize;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync mDst = DstBuffer;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync mDstUpperLimit = mDst +*DstSize;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync PutDword (0L);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync PutDword (0L);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync MakeCrcTable ();
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync mOrigSize = mCompSize = 0;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync mCrc = INIT_CRC;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Compress it
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Status = Encode ();
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (EFI_ERROR (Status)) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return EFI_OUT_OF_RESOURCES;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Null terminate the compressed data
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (mDst < mDstUpperLimit) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync *mDst++ = 0;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Fill in compressed size and original size
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync mDst = DstBuffer;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync PutDword (mCompSize + 1);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync PutDword (mOrigSize);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Return
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (mCompSize + 1 + 8 > *DstSize) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync *DstSize = mCompSize + 1 + 8;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return EFI_BUFFER_TOO_SMALL;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync } else {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync *DstSize = mCompSize + 1 + 8;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return EFI_SUCCESS;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync}
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync