161362d65fcdd6f6aff90fc5be51237b39cfeb9aeBill Richardson/* Copyright (c) 2010 The Chromium OS Authors. All rights reserved. 261362d65fcdd6f6aff90fc5be51237b39cfeb9aeBill Richardson * Use of this source code is governed by a BSD-style license that can be 361362d65fcdd6f6aff90fc5be51237b39cfeb9aeBill Richardson * found in the LICENSE file. 461362d65fcdd6f6aff90fc5be51237b39cfeb9aeBill Richardson */ 561362d65fcdd6f6aff90fc5be51237b39cfeb9aeBill Richardson 661362d65fcdd6f6aff90fc5be51237b39cfeb9aeBill Richardson/*++ 761362d65fcdd6f6aff90fc5be51237b39cfeb9aeBill Richardson 861362d65fcdd6f6aff90fc5be51237b39cfeb9aeBill RichardsonCopyright (c) 2004 - 2006, Intel Corporation 961362d65fcdd6f6aff90fc5be51237b39cfeb9aeBill RichardsonAll rights reserved. This program and the accompanying materials 1061362d65fcdd6f6aff90fc5be51237b39cfeb9aeBill Richardsonare licensed and made available under the terms and conditions of the BSD License 1161362d65fcdd6f6aff90fc5be51237b39cfeb9aeBill Richardsonwhich accompanies this distribution. The full text of the license may be found at 1261362d65fcdd6f6aff90fc5be51237b39cfeb9aeBill Richardsonhttp://opensource.org/licenses/bsd-license.php 1361362d65fcdd6f6aff90fc5be51237b39cfeb9aeBill Richardson 1461362d65fcdd6f6aff90fc5be51237b39cfeb9aeBill RichardsonTHE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, 1561362d65fcdd6f6aff90fc5be51237b39cfeb9aeBill RichardsonWITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. 1661362d65fcdd6f6aff90fc5be51237b39cfeb9aeBill Richardson 1761362d65fcdd6f6aff90fc5be51237b39cfeb9aeBill RichardsonModule Name: 1861362d65fcdd6f6aff90fc5be51237b39cfeb9aeBill Richardson 1961362d65fcdd6f6aff90fc5be51237b39cfeb9aeBill Richardson Decompress.c 2061362d65fcdd6f6aff90fc5be51237b39cfeb9aeBill Richardson 2161362d65fcdd6f6aff90fc5be51237b39cfeb9aeBill RichardsonAbstract: 2261362d65fcdd6f6aff90fc5be51237b39cfeb9aeBill Richardson 2361362d65fcdd6f6aff90fc5be51237b39cfeb9aeBill Richardson Decompressor. Algorithm Ported from OPSD code (Decomp.asm) 2461362d65fcdd6f6aff90fc5be51237b39cfeb9aeBill Richardson 2561362d65fcdd6f6aff90fc5be51237b39cfeb9aeBill Richardson--*/ 2661362d65fcdd6f6aff90fc5be51237b39cfeb9aeBill Richardson 2761362d65fcdd6f6aff90fc5be51237b39cfeb9aeBill Richardson#include <errno.h> 2861362d65fcdd6f6aff90fc5be51237b39cfeb9aeBill Richardson#include <stdint.h> 2961362d65fcdd6f6aff90fc5be51237b39cfeb9aeBill Richardson#include <stdio.h> 3061362d65fcdd6f6aff90fc5be51237b39cfeb9aeBill Richardson#include <stdlib.h> 3161362d65fcdd6f6aff90fc5be51237b39cfeb9aeBill Richardson#include <string.h> 3261362d65fcdd6f6aff90fc5be51237b39cfeb9aeBill Richardson#include <sys/types.h> 3361362d65fcdd6f6aff90fc5be51237b39cfeb9aeBill Richardson#include <sys/stat.h> 3461362d65fcdd6f6aff90fc5be51237b39cfeb9aeBill Richardson#include <unistd.h> 3561362d65fcdd6f6aff90fc5be51237b39cfeb9aeBill Richardson 3661362d65fcdd6f6aff90fc5be51237b39cfeb9aeBill Richardson#include "eficompress.h" 3761362d65fcdd6f6aff90fc5be51237b39cfeb9aeBill Richardson 3861362d65fcdd6f6aff90fc5be51237b39cfeb9aeBill Richardson 3961362d65fcdd6f6aff90fc5be51237b39cfeb9aeBill Richardson// 4061362d65fcdd6f6aff90fc5be51237b39cfeb9aeBill Richardson// Decompression algorithm begins here 4161362d65fcdd6f6aff90fc5be51237b39cfeb9aeBill Richardson// 4261362d65fcdd6f6aff90fc5be51237b39cfeb9aeBill Richardson#define BITBUFSIZ 32 4361362d65fcdd6f6aff90fc5be51237b39cfeb9aeBill Richardson#define MAXMATCH 256 4461362d65fcdd6f6aff90fc5be51237b39cfeb9aeBill Richardson#define THRESHOLD 3 4561362d65fcdd6f6aff90fc5be51237b39cfeb9aeBill Richardson#define CODE_BIT 16 4661362d65fcdd6f6aff90fc5be51237b39cfeb9aeBill Richardson#define BAD_TABLE - 1 4761362d65fcdd6f6aff90fc5be51237b39cfeb9aeBill Richardson 4861362d65fcdd6f6aff90fc5be51237b39cfeb9aeBill Richardson// 4961362d65fcdd6f6aff90fc5be51237b39cfeb9aeBill Richardson// C: Char&Len Set; P: Position Set; T: exTra Set 5061362d65fcdd6f6aff90fc5be51237b39cfeb9aeBill Richardson// 5161362d65fcdd6f6aff90fc5be51237b39cfeb9aeBill Richardson#define NC (0xff + MAXMATCH + 2 - THRESHOLD) 5261362d65fcdd6f6aff90fc5be51237b39cfeb9aeBill Richardson#define CBIT 9 5361362d65fcdd6f6aff90fc5be51237b39cfeb9aeBill Richardson#define MAXPBIT 5 5461362d65fcdd6f6aff90fc5be51237b39cfeb9aeBill Richardson#define TBIT 5 5561362d65fcdd6f6aff90fc5be51237b39cfeb9aeBill Richardson#define MAXNP ((1U << MAXPBIT) - 1) 5661362d65fcdd6f6aff90fc5be51237b39cfeb9aeBill Richardson#define NT (CODE_BIT + 3) 5761362d65fcdd6f6aff90fc5be51237b39cfeb9aeBill Richardson#if NT > MAXNP 5861362d65fcdd6f6aff90fc5be51237b39cfeb9aeBill Richardson#define NPT NT 5961362d65fcdd6f6aff90fc5be51237b39cfeb9aeBill Richardson#else 6061362d65fcdd6f6aff90fc5be51237b39cfeb9aeBill Richardson#define NPT MAXNP 6161362d65fcdd6f6aff90fc5be51237b39cfeb9aeBill Richardson#endif 6261362d65fcdd6f6aff90fc5be51237b39cfeb9aeBill Richardson 6361362d65fcdd6f6aff90fc5be51237b39cfeb9aeBill Richardsontypedef struct { 6461362d65fcdd6f6aff90fc5be51237b39cfeb9aeBill Richardson UINT8 *mSrcBase; // Starting address of compressed data 6561362d65fcdd6f6aff90fc5be51237b39cfeb9aeBill Richardson UINT8 *mDstBase; // Starting address of decompressed data 6661362d65fcdd6f6aff90fc5be51237b39cfeb9aeBill Richardson UINT32 mOutBuf; 6761362d65fcdd6f6aff90fc5be51237b39cfeb9aeBill Richardson UINT32 mInBuf; 6861362d65fcdd6f6aff90fc5be51237b39cfeb9aeBill Richardson 6961362d65fcdd6f6aff90fc5be51237b39cfeb9aeBill Richardson UINT16 mBitCount; 7061362d65fcdd6f6aff90fc5be51237b39cfeb9aeBill Richardson UINT32 mBitBuf; 7161362d65fcdd6f6aff90fc5be51237b39cfeb9aeBill Richardson UINT32 mSubBitBuf; 7261362d65fcdd6f6aff90fc5be51237b39cfeb9aeBill Richardson UINT16 mBlockSize; 7361362d65fcdd6f6aff90fc5be51237b39cfeb9aeBill Richardson UINT32 mCompSize; 7461362d65fcdd6f6aff90fc5be51237b39cfeb9aeBill Richardson UINT32 mOrigSize; 7561362d65fcdd6f6aff90fc5be51237b39cfeb9aeBill Richardson 7661362d65fcdd6f6aff90fc5be51237b39cfeb9aeBill Richardson UINT16 mBadTableFlag; 7761362d65fcdd6f6aff90fc5be51237b39cfeb9aeBill Richardson 7861362d65fcdd6f6aff90fc5be51237b39cfeb9aeBill Richardson UINT16 mLeft[2 * NC - 1]; 7961362d65fcdd6f6aff90fc5be51237b39cfeb9aeBill Richardson UINT16 mRight[2 * NC - 1]; 8061362d65fcdd6f6aff90fc5be51237b39cfeb9aeBill Richardson UINT8 mCLen[NC]; 8161362d65fcdd6f6aff90fc5be51237b39cfeb9aeBill Richardson UINT8 mPTLen[NPT]; 8261362d65fcdd6f6aff90fc5be51237b39cfeb9aeBill Richardson UINT16 mCTable[4096]; 8361362d65fcdd6f6aff90fc5be51237b39cfeb9aeBill Richardson UINT16 mPTTable[256]; 8461362d65fcdd6f6aff90fc5be51237b39cfeb9aeBill Richardson 8561362d65fcdd6f6aff90fc5be51237b39cfeb9aeBill Richardson // 8661362d65fcdd6f6aff90fc5be51237b39cfeb9aeBill Richardson // The length of the field 'Position Set Code Length Array Size' in Block Header. 8761362d65fcdd6f6aff90fc5be51237b39cfeb9aeBill Richardson // For EFI 1.1 de/compression algorithm, mPBit = 4 8861362d65fcdd6f6aff90fc5be51237b39cfeb9aeBill Richardson // For Tiano de/compression algorithm, mPBit = 5 8961362d65fcdd6f6aff90fc5be51237b39cfeb9aeBill Richardson // 9061362d65fcdd6f6aff90fc5be51237b39cfeb9aeBill Richardson UINT8 mPBit; 9161362d65fcdd6f6aff90fc5be51237b39cfeb9aeBill Richardson} SCRATCH_DATA; 9261362d65fcdd6f6aff90fc5be51237b39cfeb9aeBill Richardson 9361362d65fcdd6f6aff90fc5be51237b39cfeb9aeBill RichardsonSTATIC 9461362d65fcdd6f6aff90fc5be51237b39cfeb9aeBill RichardsonVOID 9561362d65fcdd6f6aff90fc5be51237b39cfeb9aeBill RichardsonFillBuf ( 9661362d65fcdd6f6aff90fc5be51237b39cfeb9aeBill Richardson IN SCRATCH_DATA *Sd, 9761362d65fcdd6f6aff90fc5be51237b39cfeb9aeBill Richardson IN UINT16 NumOfBits 9861362d65fcdd6f6aff90fc5be51237b39cfeb9aeBill Richardson ) 9961362d65fcdd6f6aff90fc5be51237b39cfeb9aeBill Richardson/*++ 10061362d65fcdd6f6aff90fc5be51237b39cfeb9aeBill Richardson 10161362d65fcdd6f6aff90fc5be51237b39cfeb9aeBill RichardsonRoutine Description: 10261362d65fcdd6f6aff90fc5be51237b39cfeb9aeBill Richardson 10361362d65fcdd6f6aff90fc5be51237b39cfeb9aeBill Richardson Shift mBitBuf NumOfBits left. Read in NumOfBits of bits from source. 10461362d65fcdd6f6aff90fc5be51237b39cfeb9aeBill Richardson 10561362d65fcdd6f6aff90fc5be51237b39cfeb9aeBill RichardsonArguments: 10661362d65fcdd6f6aff90fc5be51237b39cfeb9aeBill Richardson 10761362d65fcdd6f6aff90fc5be51237b39cfeb9aeBill Richardson Sd - The global scratch data 10861362d65fcdd6f6aff90fc5be51237b39cfeb9aeBill Richardson NumOfBits - The number of bits to shift and read. 10961362d65fcdd6f6aff90fc5be51237b39cfeb9aeBill Richardson 11061362d65fcdd6f6aff90fc5be51237b39cfeb9aeBill RichardsonReturns: (VOID) 11161362d65fcdd6f6aff90fc5be51237b39cfeb9aeBill Richardson 11261362d65fcdd6f6aff90fc5be51237b39cfeb9aeBill Richardson--*/ 11361362d65fcdd6f6aff90fc5be51237b39cfeb9aeBill Richardson{ 11461362d65fcdd6f6aff90fc5be51237b39cfeb9aeBill Richardson Sd->mBitBuf = (UINT32) (Sd->mBitBuf << NumOfBits); 11561362d65fcdd6f6aff90fc5be51237b39cfeb9aeBill Richardson 11661362d65fcdd6f6aff90fc5be51237b39cfeb9aeBill Richardson while (NumOfBits > Sd->mBitCount) { 11761362d65fcdd6f6aff90fc5be51237b39cfeb9aeBill Richardson 11861362d65fcdd6f6aff90fc5be51237b39cfeb9aeBill Richardson Sd->mBitBuf |= (UINT32) (Sd->mSubBitBuf << (NumOfBits = (UINT16) (NumOfBits - Sd->mBitCount))); 11961362d65fcdd6f6aff90fc5be51237b39cfeb9aeBill Richardson 12061362d65fcdd6f6aff90fc5be51237b39cfeb9aeBill Richardson if (Sd->mCompSize > 0) { 12161362d65fcdd6f6aff90fc5be51237b39cfeb9aeBill Richardson // 12261362d65fcdd6f6aff90fc5be51237b39cfeb9aeBill Richardson // Get 1 byte into SubBitBuf 12361362d65fcdd6f6aff90fc5be51237b39cfeb9aeBill Richardson // 12461362d65fcdd6f6aff90fc5be51237b39cfeb9aeBill Richardson Sd->mCompSize--; 12561362d65fcdd6f6aff90fc5be51237b39cfeb9aeBill Richardson Sd->mSubBitBuf = 0; 12661362d65fcdd6f6aff90fc5be51237b39cfeb9aeBill Richardson Sd->mSubBitBuf = Sd->mSrcBase[Sd->mInBuf++]; 12761362d65fcdd6f6aff90fc5be51237b39cfeb9aeBill Richardson Sd->mBitCount = 8; 12861362d65fcdd6f6aff90fc5be51237b39cfeb9aeBill Richardson 12961362d65fcdd6f6aff90fc5be51237b39cfeb9aeBill Richardson } else { 13061362d65fcdd6f6aff90fc5be51237b39cfeb9aeBill Richardson // 13161362d65fcdd6f6aff90fc5be51237b39cfeb9aeBill Richardson // No more bits from the source, just pad zero bit. 13261362d65fcdd6f6aff90fc5be51237b39cfeb9aeBill Richardson // 13361362d65fcdd6f6aff90fc5be51237b39cfeb9aeBill Richardson Sd->mSubBitBuf = 0; 13461362d65fcdd6f6aff90fc5be51237b39cfeb9aeBill Richardson Sd->mBitCount = 8; 13561362d65fcdd6f6aff90fc5be51237b39cfeb9aeBill Richardson 13661362d65fcdd6f6aff90fc5be51237b39cfeb9aeBill Richardson } 13761362d65fcdd6f6aff90fc5be51237b39cfeb9aeBill Richardson } 13861362d65fcdd6f6aff90fc5be51237b39cfeb9aeBill Richardson 13961362d65fcdd6f6aff90fc5be51237b39cfeb9aeBill Richardson Sd->mBitCount = (UINT16) (Sd->mBitCount - NumOfBits); 14061362d65fcdd6f6aff90fc5be51237b39cfeb9aeBill Richardson Sd->mBitBuf |= Sd->mSubBitBuf >> Sd->mBitCount; 14161362d65fcdd6f6aff90fc5be51237b39cfeb9aeBill Richardson} 14261362d65fcdd6f6aff90fc5be51237b39cfeb9aeBill Richardson 14361362d65fcdd6f6aff90fc5be51237b39cfeb9aeBill RichardsonSTATIC 14461362d65fcdd6f6aff90fc5be51237b39cfeb9aeBill RichardsonUINT32 14561362d65fcdd6f6aff90fc5be51237b39cfeb9aeBill RichardsonGetBits ( 14661362d65fcdd6f6aff90fc5be51237b39cfeb9aeBill Richardson IN SCRATCH_DATA *Sd, 14761362d65fcdd6f6aff90fc5be51237b39cfeb9aeBill Richardson IN UINT16 NumOfBits 14861362d65fcdd6f6aff90fc5be51237b39cfeb9aeBill Richardson ) 14961362d65fcdd6f6aff90fc5be51237b39cfeb9aeBill Richardson/*++ 15061362d65fcdd6f6aff90fc5be51237b39cfeb9aeBill Richardson 15161362d65fcdd6f6aff90fc5be51237b39cfeb9aeBill RichardsonRoutine Description: 15261362d65fcdd6f6aff90fc5be51237b39cfeb9aeBill Richardson 15361362d65fcdd6f6aff90fc5be51237b39cfeb9aeBill Richardson Get NumOfBits of bits out from mBitBuf. Fill mBitBuf with subsequent 15461362d65fcdd6f6aff90fc5be51237b39cfeb9aeBill Richardson NumOfBits of bits from source. Returns NumOfBits of bits that are 15561362d65fcdd6f6aff90fc5be51237b39cfeb9aeBill Richardson popped out. 15661362d65fcdd6f6aff90fc5be51237b39cfeb9aeBill Richardson 15761362d65fcdd6f6aff90fc5be51237b39cfeb9aeBill RichardsonArguments: 15861362d65fcdd6f6aff90fc5be51237b39cfeb9aeBill Richardson 15961362d65fcdd6f6aff90fc5be51237b39cfeb9aeBill Richardson Sd - The global scratch data. 16061362d65fcdd6f6aff90fc5be51237b39cfeb9aeBill Richardson NumOfBits - The number of bits to pop and read. 16161362d65fcdd6f6aff90fc5be51237b39cfeb9aeBill Richardson 16261362d65fcdd6f6aff90fc5be51237b39cfeb9aeBill RichardsonReturns: 16361362d65fcdd6f6aff90fc5be51237b39cfeb9aeBill Richardson 16461362d65fcdd6f6aff90fc5be51237b39cfeb9aeBill Richardson The bits that are popped out. 16561362d65fcdd6f6aff90fc5be51237b39cfeb9aeBill Richardson 16661362d65fcdd6f6aff90fc5be51237b39cfeb9aeBill Richardson--*/ 16761362d65fcdd6f6aff90fc5be51237b39cfeb9aeBill Richardson{ 16861362d65fcdd6f6aff90fc5be51237b39cfeb9aeBill Richardson UINT32 OutBits; 16961362d65fcdd6f6aff90fc5be51237b39cfeb9aeBill Richardson 17061362d65fcdd6f6aff90fc5be51237b39cfeb9aeBill Richardson OutBits = (UINT32) (Sd->mBitBuf >> (BITBUFSIZ - NumOfBits)); 17161362d65fcdd6f6aff90fc5be51237b39cfeb9aeBill Richardson 17261362d65fcdd6f6aff90fc5be51237b39cfeb9aeBill Richardson FillBuf (Sd, NumOfBits); 17361362d65fcdd6f6aff90fc5be51237b39cfeb9aeBill Richardson 17461362d65fcdd6f6aff90fc5be51237b39cfeb9aeBill Richardson return OutBits; 17561362d65fcdd6f6aff90fc5be51237b39cfeb9aeBill Richardson} 17661362d65fcdd6f6aff90fc5be51237b39cfeb9aeBill Richardson 17761362d65fcdd6f6aff90fc5be51237b39cfeb9aeBill RichardsonSTATIC 17861362d65fcdd6f6aff90fc5be51237b39cfeb9aeBill RichardsonUINT16 17961362d65fcdd6f6aff90fc5be51237b39cfeb9aeBill RichardsonMakeTable ( 18061362d65fcdd6f6aff90fc5be51237b39cfeb9aeBill Richardson IN SCRATCH_DATA *Sd, 18161362d65fcdd6f6aff90fc5be51237b39cfeb9aeBill Richardson IN UINT16 NumOfChar, 18261362d65fcdd6f6aff90fc5be51237b39cfeb9aeBill Richardson IN UINT8 *BitLen, 18361362d65fcdd6f6aff90fc5be51237b39cfeb9aeBill Richardson IN UINT16 TableBits, 18461362d65fcdd6f6aff90fc5be51237b39cfeb9aeBill Richardson OUT UINT16 *Table 18561362d65fcdd6f6aff90fc5be51237b39cfeb9aeBill Richardson ) 18661362d65fcdd6f6aff90fc5be51237b39cfeb9aeBill Richardson/*++ 18761362d65fcdd6f6aff90fc5be51237b39cfeb9aeBill Richardson 18861362d65fcdd6f6aff90fc5be51237b39cfeb9aeBill RichardsonRoutine Description: 18961362d65fcdd6f6aff90fc5be51237b39cfeb9aeBill Richardson 19061362d65fcdd6f6aff90fc5be51237b39cfeb9aeBill Richardson Creates Huffman Code mapping table according to code length array. 19161362d65fcdd6f6aff90fc5be51237b39cfeb9aeBill Richardson 19261362d65fcdd6f6aff90fc5be51237b39cfeb9aeBill RichardsonArguments: 19361362d65fcdd6f6aff90fc5be51237b39cfeb9aeBill Richardson 19461362d65fcdd6f6aff90fc5be51237b39cfeb9aeBill Richardson Sd - The global scratch data 19561362d65fcdd6f6aff90fc5be51237b39cfeb9aeBill Richardson NumOfChar - Number of symbols in the symbol set 19661362d65fcdd6f6aff90fc5be51237b39cfeb9aeBill Richardson BitLen - Code length array 19761362d65fcdd6f6aff90fc5be51237b39cfeb9aeBill Richardson TableBits - The width of the mapping table 19861362d65fcdd6f6aff90fc5be51237b39cfeb9aeBill Richardson Table - The table 19961362d65fcdd6f6aff90fc5be51237b39cfeb9aeBill Richardson 20061362d65fcdd6f6aff90fc5be51237b39cfeb9aeBill RichardsonReturns: 20161362d65fcdd6f6aff90fc5be51237b39cfeb9aeBill Richardson 20261362d65fcdd6f6aff90fc5be51237b39cfeb9aeBill Richardson 0 - OK. 20361362d65fcdd6f6aff90fc5be51237b39cfeb9aeBill Richardson BAD_TABLE - The table is corrupted. 20461362d65fcdd6f6aff90fc5be51237b39cfeb9aeBill Richardson 20561362d65fcdd6f6aff90fc5be51237b39cfeb9aeBill Richardson--*/ 20661362d65fcdd6f6aff90fc5be51237b39cfeb9aeBill Richardson{ 20761362d65fcdd6f6aff90fc5be51237b39cfeb9aeBill Richardson UINT16 Count[17]; 20861362d65fcdd6f6aff90fc5be51237b39cfeb9aeBill Richardson UINT16 Weight[17]; 20961362d65fcdd6f6aff90fc5be51237b39cfeb9aeBill Richardson UINT16 Start[18]; 21061362d65fcdd6f6aff90fc5be51237b39cfeb9aeBill Richardson UINT16 *Pointer; 21161362d65fcdd6f6aff90fc5be51237b39cfeb9aeBill Richardson UINT16 Index3; 21261362d65fcdd6f6aff90fc5be51237b39cfeb9aeBill Richardson UINT16 Index; 21361362d65fcdd6f6aff90fc5be51237b39cfeb9aeBill Richardson UINT16 Len; 21461362d65fcdd6f6aff90fc5be51237b39cfeb9aeBill Richardson UINT16 Char; 21561362d65fcdd6f6aff90fc5be51237b39cfeb9aeBill Richardson UINT16 JuBits; 21661362d65fcdd6f6aff90fc5be51237b39cfeb9aeBill Richardson UINT16 Avail; 21761362d65fcdd6f6aff90fc5be51237b39cfeb9aeBill Richardson UINT16 NextCode; 21861362d65fcdd6f6aff90fc5be51237b39cfeb9aeBill Richardson UINT16 Mask; 21961362d65fcdd6f6aff90fc5be51237b39cfeb9aeBill Richardson 22061362d65fcdd6f6aff90fc5be51237b39cfeb9aeBill Richardson for (Index = 1; Index <= 16; Index++) { 22161362d65fcdd6f6aff90fc5be51237b39cfeb9aeBill Richardson Count[Index] = 0; 22261362d65fcdd6f6aff90fc5be51237b39cfeb9aeBill Richardson } 22361362d65fcdd6f6aff90fc5be51237b39cfeb9aeBill Richardson 22461362d65fcdd6f6aff90fc5be51237b39cfeb9aeBill Richardson for (Index = 0; Index < NumOfChar; Index++) { 22561362d65fcdd6f6aff90fc5be51237b39cfeb9aeBill Richardson Count[BitLen[Index]]++; 22661362d65fcdd6f6aff90fc5be51237b39cfeb9aeBill Richardson } 22761362d65fcdd6f6aff90fc5be51237b39cfeb9aeBill Richardson 22861362d65fcdd6f6aff90fc5be51237b39cfeb9aeBill Richardson Start[1] = 0; 22961362d65fcdd6f6aff90fc5be51237b39cfeb9aeBill Richardson 23061362d65fcdd6f6aff90fc5be51237b39cfeb9aeBill Richardson for (Index = 1; Index <= 16; Index++) { 23161362d65fcdd6f6aff90fc5be51237b39cfeb9aeBill Richardson Start[Index + 1] = (UINT16) (Start[Index] + (Count[Index] << (16 - Index))); 23261362d65fcdd6f6aff90fc5be51237b39cfeb9aeBill Richardson } 23361362d65fcdd6f6aff90fc5be51237b39cfeb9aeBill Richardson 23461362d65fcdd6f6aff90fc5be51237b39cfeb9aeBill Richardson if (Start[17] != 0) { 23561362d65fcdd6f6aff90fc5be51237b39cfeb9aeBill Richardson /*(1U << 16)*/ 23661362d65fcdd6f6aff90fc5be51237b39cfeb9aeBill Richardson return (UINT16) BAD_TABLE; 23761362d65fcdd6f6aff90fc5be51237b39cfeb9aeBill Richardson } 23861362d65fcdd6f6aff90fc5be51237b39cfeb9aeBill Richardson 23961362d65fcdd6f6aff90fc5be51237b39cfeb9aeBill Richardson JuBits = (UINT16) (16 - TableBits); 24061362d65fcdd6f6aff90fc5be51237b39cfeb9aeBill Richardson 24161362d65fcdd6f6aff90fc5be51237b39cfeb9aeBill Richardson for (Index = 1; Index <= TableBits; Index++) { 24261362d65fcdd6f6aff90fc5be51237b39cfeb9aeBill Richardson Start[Index] >>= JuBits; 24361362d65fcdd6f6aff90fc5be51237b39cfeb9aeBill Richardson Weight[Index] = (UINT16) (1U << (TableBits - Index)); 24461362d65fcdd6f6aff90fc5be51237b39cfeb9aeBill Richardson } 24561362d65fcdd6f6aff90fc5be51237b39cfeb9aeBill Richardson 24661362d65fcdd6f6aff90fc5be51237b39cfeb9aeBill Richardson while (Index <= 16) { 24761362d65fcdd6f6aff90fc5be51237b39cfeb9aeBill Richardson Weight[Index] = (UINT16) (1U << (16 - Index)); 24861362d65fcdd6f6aff90fc5be51237b39cfeb9aeBill Richardson Index++; 24961362d65fcdd6f6aff90fc5be51237b39cfeb9aeBill Richardson } 25061362d65fcdd6f6aff90fc5be51237b39cfeb9aeBill Richardson 25161362d65fcdd6f6aff90fc5be51237b39cfeb9aeBill Richardson Index = (UINT16) (Start[TableBits + 1] >> JuBits); 25261362d65fcdd6f6aff90fc5be51237b39cfeb9aeBill Richardson 25361362d65fcdd6f6aff90fc5be51237b39cfeb9aeBill Richardson if (Index != 0) { 25461362d65fcdd6f6aff90fc5be51237b39cfeb9aeBill Richardson Index3 = (UINT16) (1U << TableBits); 25561362d65fcdd6f6aff90fc5be51237b39cfeb9aeBill Richardson while (Index != Index3) { 25661362d65fcdd6f6aff90fc5be51237b39cfeb9aeBill Richardson Table[Index++] = 0; 25761362d65fcdd6f6aff90fc5be51237b39cfeb9aeBill Richardson } 25861362d65fcdd6f6aff90fc5be51237b39cfeb9aeBill Richardson } 25961362d65fcdd6f6aff90fc5be51237b39cfeb9aeBill Richardson 26061362d65fcdd6f6aff90fc5be51237b39cfeb9aeBill Richardson Avail = NumOfChar; 26161362d65fcdd6f6aff90fc5be51237b39cfeb9aeBill Richardson Mask = (UINT16) (1U << (15 - TableBits)); 26261362d65fcdd6f6aff90fc5be51237b39cfeb9aeBill Richardson 26361362d65fcdd6f6aff90fc5be51237b39cfeb9aeBill Richardson for (Char = 0; Char < NumOfChar; Char++) { 26461362d65fcdd6f6aff90fc5be51237b39cfeb9aeBill Richardson 26561362d65fcdd6f6aff90fc5be51237b39cfeb9aeBill Richardson Len = BitLen[Char]; 26661362d65fcdd6f6aff90fc5be51237b39cfeb9aeBill Richardson if (Len == 0) { 26761362d65fcdd6f6aff90fc5be51237b39cfeb9aeBill Richardson continue; 26861362d65fcdd6f6aff90fc5be51237b39cfeb9aeBill Richardson } 26961362d65fcdd6f6aff90fc5be51237b39cfeb9aeBill Richardson 27061362d65fcdd6f6aff90fc5be51237b39cfeb9aeBill Richardson NextCode = (UINT16) (Start[Len] + Weight[Len]); 27161362d65fcdd6f6aff90fc5be51237b39cfeb9aeBill Richardson 27261362d65fcdd6f6aff90fc5be51237b39cfeb9aeBill Richardson if (Len <= TableBits) { 27361362d65fcdd6f6aff90fc5be51237b39cfeb9aeBill Richardson 27461362d65fcdd6f6aff90fc5be51237b39cfeb9aeBill Richardson for (Index = Start[Len]; Index < NextCode; Index++) { 27561362d65fcdd6f6aff90fc5be51237b39cfeb9aeBill Richardson Table[Index] = Char; 27661362d65fcdd6f6aff90fc5be51237b39cfeb9aeBill Richardson } 27761362d65fcdd6f6aff90fc5be51237b39cfeb9aeBill Richardson 27861362d65fcdd6f6aff90fc5be51237b39cfeb9aeBill Richardson } else { 27961362d65fcdd6f6aff90fc5be51237b39cfeb9aeBill Richardson 28061362d65fcdd6f6aff90fc5be51237b39cfeb9aeBill Richardson Index3 = Start[Len]; 28161362d65fcdd6f6aff90fc5be51237b39cfeb9aeBill Richardson Pointer = &Table[Index3 >> JuBits]; 28261362d65fcdd6f6aff90fc5be51237b39cfeb9aeBill Richardson Index = (UINT16) (Len - TableBits); 28361362d65fcdd6f6aff90fc5be51237b39cfeb9aeBill Richardson 28461362d65fcdd6f6aff90fc5be51237b39cfeb9aeBill Richardson while (Index != 0) { 28561362d65fcdd6f6aff90fc5be51237b39cfeb9aeBill Richardson if (*Pointer == 0) { 28661362d65fcdd6f6aff90fc5be51237b39cfeb9aeBill Richardson Sd->mRight[Avail] = Sd->mLeft[Avail] = 0; 28761362d65fcdd6f6aff90fc5be51237b39cfeb9aeBill Richardson *Pointer = Avail++; 28861362d65fcdd6f6aff90fc5be51237b39cfeb9aeBill Richardson } 28961362d65fcdd6f6aff90fc5be51237b39cfeb9aeBill Richardson 29061362d65fcdd6f6aff90fc5be51237b39cfeb9aeBill Richardson if (Index3 & Mask) { 29161362d65fcdd6f6aff90fc5be51237b39cfeb9aeBill Richardson Pointer = &Sd->mRight[*Pointer]; 29261362d65fcdd6f6aff90fc5be51237b39cfeb9aeBill Richardson } else { 29361362d65fcdd6f6aff90fc5be51237b39cfeb9aeBill Richardson Pointer = &Sd->mLeft[*Pointer]; 29461362d65fcdd6f6aff90fc5be51237b39cfeb9aeBill Richardson } 29561362d65fcdd6f6aff90fc5be51237b39cfeb9aeBill Richardson 29661362d65fcdd6f6aff90fc5be51237b39cfeb9aeBill Richardson Index3 <<= 1; 29761362d65fcdd6f6aff90fc5be51237b39cfeb9aeBill Richardson Index--; 29861362d65fcdd6f6aff90fc5be51237b39cfeb9aeBill Richardson } 29961362d65fcdd6f6aff90fc5be51237b39cfeb9aeBill Richardson 30061362d65fcdd6f6aff90fc5be51237b39cfeb9aeBill Richardson *Pointer = Char; 30161362d65fcdd6f6aff90fc5be51237b39cfeb9aeBill Richardson 30261362d65fcdd6f6aff90fc5be51237b39cfeb9aeBill Richardson } 30361362d65fcdd6f6aff90fc5be51237b39cfeb9aeBill Richardson 30461362d65fcdd6f6aff90fc5be51237b39cfeb9aeBill Richardson Start[Len] = NextCode; 30561362d65fcdd6f6aff90fc5be51237b39cfeb9aeBill Richardson } 30661362d65fcdd6f6aff90fc5be51237b39cfeb9aeBill Richardson // 30761362d65fcdd6f6aff90fc5be51237b39cfeb9aeBill Richardson // Succeeds 30861362d65fcdd6f6aff90fc5be51237b39cfeb9aeBill Richardson // 30961362d65fcdd6f6aff90fc5be51237b39cfeb9aeBill Richardson return 0; 31061362d65fcdd6f6aff90fc5be51237b39cfeb9aeBill Richardson} 31161362d65fcdd6f6aff90fc5be51237b39cfeb9aeBill Richardson 31261362d65fcdd6f6aff90fc5be51237b39cfeb9aeBill RichardsonSTATIC 31361362d65fcdd6f6aff90fc5be51237b39cfeb9aeBill RichardsonUINT32 31461362d65fcdd6f6aff90fc5be51237b39cfeb9aeBill RichardsonDecodeP ( 31561362d65fcdd6f6aff90fc5be51237b39cfeb9aeBill Richardson IN SCRATCH_DATA *Sd 31661362d65fcdd6f6aff90fc5be51237b39cfeb9aeBill Richardson ) 31761362d65fcdd6f6aff90fc5be51237b39cfeb9aeBill Richardson/*++ 31861362d65fcdd6f6aff90fc5be51237b39cfeb9aeBill Richardson 31961362d65fcdd6f6aff90fc5be51237b39cfeb9aeBill RichardsonRoutine Description: 32061362d65fcdd6f6aff90fc5be51237b39cfeb9aeBill Richardson 32161362d65fcdd6f6aff90fc5be51237b39cfeb9aeBill Richardson Decodes a position value. 32261362d65fcdd6f6aff90fc5be51237b39cfeb9aeBill Richardson 32361362d65fcdd6f6aff90fc5be51237b39cfeb9aeBill RichardsonArguments: 32461362d65fcdd6f6aff90fc5be51237b39cfeb9aeBill Richardson 32561362d65fcdd6f6aff90fc5be51237b39cfeb9aeBill Richardson Sd - the global scratch data 32661362d65fcdd6f6aff90fc5be51237b39cfeb9aeBill Richardson 32761362d65fcdd6f6aff90fc5be51237b39cfeb9aeBill RichardsonReturns: 32861362d65fcdd6f6aff90fc5be51237b39cfeb9aeBill Richardson 32961362d65fcdd6f6aff90fc5be51237b39cfeb9aeBill Richardson The position value decoded. 33061362d65fcdd6f6aff90fc5be51237b39cfeb9aeBill Richardson 33161362d65fcdd6f6aff90fc5be51237b39cfeb9aeBill Richardson--*/ 33261362d65fcdd6f6aff90fc5be51237b39cfeb9aeBill Richardson{ 33361362d65fcdd6f6aff90fc5be51237b39cfeb9aeBill Richardson UINT16 Val; 33461362d65fcdd6f6aff90fc5be51237b39cfeb9aeBill Richardson UINT32 Mask; 33561362d65fcdd6f6aff90fc5be51237b39cfeb9aeBill Richardson UINT32 Pos; 33661362d65fcdd6f6aff90fc5be51237b39cfeb9aeBill Richardson 33761362d65fcdd6f6aff90fc5be51237b39cfeb9aeBill Richardson Val = Sd->mPTTable[Sd->mBitBuf >> (BITBUFSIZ - 8)]; 33861362d65fcdd6f6aff90fc5be51237b39cfeb9aeBill Richardson 33961362d65fcdd6f6aff90fc5be51237b39cfeb9aeBill Richardson if (Val >= MAXNP) { 34061362d65fcdd6f6aff90fc5be51237b39cfeb9aeBill Richardson Mask = 1U << (BITBUFSIZ - 1 - 8); 34161362d65fcdd6f6aff90fc5be51237b39cfeb9aeBill Richardson 34261362d65fcdd6f6aff90fc5be51237b39cfeb9aeBill Richardson do { 34361362d65fcdd6f6aff90fc5be51237b39cfeb9aeBill Richardson 34461362d65fcdd6f6aff90fc5be51237b39cfeb9aeBill Richardson if (Sd->mBitBuf & Mask) { 34561362d65fcdd6f6aff90fc5be51237b39cfeb9aeBill Richardson Val = Sd->mRight[Val]; 34661362d65fcdd6f6aff90fc5be51237b39cfeb9aeBill Richardson } else { 34761362d65fcdd6f6aff90fc5be51237b39cfeb9aeBill Richardson Val = Sd->mLeft[Val]; 34861362d65fcdd6f6aff90fc5be51237b39cfeb9aeBill Richardson } 34961362d65fcdd6f6aff90fc5be51237b39cfeb9aeBill Richardson 35061362d65fcdd6f6aff90fc5be51237b39cfeb9aeBill Richardson Mask >>= 1; 35161362d65fcdd6f6aff90fc5be51237b39cfeb9aeBill Richardson } while (Val >= MAXNP); 35261362d65fcdd6f6aff90fc5be51237b39cfeb9aeBill Richardson } 35361362d65fcdd6f6aff90fc5be51237b39cfeb9aeBill Richardson // 35461362d65fcdd6f6aff90fc5be51237b39cfeb9aeBill Richardson // Advance what we have read 35561362d65fcdd6f6aff90fc5be51237b39cfeb9aeBill Richardson // 35661362d65fcdd6f6aff90fc5be51237b39cfeb9aeBill Richardson FillBuf (Sd, Sd->mPTLen[Val]); 35761362d65fcdd6f6aff90fc5be51237b39cfeb9aeBill Richardson 35861362d65fcdd6f6aff90fc5be51237b39cfeb9aeBill Richardson Pos = Val; 35961362d65fcdd6f6aff90fc5be51237b39cfeb9aeBill Richardson if (Val > 1) { 36061362d65fcdd6f6aff90fc5be51237b39cfeb9aeBill Richardson Pos = (UINT32) ((1U << (Val - 1)) + GetBits (Sd, (UINT16) (Val - 1))); 36161362d65fcdd6f6aff90fc5be51237b39cfeb9aeBill Richardson } 36261362d65fcdd6f6aff90fc5be51237b39cfeb9aeBill Richardson 36361362d65fcdd6f6aff90fc5be51237b39cfeb9aeBill Richardson return Pos; 36461362d65fcdd6f6aff90fc5be51237b39cfeb9aeBill Richardson} 36561362d65fcdd6f6aff90fc5be51237b39cfeb9aeBill Richardson 36661362d65fcdd6f6aff90fc5be51237b39cfeb9aeBill RichardsonSTATIC 36761362d65fcdd6f6aff90fc5be51237b39cfeb9aeBill RichardsonUINT16 36861362d65fcdd6f6aff90fc5be51237b39cfeb9aeBill RichardsonReadPTLen ( 36961362d65fcdd6f6aff90fc5be51237b39cfeb9aeBill Richardson IN SCRATCH_DATA *Sd, 37061362d65fcdd6f6aff90fc5be51237b39cfeb9aeBill Richardson IN UINT16 nn, 37161362d65fcdd6f6aff90fc5be51237b39cfeb9aeBill Richardson IN UINT16 nbit, 37261362d65fcdd6f6aff90fc5be51237b39cfeb9aeBill Richardson IN UINT16 Special 37361362d65fcdd6f6aff90fc5be51237b39cfeb9aeBill Richardson ) 37461362d65fcdd6f6aff90fc5be51237b39cfeb9aeBill Richardson/*++ 37561362d65fcdd6f6aff90fc5be51237b39cfeb9aeBill Richardson 37661362d65fcdd6f6aff90fc5be51237b39cfeb9aeBill RichardsonRoutine Description: 37761362d65fcdd6f6aff90fc5be51237b39cfeb9aeBill Richardson 37861362d65fcdd6f6aff90fc5be51237b39cfeb9aeBill Richardson Reads code lengths for the Extra Set or the Position Set 37961362d65fcdd6f6aff90fc5be51237b39cfeb9aeBill Richardson 38061362d65fcdd6f6aff90fc5be51237b39cfeb9aeBill RichardsonArguments: 38161362d65fcdd6f6aff90fc5be51237b39cfeb9aeBill Richardson 38261362d65fcdd6f6aff90fc5be51237b39cfeb9aeBill Richardson Sd - The global scratch data 38361362d65fcdd6f6aff90fc5be51237b39cfeb9aeBill Richardson nn - Number of symbols 38461362d65fcdd6f6aff90fc5be51237b39cfeb9aeBill Richardson nbit - Number of bits needed to represent nn 38561362d65fcdd6f6aff90fc5be51237b39cfeb9aeBill Richardson Special - The special symbol that needs to be taken care of 38661362d65fcdd6f6aff90fc5be51237b39cfeb9aeBill Richardson 38761362d65fcdd6f6aff90fc5be51237b39cfeb9aeBill RichardsonReturns: 38861362d65fcdd6f6aff90fc5be51237b39cfeb9aeBill Richardson 38961362d65fcdd6f6aff90fc5be51237b39cfeb9aeBill Richardson 0 - OK. 39061362d65fcdd6f6aff90fc5be51237b39cfeb9aeBill Richardson BAD_TABLE - Table is corrupted. 39161362d65fcdd6f6aff90fc5be51237b39cfeb9aeBill Richardson 39261362d65fcdd6f6aff90fc5be51237b39cfeb9aeBill Richardson--*/ 39361362d65fcdd6f6aff90fc5be51237b39cfeb9aeBill Richardson{ 39461362d65fcdd6f6aff90fc5be51237b39cfeb9aeBill Richardson UINT16 Number; 39561362d65fcdd6f6aff90fc5be51237b39cfeb9aeBill Richardson UINT16 CharC; 39661362d65fcdd6f6aff90fc5be51237b39cfeb9aeBill Richardson UINT16 Index; 39761362d65fcdd6f6aff90fc5be51237b39cfeb9aeBill Richardson UINT32 Mask; 39861362d65fcdd6f6aff90fc5be51237b39cfeb9aeBill Richardson 39961362d65fcdd6f6aff90fc5be51237b39cfeb9aeBill Richardson Number = (UINT16) GetBits (Sd, nbit); 40061362d65fcdd6f6aff90fc5be51237b39cfeb9aeBill Richardson 40161362d65fcdd6f6aff90fc5be51237b39cfeb9aeBill Richardson if (Number == 0) { 40261362d65fcdd6f6aff90fc5be51237b39cfeb9aeBill Richardson CharC = (UINT16) GetBits (Sd, nbit); 40361362d65fcdd6f6aff90fc5be51237b39cfeb9aeBill Richardson 40461362d65fcdd6f6aff90fc5be51237b39cfeb9aeBill Richardson for (Index = 0; Index < 256; Index++) { 40561362d65fcdd6f6aff90fc5be51237b39cfeb9aeBill Richardson Sd->mPTTable[Index] = CharC; 40661362d65fcdd6f6aff90fc5be51237b39cfeb9aeBill Richardson } 40761362d65fcdd6f6aff90fc5be51237b39cfeb9aeBill Richardson 40861362d65fcdd6f6aff90fc5be51237b39cfeb9aeBill Richardson for (Index = 0; Index < nn; Index++) { 40961362d65fcdd6f6aff90fc5be51237b39cfeb9aeBill Richardson Sd->mPTLen[Index] = 0; 41061362d65fcdd6f6aff90fc5be51237b39cfeb9aeBill Richardson } 41161362d65fcdd6f6aff90fc5be51237b39cfeb9aeBill Richardson 41261362d65fcdd6f6aff90fc5be51237b39cfeb9aeBill Richardson return 0; 41361362d65fcdd6f6aff90fc5be51237b39cfeb9aeBill Richardson } 41461362d65fcdd6f6aff90fc5be51237b39cfeb9aeBill Richardson 41561362d65fcdd6f6aff90fc5be51237b39cfeb9aeBill Richardson Index = 0; 41661362d65fcdd6f6aff90fc5be51237b39cfeb9aeBill Richardson 41761362d65fcdd6f6aff90fc5be51237b39cfeb9aeBill Richardson while (Index < Number) { 41861362d65fcdd6f6aff90fc5be51237b39cfeb9aeBill Richardson 41961362d65fcdd6f6aff90fc5be51237b39cfeb9aeBill Richardson CharC = (UINT16) (Sd->mBitBuf >> (BITBUFSIZ - 3)); 42061362d65fcdd6f6aff90fc5be51237b39cfeb9aeBill Richardson 42161362d65fcdd6f6aff90fc5be51237b39cfeb9aeBill Richardson if (CharC == 7) { 42261362d65fcdd6f6aff90fc5be51237b39cfeb9aeBill Richardson Mask = 1U << (BITBUFSIZ - 1 - 3); 42361362d65fcdd6f6aff90fc5be51237b39cfeb9aeBill Richardson while (Mask & Sd->mBitBuf) { 42461362d65fcdd6f6aff90fc5be51237b39cfeb9aeBill Richardson Mask >>= 1; 42561362d65fcdd6f6aff90fc5be51237b39cfeb9aeBill Richardson CharC += 1; 42661362d65fcdd6f6aff90fc5be51237b39cfeb9aeBill Richardson } 42761362d65fcdd6f6aff90fc5be51237b39cfeb9aeBill Richardson } 42861362d65fcdd6f6aff90fc5be51237b39cfeb9aeBill Richardson 42961362d65fcdd6f6aff90fc5be51237b39cfeb9aeBill Richardson FillBuf (Sd, (UINT16) ((CharC < 7) ? 3 : CharC - 3)); 43061362d65fcdd6f6aff90fc5be51237b39cfeb9aeBill Richardson 43161362d65fcdd6f6aff90fc5be51237b39cfeb9aeBill Richardson Sd->mPTLen[Index++] = (UINT8) CharC; 43261362d65fcdd6f6aff90fc5be51237b39cfeb9aeBill Richardson 43361362d65fcdd6f6aff90fc5be51237b39cfeb9aeBill Richardson if (Index == Special) { 43461362d65fcdd6f6aff90fc5be51237b39cfeb9aeBill Richardson CharC = (UINT16) GetBits (Sd, 2); 43561362d65fcdd6f6aff90fc5be51237b39cfeb9aeBill Richardson while ((INT16) (--CharC) >= 0) { 43661362d65fcdd6f6aff90fc5be51237b39cfeb9aeBill Richardson Sd->mPTLen[Index++] = 0; 43761362d65fcdd6f6aff90fc5be51237b39cfeb9aeBill Richardson } 43861362d65fcdd6f6aff90fc5be51237b39cfeb9aeBill Richardson } 43961362d65fcdd6f6aff90fc5be51237b39cfeb9aeBill Richardson } 44061362d65fcdd6f6aff90fc5be51237b39cfeb9aeBill Richardson 44161362d65fcdd6f6aff90fc5be51237b39cfeb9aeBill Richardson while (Index < nn) { 44261362d65fcdd6f6aff90fc5be51237b39cfeb9aeBill Richardson Sd->mPTLen[Index++] = 0; 44361362d65fcdd6f6aff90fc5be51237b39cfeb9aeBill Richardson } 44461362d65fcdd6f6aff90fc5be51237b39cfeb9aeBill Richardson 44561362d65fcdd6f6aff90fc5be51237b39cfeb9aeBill Richardson return MakeTable (Sd, nn, Sd->mPTLen, 8, Sd->mPTTable); 44661362d65fcdd6f6aff90fc5be51237b39cfeb9aeBill Richardson} 44761362d65fcdd6f6aff90fc5be51237b39cfeb9aeBill Richardson 44861362d65fcdd6f6aff90fc5be51237b39cfeb9aeBill RichardsonSTATIC 44961362d65fcdd6f6aff90fc5be51237b39cfeb9aeBill RichardsonVOID 45061362d65fcdd6f6aff90fc5be51237b39cfeb9aeBill RichardsonReadCLen ( 45161362d65fcdd6f6aff90fc5be51237b39cfeb9aeBill Richardson SCRATCH_DATA *Sd 45261362d65fcdd6f6aff90fc5be51237b39cfeb9aeBill Richardson ) 45361362d65fcdd6f6aff90fc5be51237b39cfeb9aeBill Richardson/*++ 45461362d65fcdd6f6aff90fc5be51237b39cfeb9aeBill Richardson 45561362d65fcdd6f6aff90fc5be51237b39cfeb9aeBill RichardsonRoutine Description: 45661362d65fcdd6f6aff90fc5be51237b39cfeb9aeBill Richardson 45761362d65fcdd6f6aff90fc5be51237b39cfeb9aeBill Richardson Reads code lengths for Char&Len Set. 45861362d65fcdd6f6aff90fc5be51237b39cfeb9aeBill Richardson 45961362d65fcdd6f6aff90fc5be51237b39cfeb9aeBill RichardsonArguments: 46061362d65fcdd6f6aff90fc5be51237b39cfeb9aeBill Richardson 46161362d65fcdd6f6aff90fc5be51237b39cfeb9aeBill Richardson Sd - the global scratch data 46261362d65fcdd6f6aff90fc5be51237b39cfeb9aeBill Richardson 46361362d65fcdd6f6aff90fc5be51237b39cfeb9aeBill RichardsonReturns: (VOID) 46461362d65fcdd6f6aff90fc5be51237b39cfeb9aeBill Richardson 46561362d65fcdd6f6aff90fc5be51237b39cfeb9aeBill Richardson--*/ 46661362d65fcdd6f6aff90fc5be51237b39cfeb9aeBill Richardson{ 46761362d65fcdd6f6aff90fc5be51237b39cfeb9aeBill Richardson UINT16 Number; 46861362d65fcdd6f6aff90fc5be51237b39cfeb9aeBill Richardson UINT16 CharC; 46961362d65fcdd6f6aff90fc5be51237b39cfeb9aeBill Richardson UINT16 Index; 47061362d65fcdd6f6aff90fc5be51237b39cfeb9aeBill Richardson UINT32 Mask; 47161362d65fcdd6f6aff90fc5be51237b39cfeb9aeBill Richardson 47261362d65fcdd6f6aff90fc5be51237b39cfeb9aeBill Richardson Number = (UINT16) GetBits (Sd, CBIT); 47361362d65fcdd6f6aff90fc5be51237b39cfeb9aeBill Richardson 47461362d65fcdd6f6aff90fc5be51237b39cfeb9aeBill Richardson if (Number == 0) { 47561362d65fcdd6f6aff90fc5be51237b39cfeb9aeBill Richardson CharC = (UINT16) GetBits (Sd, CBIT); 47661362d65fcdd6f6aff90fc5be51237b39cfeb9aeBill Richardson 47761362d65fcdd6f6aff90fc5be51237b39cfeb9aeBill Richardson for (Index = 0; Index < NC; Index++) { 47861362d65fcdd6f6aff90fc5be51237b39cfeb9aeBill Richardson Sd->mCLen[Index] = 0; 47961362d65fcdd6f6aff90fc5be51237b39cfeb9aeBill Richardson } 48061362d65fcdd6f6aff90fc5be51237b39cfeb9aeBill Richardson 48161362d65fcdd6f6aff90fc5be51237b39cfeb9aeBill Richardson for (Index = 0; Index < 4096; Index++) { 48261362d65fcdd6f6aff90fc5be51237b39cfeb9aeBill Richardson Sd->mCTable[Index] = CharC; 48361362d65fcdd6f6aff90fc5be51237b39cfeb9aeBill Richardson } 48461362d65fcdd6f6aff90fc5be51237b39cfeb9aeBill Richardson 48561362d65fcdd6f6aff90fc5be51237b39cfeb9aeBill Richardson return ; 48661362d65fcdd6f6aff90fc5be51237b39cfeb9aeBill Richardson } 48761362d65fcdd6f6aff90fc5be51237b39cfeb9aeBill Richardson 48861362d65fcdd6f6aff90fc5be51237b39cfeb9aeBill Richardson Index = 0; 48961362d65fcdd6f6aff90fc5be51237b39cfeb9aeBill Richardson while (Index < Number) { 49061362d65fcdd6f6aff90fc5be51237b39cfeb9aeBill Richardson 49161362d65fcdd6f6aff90fc5be51237b39cfeb9aeBill Richardson CharC = Sd->mPTTable[Sd->mBitBuf >> (BITBUFSIZ - 8)]; 49261362d65fcdd6f6aff90fc5be51237b39cfeb9aeBill Richardson if (CharC >= NT) { 49361362d65fcdd6f6aff90fc5be51237b39cfeb9aeBill Richardson Mask = 1U << (BITBUFSIZ - 1 - 8); 49461362d65fcdd6f6aff90fc5be51237b39cfeb9aeBill Richardson 49561362d65fcdd6f6aff90fc5be51237b39cfeb9aeBill Richardson do { 49661362d65fcdd6f6aff90fc5be51237b39cfeb9aeBill Richardson 49761362d65fcdd6f6aff90fc5be51237b39cfeb9aeBill Richardson if (Mask & Sd->mBitBuf) { 49861362d65fcdd6f6aff90fc5be51237b39cfeb9aeBill Richardson CharC = Sd->mRight[CharC]; 49961362d65fcdd6f6aff90fc5be51237b39cfeb9aeBill Richardson } else { 50061362d65fcdd6f6aff90fc5be51237b39cfeb9aeBill Richardson CharC = Sd->mLeft[CharC]; 50161362d65fcdd6f6aff90fc5be51237b39cfeb9aeBill Richardson } 50261362d65fcdd6f6aff90fc5be51237b39cfeb9aeBill Richardson 50361362d65fcdd6f6aff90fc5be51237b39cfeb9aeBill Richardson Mask >>= 1; 50461362d65fcdd6f6aff90fc5be51237b39cfeb9aeBill Richardson 50561362d65fcdd6f6aff90fc5be51237b39cfeb9aeBill Richardson } while (CharC >= NT); 50661362d65fcdd6f6aff90fc5be51237b39cfeb9aeBill Richardson } 50761362d65fcdd6f6aff90fc5be51237b39cfeb9aeBill Richardson // 50861362d65fcdd6f6aff90fc5be51237b39cfeb9aeBill Richardson // Advance what we have read 50961362d65fcdd6f6aff90fc5be51237b39cfeb9aeBill Richardson // 51061362d65fcdd6f6aff90fc5be51237b39cfeb9aeBill Richardson FillBuf (Sd, Sd->mPTLen[CharC]); 51161362d65fcdd6f6aff90fc5be51237b39cfeb9aeBill Richardson 51261362d65fcdd6f6aff90fc5be51237b39cfeb9aeBill Richardson if (CharC <= 2) { 51361362d65fcdd6f6aff90fc5be51237b39cfeb9aeBill Richardson 51461362d65fcdd6f6aff90fc5be51237b39cfeb9aeBill Richardson if (CharC == 0) { 51561362d65fcdd6f6aff90fc5be51237b39cfeb9aeBill Richardson CharC = 1; 51661362d65fcdd6f6aff90fc5be51237b39cfeb9aeBill Richardson } else if (CharC == 1) { 51761362d65fcdd6f6aff90fc5be51237b39cfeb9aeBill Richardson CharC = (UINT16) (GetBits (Sd, 4) + 3); 51861362d65fcdd6f6aff90fc5be51237b39cfeb9aeBill Richardson } else if (CharC == 2) { 51961362d65fcdd6f6aff90fc5be51237b39cfeb9aeBill Richardson CharC = (UINT16) (GetBits (Sd, CBIT) + 20); 52061362d65fcdd6f6aff90fc5be51237b39cfeb9aeBill Richardson } 52161362d65fcdd6f6aff90fc5be51237b39cfeb9aeBill Richardson 52261362d65fcdd6f6aff90fc5be51237b39cfeb9aeBill Richardson while ((INT16) (--CharC) >= 0) { 52361362d65fcdd6f6aff90fc5be51237b39cfeb9aeBill Richardson Sd->mCLen[Index++] = 0; 52461362d65fcdd6f6aff90fc5be51237b39cfeb9aeBill Richardson } 52561362d65fcdd6f6aff90fc5be51237b39cfeb9aeBill Richardson 52661362d65fcdd6f6aff90fc5be51237b39cfeb9aeBill Richardson } else { 52761362d65fcdd6f6aff90fc5be51237b39cfeb9aeBill Richardson 52861362d65fcdd6f6aff90fc5be51237b39cfeb9aeBill Richardson Sd->mCLen[Index++] = (UINT8) (CharC - 2); 52961362d65fcdd6f6aff90fc5be51237b39cfeb9aeBill Richardson 53061362d65fcdd6f6aff90fc5be51237b39cfeb9aeBill Richardson } 53161362d65fcdd6f6aff90fc5be51237b39cfeb9aeBill Richardson } 53261362d65fcdd6f6aff90fc5be51237b39cfeb9aeBill Richardson 53361362d65fcdd6f6aff90fc5be51237b39cfeb9aeBill Richardson while (Index < NC) { 53461362d65fcdd6f6aff90fc5be51237b39cfeb9aeBill Richardson Sd->mCLen[Index++] = 0; 53561362d65fcdd6f6aff90fc5be51237b39cfeb9aeBill Richardson } 53661362d65fcdd6f6aff90fc5be51237b39cfeb9aeBill Richardson 53761362d65fcdd6f6aff90fc5be51237b39cfeb9aeBill Richardson MakeTable (Sd, NC, Sd->mCLen, 12, Sd->mCTable); 53861362d65fcdd6f6aff90fc5be51237b39cfeb9aeBill Richardson 53961362d65fcdd6f6aff90fc5be51237b39cfeb9aeBill Richardson return ; 54061362d65fcdd6f6aff90fc5be51237b39cfeb9aeBill Richardson} 54161362d65fcdd6f6aff90fc5be51237b39cfeb9aeBill Richardson 54261362d65fcdd6f6aff90fc5be51237b39cfeb9aeBill RichardsonSTATIC 54361362d65fcdd6f6aff90fc5be51237b39cfeb9aeBill RichardsonUINT16 54461362d65fcdd6f6aff90fc5be51237b39cfeb9aeBill RichardsonDecodeC ( 54561362d65fcdd6f6aff90fc5be51237b39cfeb9aeBill Richardson SCRATCH_DATA *Sd 54661362d65fcdd6f6aff90fc5be51237b39cfeb9aeBill Richardson ) 54761362d65fcdd6f6aff90fc5be51237b39cfeb9aeBill Richardson/*++ 54861362d65fcdd6f6aff90fc5be51237b39cfeb9aeBill Richardson 54961362d65fcdd6f6aff90fc5be51237b39cfeb9aeBill RichardsonRoutine Description: 55061362d65fcdd6f6aff90fc5be51237b39cfeb9aeBill Richardson 55161362d65fcdd6f6aff90fc5be51237b39cfeb9aeBill Richardson Decode a character/length value. 55261362d65fcdd6f6aff90fc5be51237b39cfeb9aeBill Richardson 55361362d65fcdd6f6aff90fc5be51237b39cfeb9aeBill RichardsonArguments: 55461362d65fcdd6f6aff90fc5be51237b39cfeb9aeBill Richardson 55561362d65fcdd6f6aff90fc5be51237b39cfeb9aeBill Richardson Sd - The global scratch data. 55661362d65fcdd6f6aff90fc5be51237b39cfeb9aeBill Richardson 55761362d65fcdd6f6aff90fc5be51237b39cfeb9aeBill RichardsonReturns: 55861362d65fcdd6f6aff90fc5be51237b39cfeb9aeBill Richardson 55961362d65fcdd6f6aff90fc5be51237b39cfeb9aeBill Richardson The value decoded. 56061362d65fcdd6f6aff90fc5be51237b39cfeb9aeBill Richardson 56161362d65fcdd6f6aff90fc5be51237b39cfeb9aeBill Richardson--*/ 56261362d65fcdd6f6aff90fc5be51237b39cfeb9aeBill Richardson{ 56361362d65fcdd6f6aff90fc5be51237b39cfeb9aeBill Richardson UINT16 Index2; 56461362d65fcdd6f6aff90fc5be51237b39cfeb9aeBill Richardson UINT32 Mask; 56561362d65fcdd6f6aff90fc5be51237b39cfeb9aeBill Richardson 56661362d65fcdd6f6aff90fc5be51237b39cfeb9aeBill Richardson if (Sd->mBlockSize == 0) { 56761362d65fcdd6f6aff90fc5be51237b39cfeb9aeBill Richardson // 56861362d65fcdd6f6aff90fc5be51237b39cfeb9aeBill Richardson // Starting a new block 56961362d65fcdd6f6aff90fc5be51237b39cfeb9aeBill Richardson // 57061362d65fcdd6f6aff90fc5be51237b39cfeb9aeBill Richardson Sd->mBlockSize = (UINT16) GetBits (Sd, 16); 57161362d65fcdd6f6aff90fc5be51237b39cfeb9aeBill Richardson Sd->mBadTableFlag = ReadPTLen (Sd, NT, TBIT, 3); 57261362d65fcdd6f6aff90fc5be51237b39cfeb9aeBill Richardson if (Sd->mBadTableFlag != 0) { 57361362d65fcdd6f6aff90fc5be51237b39cfeb9aeBill Richardson return 0; 57461362d65fcdd6f6aff90fc5be51237b39cfeb9aeBill Richardson } 57561362d65fcdd6f6aff90fc5be51237b39cfeb9aeBill Richardson 57661362d65fcdd6f6aff90fc5be51237b39cfeb9aeBill Richardson ReadCLen (Sd); 57761362d65fcdd6f6aff90fc5be51237b39cfeb9aeBill Richardson 57861362d65fcdd6f6aff90fc5be51237b39cfeb9aeBill Richardson Sd->mBadTableFlag = ReadPTLen (Sd, MAXNP, Sd->mPBit, (UINT16) (-1)); 57961362d65fcdd6f6aff90fc5be51237b39cfeb9aeBill Richardson if (Sd->mBadTableFlag != 0) { 58061362d65fcdd6f6aff90fc5be51237b39cfeb9aeBill Richardson return 0; 58161362d65fcdd6f6aff90fc5be51237b39cfeb9aeBill Richardson } 58261362d65fcdd6f6aff90fc5be51237b39cfeb9aeBill Richardson } 58361362d65fcdd6f6aff90fc5be51237b39cfeb9aeBill Richardson 58461362d65fcdd6f6aff90fc5be51237b39cfeb9aeBill Richardson Sd->mBlockSize--; 58561362d65fcdd6f6aff90fc5be51237b39cfeb9aeBill Richardson Index2 = Sd->mCTable[Sd->mBitBuf >> (BITBUFSIZ - 12)]; 58661362d65fcdd6f6aff90fc5be51237b39cfeb9aeBill Richardson 58761362d65fcdd6f6aff90fc5be51237b39cfeb9aeBill Richardson if (Index2 >= NC) { 58861362d65fcdd6f6aff90fc5be51237b39cfeb9aeBill Richardson Mask = 1U << (BITBUFSIZ - 1 - 12); 58961362d65fcdd6f6aff90fc5be51237b39cfeb9aeBill Richardson 59061362d65fcdd6f6aff90fc5be51237b39cfeb9aeBill Richardson do { 59161362d65fcdd6f6aff90fc5be51237b39cfeb9aeBill Richardson if (Sd->mBitBuf & Mask) { 59261362d65fcdd6f6aff90fc5be51237b39cfeb9aeBill Richardson Index2 = Sd->mRight[Index2]; 59361362d65fcdd6f6aff90fc5be51237b39cfeb9aeBill Richardson } else { 59461362d65fcdd6f6aff90fc5be51237b39cfeb9aeBill Richardson Index2 = Sd->mLeft[Index2]; 59561362d65fcdd6f6aff90fc5be51237b39cfeb9aeBill Richardson } 59661362d65fcdd6f6aff90fc5be51237b39cfeb9aeBill Richardson 59761362d65fcdd6f6aff90fc5be51237b39cfeb9aeBill Richardson Mask >>= 1; 59861362d65fcdd6f6aff90fc5be51237b39cfeb9aeBill Richardson } while (Index2 >= NC); 59961362d65fcdd6f6aff90fc5be51237b39cfeb9aeBill Richardson } 60061362d65fcdd6f6aff90fc5be51237b39cfeb9aeBill Richardson // 60161362d65fcdd6f6aff90fc5be51237b39cfeb9aeBill Richardson // Advance what we have read 60261362d65fcdd6f6aff90fc5be51237b39cfeb9aeBill Richardson // 60361362d65fcdd6f6aff90fc5be51237b39cfeb9aeBill Richardson FillBuf (Sd, Sd->mCLen[Index2]); 60461362d65fcdd6f6aff90fc5be51237b39cfeb9aeBill Richardson 60561362d65fcdd6f6aff90fc5be51237b39cfeb9aeBill Richardson return Index2; 60661362d65fcdd6f6aff90fc5be51237b39cfeb9aeBill Richardson} 60761362d65fcdd6f6aff90fc5be51237b39cfeb9aeBill Richardson 60861362d65fcdd6f6aff90fc5be51237b39cfeb9aeBill RichardsonSTATIC 60961362d65fcdd6f6aff90fc5be51237b39cfeb9aeBill RichardsonVOID 61061362d65fcdd6f6aff90fc5be51237b39cfeb9aeBill RichardsonDecode ( 61161362d65fcdd6f6aff90fc5be51237b39cfeb9aeBill Richardson SCRATCH_DATA *Sd 61261362d65fcdd6f6aff90fc5be51237b39cfeb9aeBill Richardson ) 61361362d65fcdd6f6aff90fc5be51237b39cfeb9aeBill Richardson/*++ 61461362d65fcdd6f6aff90fc5be51237b39cfeb9aeBill Richardson 61561362d65fcdd6f6aff90fc5be51237b39cfeb9aeBill RichardsonRoutine Description: 61661362d65fcdd6f6aff90fc5be51237b39cfeb9aeBill Richardson 61761362d65fcdd6f6aff90fc5be51237b39cfeb9aeBill Richardson Decode the source data and put the resulting data into the destination buffer. 61861362d65fcdd6f6aff90fc5be51237b39cfeb9aeBill Richardson 61961362d65fcdd6f6aff90fc5be51237b39cfeb9aeBill RichardsonArguments: 62061362d65fcdd6f6aff90fc5be51237b39cfeb9aeBill Richardson 62161362d65fcdd6f6aff90fc5be51237b39cfeb9aeBill Richardson Sd - The global scratch data 62261362d65fcdd6f6aff90fc5be51237b39cfeb9aeBill Richardson 62361362d65fcdd6f6aff90fc5be51237b39cfeb9aeBill RichardsonReturns: (VOID) 62461362d65fcdd6f6aff90fc5be51237b39cfeb9aeBill Richardson 62561362d65fcdd6f6aff90fc5be51237b39cfeb9aeBill Richardson --*/ 62661362d65fcdd6f6aff90fc5be51237b39cfeb9aeBill Richardson{ 62761362d65fcdd6f6aff90fc5be51237b39cfeb9aeBill Richardson UINT16 BytesRemain; 62861362d65fcdd6f6aff90fc5be51237b39cfeb9aeBill Richardson UINT32 DataIdx; 62961362d65fcdd6f6aff90fc5be51237b39cfeb9aeBill Richardson UINT16 CharC; 63061362d65fcdd6f6aff90fc5be51237b39cfeb9aeBill Richardson 63161362d65fcdd6f6aff90fc5be51237b39cfeb9aeBill Richardson BytesRemain = (UINT16) (-1); 63261362d65fcdd6f6aff90fc5be51237b39cfeb9aeBill Richardson 63361362d65fcdd6f6aff90fc5be51237b39cfeb9aeBill Richardson DataIdx = 0; 63461362d65fcdd6f6aff90fc5be51237b39cfeb9aeBill Richardson 63561362d65fcdd6f6aff90fc5be51237b39cfeb9aeBill Richardson for (;;) { 63661362d65fcdd6f6aff90fc5be51237b39cfeb9aeBill Richardson CharC = DecodeC (Sd); 63761362d65fcdd6f6aff90fc5be51237b39cfeb9aeBill Richardson if (Sd->mBadTableFlag != 0) { 63861362d65fcdd6f6aff90fc5be51237b39cfeb9aeBill Richardson return ; 63961362d65fcdd6f6aff90fc5be51237b39cfeb9aeBill Richardson } 64061362d65fcdd6f6aff90fc5be51237b39cfeb9aeBill Richardson 64161362d65fcdd6f6aff90fc5be51237b39cfeb9aeBill Richardson if (CharC < 256) { 64261362d65fcdd6f6aff90fc5be51237b39cfeb9aeBill Richardson // 64361362d65fcdd6f6aff90fc5be51237b39cfeb9aeBill Richardson // Process an Original character 64461362d65fcdd6f6aff90fc5be51237b39cfeb9aeBill Richardson // 64561362d65fcdd6f6aff90fc5be51237b39cfeb9aeBill Richardson if (Sd->mOutBuf >= Sd->mOrigSize) { 64661362d65fcdd6f6aff90fc5be51237b39cfeb9aeBill Richardson return ; 64761362d65fcdd6f6aff90fc5be51237b39cfeb9aeBill Richardson } else { 64861362d65fcdd6f6aff90fc5be51237b39cfeb9aeBill Richardson Sd->mDstBase[Sd->mOutBuf++] = (UINT8) CharC; 64961362d65fcdd6f6aff90fc5be51237b39cfeb9aeBill Richardson } 65061362d65fcdd6f6aff90fc5be51237b39cfeb9aeBill Richardson 65161362d65fcdd6f6aff90fc5be51237b39cfeb9aeBill Richardson } else { 65261362d65fcdd6f6aff90fc5be51237b39cfeb9aeBill Richardson // 65361362d65fcdd6f6aff90fc5be51237b39cfeb9aeBill Richardson // Process a Pointer 65461362d65fcdd6f6aff90fc5be51237b39cfeb9aeBill Richardson // 65561362d65fcdd6f6aff90fc5be51237b39cfeb9aeBill Richardson CharC = (UINT16) (CharC - (UINT8_MAX + 1 - THRESHOLD)); 65661362d65fcdd6f6aff90fc5be51237b39cfeb9aeBill Richardson 65761362d65fcdd6f6aff90fc5be51237b39cfeb9aeBill Richardson BytesRemain = CharC; 65861362d65fcdd6f6aff90fc5be51237b39cfeb9aeBill Richardson 65961362d65fcdd6f6aff90fc5be51237b39cfeb9aeBill Richardson DataIdx = Sd->mOutBuf - DecodeP (Sd) - 1; 66061362d65fcdd6f6aff90fc5be51237b39cfeb9aeBill Richardson 66161362d65fcdd6f6aff90fc5be51237b39cfeb9aeBill Richardson BytesRemain--; 66261362d65fcdd6f6aff90fc5be51237b39cfeb9aeBill Richardson while ((INT16) (BytesRemain) >= 0) { 66361362d65fcdd6f6aff90fc5be51237b39cfeb9aeBill Richardson Sd->mDstBase[Sd->mOutBuf++] = Sd->mDstBase[DataIdx++]; 66461362d65fcdd6f6aff90fc5be51237b39cfeb9aeBill Richardson if (Sd->mOutBuf >= Sd->mOrigSize) { 66561362d65fcdd6f6aff90fc5be51237b39cfeb9aeBill Richardson return ; 66661362d65fcdd6f6aff90fc5be51237b39cfeb9aeBill Richardson } 66761362d65fcdd6f6aff90fc5be51237b39cfeb9aeBill Richardson 66861362d65fcdd6f6aff90fc5be51237b39cfeb9aeBill Richardson BytesRemain--; 66961362d65fcdd6f6aff90fc5be51237b39cfeb9aeBill Richardson } 67061362d65fcdd6f6aff90fc5be51237b39cfeb9aeBill Richardson } 67161362d65fcdd6f6aff90fc5be51237b39cfeb9aeBill Richardson } 67261362d65fcdd6f6aff90fc5be51237b39cfeb9aeBill Richardson 67361362d65fcdd6f6aff90fc5be51237b39cfeb9aeBill Richardson return ; 67461362d65fcdd6f6aff90fc5be51237b39cfeb9aeBill Richardson} 67561362d65fcdd6f6aff90fc5be51237b39cfeb9aeBill Richardson 67661362d65fcdd6f6aff90fc5be51237b39cfeb9aeBill RichardsonEFI_STATUS 67761362d65fcdd6f6aff90fc5be51237b39cfeb9aeBill RichardsonGetInfo ( 67861362d65fcdd6f6aff90fc5be51237b39cfeb9aeBill Richardson IN VOID *Source, 67961362d65fcdd6f6aff90fc5be51237b39cfeb9aeBill Richardson IN UINT32 SrcSize, 68061362d65fcdd6f6aff90fc5be51237b39cfeb9aeBill Richardson OUT UINT32 *DstSize, 68161362d65fcdd6f6aff90fc5be51237b39cfeb9aeBill Richardson OUT UINT32 *ScratchSize 68261362d65fcdd6f6aff90fc5be51237b39cfeb9aeBill Richardson ) 68361362d65fcdd6f6aff90fc5be51237b39cfeb9aeBill Richardson/*++ 68461362d65fcdd6f6aff90fc5be51237b39cfeb9aeBill Richardson 68561362d65fcdd6f6aff90fc5be51237b39cfeb9aeBill RichardsonRoutine Description: 68661362d65fcdd6f6aff90fc5be51237b39cfeb9aeBill Richardson 68761362d65fcdd6f6aff90fc5be51237b39cfeb9aeBill Richardson The internal implementation of *_DECOMPRESS_PROTOCOL.GetInfo(). 68861362d65fcdd6f6aff90fc5be51237b39cfeb9aeBill Richardson 68961362d65fcdd6f6aff90fc5be51237b39cfeb9aeBill RichardsonArguments: 69061362d65fcdd6f6aff90fc5be51237b39cfeb9aeBill Richardson 69161362d65fcdd6f6aff90fc5be51237b39cfeb9aeBill Richardson Source - The source buffer containing the compressed data. 69261362d65fcdd6f6aff90fc5be51237b39cfeb9aeBill Richardson SrcSize - The size of source buffer 69361362d65fcdd6f6aff90fc5be51237b39cfeb9aeBill Richardson DstSize - The size of destination buffer. 69461362d65fcdd6f6aff90fc5be51237b39cfeb9aeBill Richardson ScratchSize - The size of scratch buffer. 69561362d65fcdd6f6aff90fc5be51237b39cfeb9aeBill Richardson 69661362d65fcdd6f6aff90fc5be51237b39cfeb9aeBill RichardsonReturns: 69761362d65fcdd6f6aff90fc5be51237b39cfeb9aeBill Richardson 69861362d65fcdd6f6aff90fc5be51237b39cfeb9aeBill Richardson EFI_SUCCESS - The size of destination buffer and the size of scratch buffer are successull retrieved. 69961362d65fcdd6f6aff90fc5be51237b39cfeb9aeBill Richardson EFI_INVALID_PARAMETER - The source data is corrupted 70061362d65fcdd6f6aff90fc5be51237b39cfeb9aeBill Richardson 70161362d65fcdd6f6aff90fc5be51237b39cfeb9aeBill Richardson--*/ 70261362d65fcdd6f6aff90fc5be51237b39cfeb9aeBill Richardson{ 70361362d65fcdd6f6aff90fc5be51237b39cfeb9aeBill Richardson UINT8 *Src; 70461362d65fcdd6f6aff90fc5be51237b39cfeb9aeBill Richardson 70561362d65fcdd6f6aff90fc5be51237b39cfeb9aeBill Richardson *ScratchSize = sizeof (SCRATCH_DATA); 70661362d65fcdd6f6aff90fc5be51237b39cfeb9aeBill Richardson 70761362d65fcdd6f6aff90fc5be51237b39cfeb9aeBill Richardson Src = Source; 70861362d65fcdd6f6aff90fc5be51237b39cfeb9aeBill Richardson if (SrcSize < 8) { 70961362d65fcdd6f6aff90fc5be51237b39cfeb9aeBill Richardson return EFI_INVALID_PARAMETER; 71061362d65fcdd6f6aff90fc5be51237b39cfeb9aeBill Richardson } 71161362d65fcdd6f6aff90fc5be51237b39cfeb9aeBill Richardson 71261362d65fcdd6f6aff90fc5be51237b39cfeb9aeBill Richardson *DstSize = Src[4] + (Src[5] << 8) + (Src[6] << 16) + (Src[7] << 24); 71361362d65fcdd6f6aff90fc5be51237b39cfeb9aeBill Richardson return EFI_SUCCESS; 71461362d65fcdd6f6aff90fc5be51237b39cfeb9aeBill Richardson} 71561362d65fcdd6f6aff90fc5be51237b39cfeb9aeBill Richardson 71661362d65fcdd6f6aff90fc5be51237b39cfeb9aeBill RichardsonEFI_STATUS 71761362d65fcdd6f6aff90fc5be51237b39cfeb9aeBill RichardsonDecompress ( 71861362d65fcdd6f6aff90fc5be51237b39cfeb9aeBill Richardson IN VOID *Source, 71961362d65fcdd6f6aff90fc5be51237b39cfeb9aeBill Richardson IN UINT32 SrcSize, 72061362d65fcdd6f6aff90fc5be51237b39cfeb9aeBill Richardson IN OUT VOID *Destination, 72161362d65fcdd6f6aff90fc5be51237b39cfeb9aeBill Richardson IN UINT32 DstSize, 72261362d65fcdd6f6aff90fc5be51237b39cfeb9aeBill Richardson IN OUT VOID *Scratch, 72361362d65fcdd6f6aff90fc5be51237b39cfeb9aeBill Richardson IN UINT32 ScratchSize, 72461362d65fcdd6f6aff90fc5be51237b39cfeb9aeBill Richardson IN UINT8 Version 72561362d65fcdd6f6aff90fc5be51237b39cfeb9aeBill Richardson ) 72661362d65fcdd6f6aff90fc5be51237b39cfeb9aeBill Richardson/*++ 72761362d65fcdd6f6aff90fc5be51237b39cfeb9aeBill Richardson 72861362d65fcdd6f6aff90fc5be51237b39cfeb9aeBill RichardsonRoutine Description: 72961362d65fcdd6f6aff90fc5be51237b39cfeb9aeBill Richardson 73061362d65fcdd6f6aff90fc5be51237b39cfeb9aeBill Richardson The internal implementation of *_DECOMPRESS_PROTOCOL.Decompress(). 73161362d65fcdd6f6aff90fc5be51237b39cfeb9aeBill Richardson 73261362d65fcdd6f6aff90fc5be51237b39cfeb9aeBill RichardsonArguments: 73361362d65fcdd6f6aff90fc5be51237b39cfeb9aeBill Richardson 73461362d65fcdd6f6aff90fc5be51237b39cfeb9aeBill Richardson Source - The source buffer containing the compressed data. 73561362d65fcdd6f6aff90fc5be51237b39cfeb9aeBill Richardson SrcSize - The size of source buffer 73661362d65fcdd6f6aff90fc5be51237b39cfeb9aeBill Richardson Destination - The destination buffer to store the decompressed data 73761362d65fcdd6f6aff90fc5be51237b39cfeb9aeBill Richardson DstSize - The size of destination buffer. 73861362d65fcdd6f6aff90fc5be51237b39cfeb9aeBill Richardson Scratch - The buffer used internally by the decompress routine. This buffer is needed to store intermediate data. 73961362d65fcdd6f6aff90fc5be51237b39cfeb9aeBill Richardson ScratchSize - The size of scratch buffer. 74061362d65fcdd6f6aff90fc5be51237b39cfeb9aeBill Richardson Version - The version of de/compression algorithm. 74161362d65fcdd6f6aff90fc5be51237b39cfeb9aeBill Richardson Version 1 for EFI 1.1 de/compression algorithm. 74261362d65fcdd6f6aff90fc5be51237b39cfeb9aeBill Richardson Version 2 for Tiano de/compression algorithm. 74361362d65fcdd6f6aff90fc5be51237b39cfeb9aeBill Richardson 74461362d65fcdd6f6aff90fc5be51237b39cfeb9aeBill RichardsonReturns: 74561362d65fcdd6f6aff90fc5be51237b39cfeb9aeBill Richardson 74661362d65fcdd6f6aff90fc5be51237b39cfeb9aeBill Richardson EFI_SUCCESS - Decompression is successfull 74761362d65fcdd6f6aff90fc5be51237b39cfeb9aeBill Richardson EFI_INVALID_PARAMETER - The source data is corrupted 74861362d65fcdd6f6aff90fc5be51237b39cfeb9aeBill Richardson 74961362d65fcdd6f6aff90fc5be51237b39cfeb9aeBill Richardson--*/ 75061362d65fcdd6f6aff90fc5be51237b39cfeb9aeBill Richardson{ 75161362d65fcdd6f6aff90fc5be51237b39cfeb9aeBill Richardson UINT32 Index; 75261362d65fcdd6f6aff90fc5be51237b39cfeb9aeBill Richardson UINT32 CompSize; 75361362d65fcdd6f6aff90fc5be51237b39cfeb9aeBill Richardson UINT32 OrigSize; 75461362d65fcdd6f6aff90fc5be51237b39cfeb9aeBill Richardson EFI_STATUS Status; 75561362d65fcdd6f6aff90fc5be51237b39cfeb9aeBill Richardson SCRATCH_DATA *Sd; 75661362d65fcdd6f6aff90fc5be51237b39cfeb9aeBill Richardson UINT8 *Src; 75761362d65fcdd6f6aff90fc5be51237b39cfeb9aeBill Richardson UINT8 *Dst; 75861362d65fcdd6f6aff90fc5be51237b39cfeb9aeBill Richardson 75961362d65fcdd6f6aff90fc5be51237b39cfeb9aeBill Richardson Status = EFI_SUCCESS; 76061362d65fcdd6f6aff90fc5be51237b39cfeb9aeBill Richardson Src = Source; 76161362d65fcdd6f6aff90fc5be51237b39cfeb9aeBill Richardson Dst = Destination; 76261362d65fcdd6f6aff90fc5be51237b39cfeb9aeBill Richardson 76361362d65fcdd6f6aff90fc5be51237b39cfeb9aeBill Richardson if (ScratchSize < sizeof (SCRATCH_DATA)) { 76461362d65fcdd6f6aff90fc5be51237b39cfeb9aeBill Richardson return EFI_INVALID_PARAMETER; 76561362d65fcdd6f6aff90fc5be51237b39cfeb9aeBill Richardson } 76661362d65fcdd6f6aff90fc5be51237b39cfeb9aeBill Richardson 76761362d65fcdd6f6aff90fc5be51237b39cfeb9aeBill Richardson Sd = (SCRATCH_DATA *) Scratch; 76861362d65fcdd6f6aff90fc5be51237b39cfeb9aeBill Richardson 76961362d65fcdd6f6aff90fc5be51237b39cfeb9aeBill Richardson if (SrcSize < 8) { 77061362d65fcdd6f6aff90fc5be51237b39cfeb9aeBill Richardson return EFI_INVALID_PARAMETER; 77161362d65fcdd6f6aff90fc5be51237b39cfeb9aeBill Richardson } 77261362d65fcdd6f6aff90fc5be51237b39cfeb9aeBill Richardson 77361362d65fcdd6f6aff90fc5be51237b39cfeb9aeBill Richardson CompSize = Src[0] + (Src[1] << 8) + (Src[2] << 16) + (Src[3] << 24); 77461362d65fcdd6f6aff90fc5be51237b39cfeb9aeBill Richardson OrigSize = Src[4] + (Src[5] << 8) + (Src[6] << 16) + (Src[7] << 24); 77561362d65fcdd6f6aff90fc5be51237b39cfeb9aeBill Richardson 77661362d65fcdd6f6aff90fc5be51237b39cfeb9aeBill Richardson // 77761362d65fcdd6f6aff90fc5be51237b39cfeb9aeBill Richardson // If compressed file size is 0, return 77861362d65fcdd6f6aff90fc5be51237b39cfeb9aeBill Richardson // 77961362d65fcdd6f6aff90fc5be51237b39cfeb9aeBill Richardson if (OrigSize == 0) { 78061362d65fcdd6f6aff90fc5be51237b39cfeb9aeBill Richardson return Status; 78161362d65fcdd6f6aff90fc5be51237b39cfeb9aeBill Richardson } 78261362d65fcdd6f6aff90fc5be51237b39cfeb9aeBill Richardson 78361362d65fcdd6f6aff90fc5be51237b39cfeb9aeBill Richardson if (SrcSize < CompSize + 8) { 78461362d65fcdd6f6aff90fc5be51237b39cfeb9aeBill Richardson return EFI_INVALID_PARAMETER; 78561362d65fcdd6f6aff90fc5be51237b39cfeb9aeBill Richardson } 78661362d65fcdd6f6aff90fc5be51237b39cfeb9aeBill Richardson 78761362d65fcdd6f6aff90fc5be51237b39cfeb9aeBill Richardson if (DstSize != OrigSize) { 78861362d65fcdd6f6aff90fc5be51237b39cfeb9aeBill Richardson return EFI_INVALID_PARAMETER; 78961362d65fcdd6f6aff90fc5be51237b39cfeb9aeBill Richardson } 79061362d65fcdd6f6aff90fc5be51237b39cfeb9aeBill Richardson 79161362d65fcdd6f6aff90fc5be51237b39cfeb9aeBill Richardson Src = Src + 8; 79261362d65fcdd6f6aff90fc5be51237b39cfeb9aeBill Richardson 79361362d65fcdd6f6aff90fc5be51237b39cfeb9aeBill Richardson for (Index = 0; Index < sizeof (SCRATCH_DATA); Index++) { 79461362d65fcdd6f6aff90fc5be51237b39cfeb9aeBill Richardson ((UINT8 *) Sd)[Index] = 0; 79561362d65fcdd6f6aff90fc5be51237b39cfeb9aeBill Richardson } 79661362d65fcdd6f6aff90fc5be51237b39cfeb9aeBill Richardson // 79761362d65fcdd6f6aff90fc5be51237b39cfeb9aeBill Richardson // The length of the field 'Position Set Code Length Array Size' in Block Header. 79861362d65fcdd6f6aff90fc5be51237b39cfeb9aeBill Richardson // For EFI 1.1 de/compression algorithm(Version 1), mPBit = 4 79961362d65fcdd6f6aff90fc5be51237b39cfeb9aeBill Richardson // For Tiano de/compression algorithm(Version 2), mPBit = 5 80061362d65fcdd6f6aff90fc5be51237b39cfeb9aeBill Richardson // 80161362d65fcdd6f6aff90fc5be51237b39cfeb9aeBill Richardson switch (Version) { 80261362d65fcdd6f6aff90fc5be51237b39cfeb9aeBill Richardson case 1: 80361362d65fcdd6f6aff90fc5be51237b39cfeb9aeBill Richardson Sd->mPBit = 4; 80461362d65fcdd6f6aff90fc5be51237b39cfeb9aeBill Richardson break; 80561362d65fcdd6f6aff90fc5be51237b39cfeb9aeBill Richardson 80661362d65fcdd6f6aff90fc5be51237b39cfeb9aeBill Richardson case 2: 80761362d65fcdd6f6aff90fc5be51237b39cfeb9aeBill Richardson Sd->mPBit = 5; 80861362d65fcdd6f6aff90fc5be51237b39cfeb9aeBill Richardson break; 80961362d65fcdd6f6aff90fc5be51237b39cfeb9aeBill Richardson 81061362d65fcdd6f6aff90fc5be51237b39cfeb9aeBill Richardson default: 81161362d65fcdd6f6aff90fc5be51237b39cfeb9aeBill Richardson // 81261362d65fcdd6f6aff90fc5be51237b39cfeb9aeBill Richardson // Currently, only have 2 versions 81361362d65fcdd6f6aff90fc5be51237b39cfeb9aeBill Richardson // 81461362d65fcdd6f6aff90fc5be51237b39cfeb9aeBill Richardson return EFI_INVALID_PARAMETER; 81561362d65fcdd6f6aff90fc5be51237b39cfeb9aeBill Richardson } 81661362d65fcdd6f6aff90fc5be51237b39cfeb9aeBill Richardson 81761362d65fcdd6f6aff90fc5be51237b39cfeb9aeBill Richardson Sd->mSrcBase = Src; 81861362d65fcdd6f6aff90fc5be51237b39cfeb9aeBill Richardson Sd->mDstBase = Dst; 81961362d65fcdd6f6aff90fc5be51237b39cfeb9aeBill Richardson Sd->mCompSize = CompSize; 82061362d65fcdd6f6aff90fc5be51237b39cfeb9aeBill Richardson Sd->mOrigSize = OrigSize; 82161362d65fcdd6f6aff90fc5be51237b39cfeb9aeBill Richardson 82261362d65fcdd6f6aff90fc5be51237b39cfeb9aeBill Richardson // 82361362d65fcdd6f6aff90fc5be51237b39cfeb9aeBill Richardson // Fill the first BITBUFSIZ bits 82461362d65fcdd6f6aff90fc5be51237b39cfeb9aeBill Richardson // 82561362d65fcdd6f6aff90fc5be51237b39cfeb9aeBill Richardson FillBuf (Sd, BITBUFSIZ); 82661362d65fcdd6f6aff90fc5be51237b39cfeb9aeBill Richardson 82761362d65fcdd6f6aff90fc5be51237b39cfeb9aeBill Richardson // 82861362d65fcdd6f6aff90fc5be51237b39cfeb9aeBill Richardson // Decompress it 82961362d65fcdd6f6aff90fc5be51237b39cfeb9aeBill Richardson // 83061362d65fcdd6f6aff90fc5be51237b39cfeb9aeBill Richardson Decode (Sd); 83161362d65fcdd6f6aff90fc5be51237b39cfeb9aeBill Richardson 83261362d65fcdd6f6aff90fc5be51237b39cfeb9aeBill Richardson if (Sd->mBadTableFlag != 0) { 83361362d65fcdd6f6aff90fc5be51237b39cfeb9aeBill Richardson // 83461362d65fcdd6f6aff90fc5be51237b39cfeb9aeBill Richardson // Something wrong with the source 83561362d65fcdd6f6aff90fc5be51237b39cfeb9aeBill Richardson // 83661362d65fcdd6f6aff90fc5be51237b39cfeb9aeBill Richardson Status = EFI_INVALID_PARAMETER; 83761362d65fcdd6f6aff90fc5be51237b39cfeb9aeBill Richardson } 83861362d65fcdd6f6aff90fc5be51237b39cfeb9aeBill Richardson 83961362d65fcdd6f6aff90fc5be51237b39cfeb9aeBill Richardson return Status; 84061362d65fcdd6f6aff90fc5be51237b39cfeb9aeBill Richardson} 84161362d65fcdd6f6aff90fc5be51237b39cfeb9aeBill Richardson 84261362d65fcdd6f6aff90fc5be51237b39cfeb9aeBill RichardsonEFI_STATUS 84361362d65fcdd6f6aff90fc5be51237b39cfeb9aeBill RichardsonEFIAPI 84461362d65fcdd6f6aff90fc5be51237b39cfeb9aeBill RichardsonEfiGetInfo ( 84561362d65fcdd6f6aff90fc5be51237b39cfeb9aeBill Richardson IN VOID *Source, 84661362d65fcdd6f6aff90fc5be51237b39cfeb9aeBill Richardson IN UINT32 SrcSize, 84761362d65fcdd6f6aff90fc5be51237b39cfeb9aeBill Richardson OUT UINT32 *DstSize, 84861362d65fcdd6f6aff90fc5be51237b39cfeb9aeBill Richardson OUT UINT32 *ScratchSize 84961362d65fcdd6f6aff90fc5be51237b39cfeb9aeBill Richardson ) 85061362d65fcdd6f6aff90fc5be51237b39cfeb9aeBill Richardson/*++ 85161362d65fcdd6f6aff90fc5be51237b39cfeb9aeBill Richardson 85261362d65fcdd6f6aff90fc5be51237b39cfeb9aeBill RichardsonRoutine Description: 85361362d65fcdd6f6aff90fc5be51237b39cfeb9aeBill Richardson 85461362d65fcdd6f6aff90fc5be51237b39cfeb9aeBill Richardson The implementation is same as that of EFI_DECOMPRESS_PROTOCOL.GetInfo(). 85561362d65fcdd6f6aff90fc5be51237b39cfeb9aeBill Richardson 85661362d65fcdd6f6aff90fc5be51237b39cfeb9aeBill RichardsonArguments: 85761362d65fcdd6f6aff90fc5be51237b39cfeb9aeBill Richardson 85861362d65fcdd6f6aff90fc5be51237b39cfeb9aeBill Richardson This - The protocol instance pointer 85961362d65fcdd6f6aff90fc5be51237b39cfeb9aeBill Richardson Source - The source buffer containing the compressed data. 86061362d65fcdd6f6aff90fc5be51237b39cfeb9aeBill Richardson SrcSize - The size of source buffer 86161362d65fcdd6f6aff90fc5be51237b39cfeb9aeBill Richardson DstSize - The size of destination buffer. 86261362d65fcdd6f6aff90fc5be51237b39cfeb9aeBill Richardson ScratchSize - The size of scratch buffer. 86361362d65fcdd6f6aff90fc5be51237b39cfeb9aeBill Richardson 86461362d65fcdd6f6aff90fc5be51237b39cfeb9aeBill RichardsonReturns: 86561362d65fcdd6f6aff90fc5be51237b39cfeb9aeBill Richardson 86661362d65fcdd6f6aff90fc5be51237b39cfeb9aeBill Richardson EFI_SUCCESS - The size of destination buffer and the size of scratch buffer are successull retrieved. 86761362d65fcdd6f6aff90fc5be51237b39cfeb9aeBill Richardson EFI_INVALID_PARAMETER - The source data is corrupted 86861362d65fcdd6f6aff90fc5be51237b39cfeb9aeBill Richardson 86961362d65fcdd6f6aff90fc5be51237b39cfeb9aeBill Richardson--*/ 87061362d65fcdd6f6aff90fc5be51237b39cfeb9aeBill Richardson{ 87161362d65fcdd6f6aff90fc5be51237b39cfeb9aeBill Richardson return GetInfo ( 87261362d65fcdd6f6aff90fc5be51237b39cfeb9aeBill Richardson Source, 87361362d65fcdd6f6aff90fc5be51237b39cfeb9aeBill Richardson SrcSize, 87461362d65fcdd6f6aff90fc5be51237b39cfeb9aeBill Richardson DstSize, 87561362d65fcdd6f6aff90fc5be51237b39cfeb9aeBill Richardson ScratchSize 87661362d65fcdd6f6aff90fc5be51237b39cfeb9aeBill Richardson ); 87761362d65fcdd6f6aff90fc5be51237b39cfeb9aeBill Richardson} 87861362d65fcdd6f6aff90fc5be51237b39cfeb9aeBill Richardson 87961362d65fcdd6f6aff90fc5be51237b39cfeb9aeBill RichardsonEFI_STATUS 88061362d65fcdd6f6aff90fc5be51237b39cfeb9aeBill RichardsonEFIAPI 88161362d65fcdd6f6aff90fc5be51237b39cfeb9aeBill RichardsonEfiDecompress ( 88261362d65fcdd6f6aff90fc5be51237b39cfeb9aeBill Richardson IN VOID *Source, 88361362d65fcdd6f6aff90fc5be51237b39cfeb9aeBill Richardson IN UINT32 SrcSize, 88461362d65fcdd6f6aff90fc5be51237b39cfeb9aeBill Richardson IN OUT VOID *Destination, 88561362d65fcdd6f6aff90fc5be51237b39cfeb9aeBill Richardson IN UINT32 DstSize, 88661362d65fcdd6f6aff90fc5be51237b39cfeb9aeBill Richardson IN OUT VOID *Scratch, 88761362d65fcdd6f6aff90fc5be51237b39cfeb9aeBill Richardson IN UINT32 ScratchSize 88861362d65fcdd6f6aff90fc5be51237b39cfeb9aeBill Richardson ) 88961362d65fcdd6f6aff90fc5be51237b39cfeb9aeBill Richardson/*++ 89061362d65fcdd6f6aff90fc5be51237b39cfeb9aeBill Richardson 89161362d65fcdd6f6aff90fc5be51237b39cfeb9aeBill RichardsonRoutine Description: 89261362d65fcdd6f6aff90fc5be51237b39cfeb9aeBill Richardson 89361362d65fcdd6f6aff90fc5be51237b39cfeb9aeBill Richardson The implementation is same as that of EFI_DECOMPRESS_PROTOCOL.Decompress(). 89461362d65fcdd6f6aff90fc5be51237b39cfeb9aeBill Richardson 89561362d65fcdd6f6aff90fc5be51237b39cfeb9aeBill RichardsonArguments: 89661362d65fcdd6f6aff90fc5be51237b39cfeb9aeBill Richardson 89761362d65fcdd6f6aff90fc5be51237b39cfeb9aeBill Richardson This - The protocol instance pointer 89861362d65fcdd6f6aff90fc5be51237b39cfeb9aeBill Richardson Source - The source buffer containing the compressed data. 89961362d65fcdd6f6aff90fc5be51237b39cfeb9aeBill Richardson SrcSize - The size of source buffer 90061362d65fcdd6f6aff90fc5be51237b39cfeb9aeBill Richardson Destination - The destination buffer to store the decompressed data 90161362d65fcdd6f6aff90fc5be51237b39cfeb9aeBill Richardson DstSize - The size of destination buffer. 90261362d65fcdd6f6aff90fc5be51237b39cfeb9aeBill Richardson Scratch - The buffer used internally by the decompress routine. This buffer is needed to store intermediate data. 90361362d65fcdd6f6aff90fc5be51237b39cfeb9aeBill Richardson ScratchSize - The size of scratch buffer. 90461362d65fcdd6f6aff90fc5be51237b39cfeb9aeBill Richardson 90561362d65fcdd6f6aff90fc5be51237b39cfeb9aeBill RichardsonReturns: 90661362d65fcdd6f6aff90fc5be51237b39cfeb9aeBill Richardson 90761362d65fcdd6f6aff90fc5be51237b39cfeb9aeBill Richardson EFI_SUCCESS - Decompression is successfull 90861362d65fcdd6f6aff90fc5be51237b39cfeb9aeBill Richardson EFI_INVALID_PARAMETER - The source data is corrupted 90961362d65fcdd6f6aff90fc5be51237b39cfeb9aeBill Richardson 91061362d65fcdd6f6aff90fc5be51237b39cfeb9aeBill Richardson--*/ 91161362d65fcdd6f6aff90fc5be51237b39cfeb9aeBill Richardson{ 91261362d65fcdd6f6aff90fc5be51237b39cfeb9aeBill Richardson // 91361362d65fcdd6f6aff90fc5be51237b39cfeb9aeBill Richardson // For EFI 1.1 de/compression algorithm, the version is 1. 91461362d65fcdd6f6aff90fc5be51237b39cfeb9aeBill Richardson // 91561362d65fcdd6f6aff90fc5be51237b39cfeb9aeBill Richardson return Decompress ( 91661362d65fcdd6f6aff90fc5be51237b39cfeb9aeBill Richardson Source, 91761362d65fcdd6f6aff90fc5be51237b39cfeb9aeBill Richardson SrcSize, 91861362d65fcdd6f6aff90fc5be51237b39cfeb9aeBill Richardson Destination, 91961362d65fcdd6f6aff90fc5be51237b39cfeb9aeBill Richardson DstSize, 92061362d65fcdd6f6aff90fc5be51237b39cfeb9aeBill Richardson Scratch, 92161362d65fcdd6f6aff90fc5be51237b39cfeb9aeBill Richardson ScratchSize, 92261362d65fcdd6f6aff90fc5be51237b39cfeb9aeBill Richardson 1 92361362d65fcdd6f6aff90fc5be51237b39cfeb9aeBill Richardson ); 92461362d65fcdd6f6aff90fc5be51237b39cfeb9aeBill Richardson} 92561362d65fcdd6f6aff90fc5be51237b39cfeb9aeBill Richardson 92661362d65fcdd6f6aff90fc5be51237b39cfeb9aeBill RichardsonEFI_STATUS 92761362d65fcdd6f6aff90fc5be51237b39cfeb9aeBill RichardsonEFIAPI 92861362d65fcdd6f6aff90fc5be51237b39cfeb9aeBill RichardsonTianoGetInfo ( 92961362d65fcdd6f6aff90fc5be51237b39cfeb9aeBill Richardson IN VOID *Source, 93061362d65fcdd6f6aff90fc5be51237b39cfeb9aeBill Richardson IN UINT32 SrcSize, 93161362d65fcdd6f6aff90fc5be51237b39cfeb9aeBill Richardson OUT UINT32 *DstSize, 93261362d65fcdd6f6aff90fc5be51237b39cfeb9aeBill Richardson OUT UINT32 *ScratchSize 93361362d65fcdd6f6aff90fc5be51237b39cfeb9aeBill Richardson ) 93461362d65fcdd6f6aff90fc5be51237b39cfeb9aeBill Richardson/*++ 93561362d65fcdd6f6aff90fc5be51237b39cfeb9aeBill Richardson 93661362d65fcdd6f6aff90fc5be51237b39cfeb9aeBill RichardsonRoutine Description: 93761362d65fcdd6f6aff90fc5be51237b39cfeb9aeBill Richardson 93861362d65fcdd6f6aff90fc5be51237b39cfeb9aeBill Richardson The implementation is same as that of EFI_TIANO_DECOMPRESS_PROTOCOL.GetInfo(). 93961362d65fcdd6f6aff90fc5be51237b39cfeb9aeBill Richardson 94061362d65fcdd6f6aff90fc5be51237b39cfeb9aeBill RichardsonArguments: 94161362d65fcdd6f6aff90fc5be51237b39cfeb9aeBill Richardson 94261362d65fcdd6f6aff90fc5be51237b39cfeb9aeBill Richardson This - The protocol instance pointer 94361362d65fcdd6f6aff90fc5be51237b39cfeb9aeBill Richardson Source - The source buffer containing the compressed data. 94461362d65fcdd6f6aff90fc5be51237b39cfeb9aeBill Richardson SrcSize - The size of source buffer 94561362d65fcdd6f6aff90fc5be51237b39cfeb9aeBill Richardson DstSize - The size of destination buffer. 94661362d65fcdd6f6aff90fc5be51237b39cfeb9aeBill Richardson ScratchSize - The size of scratch buffer. 94761362d65fcdd6f6aff90fc5be51237b39cfeb9aeBill Richardson 94861362d65fcdd6f6aff90fc5be51237b39cfeb9aeBill RichardsonReturns: 94961362d65fcdd6f6aff90fc5be51237b39cfeb9aeBill Richardson 95061362d65fcdd6f6aff90fc5be51237b39cfeb9aeBill Richardson EFI_SUCCESS - The size of destination buffer and the size of scratch buffer are successull retrieved. 95161362d65fcdd6f6aff90fc5be51237b39cfeb9aeBill Richardson EFI_INVALID_PARAMETER - The source data is corrupted 95261362d65fcdd6f6aff90fc5be51237b39cfeb9aeBill Richardson 95361362d65fcdd6f6aff90fc5be51237b39cfeb9aeBill Richardson--*/ 95461362d65fcdd6f6aff90fc5be51237b39cfeb9aeBill Richardson{ 95561362d65fcdd6f6aff90fc5be51237b39cfeb9aeBill Richardson return GetInfo ( 95661362d65fcdd6f6aff90fc5be51237b39cfeb9aeBill Richardson Source, 95761362d65fcdd6f6aff90fc5be51237b39cfeb9aeBill Richardson SrcSize, 95861362d65fcdd6f6aff90fc5be51237b39cfeb9aeBill Richardson DstSize, 95961362d65fcdd6f6aff90fc5be51237b39cfeb9aeBill Richardson ScratchSize 96061362d65fcdd6f6aff90fc5be51237b39cfeb9aeBill Richardson ); 96161362d65fcdd6f6aff90fc5be51237b39cfeb9aeBill Richardson} 96261362d65fcdd6f6aff90fc5be51237b39cfeb9aeBill Richardson 96361362d65fcdd6f6aff90fc5be51237b39cfeb9aeBill RichardsonEFI_STATUS 96461362d65fcdd6f6aff90fc5be51237b39cfeb9aeBill RichardsonEFIAPI 96561362d65fcdd6f6aff90fc5be51237b39cfeb9aeBill RichardsonTianoDecompress ( 96661362d65fcdd6f6aff90fc5be51237b39cfeb9aeBill Richardson IN VOID *Source, 96761362d65fcdd6f6aff90fc5be51237b39cfeb9aeBill Richardson IN UINT32 SrcSize, 96861362d65fcdd6f6aff90fc5be51237b39cfeb9aeBill Richardson IN OUT VOID *Destination, 96961362d65fcdd6f6aff90fc5be51237b39cfeb9aeBill Richardson IN UINT32 DstSize, 97061362d65fcdd6f6aff90fc5be51237b39cfeb9aeBill Richardson IN OUT VOID *Scratch, 97161362d65fcdd6f6aff90fc5be51237b39cfeb9aeBill Richardson IN UINT32 ScratchSize 97261362d65fcdd6f6aff90fc5be51237b39cfeb9aeBill Richardson ) 97361362d65fcdd6f6aff90fc5be51237b39cfeb9aeBill Richardson/*++ 97461362d65fcdd6f6aff90fc5be51237b39cfeb9aeBill Richardson 97561362d65fcdd6f6aff90fc5be51237b39cfeb9aeBill RichardsonRoutine Description: 97661362d65fcdd6f6aff90fc5be51237b39cfeb9aeBill Richardson 97761362d65fcdd6f6aff90fc5be51237b39cfeb9aeBill Richardson The implementation is same as that of EFI_TIANO_DECOMPRESS_PROTOCOL.Decompress(). 97861362d65fcdd6f6aff90fc5be51237b39cfeb9aeBill Richardson 97961362d65fcdd6f6aff90fc5be51237b39cfeb9aeBill RichardsonArguments: 98061362d65fcdd6f6aff90fc5be51237b39cfeb9aeBill Richardson 98161362d65fcdd6f6aff90fc5be51237b39cfeb9aeBill Richardson This - The protocol instance pointer 98261362d65fcdd6f6aff90fc5be51237b39cfeb9aeBill Richardson Source - The source buffer containing the compressed data. 98361362d65fcdd6f6aff90fc5be51237b39cfeb9aeBill Richardson SrcSize - The size of source buffer 98461362d65fcdd6f6aff90fc5be51237b39cfeb9aeBill Richardson Destination - The destination buffer to store the decompressed data 98561362d65fcdd6f6aff90fc5be51237b39cfeb9aeBill Richardson DstSize - The size of destination buffer. 98661362d65fcdd6f6aff90fc5be51237b39cfeb9aeBill Richardson Scratch - The buffer used internally by the decompress routine. This buffer is needed to store intermediate data. 98761362d65fcdd6f6aff90fc5be51237b39cfeb9aeBill Richardson ScratchSize - The size of scratch buffer. 98861362d65fcdd6f6aff90fc5be51237b39cfeb9aeBill Richardson 98961362d65fcdd6f6aff90fc5be51237b39cfeb9aeBill RichardsonReturns: 99061362d65fcdd6f6aff90fc5be51237b39cfeb9aeBill Richardson 99161362d65fcdd6f6aff90fc5be51237b39cfeb9aeBill Richardson EFI_SUCCESS - Decompression is successfull 99261362d65fcdd6f6aff90fc5be51237b39cfeb9aeBill Richardson EFI_INVALID_PARAMETER - The source data is corrupted 99361362d65fcdd6f6aff90fc5be51237b39cfeb9aeBill Richardson 99461362d65fcdd6f6aff90fc5be51237b39cfeb9aeBill Richardson--*/ 99561362d65fcdd6f6aff90fc5be51237b39cfeb9aeBill Richardson{ 99661362d65fcdd6f6aff90fc5be51237b39cfeb9aeBill Richardson // 99761362d65fcdd6f6aff90fc5be51237b39cfeb9aeBill Richardson // For Tiano de/compression algorithm, the version is 2. 99861362d65fcdd6f6aff90fc5be51237b39cfeb9aeBill Richardson // 99961362d65fcdd6f6aff90fc5be51237b39cfeb9aeBill Richardson return Decompress ( 100061362d65fcdd6f6aff90fc5be51237b39cfeb9aeBill Richardson Source, 100161362d65fcdd6f6aff90fc5be51237b39cfeb9aeBill Richardson SrcSize, 100261362d65fcdd6f6aff90fc5be51237b39cfeb9aeBill Richardson Destination, 100361362d65fcdd6f6aff90fc5be51237b39cfeb9aeBill Richardson DstSize, 100461362d65fcdd6f6aff90fc5be51237b39cfeb9aeBill Richardson Scratch, 100561362d65fcdd6f6aff90fc5be51237b39cfeb9aeBill Richardson ScratchSize, 100661362d65fcdd6f6aff90fc5be51237b39cfeb9aeBill Richardson 2 100761362d65fcdd6f6aff90fc5be51237b39cfeb9aeBill Richardson ); 100861362d65fcdd6f6aff90fc5be51237b39cfeb9aeBill Richardson} 1009573d4f6d80730ac56d23b2c5c8620a9fd843e816Bill Richardson 1010573d4f6d80730ac56d23b2c5c8620a9fd843e816Bill Richardson 101117f8d341099120da78a6ca71165834eefb0960edRandall Spangler#ifndef FOR_LIBRARY 1012573d4f6d80730ac56d23b2c5c8620a9fd843e816Bill Richardsonint main(int argc, char *argv[]) 1013573d4f6d80730ac56d23b2c5c8620a9fd843e816Bill Richardson{ 1014573d4f6d80730ac56d23b2c5c8620a9fd843e816Bill Richardson char *progname; 1015573d4f6d80730ac56d23b2c5c8620a9fd843e816Bill Richardson int retval = 1; 1016573d4f6d80730ac56d23b2c5c8620a9fd843e816Bill Richardson 1017573d4f6d80730ac56d23b2c5c8620a9fd843e816Bill Richardson progname = strrchr(argv[0], '/'); 1018573d4f6d80730ac56d23b2c5c8620a9fd843e816Bill Richardson if (progname) 1019573d4f6d80730ac56d23b2c5c8620a9fd843e816Bill Richardson progname++; 1020573d4f6d80730ac56d23b2c5c8620a9fd843e816Bill Richardson else 1021573d4f6d80730ac56d23b2c5c8620a9fd843e816Bill Richardson progname = argv[0]; 1022573d4f6d80730ac56d23b2c5c8620a9fd843e816Bill Richardson 1023573d4f6d80730ac56d23b2c5c8620a9fd843e816Bill Richardson if (argc != 3) 1024573d4f6d80730ac56d23b2c5c8620a9fd843e816Bill Richardson { 1025573d4f6d80730ac56d23b2c5c8620a9fd843e816Bill Richardson fprintf(stderr, "\nUsage: %s INFILE OUTFILE\n\n", progname); 1026573d4f6d80730ac56d23b2c5c8620a9fd843e816Bill Richardson exit(1); 1027573d4f6d80730ac56d23b2c5c8620a9fd843e816Bill Richardson } 1028573d4f6d80730ac56d23b2c5c8620a9fd843e816Bill Richardson 1029573d4f6d80730ac56d23b2c5c8620a9fd843e816Bill Richardson char *infile = argv[1]; 1030573d4f6d80730ac56d23b2c5c8620a9fd843e816Bill Richardson char *outfile = argv[2]; 1031573d4f6d80730ac56d23b2c5c8620a9fd843e816Bill Richardson 1032573d4f6d80730ac56d23b2c5c8620a9fd843e816Bill Richardson struct stat istat; 1033573d4f6d80730ac56d23b2c5c8620a9fd843e816Bill Richardson if (0 != stat(infile, &istat)) { 1034573d4f6d80730ac56d23b2c5c8620a9fd843e816Bill Richardson fprintf(stderr, "%s: can't stat %s: %s\n", 1035573d4f6d80730ac56d23b2c5c8620a9fd843e816Bill Richardson progname, 1036573d4f6d80730ac56d23b2c5c8620a9fd843e816Bill Richardson infile, 1037573d4f6d80730ac56d23b2c5c8620a9fd843e816Bill Richardson strerror(errno)); 1038573d4f6d80730ac56d23b2c5c8620a9fd843e816Bill Richardson exit(1); 1039573d4f6d80730ac56d23b2c5c8620a9fd843e816Bill Richardson } 1040573d4f6d80730ac56d23b2c5c8620a9fd843e816Bill Richardson uint32_t isize = (uint32_t)istat.st_size; 1041573d4f6d80730ac56d23b2c5c8620a9fd843e816Bill Richardson 1042573d4f6d80730ac56d23b2c5c8620a9fd843e816Bill Richardson printf("%s is %d bytes\n", infile, isize); 1043573d4f6d80730ac56d23b2c5c8620a9fd843e816Bill Richardson 1044573d4f6d80730ac56d23b2c5c8620a9fd843e816Bill Richardson FILE *ifp = fopen(infile, "rb"); 1045573d4f6d80730ac56d23b2c5c8620a9fd843e816Bill Richardson if (!ifp) 1046573d4f6d80730ac56d23b2c5c8620a9fd843e816Bill Richardson { 1047573d4f6d80730ac56d23b2c5c8620a9fd843e816Bill Richardson fprintf(stderr, "%s: can't read %s: %s\n", 1048573d4f6d80730ac56d23b2c5c8620a9fd843e816Bill Richardson progname, 1049573d4f6d80730ac56d23b2c5c8620a9fd843e816Bill Richardson infile, 1050573d4f6d80730ac56d23b2c5c8620a9fd843e816Bill Richardson strerror(errno)); 1051573d4f6d80730ac56d23b2c5c8620a9fd843e816Bill Richardson exit(1); 1052573d4f6d80730ac56d23b2c5c8620a9fd843e816Bill Richardson } 1053573d4f6d80730ac56d23b2c5c8620a9fd843e816Bill Richardson 1054573d4f6d80730ac56d23b2c5c8620a9fd843e816Bill Richardson // read input file into buffer 1055573d4f6d80730ac56d23b2c5c8620a9fd843e816Bill Richardson uint8_t *ibuf = malloc(isize); 1056573d4f6d80730ac56d23b2c5c8620a9fd843e816Bill Richardson if (!ibuf) { 1057573d4f6d80730ac56d23b2c5c8620a9fd843e816Bill Richardson fprintf(stderr, "%s: can't allocate %d bytes: %s\n", 1058573d4f6d80730ac56d23b2c5c8620a9fd843e816Bill Richardson progname, 1059573d4f6d80730ac56d23b2c5c8620a9fd843e816Bill Richardson isize, 1060573d4f6d80730ac56d23b2c5c8620a9fd843e816Bill Richardson strerror(errno)); 1061573d4f6d80730ac56d23b2c5c8620a9fd843e816Bill Richardson goto done1; 1062573d4f6d80730ac56d23b2c5c8620a9fd843e816Bill Richardson } 1063573d4f6d80730ac56d23b2c5c8620a9fd843e816Bill Richardson if (1 != fread(ibuf, isize, 1, ifp)) { 1064573d4f6d80730ac56d23b2c5c8620a9fd843e816Bill Richardson fprintf(stderr, "%s: can't read %d bytes: %s\n", 1065573d4f6d80730ac56d23b2c5c8620a9fd843e816Bill Richardson progname, 1066573d4f6d80730ac56d23b2c5c8620a9fd843e816Bill Richardson isize, 1067573d4f6d80730ac56d23b2c5c8620a9fd843e816Bill Richardson strerror(errno)); 1068573d4f6d80730ac56d23b2c5c8620a9fd843e816Bill Richardson goto done2; 1069573d4f6d80730ac56d23b2c5c8620a9fd843e816Bill Richardson } 1070573d4f6d80730ac56d23b2c5c8620a9fd843e816Bill Richardson 1071573d4f6d80730ac56d23b2c5c8620a9fd843e816Bill Richardson 1072573d4f6d80730ac56d23b2c5c8620a9fd843e816Bill Richardson // Determine required parameters 1073573d4f6d80730ac56d23b2c5c8620a9fd843e816Bill Richardson uint32_t ssize=0, osize=0; 1074573d4f6d80730ac56d23b2c5c8620a9fd843e816Bill Richardson EFI_STATUS r = GetInfo(ibuf, isize, &osize, &ssize); 1075573d4f6d80730ac56d23b2c5c8620a9fd843e816Bill Richardson if (r != EFI_SUCCESS) { 1076573d4f6d80730ac56d23b2c5c8620a9fd843e816Bill Richardson fprintf(stderr, "%s: GetInfo failed with code %d\n", 1077573d4f6d80730ac56d23b2c5c8620a9fd843e816Bill Richardson progname, 1078573d4f6d80730ac56d23b2c5c8620a9fd843e816Bill Richardson r); 1079573d4f6d80730ac56d23b2c5c8620a9fd843e816Bill Richardson goto done2; 1080573d4f6d80730ac56d23b2c5c8620a9fd843e816Bill Richardson } 1081573d4f6d80730ac56d23b2c5c8620a9fd843e816Bill Richardson printf("need %d bytes of scratch to produce %d bytes of data\n", 1082573d4f6d80730ac56d23b2c5c8620a9fd843e816Bill Richardson ssize, osize); 1083573d4f6d80730ac56d23b2c5c8620a9fd843e816Bill Richardson 1084573d4f6d80730ac56d23b2c5c8620a9fd843e816Bill Richardson uint8_t *sbuf = malloc(ssize); 1085573d4f6d80730ac56d23b2c5c8620a9fd843e816Bill Richardson if (!sbuf) { 1086573d4f6d80730ac56d23b2c5c8620a9fd843e816Bill Richardson fprintf(stderr, "%s: can't allocate %d bytes: %s\n", 1087573d4f6d80730ac56d23b2c5c8620a9fd843e816Bill Richardson progname, 1088573d4f6d80730ac56d23b2c5c8620a9fd843e816Bill Richardson ssize, 1089573d4f6d80730ac56d23b2c5c8620a9fd843e816Bill Richardson strerror(errno)); 1090573d4f6d80730ac56d23b2c5c8620a9fd843e816Bill Richardson goto done2; 1091573d4f6d80730ac56d23b2c5c8620a9fd843e816Bill Richardson } 1092573d4f6d80730ac56d23b2c5c8620a9fd843e816Bill Richardson 1093573d4f6d80730ac56d23b2c5c8620a9fd843e816Bill Richardson uint8_t *obuf = malloc(osize); 1094573d4f6d80730ac56d23b2c5c8620a9fd843e816Bill Richardson if (!obuf) { 1095573d4f6d80730ac56d23b2c5c8620a9fd843e816Bill Richardson fprintf(stderr, "%s: can't allocate %d bytes: %s\n", 1096573d4f6d80730ac56d23b2c5c8620a9fd843e816Bill Richardson progname, 1097573d4f6d80730ac56d23b2c5c8620a9fd843e816Bill Richardson osize, 1098573d4f6d80730ac56d23b2c5c8620a9fd843e816Bill Richardson strerror(errno)); 1099573d4f6d80730ac56d23b2c5c8620a9fd843e816Bill Richardson goto done3; 1100573d4f6d80730ac56d23b2c5c8620a9fd843e816Bill Richardson } 1101573d4f6d80730ac56d23b2c5c8620a9fd843e816Bill Richardson 1102573d4f6d80730ac56d23b2c5c8620a9fd843e816Bill Richardson // Try new version first 1103573d4f6d80730ac56d23b2c5c8620a9fd843e816Bill Richardson r = TianoDecompress(ibuf, isize, obuf, osize, sbuf, ssize); 1104573d4f6d80730ac56d23b2c5c8620a9fd843e816Bill Richardson if (r != EFI_SUCCESS) { 1105573d4f6d80730ac56d23b2c5c8620a9fd843e816Bill Richardson fprintf(stderr, "%s: TianoDecompress failed with code %d\n", 1106573d4f6d80730ac56d23b2c5c8620a9fd843e816Bill Richardson progname, 1107573d4f6d80730ac56d23b2c5c8620a9fd843e816Bill Richardson r); 1108573d4f6d80730ac56d23b2c5c8620a9fd843e816Bill Richardson 1109573d4f6d80730ac56d23b2c5c8620a9fd843e816Bill Richardson // Try old version 1110573d4f6d80730ac56d23b2c5c8620a9fd843e816Bill Richardson r = EfiDecompress(ibuf, isize, obuf, osize, sbuf, ssize); 1111573d4f6d80730ac56d23b2c5c8620a9fd843e816Bill Richardson if (r != EFI_SUCCESS) { 1112573d4f6d80730ac56d23b2c5c8620a9fd843e816Bill Richardson fprintf(stderr, "%s: TianoDecompress failed with code %d\n", 1113573d4f6d80730ac56d23b2c5c8620a9fd843e816Bill Richardson progname, 1114573d4f6d80730ac56d23b2c5c8620a9fd843e816Bill Richardson r); 1115573d4f6d80730ac56d23b2c5c8620a9fd843e816Bill Richardson goto done4; 1116573d4f6d80730ac56d23b2c5c8620a9fd843e816Bill Richardson } 1117573d4f6d80730ac56d23b2c5c8620a9fd843e816Bill Richardson } 1118573d4f6d80730ac56d23b2c5c8620a9fd843e816Bill Richardson 1119573d4f6d80730ac56d23b2c5c8620a9fd843e816Bill Richardson printf("Uncompressed %d bytes to %d bytes\n", isize, osize); 1120573d4f6d80730ac56d23b2c5c8620a9fd843e816Bill Richardson 1121573d4f6d80730ac56d23b2c5c8620a9fd843e816Bill Richardson // Write it out 1122573d4f6d80730ac56d23b2c5c8620a9fd843e816Bill Richardson FILE *ofp = fopen(outfile, "wb"); 1123573d4f6d80730ac56d23b2c5c8620a9fd843e816Bill Richardson if (!ofp) 1124573d4f6d80730ac56d23b2c5c8620a9fd843e816Bill Richardson { 1125573d4f6d80730ac56d23b2c5c8620a9fd843e816Bill Richardson fprintf(stderr, "%s: can't open %s for writing: %s\n", 1126573d4f6d80730ac56d23b2c5c8620a9fd843e816Bill Richardson progname, 1127573d4f6d80730ac56d23b2c5c8620a9fd843e816Bill Richardson outfile, 1128573d4f6d80730ac56d23b2c5c8620a9fd843e816Bill Richardson strerror(errno)); 1129573d4f6d80730ac56d23b2c5c8620a9fd843e816Bill Richardson goto done4; 1130573d4f6d80730ac56d23b2c5c8620a9fd843e816Bill Richardson } 1131573d4f6d80730ac56d23b2c5c8620a9fd843e816Bill Richardson 1132573d4f6d80730ac56d23b2c5c8620a9fd843e816Bill Richardson if (1 != fwrite(obuf, osize, 1, ofp)) { 1133573d4f6d80730ac56d23b2c5c8620a9fd843e816Bill Richardson fprintf(stderr, "%s: can't write %d bytes: %s\n", 1134573d4f6d80730ac56d23b2c5c8620a9fd843e816Bill Richardson progname, 1135573d4f6d80730ac56d23b2c5c8620a9fd843e816Bill Richardson osize, 1136573d4f6d80730ac56d23b2c5c8620a9fd843e816Bill Richardson strerror(errno)); 1137573d4f6d80730ac56d23b2c5c8620a9fd843e816Bill Richardson goto done5; 1138573d4f6d80730ac56d23b2c5c8620a9fd843e816Bill Richardson } 1139573d4f6d80730ac56d23b2c5c8620a9fd843e816Bill Richardson 1140573d4f6d80730ac56d23b2c5c8620a9fd843e816Bill Richardson printf("wrote %d bytes to %s\n", osize, outfile); 1141573d4f6d80730ac56d23b2c5c8620a9fd843e816Bill Richardson retval = 0; 1142573d4f6d80730ac56d23b2c5c8620a9fd843e816Bill Richardson 1143573d4f6d80730ac56d23b2c5c8620a9fd843e816Bill Richardsondone5: 1144573d4f6d80730ac56d23b2c5c8620a9fd843e816Bill Richardson fclose(ofp); 1145573d4f6d80730ac56d23b2c5c8620a9fd843e816Bill Richardson 1146573d4f6d80730ac56d23b2c5c8620a9fd843e816Bill Richardsondone4: 1147573d4f6d80730ac56d23b2c5c8620a9fd843e816Bill Richardson free(obuf); 1148573d4f6d80730ac56d23b2c5c8620a9fd843e816Bill Richardson 1149573d4f6d80730ac56d23b2c5c8620a9fd843e816Bill Richardsondone3: 1150573d4f6d80730ac56d23b2c5c8620a9fd843e816Bill Richardson free(sbuf); 1151573d4f6d80730ac56d23b2c5c8620a9fd843e816Bill Richardson 1152573d4f6d80730ac56d23b2c5c8620a9fd843e816Bill Richardsondone2: 1153573d4f6d80730ac56d23b2c5c8620a9fd843e816Bill Richardson free(ibuf); 1154573d4f6d80730ac56d23b2c5c8620a9fd843e816Bill Richardson 1155573d4f6d80730ac56d23b2c5c8620a9fd843e816Bill Richardsondone1: 1156573d4f6d80730ac56d23b2c5c8620a9fd843e816Bill Richardson fclose(ifp); 1157573d4f6d80730ac56d23b2c5c8620a9fd843e816Bill Richardson 1158573d4f6d80730ac56d23b2c5c8620a9fd843e816Bill Richardson return retval; 1159573d4f6d80730ac56d23b2c5c8620a9fd843e816Bill Richardson} 116017f8d341099120da78a6ca71165834eefb0960edRandall Spangler#endif // FOR_LIBRARY 1161