4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync/** @file
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync LZMA Compress/Decompress tool (LzmaCompress)
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Based on LZMA SDK 4.65:
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync LzmaUtil.c -- Test application for LZMA compression
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync 2008-11-23 : Igor Pavlov : Public domain
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Copyright (c) 2006 - 2012, Intel Corporation. All rights reserved.<BR>
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync This program and the accompanying materials
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync are licensed and made available under the terms and conditions of the BSD License
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync which accompanies this distribution. The full text of the license may be found at
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync http://opensource.org/licenses/bsd-license.php
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync**/
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync#define _CRT_SECURE_NO_WARNINGS
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync#include <stdio.h>
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync#include <stdlib.h>
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync#include <string.h>
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync#include "Sdk/C/Alloc.h"
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync#include "Sdk/C/7zFile.h"
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync#include "Sdk/C/7zVersion.h"
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync#include "Sdk/C/LzmaDec.h"
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync#include "Sdk/C/LzmaEnc.h"
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync#include "Sdk/C/Bra.h"
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync#include "CommonLib.h"
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync#define LZMA_HEADER_SIZE (LZMA_PROPS_SIZE + 8)
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsynctypedef enum {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync NoConverter,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync X86Converter,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync MaxConverter
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync} CONVERTER_TYPE;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncconst char *kCantReadMessage = "Can not read input file";
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncconst char *kCantWriteMessage = "Can not write output file";
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncconst char *kCantAllocateMessage = "Can not allocate memory";
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncconst char *kDataErrorMessage = "Data error";
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncstatic void *SzAlloc(void *p, size_t size) { p = p; return MyAlloc(size); }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncstatic void SzFree(void *p, void *address) { p = p; MyFree(address); }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncstatic ISzAlloc g_Alloc = { SzAlloc, SzFree };
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncstatic Bool mQuietMode = False;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncstatic CONVERTER_TYPE mConType = NoConverter;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync#define UTILITY_NAME "LzmaCompress"
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync#define UTILITY_MAJOR_VERSION 0
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync#define UTILITY_MINOR_VERSION 2
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync#define INTEL_COPYRIGHT \
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync "Copyright (c) 2009-2012, Intel Corporation. All rights reserved."
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncvoid PrintHelp(char *buffer)
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync{
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync strcat(buffer,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync "\n" UTILITY_NAME " - " INTEL_COPYRIGHT "\n"
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync "Based on LZMA Utility " MY_VERSION_COPYRIGHT_DATE "\n"
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync "\nUsage: LzmaCompress -e|-d [options] <inputFile>\n"
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync " -e: encode file\n"
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync " -d: decode file\n"
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync " -o FileName, --output FileName: specify the output filename\n"
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync " --f86: enable converter for x86 code\n"
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync " -v, --verbose: increase output messages\n"
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync " -q, --quiet: reduce output messages\n"
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync " --debug [0-9]: set debug level\n"
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync " --version: display the program version and exit\n"
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync " -h, --help: display this help text\n"
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync );
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync}
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncint PrintError(char *buffer, const char *message)
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync{
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync strcat(buffer, "\nError: ");
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync strcat(buffer, message);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync strcat(buffer, "\n");
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return 1;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync}
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncint PrintErrorNumber(char *buffer, SRes val)
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync{
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync sprintf(buffer + strlen(buffer), "\nError code: %x\n", (unsigned)val);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return 1;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync}
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncint PrintUserError(char *buffer)
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync{
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return PrintError(buffer, "Incorrect command");
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync}
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncvoid PrintVersion(char *buffer)
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync{
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync sprintf (buffer, "%s Version %d.%d %s ", UTILITY_NAME, UTILITY_MAJOR_VERSION, UTILITY_MINOR_VERSION, __BUILD_VERSION);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync}
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncstatic SRes Encode(ISeqOutStream *outStream, ISeqInStream *inStream, UInt64 fileSize)
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync{
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync SRes res;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync size_t inSize = (size_t)fileSize;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Byte *inBuffer = 0;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Byte *outBuffer = 0;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Byte *filteredStream = 0;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync size_t outSize;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync CLzmaEncProps props;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync LzmaEncProps_Init(&props);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync LzmaEncProps_Normalize(&props);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (inSize != 0) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync inBuffer = (Byte *)MyAlloc(inSize);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (inBuffer == 0)
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return SZ_ERROR_MEM;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync } else {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return SZ_ERROR_INPUT_EOF;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (SeqInStream_Read(inStream, inBuffer, inSize) != SZ_OK) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync res = SZ_ERROR_READ;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync goto Done;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // we allocate 105% of original size + 64KB for output buffer
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync outSize = (size_t)fileSize / 20 * 21 + (1 << 16);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync outBuffer = (Byte *)MyAlloc(outSize);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (outBuffer == 0) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync res = SZ_ERROR_MEM;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync goto Done;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync int i;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync for (i = 0; i < 8; i++)
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync outBuffer[i + LZMA_PROPS_SIZE] = (Byte)(fileSize >> (8 * i));
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (mConType != NoConverter)
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync filteredStream = (Byte *)MyAlloc(inSize);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (filteredStream == 0) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync res = SZ_ERROR_MEM;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync goto Done;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync memcpy(filteredStream, inBuffer, inSize);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (mConType == X86Converter) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync UInt32 x86State;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync x86_Convert_Init(x86State);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync x86_Convert(filteredStream, (SizeT) inSize, 0, &x86State, 1);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync size_t outSizeProcessed = outSize - LZMA_HEADER_SIZE;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync size_t outPropsSize = LZMA_PROPS_SIZE;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync res = LzmaEncode(outBuffer + LZMA_HEADER_SIZE, &outSizeProcessed,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync mConType != NoConverter ? filteredStream : inBuffer, inSize,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync &props, outBuffer, &outPropsSize, 0,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync NULL, &g_Alloc, &g_Alloc);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (res != SZ_OK)
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync goto Done;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync outSize = LZMA_HEADER_SIZE + outSizeProcessed;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (outStream->Write(outStream, outBuffer, outSize) != outSize)
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync res = SZ_ERROR_WRITE;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncDone:
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync MyFree(outBuffer);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync MyFree(inBuffer);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync MyFree(filteredStream);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return res;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync}
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncstatic SRes Decode(ISeqOutStream *outStream, ISeqInStream *inStream, UInt64 fileSize)
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync{
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync SRes res;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync size_t inSize = (size_t)fileSize;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Byte *inBuffer = 0;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Byte *outBuffer = 0;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync size_t outSize = 0;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync size_t inSizePure;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ELzmaStatus status;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync UInt64 outSize64 = 0;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync int i;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (inSize < LZMA_HEADER_SIZE)
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return SZ_ERROR_INPUT_EOF;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync inBuffer = (Byte *)MyAlloc(inSize);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (inBuffer == 0)
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return SZ_ERROR_MEM;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (SeqInStream_Read(inStream, inBuffer, inSize) != SZ_OK) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync res = SZ_ERROR_READ;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync goto Done;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync for (i = 0; i < 8; i++)
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync outSize64 += ((UInt64)inBuffer[LZMA_PROPS_SIZE + i]) << (i * 8);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync outSize = (size_t)outSize64;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (outSize != 0) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync outBuffer = (Byte *)MyAlloc(outSize);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (outBuffer == 0) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync res = SZ_ERROR_MEM;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync goto Done;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync } else {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync res = SZ_OK;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync goto Done;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync inSizePure = inSize - LZMA_HEADER_SIZE;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync res = LzmaDecode(outBuffer, &outSize, inBuffer + LZMA_HEADER_SIZE, &inSizePure,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync inBuffer, LZMA_PROPS_SIZE, LZMA_FINISH_END, &status, &g_Alloc);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (res != SZ_OK)
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync goto Done;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (mConType == X86Converter)
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync UInt32 x86State;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync x86_Convert_Init(x86State);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync x86_Convert(outBuffer, (SizeT) outSize, 0, &x86State, 0);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (outStream->Write(outStream, outBuffer, outSize) != outSize)
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync res = SZ_ERROR_WRITE;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncDone:
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync MyFree(outBuffer);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync MyFree(inBuffer);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return res;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync}
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncint main2(int numArgs, const char *args[], char *rs)
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync{
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync CFileSeqInStream inStream;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync CFileOutStream outStream;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync int res;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync int encodeMode = 0;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Bool modeWasSet = False;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync const char *inputFile = NULL;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync const char *outputFile = "file.tmp";
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync int param;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync UInt64 fileSize;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync FileSeqInStream_CreateVTable(&inStream);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync File_Construct(&inStream.file);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync FileOutStream_CreateVTable(&outStream);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync File_Construct(&outStream.file);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (numArgs == 1)
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync PrintHelp(rs);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return 0;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync for (param = 1; param < numArgs; param++) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (strcmp(args[param], "-e") == 0 || strcmp(args[param], "-d") == 0) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync encodeMode = (args[param][1] == 'e');
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync modeWasSet = True;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync#ifdef VBOX_LZMA_F86_COMPRESS
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync mConType = X86Converter;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync#endif
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync } else if (strcmp(args[param], "--f86") == 0) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync mConType = X86Converter;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync } else if (strcmp(args[param], "-o") == 0 ||
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync strcmp(args[param], "--output") == 0) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (numArgs < (param + 2)) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return PrintUserError(rs);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync outputFile = args[++param];
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync } else if (strcmp(args[param], "--debug") == 0) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (numArgs < (param + 2)) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return PrintUserError(rs);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // For now we silently ignore this parameter to achieve command line
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // parameter compatibility with other build tools.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync param++;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync } else if (
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync strcmp(args[param], "-h") == 0 ||
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync strcmp(args[param], "--help") == 0
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync PrintHelp(rs);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return 0;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync } else if (
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync strcmp(args[param], "-v") == 0 ||
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync strcmp(args[param], "--verbose") == 0
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // For now we silently ignore this parameter to achieve command line
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // parameter compatibility with other build tools.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync } else if (
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync strcmp(args[param], "-q") == 0 ||
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync strcmp(args[param], "--quiet") == 0
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync mQuietMode = True;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync } else if (strcmp(args[param], "--version") == 0) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync PrintVersion(rs);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return 0;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync } else if (inputFile == NULL) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync inputFile = args[param];
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync } else {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return PrintUserError(rs);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if ((inputFile == NULL) || !modeWasSet) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return PrintUserError(rs);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync size_t t4 = sizeof(UInt32);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync size_t t8 = sizeof(UInt64);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (t4 != 4 || t8 != 8)
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return PrintError(rs, "Incorrect UInt32 or UInt64");
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (InFile_Open(&inStream.file, inputFile) != 0)
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return PrintError(rs, "Can not open input file");
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (OutFile_Open(&outStream.file, outputFile) != 0)
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return PrintError(rs, "Can not open output file");
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync File_GetLength(&inStream.file, &fileSize);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (encodeMode)
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (!mQuietMode) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync printf("Encoding\n");
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync res = Encode(&outStream.s, &inStream.s, fileSize);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync else
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (!mQuietMode) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync printf("Decoding\n");
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync res = Decode(&outStream.s, &inStream.s, fileSize);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync File_Close(&outStream.file);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync File_Close(&inStream.file);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (res != SZ_OK)
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (res == SZ_ERROR_MEM)
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return PrintError(rs, kCantAllocateMessage);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync else if (res == SZ_ERROR_DATA)
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return PrintError(rs, kDataErrorMessage);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync else if (res == SZ_ERROR_WRITE)
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return PrintError(rs, kCantWriteMessage);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync else if (res == SZ_ERROR_READ)
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return PrintError(rs, kCantReadMessage);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return PrintErrorNumber(rs, res);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return 0;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync}
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncint MY_CDECL main(int numArgs, const char *args[])
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync{
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync char rs[2000] = { 0 };
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync int res = main2(numArgs, args, rs);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (strlen(rs) > 0) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync puts(rs);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return res;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync}