130fdf1140b8d1ce93f3821d986fa165552023440lgao/** @file
230fdf1140b8d1ce93f3821d986fa165552023440lgao  LZMA Compress/Decompress tool (LzmaCompress)
330fdf1140b8d1ce93f3821d986fa165552023440lgao
4c4ab09ef2f543ebf420da5d7cd8d48988c99b89cLiming Gao  Based on LZMA SDK 16.04:
530fdf1140b8d1ce93f3821d986fa165552023440lgao    LzmaUtil.c -- Test application for LZMA compression
6c4ab09ef2f543ebf420da5d7cd8d48988c99b89cLiming Gao    2016-10-04 : Igor Pavlov : Public domain
730fdf1140b8d1ce93f3821d986fa165552023440lgao
8c4ab09ef2f543ebf420da5d7cd8d48988c99b89cLiming Gao  Copyright (c) 2006 - 2016, Intel Corporation. All rights reserved.<BR>
940d841f6a8f84e75409178e19e69b95e01bada0flgao  This program and the accompanying materials
1030fdf1140b8d1ce93f3821d986fa165552023440lgao  are licensed and made available under the terms and conditions of the BSD License
1130fdf1140b8d1ce93f3821d986fa165552023440lgao  which accompanies this distribution.  The full text of the license may be found at
1230fdf1140b8d1ce93f3821d986fa165552023440lgao  http://opensource.org/licenses/bsd-license.php
1330fdf1140b8d1ce93f3821d986fa165552023440lgao
1430fdf1140b8d1ce93f3821d986fa165552023440lgao  THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
1530fdf1140b8d1ce93f3821d986fa165552023440lgao  WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
1630fdf1140b8d1ce93f3821d986fa165552023440lgao
1730fdf1140b8d1ce93f3821d986fa165552023440lgao**/
1830fdf1140b8d1ce93f3821d986fa165552023440lgao
1930fdf1140b8d1ce93f3821d986fa165552023440lgao#define _CRT_SECURE_NO_WARNINGS
2030fdf1140b8d1ce93f3821d986fa165552023440lgao
2130fdf1140b8d1ce93f3821d986fa165552023440lgao#include <stdio.h>
2230fdf1140b8d1ce93f3821d986fa165552023440lgao#include <stdlib.h>
2330fdf1140b8d1ce93f3821d986fa165552023440lgao#include <string.h>
2430fdf1140b8d1ce93f3821d986fa165552023440lgao
2530fdf1140b8d1ce93f3821d986fa165552023440lgao#include "Sdk/C/Alloc.h"
2630fdf1140b8d1ce93f3821d986fa165552023440lgao#include "Sdk/C/7zFile.h"
2730fdf1140b8d1ce93f3821d986fa165552023440lgao#include "Sdk/C/7zVersion.h"
2830fdf1140b8d1ce93f3821d986fa165552023440lgao#include "Sdk/C/LzmaDec.h"
2930fdf1140b8d1ce93f3821d986fa165552023440lgao#include "Sdk/C/LzmaEnc.h"
3064b2609fcff9d6412eea4c74c8e74bed33dc3235lgao#include "Sdk/C/Bra.h"
31b36d134faf4305247830522b8e2bb255e98c5699lgao#include "CommonLib.h"
3230fdf1140b8d1ce93f3821d986fa165552023440lgao
3364b2609fcff9d6412eea4c74c8e74bed33dc3235lgao#define LZMA_HEADER_SIZE (LZMA_PROPS_SIZE + 8)
3464b2609fcff9d6412eea4c74c8e74bed33dc3235lgao
3564b2609fcff9d6412eea4c74c8e74bed33dc3235lgaotypedef enum {
3664b2609fcff9d6412eea4c74c8e74bed33dc3235lgao  NoConverter,
3764b2609fcff9d6412eea4c74c8e74bed33dc3235lgao  X86Converter,
3864b2609fcff9d6412eea4c74c8e74bed33dc3235lgao  MaxConverter
3964b2609fcff9d6412eea4c74c8e74bed33dc3235lgao} CONVERTER_TYPE;
4064b2609fcff9d6412eea4c74c8e74bed33dc3235lgao
4130fdf1140b8d1ce93f3821d986fa165552023440lgaoconst char *kCantReadMessage = "Can not read input file";
4230fdf1140b8d1ce93f3821d986fa165552023440lgaoconst char *kCantWriteMessage = "Can not write output file";
4330fdf1140b8d1ce93f3821d986fa165552023440lgaoconst char *kCantAllocateMessage = "Can not allocate memory";
4430fdf1140b8d1ce93f3821d986fa165552023440lgaoconst char *kDataErrorMessage = "Data error";
4530fdf1140b8d1ce93f3821d986fa165552023440lgao
4630fdf1140b8d1ce93f3821d986fa165552023440lgaostatic Bool mQuietMode = False;
4764b2609fcff9d6412eea4c74c8e74bed33dc3235lgaostatic CONVERTER_TYPE mConType = NoConverter;
4830fdf1140b8d1ce93f3821d986fa165552023440lgao
4930fdf1140b8d1ce93f3821d986fa165552023440lgao#define UTILITY_NAME "LzmaCompress"
5030fdf1140b8d1ce93f3821d986fa165552023440lgao#define UTILITY_MAJOR_VERSION 0
5164b2609fcff9d6412eea4c74c8e74bed33dc3235lgao#define UTILITY_MINOR_VERSION 2
5230fdf1140b8d1ce93f3821d986fa165552023440lgao#define INTEL_COPYRIGHT \
53c4ab09ef2f543ebf420da5d7cd8d48988c99b89cLiming Gao  "Copyright (c) 2009-2016, Intel Corporation. All rights reserved."
5430fdf1140b8d1ce93f3821d986fa165552023440lgaovoid PrintHelp(char *buffer)
5530fdf1140b8d1ce93f3821d986fa165552023440lgao{
5630fdf1140b8d1ce93f3821d986fa165552023440lgao  strcat(buffer,
5730fdf1140b8d1ce93f3821d986fa165552023440lgao      "\n" UTILITY_NAME " - " INTEL_COPYRIGHT "\n"
5830fdf1140b8d1ce93f3821d986fa165552023440lgao      "Based on LZMA Utility " MY_VERSION_COPYRIGHT_DATE "\n"
5930fdf1140b8d1ce93f3821d986fa165552023440lgao      "\nUsage:  LzmaCompress -e|-d [options] <inputFile>\n"
6030fdf1140b8d1ce93f3821d986fa165552023440lgao             "  -e: encode file\n"
6130fdf1140b8d1ce93f3821d986fa165552023440lgao             "  -d: decode file\n"
6230fdf1140b8d1ce93f3821d986fa165552023440lgao             "  -o FileName, --output FileName: specify the output filename\n"
6364b2609fcff9d6412eea4c74c8e74bed33dc3235lgao             "  --f86: enable converter for x86 code\n"
6430fdf1140b8d1ce93f3821d986fa165552023440lgao             "  -v, --verbose: increase output messages\n"
6530fdf1140b8d1ce93f3821d986fa165552023440lgao             "  -q, --quiet: reduce output messages\n"
6630fdf1140b8d1ce93f3821d986fa165552023440lgao             "  --debug [0-9]: set debug level\n"
6730fdf1140b8d1ce93f3821d986fa165552023440lgao             "  --version: display the program version and exit\n"
6830fdf1140b8d1ce93f3821d986fa165552023440lgao             "  -h, --help: display this help text\n"
6930fdf1140b8d1ce93f3821d986fa165552023440lgao             );
7030fdf1140b8d1ce93f3821d986fa165552023440lgao}
7130fdf1140b8d1ce93f3821d986fa165552023440lgao
7230fdf1140b8d1ce93f3821d986fa165552023440lgaoint PrintError(char *buffer, const char *message)
7330fdf1140b8d1ce93f3821d986fa165552023440lgao{
7430fdf1140b8d1ce93f3821d986fa165552023440lgao  strcat(buffer, "\nError: ");
7530fdf1140b8d1ce93f3821d986fa165552023440lgao  strcat(buffer, message);
7630fdf1140b8d1ce93f3821d986fa165552023440lgao  strcat(buffer, "\n");
7730fdf1140b8d1ce93f3821d986fa165552023440lgao  return 1;
7830fdf1140b8d1ce93f3821d986fa165552023440lgao}
7930fdf1140b8d1ce93f3821d986fa165552023440lgao
8030fdf1140b8d1ce93f3821d986fa165552023440lgaoint PrintErrorNumber(char *buffer, SRes val)
8130fdf1140b8d1ce93f3821d986fa165552023440lgao{
8230fdf1140b8d1ce93f3821d986fa165552023440lgao  sprintf(buffer + strlen(buffer), "\nError code: %x\n", (unsigned)val);
8330fdf1140b8d1ce93f3821d986fa165552023440lgao  return 1;
8430fdf1140b8d1ce93f3821d986fa165552023440lgao}
8530fdf1140b8d1ce93f3821d986fa165552023440lgao
8630fdf1140b8d1ce93f3821d986fa165552023440lgaoint PrintUserError(char *buffer)
8730fdf1140b8d1ce93f3821d986fa165552023440lgao{
8830fdf1140b8d1ce93f3821d986fa165552023440lgao  return PrintError(buffer, "Incorrect command");
8930fdf1140b8d1ce93f3821d986fa165552023440lgao}
9030fdf1140b8d1ce93f3821d986fa165552023440lgao
9130fdf1140b8d1ce93f3821d986fa165552023440lgaovoid PrintVersion(char *buffer)
9230fdf1140b8d1ce93f3821d986fa165552023440lgao{
93b36d134faf4305247830522b8e2bb255e98c5699lgao  sprintf (buffer, "%s Version %d.%d %s ", UTILITY_NAME, UTILITY_MAJOR_VERSION, UTILITY_MINOR_VERSION, __BUILD_VERSION);
9430fdf1140b8d1ce93f3821d986fa165552023440lgao}
9530fdf1140b8d1ce93f3821d986fa165552023440lgao
9664b2609fcff9d6412eea4c74c8e74bed33dc3235lgaostatic SRes Encode(ISeqOutStream *outStream, ISeqInStream *inStream, UInt64 fileSize)
9730fdf1140b8d1ce93f3821d986fa165552023440lgao{
9864b2609fcff9d6412eea4c74c8e74bed33dc3235lgao  SRes res;
9964b2609fcff9d6412eea4c74c8e74bed33dc3235lgao  size_t inSize = (size_t)fileSize;
10064b2609fcff9d6412eea4c74c8e74bed33dc3235lgao  Byte *inBuffer = 0;
10164b2609fcff9d6412eea4c74c8e74bed33dc3235lgao  Byte *outBuffer = 0;
10264b2609fcff9d6412eea4c74c8e74bed33dc3235lgao  Byte *filteredStream = 0;
10364b2609fcff9d6412eea4c74c8e74bed33dc3235lgao  size_t outSize;
10464b2609fcff9d6412eea4c74c8e74bed33dc3235lgao  CLzmaEncProps props;
10530fdf1140b8d1ce93f3821d986fa165552023440lgao
10664b2609fcff9d6412eea4c74c8e74bed33dc3235lgao  LzmaEncProps_Init(&props);
10764b2609fcff9d6412eea4c74c8e74bed33dc3235lgao  LzmaEncProps_Normalize(&props);
10864b2609fcff9d6412eea4c74c8e74bed33dc3235lgao
10964b2609fcff9d6412eea4c74c8e74bed33dc3235lgao  if (inSize != 0) {
11064b2609fcff9d6412eea4c74c8e74bed33dc3235lgao    inBuffer = (Byte *)MyAlloc(inSize);
11164b2609fcff9d6412eea4c74c8e74bed33dc3235lgao    if (inBuffer == 0)
11264b2609fcff9d6412eea4c74c8e74bed33dc3235lgao      return SZ_ERROR_MEM;
11364b2609fcff9d6412eea4c74c8e74bed33dc3235lgao  } else {
11464b2609fcff9d6412eea4c74c8e74bed33dc3235lgao    return SZ_ERROR_INPUT_EOF;
11564b2609fcff9d6412eea4c74c8e74bed33dc3235lgao  }
11664b2609fcff9d6412eea4c74c8e74bed33dc3235lgao
11764b2609fcff9d6412eea4c74c8e74bed33dc3235lgao  if (SeqInStream_Read(inStream, inBuffer, inSize) != SZ_OK) {
11864b2609fcff9d6412eea4c74c8e74bed33dc3235lgao    res = SZ_ERROR_READ;
11964b2609fcff9d6412eea4c74c8e74bed33dc3235lgao    goto Done;
12064b2609fcff9d6412eea4c74c8e74bed33dc3235lgao  }
12130fdf1140b8d1ce93f3821d986fa165552023440lgao
12264b2609fcff9d6412eea4c74c8e74bed33dc3235lgao  // we allocate 105% of original size + 64KB for output buffer
12364b2609fcff9d6412eea4c74c8e74bed33dc3235lgao  outSize = (size_t)fileSize / 20 * 21 + (1 << 16);
12464b2609fcff9d6412eea4c74c8e74bed33dc3235lgao  outBuffer = (Byte *)MyAlloc(outSize);
12564b2609fcff9d6412eea4c74c8e74bed33dc3235lgao  if (outBuffer == 0) {
12664b2609fcff9d6412eea4c74c8e74bed33dc3235lgao    res = SZ_ERROR_MEM;
12764b2609fcff9d6412eea4c74c8e74bed33dc3235lgao    goto Done;
12864b2609fcff9d6412eea4c74c8e74bed33dc3235lgao  }
12964b2609fcff9d6412eea4c74c8e74bed33dc3235lgao
13064b2609fcff9d6412eea4c74c8e74bed33dc3235lgao  {
13164b2609fcff9d6412eea4c74c8e74bed33dc3235lgao    int i;
13264b2609fcff9d6412eea4c74c8e74bed33dc3235lgao    for (i = 0; i < 8; i++)
13364b2609fcff9d6412eea4c74c8e74bed33dc3235lgao      outBuffer[i + LZMA_PROPS_SIZE] = (Byte)(fileSize >> (8 * i));
13464b2609fcff9d6412eea4c74c8e74bed33dc3235lgao  }
13530fdf1140b8d1ce93f3821d986fa165552023440lgao
13664b2609fcff9d6412eea4c74c8e74bed33dc3235lgao  if (mConType != NoConverter)
13764b2609fcff9d6412eea4c74c8e74bed33dc3235lgao  {
13864b2609fcff9d6412eea4c74c8e74bed33dc3235lgao    filteredStream = (Byte *)MyAlloc(inSize);
13964b2609fcff9d6412eea4c74c8e74bed33dc3235lgao    if (filteredStream == 0) {
14064b2609fcff9d6412eea4c74c8e74bed33dc3235lgao      res = SZ_ERROR_MEM;
14164b2609fcff9d6412eea4c74c8e74bed33dc3235lgao      goto Done;
14264b2609fcff9d6412eea4c74c8e74bed33dc3235lgao    }
14364b2609fcff9d6412eea4c74c8e74bed33dc3235lgao    memcpy(filteredStream, inBuffer, inSize);
14464b2609fcff9d6412eea4c74c8e74bed33dc3235lgao
14564b2609fcff9d6412eea4c74c8e74bed33dc3235lgao    if (mConType == X86Converter) {
14630fdf1140b8d1ce93f3821d986fa165552023440lgao      {
14764b2609fcff9d6412eea4c74c8e74bed33dc3235lgao        UInt32 x86State;
14864b2609fcff9d6412eea4c74c8e74bed33dc3235lgao        x86_Convert_Init(x86State);
14964b2609fcff9d6412eea4c74c8e74bed33dc3235lgao        x86_Convert(filteredStream, (SizeT) inSize, 0, &x86State, 1);
15030fdf1140b8d1ce93f3821d986fa165552023440lgao      }
15130fdf1140b8d1ce93f3821d986fa165552023440lgao    }
15230fdf1140b8d1ce93f3821d986fa165552023440lgao  }
15330fdf1140b8d1ce93f3821d986fa165552023440lgao
15464b2609fcff9d6412eea4c74c8e74bed33dc3235lgao  {
15564b2609fcff9d6412eea4c74c8e74bed33dc3235lgao    size_t outSizeProcessed = outSize - LZMA_HEADER_SIZE;
15664b2609fcff9d6412eea4c74c8e74bed33dc3235lgao    size_t outPropsSize = LZMA_PROPS_SIZE;
15764b2609fcff9d6412eea4c74c8e74bed33dc3235lgao
15864b2609fcff9d6412eea4c74c8e74bed33dc3235lgao    res = LzmaEncode(outBuffer + LZMA_HEADER_SIZE, &outSizeProcessed,
15964b2609fcff9d6412eea4c74c8e74bed33dc3235lgao        mConType != NoConverter ? filteredStream : inBuffer, inSize,
16064b2609fcff9d6412eea4c74c8e74bed33dc3235lgao        &props, outBuffer, &outPropsSize, 0,
16164b2609fcff9d6412eea4c74c8e74bed33dc3235lgao        NULL, &g_Alloc, &g_Alloc);
16264b2609fcff9d6412eea4c74c8e74bed33dc3235lgao
16364b2609fcff9d6412eea4c74c8e74bed33dc3235lgao    if (res != SZ_OK)
16464b2609fcff9d6412eea4c74c8e74bed33dc3235lgao      goto Done;
16564b2609fcff9d6412eea4c74c8e74bed33dc3235lgao
16664b2609fcff9d6412eea4c74c8e74bed33dc3235lgao    outSize = LZMA_HEADER_SIZE + outSizeProcessed;
16764b2609fcff9d6412eea4c74c8e74bed33dc3235lgao  }
16830fdf1140b8d1ce93f3821d986fa165552023440lgao
16964b2609fcff9d6412eea4c74c8e74bed33dc3235lgao  if (outStream->Write(outStream, outBuffer, outSize) != outSize)
17064b2609fcff9d6412eea4c74c8e74bed33dc3235lgao    res = SZ_ERROR_WRITE;
17130fdf1140b8d1ce93f3821d986fa165552023440lgao
17264b2609fcff9d6412eea4c74c8e74bed33dc3235lgaoDone:
17364b2609fcff9d6412eea4c74c8e74bed33dc3235lgao  MyFree(outBuffer);
17464b2609fcff9d6412eea4c74c8e74bed33dc3235lgao  MyFree(inBuffer);
17564b2609fcff9d6412eea4c74c8e74bed33dc3235lgao  MyFree(filteredStream);
17630fdf1140b8d1ce93f3821d986fa165552023440lgao
17730fdf1140b8d1ce93f3821d986fa165552023440lgao  return res;
17830fdf1140b8d1ce93f3821d986fa165552023440lgao}
17930fdf1140b8d1ce93f3821d986fa165552023440lgao
18064b2609fcff9d6412eea4c74c8e74bed33dc3235lgaostatic SRes Decode(ISeqOutStream *outStream, ISeqInStream *inStream, UInt64 fileSize)
18130fdf1140b8d1ce93f3821d986fa165552023440lgao{
18230fdf1140b8d1ce93f3821d986fa165552023440lgao  SRes res;
18364b2609fcff9d6412eea4c74c8e74bed33dc3235lgao  size_t inSize = (size_t)fileSize;
18464b2609fcff9d6412eea4c74c8e74bed33dc3235lgao  Byte *inBuffer = 0;
18564b2609fcff9d6412eea4c74c8e74bed33dc3235lgao  Byte *outBuffer = 0;
18664b2609fcff9d6412eea4c74c8e74bed33dc3235lgao  size_t outSize = 0;
18764b2609fcff9d6412eea4c74c8e74bed33dc3235lgao  size_t inSizePure;
18864b2609fcff9d6412eea4c74c8e74bed33dc3235lgao  ELzmaStatus status;
18964b2609fcff9d6412eea4c74c8e74bed33dc3235lgao  UInt64 outSize64 = 0;
19030fdf1140b8d1ce93f3821d986fa165552023440lgao
19164b2609fcff9d6412eea4c74c8e74bed33dc3235lgao  int i;
19264b2609fcff9d6412eea4c74c8e74bed33dc3235lgao
19364b2609fcff9d6412eea4c74c8e74bed33dc3235lgao  if (inSize < LZMA_HEADER_SIZE)
19464b2609fcff9d6412eea4c74c8e74bed33dc3235lgao    return SZ_ERROR_INPUT_EOF;
19530fdf1140b8d1ce93f3821d986fa165552023440lgao
19664b2609fcff9d6412eea4c74c8e74bed33dc3235lgao  inBuffer = (Byte *)MyAlloc(inSize);
19764b2609fcff9d6412eea4c74c8e74bed33dc3235lgao  if (inBuffer == 0)
19830fdf1140b8d1ce93f3821d986fa165552023440lgao    return SZ_ERROR_MEM;
19964b2609fcff9d6412eea4c74c8e74bed33dc3235lgao
20064b2609fcff9d6412eea4c74c8e74bed33dc3235lgao  if (SeqInStream_Read(inStream, inBuffer, inSize) != SZ_OK) {
20164b2609fcff9d6412eea4c74c8e74bed33dc3235lgao    res = SZ_ERROR_READ;
20264b2609fcff9d6412eea4c74c8e74bed33dc3235lgao    goto Done;
20364b2609fcff9d6412eea4c74c8e74bed33dc3235lgao  }
20430fdf1140b8d1ce93f3821d986fa165552023440lgao
20564b2609fcff9d6412eea4c74c8e74bed33dc3235lgao  for (i = 0; i < 8; i++)
20664b2609fcff9d6412eea4c74c8e74bed33dc3235lgao    outSize64 += ((UInt64)inBuffer[LZMA_PROPS_SIZE + i]) << (i * 8);
20764b2609fcff9d6412eea4c74c8e74bed33dc3235lgao
20864b2609fcff9d6412eea4c74c8e74bed33dc3235lgao  outSize = (size_t)outSize64;
20964b2609fcff9d6412eea4c74c8e74bed33dc3235lgao  if (outSize != 0) {
21064b2609fcff9d6412eea4c74c8e74bed33dc3235lgao    outBuffer = (Byte *)MyAlloc(outSize);
21164b2609fcff9d6412eea4c74c8e74bed33dc3235lgao    if (outBuffer == 0) {
21264b2609fcff9d6412eea4c74c8e74bed33dc3235lgao      res = SZ_ERROR_MEM;
21364b2609fcff9d6412eea4c74c8e74bed33dc3235lgao      goto Done;
21464b2609fcff9d6412eea4c74c8e74bed33dc3235lgao    }
21564b2609fcff9d6412eea4c74c8e74bed33dc3235lgao  } else {
21664b2609fcff9d6412eea4c74c8e74bed33dc3235lgao    res = SZ_OK;
21764b2609fcff9d6412eea4c74c8e74bed33dc3235lgao    goto Done;
21864b2609fcff9d6412eea4c74c8e74bed33dc3235lgao  }
21930fdf1140b8d1ce93f3821d986fa165552023440lgao
22064b2609fcff9d6412eea4c74c8e74bed33dc3235lgao  inSizePure = inSize - LZMA_HEADER_SIZE;
22164b2609fcff9d6412eea4c74c8e74bed33dc3235lgao  res = LzmaDecode(outBuffer, &outSize, inBuffer + LZMA_HEADER_SIZE, &inSizePure,
22264b2609fcff9d6412eea4c74c8e74bed33dc3235lgao      inBuffer, LZMA_PROPS_SIZE, LZMA_FINISH_END, &status, &g_Alloc);
22330fdf1140b8d1ce93f3821d986fa165552023440lgao
22464b2609fcff9d6412eea4c74c8e74bed33dc3235lgao  if (res != SZ_OK)
22564b2609fcff9d6412eea4c74c8e74bed33dc3235lgao    goto Done;
22664b2609fcff9d6412eea4c74c8e74bed33dc3235lgao
22764b2609fcff9d6412eea4c74c8e74bed33dc3235lgao  if (mConType == X86Converter)
22864b2609fcff9d6412eea4c74c8e74bed33dc3235lgao  {
22964b2609fcff9d6412eea4c74c8e74bed33dc3235lgao    UInt32 x86State;
23064b2609fcff9d6412eea4c74c8e74bed33dc3235lgao    x86_Convert_Init(x86State);
23164b2609fcff9d6412eea4c74c8e74bed33dc3235lgao    x86_Convert(outBuffer, (SizeT) outSize, 0, &x86State, 0);
23230fdf1140b8d1ce93f3821d986fa165552023440lgao  }
23364b2609fcff9d6412eea4c74c8e74bed33dc3235lgao
23464b2609fcff9d6412eea4c74c8e74bed33dc3235lgao  if (outStream->Write(outStream, outBuffer, outSize) != outSize)
23564b2609fcff9d6412eea4c74c8e74bed33dc3235lgao    res = SZ_ERROR_WRITE;
23664b2609fcff9d6412eea4c74c8e74bed33dc3235lgao
23764b2609fcff9d6412eea4c74c8e74bed33dc3235lgaoDone:
23864b2609fcff9d6412eea4c74c8e74bed33dc3235lgao  MyFree(outBuffer);
23964b2609fcff9d6412eea4c74c8e74bed33dc3235lgao  MyFree(inBuffer);
24064b2609fcff9d6412eea4c74c8e74bed33dc3235lgao
24130fdf1140b8d1ce93f3821d986fa165552023440lgao  return res;
24230fdf1140b8d1ce93f3821d986fa165552023440lgao}
24330fdf1140b8d1ce93f3821d986fa165552023440lgao
24430fdf1140b8d1ce93f3821d986fa165552023440lgaoint main2(int numArgs, const char *args[], char *rs)
24530fdf1140b8d1ce93f3821d986fa165552023440lgao{
24630fdf1140b8d1ce93f3821d986fa165552023440lgao  CFileSeqInStream inStream;
24730fdf1140b8d1ce93f3821d986fa165552023440lgao  CFileOutStream outStream;
24830fdf1140b8d1ce93f3821d986fa165552023440lgao  int res;
249fd171542e0aa89ac12a09d79608173f48019b14bvanjeff  int encodeMode = 0;
25030fdf1140b8d1ce93f3821d986fa165552023440lgao  Bool modeWasSet = False;
25130fdf1140b8d1ce93f3821d986fa165552023440lgao  const char *inputFile = NULL;
25230fdf1140b8d1ce93f3821d986fa165552023440lgao  const char *outputFile = "file.tmp";
25330fdf1140b8d1ce93f3821d986fa165552023440lgao  int param;
25464b2609fcff9d6412eea4c74c8e74bed33dc3235lgao  UInt64 fileSize;
25530fdf1140b8d1ce93f3821d986fa165552023440lgao
25630fdf1140b8d1ce93f3821d986fa165552023440lgao  FileSeqInStream_CreateVTable(&inStream);
25730fdf1140b8d1ce93f3821d986fa165552023440lgao  File_Construct(&inStream.file);
25830fdf1140b8d1ce93f3821d986fa165552023440lgao
25930fdf1140b8d1ce93f3821d986fa165552023440lgao  FileOutStream_CreateVTable(&outStream);
26030fdf1140b8d1ce93f3821d986fa165552023440lgao  File_Construct(&outStream.file);
26130fdf1140b8d1ce93f3821d986fa165552023440lgao
26230fdf1140b8d1ce93f3821d986fa165552023440lgao  if (numArgs == 1)
26330fdf1140b8d1ce93f3821d986fa165552023440lgao  {
26430fdf1140b8d1ce93f3821d986fa165552023440lgao    PrintHelp(rs);
26530fdf1140b8d1ce93f3821d986fa165552023440lgao    return 0;
26630fdf1140b8d1ce93f3821d986fa165552023440lgao  }
26730fdf1140b8d1ce93f3821d986fa165552023440lgao
26830fdf1140b8d1ce93f3821d986fa165552023440lgao  for (param = 1; param < numArgs; param++) {
26930fdf1140b8d1ce93f3821d986fa165552023440lgao    if (strcmp(args[param], "-e") == 0 || strcmp(args[param], "-d") == 0) {
27030fdf1140b8d1ce93f3821d986fa165552023440lgao      encodeMode = (args[param][1] == 'e');
27130fdf1140b8d1ce93f3821d986fa165552023440lgao      modeWasSet = True;
27264b2609fcff9d6412eea4c74c8e74bed33dc3235lgao    } else if (strcmp(args[param], "--f86") == 0) {
27364b2609fcff9d6412eea4c74c8e74bed33dc3235lgao      mConType = X86Converter;
27430fdf1140b8d1ce93f3821d986fa165552023440lgao    } else if (strcmp(args[param], "-o") == 0 ||
27530fdf1140b8d1ce93f3821d986fa165552023440lgao               strcmp(args[param], "--output") == 0) {
27630fdf1140b8d1ce93f3821d986fa165552023440lgao      if (numArgs < (param + 2)) {
27730fdf1140b8d1ce93f3821d986fa165552023440lgao        return PrintUserError(rs);
27830fdf1140b8d1ce93f3821d986fa165552023440lgao      }
27930fdf1140b8d1ce93f3821d986fa165552023440lgao      outputFile = args[++param];
28030fdf1140b8d1ce93f3821d986fa165552023440lgao    } else if (strcmp(args[param], "--debug") == 0) {
28130fdf1140b8d1ce93f3821d986fa165552023440lgao      if (numArgs < (param + 2)) {
28230fdf1140b8d1ce93f3821d986fa165552023440lgao        return PrintUserError(rs);
28330fdf1140b8d1ce93f3821d986fa165552023440lgao      }
28430fdf1140b8d1ce93f3821d986fa165552023440lgao      //
28530fdf1140b8d1ce93f3821d986fa165552023440lgao      // For now we silently ignore this parameter to achieve command line
28630fdf1140b8d1ce93f3821d986fa165552023440lgao      // parameter compatibility with other build tools.
28730fdf1140b8d1ce93f3821d986fa165552023440lgao      //
28830fdf1140b8d1ce93f3821d986fa165552023440lgao      param++;
28930fdf1140b8d1ce93f3821d986fa165552023440lgao    } else if (
29030fdf1140b8d1ce93f3821d986fa165552023440lgao                strcmp(args[param], "-h") == 0 ||
29130fdf1140b8d1ce93f3821d986fa165552023440lgao                strcmp(args[param], "--help") == 0
29230fdf1140b8d1ce93f3821d986fa165552023440lgao              ) {
29330fdf1140b8d1ce93f3821d986fa165552023440lgao      PrintHelp(rs);
29430fdf1140b8d1ce93f3821d986fa165552023440lgao      return 0;
29530fdf1140b8d1ce93f3821d986fa165552023440lgao    } else if (
29630fdf1140b8d1ce93f3821d986fa165552023440lgao                strcmp(args[param], "-v") == 0 ||
29730fdf1140b8d1ce93f3821d986fa165552023440lgao                strcmp(args[param], "--verbose") == 0
29830fdf1140b8d1ce93f3821d986fa165552023440lgao              ) {
29930fdf1140b8d1ce93f3821d986fa165552023440lgao      //
30030fdf1140b8d1ce93f3821d986fa165552023440lgao      // For now we silently ignore this parameter to achieve command line
30130fdf1140b8d1ce93f3821d986fa165552023440lgao      // parameter compatibility with other build tools.
30230fdf1140b8d1ce93f3821d986fa165552023440lgao      //
30330fdf1140b8d1ce93f3821d986fa165552023440lgao    } else if (
30430fdf1140b8d1ce93f3821d986fa165552023440lgao                strcmp(args[param], "-q") == 0 ||
30530fdf1140b8d1ce93f3821d986fa165552023440lgao                strcmp(args[param], "--quiet") == 0
30630fdf1140b8d1ce93f3821d986fa165552023440lgao              ) {
30730fdf1140b8d1ce93f3821d986fa165552023440lgao      mQuietMode = True;
30830fdf1140b8d1ce93f3821d986fa165552023440lgao    } else if (strcmp(args[param], "--version") == 0) {
30930fdf1140b8d1ce93f3821d986fa165552023440lgao      PrintVersion(rs);
31030fdf1140b8d1ce93f3821d986fa165552023440lgao      return 0;
31130fdf1140b8d1ce93f3821d986fa165552023440lgao    } else if (inputFile == NULL) {
31230fdf1140b8d1ce93f3821d986fa165552023440lgao      inputFile = args[param];
31330fdf1140b8d1ce93f3821d986fa165552023440lgao    } else {
31430fdf1140b8d1ce93f3821d986fa165552023440lgao      return PrintUserError(rs);
31530fdf1140b8d1ce93f3821d986fa165552023440lgao    }
31630fdf1140b8d1ce93f3821d986fa165552023440lgao  }
31730fdf1140b8d1ce93f3821d986fa165552023440lgao
31830fdf1140b8d1ce93f3821d986fa165552023440lgao  if ((inputFile == NULL) || !modeWasSet) {
31930fdf1140b8d1ce93f3821d986fa165552023440lgao    return PrintUserError(rs);
32030fdf1140b8d1ce93f3821d986fa165552023440lgao  }
32130fdf1140b8d1ce93f3821d986fa165552023440lgao
32230fdf1140b8d1ce93f3821d986fa165552023440lgao  {
32330fdf1140b8d1ce93f3821d986fa165552023440lgao    size_t t4 = sizeof(UInt32);
32430fdf1140b8d1ce93f3821d986fa165552023440lgao    size_t t8 = sizeof(UInt64);
32530fdf1140b8d1ce93f3821d986fa165552023440lgao    if (t4 != 4 || t8 != 8)
32630fdf1140b8d1ce93f3821d986fa165552023440lgao      return PrintError(rs, "Incorrect UInt32 or UInt64");
32730fdf1140b8d1ce93f3821d986fa165552023440lgao  }
32830fdf1140b8d1ce93f3821d986fa165552023440lgao
32930fdf1140b8d1ce93f3821d986fa165552023440lgao  if (InFile_Open(&inStream.file, inputFile) != 0)
33030fdf1140b8d1ce93f3821d986fa165552023440lgao    return PrintError(rs, "Can not open input file");
33130fdf1140b8d1ce93f3821d986fa165552023440lgao
3321880d5e4d0b12695bec02e72e154a415e5085298Hao Wu  if (OutFile_Open(&outStream.file, outputFile) != 0) {
3331880d5e4d0b12695bec02e72e154a415e5085298Hao Wu    File_Close(&inStream.file);
33430fdf1140b8d1ce93f3821d986fa165552023440lgao    return PrintError(rs, "Can not open output file");
3351880d5e4d0b12695bec02e72e154a415e5085298Hao Wu  }
33630fdf1140b8d1ce93f3821d986fa165552023440lgao
33764b2609fcff9d6412eea4c74c8e74bed33dc3235lgao  File_GetLength(&inStream.file, &fileSize);
33864b2609fcff9d6412eea4c74c8e74bed33dc3235lgao
33930fdf1140b8d1ce93f3821d986fa165552023440lgao  if (encodeMode)
34030fdf1140b8d1ce93f3821d986fa165552023440lgao  {
34130fdf1140b8d1ce93f3821d986fa165552023440lgao    if (!mQuietMode) {
34230fdf1140b8d1ce93f3821d986fa165552023440lgao      printf("Encoding\n");
34330fdf1140b8d1ce93f3821d986fa165552023440lgao    }
34464b2609fcff9d6412eea4c74c8e74bed33dc3235lgao    res = Encode(&outStream.s, &inStream.s, fileSize);
34530fdf1140b8d1ce93f3821d986fa165552023440lgao  }
34630fdf1140b8d1ce93f3821d986fa165552023440lgao  else
34730fdf1140b8d1ce93f3821d986fa165552023440lgao  {
34830fdf1140b8d1ce93f3821d986fa165552023440lgao    if (!mQuietMode) {
34930fdf1140b8d1ce93f3821d986fa165552023440lgao      printf("Decoding\n");
35030fdf1140b8d1ce93f3821d986fa165552023440lgao    }
35164b2609fcff9d6412eea4c74c8e74bed33dc3235lgao    res = Decode(&outStream.s, &inStream.s, fileSize);
35230fdf1140b8d1ce93f3821d986fa165552023440lgao  }
35330fdf1140b8d1ce93f3821d986fa165552023440lgao
35430fdf1140b8d1ce93f3821d986fa165552023440lgao  File_Close(&outStream.file);
35530fdf1140b8d1ce93f3821d986fa165552023440lgao  File_Close(&inStream.file);
35630fdf1140b8d1ce93f3821d986fa165552023440lgao
35730fdf1140b8d1ce93f3821d986fa165552023440lgao  if (res != SZ_OK)
35830fdf1140b8d1ce93f3821d986fa165552023440lgao  {
35930fdf1140b8d1ce93f3821d986fa165552023440lgao    if (res == SZ_ERROR_MEM)
36030fdf1140b8d1ce93f3821d986fa165552023440lgao      return PrintError(rs, kCantAllocateMessage);
36130fdf1140b8d1ce93f3821d986fa165552023440lgao    else if (res == SZ_ERROR_DATA)
36230fdf1140b8d1ce93f3821d986fa165552023440lgao      return PrintError(rs, kDataErrorMessage);
36330fdf1140b8d1ce93f3821d986fa165552023440lgao    else if (res == SZ_ERROR_WRITE)
36430fdf1140b8d1ce93f3821d986fa165552023440lgao      return PrintError(rs, kCantWriteMessage);
36530fdf1140b8d1ce93f3821d986fa165552023440lgao    else if (res == SZ_ERROR_READ)
36630fdf1140b8d1ce93f3821d986fa165552023440lgao      return PrintError(rs, kCantReadMessage);
36730fdf1140b8d1ce93f3821d986fa165552023440lgao    return PrintErrorNumber(rs, res);
36830fdf1140b8d1ce93f3821d986fa165552023440lgao  }
36930fdf1140b8d1ce93f3821d986fa165552023440lgao  return 0;
37030fdf1140b8d1ce93f3821d986fa165552023440lgao}
37130fdf1140b8d1ce93f3821d986fa165552023440lgao
37230fdf1140b8d1ce93f3821d986fa165552023440lgaoint MY_CDECL main(int numArgs, const char *args[])
37330fdf1140b8d1ce93f3821d986fa165552023440lgao{
37430fdf1140b8d1ce93f3821d986fa165552023440lgao  char rs[2000] = { 0 };
37530fdf1140b8d1ce93f3821d986fa165552023440lgao  int res = main2(numArgs, args, rs);
37630fdf1140b8d1ce93f3821d986fa165552023440lgao  if (strlen(rs) > 0) {
37730fdf1140b8d1ce93f3821d986fa165552023440lgao    puts(rs);
37830fdf1140b8d1ce93f3821d986fa165552023440lgao  }
37930fdf1140b8d1ce93f3821d986fa165552023440lgao  return res;
38030fdf1140b8d1ce93f3821d986fa165552023440lgao}
381