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