]> git.proxmox.com Git - mirror_edk2.git/blob - BaseTools/Source/C/TianoCompress/TianoCompress.h
License header updated to match correct format.
[mirror_edk2.git] / BaseTools / Source / C / TianoCompress / TianoCompress.h
1 /** @file
2 Internal include file for Tiano Decompress Libary.
3
4 Copyright (c) 2006 - 2014, Intel Corporation. All rights reserved.<BR>
5 This program and the accompanying materials
6 are licensed and made available under the terms and conditions of the BSD License
7 which accompanies this distribution. The full text of the license may be found at
8 http://opensource.org/licenses/bsd-license.php
9
10 THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
11 WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
12
13 **/
14
15 #ifndef __TIANO_DECOMPRESS_H__
16 #define __TIANO_DECOMPRESS_H__
17
18 #include <stdio.h>
19 #include <assert.h>
20 #include <Common/UefiBaseTypes.h>
21
22
23 //
24 // Decompression algorithm begins here
25 //
26 #define UTILITY_NAME "TianoCompress"
27 #define UTILITY_MAJOR_VERSION 0
28 #define UTILITY_MINOR_VERSION 1
29
30 //
31 // Default output file name
32 //
33 #define DEFAULT_OUTPUT_FILE "file.tmp"
34
35 #define BITBUFSIZ 32
36 #define MAXMATCH 256
37 #define THRESHOLD 3
38 #define CODE_BIT 16
39 #define BAD_TABLE - 1
40
41 typedef INT32 NODE;
42
43 //
44 // C: Char&Len Set; P: Position Set; T: exTra Set
45 //
46 #define NC (0xff + MAXMATCH + 2 - THRESHOLD)
47 #define CBIT 9
48 #define MAXPBIT 5
49 #define TBIT 5
50 #define MAXNP ((1U << MAXPBIT) - 1)
51 #define NT (CODE_BIT + 3)
52 #if NT > MAXNP
53 #define NPT NT
54 #else
55 #define NPT MAXNP
56 #endif
57
58 typedef struct {
59 UINT8 *mSrcBase; // Starting address of compressed data
60 UINT8 *mDstBase; // Starting address of decompressed data
61 UINT32 mOutBuf;
62 UINT32 mInBuf;
63
64 UINT16 mBitCount;
65 UINT32 mBitBuf;
66 UINT32 mSubBitBuf;
67 UINT16 mBlockSize;
68 UINT32 mCompSize;
69 UINT32 mOrigSize;
70
71 UINT16 mBadTableFlag;
72
73 UINT16 mLeft[2 * NC - 1];
74 UINT16 mRight[2 * NC - 1];
75 UINT8 mCLen[NC];
76 UINT8 mPTLen[NPT];
77 UINT16 mCTable[4096];
78 UINT16 mPTTable[256];
79
80 //
81 // The length of the field 'Position Set Code Length Array Size' in Block Header.
82 // For EFI 1.1 de/compression algorithm, mPBit = 4
83 // For Tiano de/compression algorithm, mPBit = 5
84 //
85 UINT8 mPBit;
86 } SCRATCH_DATA;
87
88 //
89 // Function Prototypes
90 //
91
92 EFI_STATUS
93 GetFileContents (
94 IN char *InputFileName,
95 OUT UINT8 *FileBuffer,
96 OUT UINT32 *BufferLength
97 );
98
99 STATIC
100 VOID
101 PutDword(
102 IN UINT32 Data
103 );
104
105 STATIC
106 EFI_STATUS
107 AllocateMemory (
108 VOID
109 );
110
111 STATIC
112 VOID
113 FreeMemory (
114 VOID
115 );
116
117 STATIC
118 VOID
119 InitSlide (
120 VOID
121 );
122
123 STATIC
124 NODE
125 Child (
126 IN NODE NodeQ,
127 IN UINT8 CharC
128 );
129
130 STATIC
131 VOID
132 MakeChild (
133 IN NODE NodeQ,
134 IN UINT8 CharC,
135 IN NODE NodeR
136 );
137
138 STATIC
139 VOID
140 Split (
141 IN NODE Old
142 );
143
144 STATIC
145 VOID
146 InsertNode (
147 VOID
148 );
149
150 STATIC
151 VOID
152 DeleteNode (
153 VOID
154 );
155
156 STATIC
157 VOID
158 GetNextMatch (
159 VOID
160 );
161
162 STATIC
163 EFI_STATUS
164 Encode (
165 VOID
166 );
167
168 STATIC
169 VOID
170 CountTFreq (
171 VOID
172 );
173
174 STATIC
175 VOID
176 WritePTLen (
177 IN INT32 Number,
178 IN INT32 nbit,
179 IN INT32 Special
180 );
181
182 STATIC
183 VOID
184 WriteCLen (
185 VOID
186 );
187
188 STATIC
189 VOID
190 EncodeC (
191 IN INT32 Value
192 );
193
194 STATIC
195 VOID
196 EncodeP (
197 IN UINT32 Value
198 );
199
200 STATIC
201 VOID
202 SendBlock (
203 VOID
204 );
205
206 STATIC
207 VOID
208 Output (
209 IN UINT32 c,
210 IN UINT32 p
211 );
212
213 STATIC
214 VOID
215 HufEncodeStart (
216 VOID
217 );
218
219 STATIC
220 VOID
221 HufEncodeEnd (
222 VOID
223 );
224
225 STATIC
226 VOID
227 MakeCrcTable (
228 VOID
229 );
230
231
232 STATIC
233 VOID
234 PutBits (
235 IN INT32 Number,
236 IN UINT32 Value
237 );
238
239 STATIC
240 INT32
241 FreadCrc (
242 OUT UINT8 *Pointer,
243 IN INT32 Number
244 );
245
246 STATIC
247 VOID
248 InitPutBits (
249 VOID
250 );
251
252 STATIC
253 VOID
254 CountLen (
255 IN INT32 Index
256 );
257
258 STATIC
259 VOID
260 MakeLen (
261 IN INT32 Root
262 );
263
264 STATIC
265 VOID
266 DownHeap (
267 IN INT32 Index
268 );
269
270 STATIC
271 VOID
272 MakeCode (
273 IN INT32 Number,
274 IN UINT8 Len[ ],
275 OUT UINT16 Code[]
276 );
277
278 STATIC
279 INT32
280 MakeTree (
281 IN INT32 NParm,
282 IN UINT16 FreqParm[],
283 OUT UINT8 LenParm[ ],
284 OUT UINT16 CodeParm[]
285 );
286
287 /**
288 Read NumOfBit of bits from source into mBitBuf
289
290 Shift mBitBuf NumOfBits left. Read in NumOfBits of bits from source.
291
292 @param Sd The global scratch data
293 @param NumOfBits The number of bits to shift and read.
294
295 **/
296 VOID
297 FillBuf (
298 IN SCRATCH_DATA *Sd,
299 IN UINT16 NumOfBits
300 );
301
302 /**
303 Get NumOfBits of bits out from mBitBuf
304
305 Get NumOfBits of bits out from mBitBuf. Fill mBitBuf with subsequent
306 NumOfBits of bits from source. Returns NumOfBits of bits that are
307 popped out.
308
309 @param Sd The global scratch data.
310 @param NumOfBits The number of bits to pop and read.
311
312 @return The bits that are popped out.
313
314 **/
315 UINT32
316 GetBits (
317 IN SCRATCH_DATA *Sd,
318 IN UINT16 NumOfBits
319 );
320
321 /**
322 Creates Huffman Code mapping table according to code length array.
323
324 Creates Huffman Code mapping table for Extra Set, Char&Len Set
325 and Position Set according to code length array.
326
327 @param Sd The global scratch data
328 @param NumOfChar Number of symbols in the symbol set
329 @param BitLen Code length array
330 @param TableBits The width of the mapping table
331 @param Table The table
332
333 @retval 0 OK.
334 @retval BAD_TABLE The table is corrupted.
335
336 **/
337 UINT16
338 MakeTable (
339 IN SCRATCH_DATA *Sd,
340 IN UINT16 NumOfChar,
341 IN UINT8 *BitLen,
342 IN UINT16 TableBits,
343 OUT UINT16 *Table
344 );
345
346 /**
347 Decodes a position value.
348
349 Get a position value according to Position Huffman Table.
350
351 @param Sd the global scratch data
352
353 @return The position value decoded.
354
355 **/
356 UINT32
357 DecodeP (
358 IN SCRATCH_DATA *Sd
359 );
360
361 /**
362 Reads code lengths for the Extra Set or the Position Set.
363
364 Read in the Extra Set or Pointion Set Length Arrary, then
365 generate the Huffman code mapping for them.
366
367 @param Sd The global scratch data.
368 @param nn Number of symbols.
369 @param nbit Number of bits needed to represent nn.
370 @param Special The special symbol that needs to be taken care of.
371
372 @retval 0 OK.
373 @retval BAD_TABLE Table is corrupted.
374
375 **/
376 UINT16
377 ReadPTLen (
378 IN SCRATCH_DATA *Sd,
379 IN UINT16 nn,
380 IN UINT16 nbit,
381 IN UINT16 Special
382 );
383
384 /**
385 Reads code lengths for Char&Len Set.
386
387 Read in and decode the Char&Len Set Code Length Array, then
388 generate the Huffman Code mapping table for the Char&Len Set.
389
390 @param Sd the global scratch data
391
392 **/
393 VOID
394 ReadCLen (
395 SCRATCH_DATA *Sd
396 );
397
398 /**
399 Decode a character/length value.
400
401 Read one value from mBitBuf, Get one code from mBitBuf. If it is at block boundary, generates
402 Huffman code mapping table for Extra Set, Code&Len Set and
403 Position Set.
404
405 @param Sd The global scratch data.
406
407 @return The value decoded.
408
409 **/
410 UINT16
411 DecodeC (
412 SCRATCH_DATA *Sd
413 );
414
415 /**
416 Decode the source data and put the resulting data into the destination buffer.
417
418 Decode the source data and put the resulting data into the destination buffer.
419
420 @param Sd The global scratch data
421
422 **/
423 VOID
424 Decode (
425 SCRATCH_DATA *Sd
426 );
427
428 RETURN_STATUS
429 EFIAPI
430 Decompress (
431 IN VOID *Source,
432 IN OUT VOID *Destination,
433 IN OUT VOID *Scratch,
434 IN UINT32 Version
435 );
436
437 #endif