| /** @file | |
| Internal include file for Tiano Decompress Library. | |
| Copyright (c) 2006 - 2018, Intel Corporation. All rights reserved.<BR> | |
| SPDX-License-Identifier: BSD-2-Clause-Patent | |
| **/ | |
| #ifndef __TIANO_DECOMPRESS_H__ | |
| #define __TIANO_DECOMPRESS_H__ | |
| #include <stdio.h> | |
| #include <assert.h> | |
| #include <Common/UefiBaseTypes.h> | |
| // | |
| // Decompression algorithm begins here | |
| // | |
| #define UTILITY_NAME "TianoCompress" | |
| #define UTILITY_MAJOR_VERSION 0 | |
| #define UTILITY_MINOR_VERSION 1 | |
| // | |
| // Default output file name | |
| // | |
| #define DEFAULT_OUTPUT_FILE "file.tmp" | |
| #define BITBUFSIZ 32 | |
| #define MAXMATCH 256 | |
| #define THRESHOLD 3 | |
| #define CODE_BIT 16 | |
| #define BAD_TABLE - 1 | |
| typedef INT32 NODE; | |
| // | |
| // C: Char&Len Set; P: Position Set; T: exTra Set | |
| // | |
| #define NC (0xff + MAXMATCH + 2 - THRESHOLD) | |
| #define CBIT 9 | |
| #define MAXPBIT 5 | |
| #define TBIT 5 | |
| #define MAXNP ((1U << MAXPBIT) - 1) | |
| #define NT (CODE_BIT + 3) | |
| #if NT > MAXNP | |
| #define NPT NT | |
| #else | |
| #define NPT MAXNP | |
| #endif | |
| typedef struct { | |
| UINT8 *mSrcBase; // Starting address of compressed data | |
| UINT8 *mDstBase; // Starting address of decompressed data | |
| UINT32 mOutBuf; | |
| UINT32 mInBuf; | |
| UINT16 mBitCount; | |
| UINT32 mBitBuf; | |
| UINT32 mSubBitBuf; | |
| UINT16 mBlockSize; | |
| UINT32 mCompSize; | |
| UINT32 mOrigSize; | |
| UINT16 mBadTableFlag; | |
| UINT16 mLeft[2 * NC - 1]; | |
| UINT16 mRight[2 * NC - 1]; | |
| UINT8 mCLen[NC]; | |
| UINT8 mPTLen[NPT]; | |
| UINT16 mCTable[4096]; | |
| UINT16 mPTTable[256]; | |
| // | |
| // The length of the field 'Position Set Code Length Array Size' in Block Header. | |
| // For EFI 1.1 de/compression algorithm, mPBit = 4 | |
| // For Tiano de/compression algorithm, mPBit = 5 | |
| // | |
| UINT8 mPBit; | |
| } SCRATCH_DATA; | |
| // | |
| // Function Prototypes | |
| // | |
| EFI_STATUS | |
| GetFileContents ( | |
| IN char *InputFileName, | |
| OUT UINT8 *FileBuffer, | |
| OUT UINT32 *BufferLength | |
| ); | |
| STATIC | |
| VOID | |
| PutDword( | |
| IN UINT32 Data | |
| ); | |
| STATIC | |
| EFI_STATUS | |
| AllocateMemory ( | |
| VOID | |
| ); | |
| STATIC | |
| VOID | |
| FreeMemory ( | |
| VOID | |
| ); | |
| STATIC | |
| VOID | |
| InitSlide ( | |
| VOID | |
| ); | |
| STATIC | |
| NODE | |
| Child ( | |
| IN NODE NodeQ, | |
| IN UINT8 CharC | |
| ); | |
| STATIC | |
| VOID | |
| MakeChild ( | |
| IN NODE NodeQ, | |
| IN UINT8 CharC, | |
| IN NODE NodeR | |
| ); | |
| STATIC | |
| VOID | |
| Split ( | |
| IN NODE Old | |
| ); | |
| STATIC | |
| VOID | |
| InsertNode ( | |
| VOID | |
| ); | |
| STATIC | |
| VOID | |
| DeleteNode ( | |
| VOID | |
| ); | |
| STATIC | |
| VOID | |
| GetNextMatch ( | |
| VOID | |
| ); | |
| STATIC | |
| EFI_STATUS | |
| Encode ( | |
| VOID | |
| ); | |
| STATIC | |
| VOID | |
| CountTFreq ( | |
| VOID | |
| ); | |
| STATIC | |
| VOID | |
| WritePTLen ( | |
| IN INT32 Number, | |
| IN INT32 nbit, | |
| IN INT32 Special | |
| ); | |
| STATIC | |
| VOID | |
| WriteCLen ( | |
| VOID | |
| ); | |
| STATIC | |
| VOID | |
| EncodeC ( | |
| IN INT32 Value | |
| ); | |
| STATIC | |
| VOID | |
| EncodeP ( | |
| IN UINT32 Value | |
| ); | |
| STATIC | |
| VOID | |
| SendBlock ( | |
| VOID | |
| ); | |
| STATIC | |
| VOID | |
| Output ( | |
| IN UINT32 c, | |
| IN UINT32 p | |
| ); | |
| STATIC | |
| VOID | |
| HufEncodeStart ( | |
| VOID | |
| ); | |
| STATIC | |
| VOID | |
| HufEncodeEnd ( | |
| VOID | |
| ); | |
| STATIC | |
| VOID | |
| MakeCrcTable ( | |
| VOID | |
| ); | |
| STATIC | |
| VOID | |
| PutBits ( | |
| IN INT32 Number, | |
| IN UINT32 Value | |
| ); | |
| STATIC | |
| INT32 | |
| FreadCrc ( | |
| OUT UINT8 *Pointer, | |
| IN INT32 Number | |
| ); | |
| STATIC | |
| VOID | |
| InitPutBits ( | |
| VOID | |
| ); | |
| STATIC | |
| VOID | |
| CountLen ( | |
| IN INT32 Index | |
| ); | |
| STATIC | |
| VOID | |
| MakeLen ( | |
| IN INT32 Root | |
| ); | |
| STATIC | |
| VOID | |
| DownHeap ( | |
| IN INT32 Index | |
| ); | |
| STATIC | |
| VOID | |
| MakeCode ( | |
| IN INT32 Number, | |
| IN UINT8 Len[ ], | |
| OUT UINT16 Code[] | |
| ); | |
| STATIC | |
| INT32 | |
| MakeTree ( | |
| IN INT32 NParm, | |
| IN UINT16 FreqParm[], | |
| OUT UINT8 LenParm[ ], | |
| OUT UINT16 CodeParm[] | |
| ); | |
| /** | |
| Read NumOfBit of bits from source into mBitBuf | |
| Shift mBitBuf NumOfBits left. Read in NumOfBits of bits from source. | |
| @param Sd The global scratch data | |
| @param NumOfBits The number of bits to shift and read. | |
| **/ | |
| VOID | |
| FillBuf ( | |
| IN SCRATCH_DATA *Sd, | |
| IN UINT16 NumOfBits | |
| ); | |
| /** | |
| Get NumOfBits of bits out from mBitBuf | |
| Get NumOfBits of bits out from mBitBuf. Fill mBitBuf with subsequent | |
| NumOfBits of bits from source. Returns NumOfBits of bits that are | |
| popped out. | |
| @param Sd The global scratch data. | |
| @param NumOfBits The number of bits to pop and read. | |
| @return The bits that are popped out. | |
| **/ | |
| UINT32 | |
| GetBits ( | |
| IN SCRATCH_DATA *Sd, | |
| IN UINT16 NumOfBits | |
| ); | |
| /** | |
| Creates Huffman Code mapping table according to code length array. | |
| Creates Huffman Code mapping table for Extra Set, Char&Len Set | |
| and Position Set according to code length array. | |
| @param Sd The global scratch data | |
| @param NumOfChar Number of symbols in the symbol set | |
| @param BitLen Code length array | |
| @param TableBits The width of the mapping table | |
| @param Table The table | |
| @retval 0 OK. | |
| @retval BAD_TABLE The table is corrupted. | |
| **/ | |
| UINT16 | |
| MakeTable ( | |
| IN SCRATCH_DATA *Sd, | |
| IN UINT16 NumOfChar, | |
| IN UINT8 *BitLen, | |
| IN UINT16 TableBits, | |
| OUT UINT16 *Table | |
| ); | |
| /** | |
| Decodes a position value. | |
| Get a position value according to Position Huffman Table. | |
| @param Sd the global scratch data | |
| @return The position value decoded. | |
| **/ | |
| UINT32 | |
| DecodeP ( | |
| IN SCRATCH_DATA *Sd | |
| ); | |
| /** | |
| Reads code lengths for the Extra Set or the Position Set. | |
| Read in the Extra Set or Position Set Length Array, then | |
| generate the Huffman code mapping for them. | |
| @param Sd The global scratch data. | |
| @param nn Number of symbols. | |
| @param nbit Number of bits needed to represent nn. | |
| @param Special The special symbol that needs to be taken care of. | |
| @retval 0 OK. | |
| @retval BAD_TABLE Table is corrupted. | |
| **/ | |
| UINT16 | |
| ReadPTLen ( | |
| IN SCRATCH_DATA *Sd, | |
| IN UINT16 nn, | |
| IN UINT16 nbit, | |
| IN UINT16 Special | |
| ); | |
| /** | |
| Reads code lengths for Char&Len Set. | |
| Read in and decode the Char&Len Set Code Length Array, then | |
| generate the Huffman Code mapping table for the Char&Len Set. | |
| @param Sd the global scratch data | |
| **/ | |
| VOID | |
| ReadCLen ( | |
| SCRATCH_DATA *Sd | |
| ); | |
| /** | |
| Decode a character/length value. | |
| Read one value from mBitBuf, Get one code from mBitBuf. If it is at block boundary, generates | |
| Huffman code mapping table for Extra Set, Code&Len Set and | |
| Position Set. | |
| @param Sd The global scratch data. | |
| @return The value decoded. | |
| **/ | |
| UINT16 | |
| DecodeC ( | |
| SCRATCH_DATA *Sd | |
| ); | |
| /** | |
| Decode the source data and put the resulting data into the destination buffer. | |
| Decode the source data and put the resulting data into the destination buffer. | |
| @param Sd The global scratch data | |
| **/ | |
| VOID | |
| Decode ( | |
| SCRATCH_DATA *Sd | |
| ); | |
| RETURN_STATUS | |
| EFIAPI | |
| TDecompress ( | |
| IN VOID *Source, | |
| IN OUT VOID *Destination, | |
| IN OUT VOID *Scratch, | |
| IN UINT32 Version | |
| ); | |
| #endif |