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