diff --git a/src/plugins/tar/beta.txt b/src/plugins/tar/beta.txt index 539af97f7..21a374dc8 100644 --- a/src/plugins/tar/beta.txt +++ b/src/plugins/tar/beta.txt @@ -55,3 +55,10 @@ version 3.30: (2009.02.28) J.Patera -CDecompressFile::Rewind() did not update StreamPos -> CPIO (e_OldASCII) archives could not open -GZIP: files longer than 4 GB before compression complained about premature EOF + +version 3.40: (2021.11.12) Vilo + +LZMA: Added support for .XZ archives + +ZSTD: Added support for .ZST archives + +version 3.50: (2025.09.14) Vilo + +GZIP3: Added support for .gz3 archives diff --git a/src/plugins/tar/bzip/.clang-format b/src/plugins/tar/bzip/.clang-format deleted file mode 100644 index e3845288a..000000000 --- a/src/plugins/tar/bzip/.clang-format +++ /dev/null @@ -1 +0,0 @@ -DisableFormat: true diff --git a/src/plugins/tar/bzip/bunzip.cpp b/src/plugins/tar/bzip/bunzip.cpp index 51096cc43..9085488d1 100644 --- a/src/plugins/tar/bzip/bunzip.cpp +++ b/src/plugins/tar/bzip/bunzip.cpp @@ -2,146 +2,144 @@ #include "../dlldefs.h" #include "../fileio.h" -#include "bzlib.h" #include "bzip.h" #include "..\tar.rh" #include "..\tar.rh2" #include "..\lang\lang.rh" -CBZip::CBZip(const char *filename, HANDLE file, unsigned char *buffer, unsigned long start, unsigned long read, CQuadWord inputSize): - CZippedFile(filename, file, buffer, start, read, inputSize), BZStream(NULL), EndReached(FALSE) +CBZip::CBZip(const char* filename, HANDLE file, unsigned char* buffer, unsigned long start, unsigned long read, CQuadWord inputSize) : CZippedFile(filename, file, buffer, start, read, inputSize) { - CALL_STACK_MESSAGE2("CBZip::CBZip(%s, , , )", filename); - - // if the parent constructor failed, bail out immediately - if (!Ok) - return; + CALL_STACK_MESSAGE2("CBZip::CBZip(%s, , , )", filename); - // this cannot be bzip if we have less than a header... - if (DataEnd - DataStart < 4) - { - Ok = FALSE; - FreeBufAndFile = FALSE; - return; - } - // if the "magic number" is not at the start, it is not a bzip stream - if (DataStart[0] != 'B' || DataStart[1] != 'Z' || - DataStart[2] != 'h' || DataStart[3] < '0' || DataStart[3] > '9') - { - Ok = FALSE; - FreeBufAndFile = FALSE; - return; - } - // we have bzip, but do not confirm the header yet; the library will verify it again... + // if the parent constructor failed, bail out immediately + if (!Ok) + return; - // prepare the extractor - BZStream = (bz_stream *)malloc(sizeof(bz_stream)); - if (BZStream == NULL) - { - Ok = FALSE; - ErrorCode = IDS_ERR_MEMORY; - FreeBufAndFile = FALSE; - return; - } - memset(BZStream, 0, sizeof(bz_stream)); + // this cannot be bzip if we have less than a header... + if (DataEnd - DataStart < 4) + { + Ok = FALSE; + FreeBufAndFile = FALSE; + return; + } + // if the "magic number" is not at the start, it is not a bzip stream + if (DataStart[0] != 'B' || DataStart[1] != 'Z' || + DataStart[2] != 'h' || DataStart[3] < '0' || DataStart[3] > '9') + { + Ok = FALSE; + FreeBufAndFile = FALSE; + return; + } + // we have bzip, but do not confirm the header yet; the library will verify it again... - int ret = BZ2_bzDecompressInit(BZStream, 0, 0); - if (ret != BZ_OK) - { - free(BZStream); - BZStream = NULL; - Ok = FALSE; - FreeBufAndFile = FALSE; - switch (ret) + // prepare the extractor + BZStream = (bz_stream*)malloc(sizeof(bz_stream)); + if (BZStream == NULL) { - case BZ_MEM_ERROR: + Ok = FALSE; ErrorCode = IDS_ERR_MEMORY; - break; - case BZ_CONFIG_ERROR: - case BZ_PARAM_ERROR: - default: - ErrorCode = IDS_ERR_INTERNAL; - break; + FreeBufAndFile = FALSE; + return; } - return; - } - // done -} + memset(BZStream, 0, sizeof(bz_stream)); -CBZip::~CBZip() -{ - CALL_STACK_MESSAGE1("CBZip::~CBZip()"); - if (BZStream) - { - int ret = BZ2_bzDecompressEnd(BZStream); + int ret = BZ2_bzDecompressInit(BZStream, 0, 0); if (ret != BZ_OK) - SalamanderGeneral->ShowMessageBox(LoadStr(IDS_ERR_INTERNAL), LoadStr(IDS_GZERR_TITLE), - MSGBOX_ERROR); - free(BZStream); - } + { + free(BZStream); + BZStream = NULL; + Ok = FALSE; + FreeBufAndFile = FALSE; + switch (ret) + { + case BZ_MEM_ERROR: + ErrorCode = IDS_ERR_MEMORY; + break; + case BZ_CONFIG_ERROR: + case BZ_PARAM_ERROR: + default: + ErrorCode = IDS_ERR_INTERNAL; + break; + } + return; + } + // done } -BOOL -CBZip::DecompressBlock(unsigned short needed) +CBZip::~CBZip() { - if (EndReached) - return TRUE; - int ret = BZ_OK; - while (ret != BZ_STREAM_END && ExtrEnd < Window + BUFSIZE) - { - unsigned char *src = DataStart; - // at least one byte must already be buffered - if (DataEnd == DataStart) - src = (unsigned char *)FReadBlock(0); - if (src == NULL) - return FALSE; - if (DataEnd == DataStart) + CALL_STACK_MESSAGE1("CBZip::~CBZip()"); + if (BZStream) { - Ok = FALSE; - ErrorCode = IDS_ERR_EOF; - return FALSE; + int ret = BZ2_bzDecompressEnd(BZStream); + if (ret != BZ_OK) + SalamanderGeneral->ShowMessageBox(LoadStr(IDS_ERR_INTERNAL), LoadStr(IDS_GZERR_TITLE), + MSGBOX_ERROR); + free(BZStream); } - BZStream->next_in = (char *)DataStart; - BZStream->avail_in = (unsigned int)(DataEnd - DataStart); - BZStream->next_out = (char *)ExtrEnd; - BZStream->avail_out = BUFSIZE - (unsigned int)(ExtrEnd - Window); - ret = BZ2_bzDecompress(BZStream); - if (ret != BZ_OK && ret != BZ_STREAM_END) +} + +BOOL CBZip::DecompressBlock(unsigned short needed) +{ + if (EndReached) + return TRUE; + int ret = BZ_OK; + while (ret != BZ_STREAM_END && ExtrEnd < Window + BUFSIZE) { - Ok = FALSE; - switch (ret) - { - case BZ_DATA_ERROR: - case BZ_DATA_ERROR_MAGIC: - ErrorCode = IDS_ERR_CORRUPT; - break; - case BZ_MEM_ERROR: - ErrorCode = IDS_ERR_MEMORY; - break; - case BZ_PARAM_ERROR: - default: - ErrorCode = IDS_ERR_INTERNAL; - break; - } - return FALSE; + unsigned char* src = DataStart; + // at least one byte must already be buffered + if (DataEnd == DataStart) + src = (unsigned char*)FReadBlock(0); + if (src == NULL) + return FALSE; + if (DataEnd == DataStart) + { + Ok = FALSE; + ErrorCode = IDS_ERR_EOF; + return FALSE; + } + BZStream->next_in = (char*)DataStart; + BZStream->avail_in = (unsigned int)GetUnreadInputBufferSize(); + BZStream->next_out = (char*)ExtrEnd; + BZStream->avail_out = BUFSIZE - (unsigned int)(ExtrEnd - Window); + ret = BZ2_bzDecompress(BZStream); + if (ret != BZ_OK && ret != BZ_STREAM_END) + { + Ok = FALSE; + switch (ret) + { + case BZ_DATA_ERROR: + case BZ_DATA_ERROR_MAGIC: + ErrorCode = IDS_ERR_CORRUPT; + break; + case BZ_MEM_ERROR: + ErrorCode = IDS_ERR_MEMORY; + break; + case BZ_PARAM_ERROR: + default: + ErrorCode = IDS_ERR_INTERNAL; + break; + } + return FALSE; + } + // commit the consumed input bytes + FReadBlock((unsigned int)(BZStream->next_in - (char*)DataStart)); + unsigned short extracted = (unsigned short)((unsigned char*)BZStream->next_out - ExtrEnd); + ExtrEnd = (unsigned char*)BZStream->next_out; } - // commit the consumed input bytes - FReadBlock((unsigned int)(BZStream->next_in - (char *)DataStart)); - unsigned short extracted = (unsigned short)((unsigned char *)BZStream->next_out - ExtrEnd); - ExtrEnd = (unsigned char *)BZStream->next_out; - } - if (ret == BZ_STREAM_END) - EndReached = TRUE; - return TRUE; + if (ret == BZ_STREAM_END) + EndReached = TRUE; + return TRUE; } -extern "C" { -void bz_internal_error(int errcode); +extern "C" +{ + void bz_internal_error(int errcode); } void bz_internal_error(int errcode) { - SalamanderGeneral->ShowMessageBox(LoadStr(IDS_ERR_INTERNAL), LoadStr(IDS_GZERR_TITLE), - MSGBOX_ERROR); + SalamanderGeneral->ShowMessageBox(LoadStr(IDS_ERR_INTERNAL), LoadStr(IDS_GZERR_TITLE), + MSGBOX_ERROR); } diff --git a/src/plugins/tar/bzip/bunzip3.cpp b/src/plugins/tar/bzip/bunzip3.cpp new file mode 100644 index 000000000..a53e9f7e4 --- /dev/null +++ b/src/plugins/tar/bzip/bunzip3.cpp @@ -0,0 +1,211 @@ +// SPDX-FileCopyrightText: 2023 Open Salamander Authors +// SPDX-License-Identifier: GPL-2.0-or-later + +#include "precomp.h" + +#include "../dlldefs.h" +#include "../fileio.h" +#include "bzip3.h" +#include "bzip3format.h" + +#include "..\tar.rh" +#include "..\tar.rh2" +#include "..\lang\lang.rh" + +#define KiB(x) ((x) * 1024) +#define MiB(x) ((x) * 1024 * 1024) + +CBZip3::CBZip3(const char* filename, HANDLE file, unsigned char* buffer, unsigned long start, unsigned long read, CQuadWord inputSize) : CZippedFile(filename, file, buffer, start, read, inputSize) +{ + CALL_STACK_MESSAGE2("CBZip3::CBZip3(%s, , , )", filename); + + // if the parent constructor failed, bail out immediately + if (!Ok) + return; + + // need at least size of buffer to read from input + if (DataEnd - DataStart < static_cast(sizeof(BZ3_Header))) + { + Ok = FALSE; + FreeBufAndFile = FALSE; + return; + } + + // verify file signature + const auto header = reinterpret_cast(DataStart); + if (memcmp(header->Signature, BZ3_Header::SIGNATURE, BZ3_Header::SIGNATURE_LEN) != 0) + { + Ok = FALSE; + FreeBufAndFile = FALSE; + return; + } + + // this is a bzip3 file, check also block size limits + m_BlockSize = header->BlockSize; + if (m_BlockSize < KiB(65) || m_BlockSize > MiB(511)) + { + Ok = FALSE; + ErrorCode = IDS_ERR_CORRUPT; + FreeBufAndFile = FALSE; + return; + } + // commit read data from input + FReadBlock(sizeof(BZ3_Header)); + + // instantiate bzip3 block decoder + m_State = bz3_new(m_BlockSize); + if (!m_State) + { + Ok = FALSE; + ErrorCode = IDS_ERR_MEMORY; + FreeBufAndFile = FALSE; + return; + } + + // alloc internal buffer for processing bzip3 blocks + m_BufferSize = bz3_bound(m_BlockSize); + m_Buffer = (BYTE*) malloc(m_BufferSize); + if (!m_Buffer) + { + Ok = FALSE; + ErrorCode = IDS_ERR_MEMORY; + FreeBufAndFile = FALSE; + return; + } + + // done +} + +CBZip3::~CBZip3() +{ + CALL_STACK_MESSAGE1("CBZip3::~CBZip3()"); + if (m_Buffer) + { + free(m_Buffer); + m_Buffer = nullptr; + m_BufferSize = 0; + } + if (m_State) + { + bz3_free(m_State); + m_State = nullptr; + } +} + +BOOL CBZip3::DecompressBlock(unsigned short needed) +{ + if (EndReached) + return TRUE; + + // NOTE: decompression stages: + // 1. read compressed bzip3 block data from input into block buffer + // 2. decompress the bzip3 block, bz3_decode_block() decompress it to the same buffer + // 3. write the decompressed data to output (by chunks) + // 4. continue with the next block, if not EOF + + if (m_BufferWrittenDataLen == 0) + { + // found the next bzip3 block + + // read input data if input buffer is empty + if (DataEnd == DataStart) + { + const auto src = FReadBlock(0); + if (src == NULL) + return FALSE; + } + if (DataEnd == DataStart) + { + Ok = FALSE; + ErrorCode = IDS_ERR_EOF; + return FALSE; + } + + // get block header + const auto block = *reinterpret_cast(DataStart); + // commit read data from input + FReadBlock(sizeof(BZ3_Block)); + + // block decompression will run on the same buffer, that has to be + // long enough for both compressed and decompressed data + if (block.OrigSize > m_BufferSize || block.CompressedSize > m_BufferSize) + { + // inconsistent header + Ok = FALSE; + ErrorCode = IDS_ERR_CORRUPT; + return FALSE; + } + + // read whole bzip3 block from input + while (true) + { + // if input buffer is empty, read next chunk + auto UnreadBufferSize = GetUnreadInputBufferSize(); + if (UnreadBufferSize == 0) + { + if (!FReadBlock(0)) + return FALSE; + UnreadBufferSize = GetUnreadInputBufferSize(); + } + + // read compressed data from input into the internal buffer + const auto BytesToRead = min(UnreadBufferSize, block.CompressedSize - m_BufferWrittenDataLen); + memcpy_s(m_Buffer + m_BufferWrittenDataLen, m_BufferSize - m_BufferWrittenDataLen, DataStart, BytesToRead); + m_BufferWrittenDataLen += BytesToRead; + + // commit read data from input + if (!FReadBlock(BytesToRead)) + return FALSE; + if (block.CompressedSize == m_BufferWrittenDataLen) + break; + } + + // bzip3 block is read, we can start decoding + const auto ret = bz3_decode_block(m_State, m_Buffer, m_BufferSize, block.CompressedSize, block.OrigSize); + const auto errcode = bz3_last_error(m_State); + if (ret == -1 || errcode != BZ3_OK) + { + Ok = FALSE; + switch (errcode) + { + case BZ3_ERR_CRC: + case BZ3_ERR_MALFORMED_HEADER: + case BZ3_ERR_DATA_TOO_BIG: + ErrorCode = IDS_ERR_CORRUPT; + break; + default: + ErrorCode = IDS_ERR_INTERNAL; + break; + } + return FALSE; + } + + // update buffer data length to the decompressed size + m_BufferWrittenDataLen = block.OrigSize; + } + + if (m_BufferReadDataLen < m_BufferWrittenDataLen) + { + // write the decompressed data to the output by `needed` chunk size + const auto OutSize = min(BUFSIZE - (unsigned int)(ExtrStart - Window), needed); + const auto ReadLen = min(OutSize, m_BufferWrittenDataLen - m_BufferReadDataLen); + memcpy_s(ExtrStart, OutSize, m_Buffer + m_BufferReadDataLen, ReadLen); + ExtrEnd = ExtrStart + ReadLen; + m_BufferReadDataLen += ReadLen; + } + + if (m_BufferReadDataLen == m_BufferWrittenDataLen) + { + // reached end of a bzip3 block + m_BufferWrittenDataLen = 0; + m_BufferReadDataLen = 0; + + // check for EOF + if (GetUnreadInputBufferSize() == 0) + { + EndReached = TRUE; + } + } + + return TRUE; +} diff --git a/src/plugins/tar/bzip/bzip.h b/src/plugins/tar/bzip/bzip.h index 14b5c21ae..018002c8c 100644 --- a/src/plugins/tar/bzip/bzip.h +++ b/src/plugins/tar/bzip/bzip.h @@ -1,21 +1,19 @@ #ifndef __BZIP_H__ #define __BZIP_H__ -class CBZip: public CZippedFile -{ - public: - CBZip(const char *filename, HANDLE file, unsigned char *buffer, unsigned long start, unsigned long read, CQuadWord inputSize); - virtual ~CBZip(); - - virtual BOOL BuggySize() { return TRUE; } +#include - static BOOL DetectArchive(const unsigned char *inBuffer, unsigned int inBufSize); +class CBZip : public CZippedFile +{ +public: + CBZip(const char* filename, HANDLE file, unsigned char* buffer, unsigned long start, unsigned long read, CQuadWord inputSize); + ~CBZip() override; - protected: - BOOL EndReached; // set, when all data was extracted +protected: + BOOL EndReached{FALSE}; // set, when all data was extracted - bz_stream *BZStream; - virtual BOOL DecompressBlock(unsigned short needed); + bz_stream* BZStream{}; + BOOL DecompressBlock(unsigned short needed) override; }; #endif // __BZIP_H__ diff --git a/src/plugins/tar/bzip/bzip3.h b/src/plugins/tar/bzip/bzip3.h new file mode 100644 index 000000000..640b870f6 --- /dev/null +++ b/src/plugins/tar/bzip/bzip3.h @@ -0,0 +1,27 @@ +// SPDX-FileCopyrightText: 2023 Open Salamander Authors +// SPDX-License-Identifier: GPL-2.0-or-later + +#ifndef __BZIP3_H__ +#define __BZIP3_H__ + +#include + +class CBZip3 : public CZippedFile +{ +public: + CBZip3(const char* filename, HANDLE file, unsigned char* buffer, unsigned long start, unsigned long read, CQuadWord inputSize); + ~CBZip3() override; + +protected: + BOOL EndReached{FALSE}; // set, when all data was extracted + + bz3_state* m_State{}; + uint32_t m_BlockSize{0}; + BYTE* m_Buffer{}; // buffer for bzip3 block, compressed data are decompressed to the same buffer + size_t m_BufferSize{0}; // buffer size where bzip3 block has to fit + size_t m_BufferWrittenDataLen{0}; // length of compressed data read from input + size_t m_BufferReadDataLen{0}; // length of decompressed data written to output + BOOL DecompressBlock(unsigned short needed) override; +}; + +#endif // __BZIP3_H__ diff --git a/src/plugins/tar/bzip/bzip3format.h b/src/plugins/tar/bzip/bzip3format.h new file mode 100644 index 000000000..072f9f2cf --- /dev/null +++ b/src/plugins/tar/bzip/bzip3format.h @@ -0,0 +1,25 @@ +// SPDX-FileCopyrightText: 2023 Open Salamander Authors +// SPDX-License-Identifier: GPL-2.0-or-later + +#pragma once + +// BZip3 file format definitions + +#pragma pack(push, 1) + +struct BZ3_Header +{ + static constexpr const char SIGNATURE[] = "BZ3v1"; + static constexpr size_t SIGNATURE_LEN = sizeof(SIGNATURE) - 1; + + BYTE Signature[SIGNATURE_LEN]; + uint32_t BlockSize; +}; + +struct BZ3_Block +{ + uint32_t CompressedSize; + uint32_t OrigSize; +}; + +#pragma pack(pop) diff --git a/src/plugins/tar/bzip/bzlib.c b/src/plugins/tar/bzip/bzlib.c deleted file mode 100644 index c98452730..000000000 --- a/src/plugins/tar/bzip/bzlib.c +++ /dev/null @@ -1,1584 +0,0 @@ - -/*-------------------------------------------------------------*/ -/*--- Library top-level functions. ---*/ -/*--- bzlib.c ---*/ -/*-------------------------------------------------------------*/ - -/* ------------------------------------------------------------------ - This file is part of bzip2/libbzip2, a program and library for - lossless, block-sorting data compression. - - bzip2/libbzip2 version 1.0.5 of 10 December 2007 - Copyright (C) 1996-2007 Julian Seward - - Please read the WARNING, DISCLAIMER and PATENTS sections in the - README file. - - This program is released under the terms of the license contained - in the file LICENSE. - ------------------------------------------------------------------ */ - -/* CHANGES - 0.9.0 -- original version. - 0.9.0a/b -- no changes in this file. - 0.9.0c -- made zero-length BZ_FLUSH work correctly in bzCompress(). - fixed bzWrite/bzRead to ignore zero-length requests. - fixed bzread to correctly handle read requests after EOF. - wrong parameter order in call to bzDecompressInit in - bzBuffToBuffDecompress. Fixed. -*/ - -#include "bzlib_private.h" - - -/*---------------------------------------------------*/ -/*--- Compression stuff ---*/ -/*---------------------------------------------------*/ - - -/*---------------------------------------------------*/ -#ifndef BZ_NO_STDIO -void BZ2_bz__AssertH__fail ( int errcode ) -{ - fprintf(stderr, - "\n\nbzip2/libbzip2: internal error number %d.\n" - "This is a bug in bzip2/libbzip2, %s.\n" - "Please report it to me at: jseward@bzip.org. If this happened\n" - "when you were using some program which uses libbzip2 as a\n" - "component, you should also report this bug to the author(s)\n" - "of that program. Please make an effort to report this bug;\n" - "timely and accurate bug reports eventually lead to higher\n" - "quality software. Thanks. Julian Seward, 10 December 2007.\n\n", - errcode, - BZ2_bzlibVersion() - ); - - if (errcode == 1007) { - fprintf(stderr, - "\n*** A special note about internal error number 1007 ***\n" - "\n" - "Experience suggests that a common cause of i.e. 1007\n" - "is unreliable memory or other hardware. The 1007 assertion\n" - "just happens to cross-check the results of huge numbers of\n" - "memory reads/writes, and so acts (unintendedly) as a stress\n" - "test of your memory system.\n" - "\n" - "I suggest the following: try compressing the file again,\n" - "possibly monitoring progress in detail with the -vv flag.\n" - "\n" - "* If the error cannot be reproduced, and/or happens at different\n" - " points in compression, you may have a flaky memory system.\n" - " Try a memory-test program. I have used Memtest86\n" - " (www.memtest86.com). At the time of writing it is free (GPLd).\n" - " Memtest86 tests memory much more thorougly than your BIOSs\n" - " power-on test, and may find failures that the BIOS doesn't.\n" - "\n" - "* If the error can be repeatably reproduced, this is a bug in\n" - " bzip2, and I would very much like to hear about it. Please\n" - " let me know, and, ideally, save a copy of the file causing the\n" - " problem -- without which I will be unable to investigate it.\n" - "\n" - ); - } - - exit(3); -} -#endif - - -/*---------------------------------------------------*/ -static -int bz_config_ok ( void ) -{ - if (sizeof(int) != 4) return 0; - if (sizeof(short) != 2) return 0; - if (sizeof(char) != 1) return 0; - return 1; -} - - -/*---------------------------------------------------*/ -static -void* default_bzalloc ( void* opaque, Int32 items, Int32 size ) -{ - void* v = malloc ( items * size ); - return v; -} - -static -void default_bzfree ( void* opaque, void* addr ) -{ - if (addr != NULL) free ( addr ); -} - - -/*---------------------------------------------------*/ -static -void prepare_new_block ( EState* s ) -{ - Int32 i; - s->nblock = 0; - s->numZ = 0; - s->state_out_pos = 0; - BZ_INITIALISE_CRC ( s->blockCRC ); - for (i = 0; i < 256; i++) s->inUse[i] = False; - s->blockNo++; -} - - -/*---------------------------------------------------*/ -static -void init_RL ( EState* s ) -{ - s->state_in_ch = 256; - s->state_in_len = 0; -} - - -static -Bool isempty_RL ( EState* s ) -{ - if (s->state_in_ch < 256 && s->state_in_len > 0) - return False; else - return True; -} - - -/*---------------------------------------------------*/ -/* -int BZ_API(BZ2_bzCompressInit) - ( bz_stream* strm, - int blockSize100k, - int verbosity, - int workFactor ) -{ - Int32 n; - EState* s; - - if (!bz_config_ok()) return BZ_CONFIG_ERROR; - - if (strm == NULL || - blockSize100k < 1 || blockSize100k > 9 || - workFactor < 0 || workFactor > 250) - return BZ_PARAM_ERROR; - - if (workFactor == 0) workFactor = 30; - if (strm->bzalloc == NULL) strm->bzalloc = default_bzalloc; - if (strm->bzfree == NULL) strm->bzfree = default_bzfree; - - s = BZALLOC( sizeof(EState) ); - if (s == NULL) return BZ_MEM_ERROR; - s->strm = strm; - - s->arr1 = NULL; - s->arr2 = NULL; - s->ftab = NULL; - - n = 100000 * blockSize100k; - s->arr1 = BZALLOC( n * sizeof(UInt32) ); - s->arr2 = BZALLOC( (n+BZ_N_OVERSHOOT) * sizeof(UInt32) ); - s->ftab = BZALLOC( 65537 * sizeof(UInt32) ); - - if (s->arr1 == NULL || s->arr2 == NULL || s->ftab == NULL) { - if (s->arr1 != NULL) BZFREE(s->arr1); - if (s->arr2 != NULL) BZFREE(s->arr2); - if (s->ftab != NULL) BZFREE(s->ftab); - if (s != NULL) BZFREE(s); - return BZ_MEM_ERROR; - } - - s->blockNo = 0; - s->state = BZ_S_INPUT; - s->mode = BZ_M_RUNNING; - s->combinedCRC = 0; - s->blockSize100k = blockSize100k; - s->nblockMAX = 100000 * blockSize100k - 19; - s->verbosity = verbosity; - s->workFactor = workFactor; - - s->block = (UChar*)s->arr2; - s->mtfv = (UInt16*)s->arr1; - s->zbits = NULL; - s->ptr = (UInt32*)s->arr1; - - strm->state = s; - strm->total_in_lo32 = 0; - strm->total_in_hi32 = 0; - strm->total_out_lo32 = 0; - strm->total_out_hi32 = 0; - init_RL ( s ); - prepare_new_block ( s ); - return BZ_OK; -} -*/ - -/*---------------------------------------------------*/ -/* -static -void add_pair_to_block ( EState* s ) -{ - Int32 i; - UChar ch = (UChar)(s->state_in_ch); - for (i = 0; i < s->state_in_len; i++) { - BZ_UPDATE_CRC( s->blockCRC, ch ); - } - s->inUse[s->state_in_ch] = True; - switch (s->state_in_len) { - case 1: - s->block[s->nblock] = (UChar)ch; s->nblock++; - break; - case 2: - s->block[s->nblock] = (UChar)ch; s->nblock++; - s->block[s->nblock] = (UChar)ch; s->nblock++; - break; - case 3: - s->block[s->nblock] = (UChar)ch; s->nblock++; - s->block[s->nblock] = (UChar)ch; s->nblock++; - s->block[s->nblock] = (UChar)ch; s->nblock++; - break; - default: - s->inUse[s->state_in_len-4] = True; - s->block[s->nblock] = (UChar)ch; s->nblock++; - s->block[s->nblock] = (UChar)ch; s->nblock++; - s->block[s->nblock] = (UChar)ch; s->nblock++; - s->block[s->nblock] = (UChar)ch; s->nblock++; - s->block[s->nblock] = ((UChar)(s->state_in_len-4)); - s->nblock++; - break; - } -} -*/ - -/*---------------------------------------------------*/ -/* -static -void flush_RL ( EState* s ) -{ - if (s->state_in_ch < 256) add_pair_to_block ( s ); - init_RL ( s ); -} -*/ - - -/*---------------------------------------------------*/ -/* -#define ADD_CHAR_TO_BLOCK(zs,zchh0) \ -{ \ - UInt32 zchh = (UInt32)(zchh0); \ - / *-- fast track the common case --* / \ - if (zchh != zs->state_in_ch && \ - zs->state_in_len == 1) { \ - UChar ch = (UChar)(zs->state_in_ch); \ - BZ_UPDATE_CRC( zs->blockCRC, ch ); \ - zs->inUse[zs->state_in_ch] = True; \ - zs->block[zs->nblock] = (UChar)ch; \ - zs->nblock++; \ - zs->state_in_ch = zchh; \ - } \ - else \ - / *-- general, uncommon cases --* / \ - if (zchh != zs->state_in_ch || \ - zs->state_in_len == 255) { \ - if (zs->state_in_ch < 256) \ - add_pair_to_block ( zs ); \ - zs->state_in_ch = zchh; \ - zs->state_in_len = 1; \ - } else { \ - zs->state_in_len++; \ - } \ -} -*/ - -/*---------------------------------------------------*/ -/* -static -Bool copy_input_until_stop ( EState* s ) -{ - Bool progress_in = False; - - if (s->mode == BZ_M_RUNNING) { - - / *-- fast track the common case --* / - while (True) { - / *-- block full? --* / - if (s->nblock >= s->nblockMAX) break; - / *-- no input? --* / - if (s->strm->avail_in == 0) break; - progress_in = True; - ADD_CHAR_TO_BLOCK ( s, (UInt32)(*((UChar*)(s->strm->next_in))) ); - s->strm->next_in++; - s->strm->avail_in--; - s->strm->total_in_lo32++; - if (s->strm->total_in_lo32 == 0) s->strm->total_in_hi32++; - } - - } else { - - / *-- general, uncommon case --* / - while (True) { - / *-- block full? --* / - if (s->nblock >= s->nblockMAX) break; - / *-- no input? --* / - if (s->strm->avail_in == 0) break; - / *-- flush/finish end? --* / - if (s->avail_in_expect == 0) break; - progress_in = True; - ADD_CHAR_TO_BLOCK ( s, (UInt32)(*((UChar*)(s->strm->next_in))) ); - s->strm->next_in++; - s->strm->avail_in--; - s->strm->total_in_lo32++; - if (s->strm->total_in_lo32 == 0) s->strm->total_in_hi32++; - s->avail_in_expect--; - } - } - return progress_in; -} -*/ - -/*---------------------------------------------------*/ -/* -static -Bool copy_output_until_stop ( EState* s ) -{ - Bool progress_out = False; - - while (True) { - - / *-- no output space? --* / - if (s->strm->avail_out == 0) break; - - / *-- block done? --* / - if (s->state_out_pos >= s->numZ) break; - - progress_out = True; - *(s->strm->next_out) = s->zbits[s->state_out_pos]; - s->state_out_pos++; - s->strm->avail_out--; - s->strm->next_out++; - s->strm->total_out_lo32++; - if (s->strm->total_out_lo32 == 0) s->strm->total_out_hi32++; - } - - return progress_out; -} -*/ - -/*---------------------------------------------------*/ -/* -static -Bool handle_compress ( bz_stream* strm ) -{ - Bool progress_in = False; - Bool progress_out = False; - EState* s = strm->state; - - while (True) { - - if (s->state == BZ_S_OUTPUT) { - progress_out |= copy_output_until_stop ( s ); - if (s->state_out_pos < s->numZ) break; - if (s->mode == BZ_M_FINISHING && - s->avail_in_expect == 0 && - isempty_RL(s)) break; - prepare_new_block ( s ); - s->state = BZ_S_INPUT; - if (s->mode == BZ_M_FLUSHING && - s->avail_in_expect == 0 && - isempty_RL(s)) break; - } - - if (s->state == BZ_S_INPUT) { - progress_in |= copy_input_until_stop ( s ); - if (s->mode != BZ_M_RUNNING && s->avail_in_expect == 0) { - flush_RL ( s ); - BZ2_compressBlock ( s, (Bool)(s->mode == BZ_M_FINISHING) ); - s->state = BZ_S_OUTPUT; - } - else - if (s->nblock >= s->nblockMAX) { - BZ2_compressBlock ( s, False ); - s->state = BZ_S_OUTPUT; - } - else - if (s->strm->avail_in == 0) { - break; - } - } - - } - - return progress_in || progress_out; -} -*/ - -/*---------------------------------------------------*/ -/* -int BZ_API(BZ2_bzCompress) ( bz_stream *strm, int action ) -{ - Bool progress; - EState* s; - if (strm == NULL) return BZ_PARAM_ERROR; - s = strm->state; - if (s == NULL) return BZ_PARAM_ERROR; - if (s->strm != strm) return BZ_PARAM_ERROR; - - preswitch: - switch (s->mode) { - - case BZ_M_IDLE: - return BZ_SEQUENCE_ERROR; - - case BZ_M_RUNNING: - if (action == BZ_RUN) { - progress = handle_compress ( strm ); - return progress ? BZ_RUN_OK : BZ_PARAM_ERROR; - } - else - if (action == BZ_FLUSH) { - s->avail_in_expect = strm->avail_in; - s->mode = BZ_M_FLUSHING; - goto preswitch; - } - else - if (action == BZ_FINISH) { - s->avail_in_expect = strm->avail_in; - s->mode = BZ_M_FINISHING; - goto preswitch; - } - else - return BZ_PARAM_ERROR; - - case BZ_M_FLUSHING: - if (action != BZ_FLUSH) return BZ_SEQUENCE_ERROR; - if (s->avail_in_expect != s->strm->avail_in) - return BZ_SEQUENCE_ERROR; - progress = handle_compress ( strm ); - if (s->avail_in_expect > 0 || !isempty_RL(s) || - s->state_out_pos < s->numZ) return BZ_FLUSH_OK; - s->mode = BZ_M_RUNNING; - return BZ_RUN_OK; - - case BZ_M_FINISHING: - if (action != BZ_FINISH) return BZ_SEQUENCE_ERROR; - if (s->avail_in_expect != s->strm->avail_in) - return BZ_SEQUENCE_ERROR; - progress = handle_compress ( strm ); - if (!progress) return BZ_SEQUENCE_ERROR; - if (s->avail_in_expect > 0 || !isempty_RL(s) || - s->state_out_pos < s->numZ) return BZ_FINISH_OK; - s->mode = BZ_M_IDLE; - return BZ_STREAM_END; - } - return BZ_OK; / *--not reached--* / -} -*/ - -/*---------------------------------------------------*/ -/* -int BZ_API(BZ2_bzCompressEnd) ( bz_stream *strm ) -{ - EState* s; - if (strm == NULL) return BZ_PARAM_ERROR; - s = strm->state; - if (s == NULL) return BZ_PARAM_ERROR; - if (s->strm != strm) return BZ_PARAM_ERROR; - - if (s->arr1 != NULL) BZFREE(s->arr1); - if (s->arr2 != NULL) BZFREE(s->arr2); - if (s->ftab != NULL) BZFREE(s->ftab); - BZFREE(strm->state); - - strm->state = NULL; - - return BZ_OK; -} -*/ - -/*---------------------------------------------------*/ -/*--- Decompression stuff ---*/ -/*---------------------------------------------------*/ - -/*---------------------------------------------------*/ -int BZ_API(BZ2_bzDecompressInit) - ( bz_stream* strm, - int verbosity, - int small ) -{ - DState* s; - - if (!bz_config_ok()) return BZ_CONFIG_ERROR; - - if (strm == NULL) return BZ_PARAM_ERROR; - if (small != 0 && small != 1) return BZ_PARAM_ERROR; - if (verbosity < 0 || verbosity > 4) return BZ_PARAM_ERROR; - - if (strm->bzalloc == NULL) strm->bzalloc = default_bzalloc; - if (strm->bzfree == NULL) strm->bzfree = default_bzfree; - - s = BZALLOC( sizeof(DState) ); - if (s == NULL) return BZ_MEM_ERROR; - s->strm = strm; - strm->state = s; - s->state = BZ_X_MAGIC_1; - s->bsLive = 0; - s->bsBuff = 0; - s->calculatedCombinedCRC = 0; - strm->total_in_lo32 = 0; - strm->total_in_hi32 = 0; - strm->total_out_lo32 = 0; - strm->total_out_hi32 = 0; - s->smallDecompress = (Bool)small; - s->ll4 = NULL; - s->ll16 = NULL; - s->tt = NULL; - s->currBlockNo = 0; - s->verbosity = verbosity; - - return BZ_OK; -} - - -/*---------------------------------------------------*/ -/* Return True iff data corruption is discovered. - Returns False if there is no problem. -*/ -static -Bool unRLE_obuf_to_output_FAST ( DState* s ) -{ - UChar k1; - - if (s->blockRandomised) { - - while (True) { - /* try to finish existing run */ - while (True) { - if (s->strm->avail_out == 0) return False; - if (s->state_out_len == 0) break; - *( (UChar*)(s->strm->next_out) ) = s->state_out_ch; - BZ_UPDATE_CRC ( s->calculatedBlockCRC, s->state_out_ch ); - s->state_out_len--; - s->strm->next_out++; - s->strm->avail_out--; - s->strm->total_out_lo32++; - if (s->strm->total_out_lo32 == 0) s->strm->total_out_hi32++; - } - - /* can a new run be started? */ - if (s->nblock_used == s->save_nblock+1) return False; - - /* Only caused by corrupt data stream? */ - if (s->nblock_used > s->save_nblock+1) - return True; - - s->state_out_len = 1; - s->state_out_ch = s->k0; - BZ_GET_FAST(k1); BZ_RAND_UPD_MASK; - k1 ^= BZ_RAND_MASK; s->nblock_used++; - if (s->nblock_used == s->save_nblock+1) continue; - if (k1 != s->k0) { s->k0 = k1; continue; }; - - s->state_out_len = 2; - BZ_GET_FAST(k1); BZ_RAND_UPD_MASK; - k1 ^= BZ_RAND_MASK; s->nblock_used++; - if (s->nblock_used == s->save_nblock+1) continue; - if (k1 != s->k0) { s->k0 = k1; continue; }; - - s->state_out_len = 3; - BZ_GET_FAST(k1); BZ_RAND_UPD_MASK; - k1 ^= BZ_RAND_MASK; s->nblock_used++; - if (s->nblock_used == s->save_nblock+1) continue; - if (k1 != s->k0) { s->k0 = k1; continue; }; - - BZ_GET_FAST(k1); BZ_RAND_UPD_MASK; - k1 ^= BZ_RAND_MASK; s->nblock_used++; - s->state_out_len = ((Int32)k1) + 4; - BZ_GET_FAST(s->k0); BZ_RAND_UPD_MASK; - s->k0 ^= BZ_RAND_MASK; s->nblock_used++; - } - - } else { - - /* restore */ - UInt32 c_calculatedBlockCRC = s->calculatedBlockCRC; - UChar c_state_out_ch = s->state_out_ch; - Int32 c_state_out_len = s->state_out_len; - Int32 c_nblock_used = s->nblock_used; - Int32 c_k0 = s->k0; - UInt32* c_tt = s->tt; - UInt32 c_tPos = s->tPos; - char* cs_next_out = s->strm->next_out; - unsigned int cs_avail_out = s->strm->avail_out; - Int32 ro_blockSize100k = s->blockSize100k; - /* end restore */ - - UInt32 avail_out_INIT = cs_avail_out; - Int32 s_save_nblockPP = s->save_nblock+1; - unsigned int total_out_lo32_old; - - while (True) { - - /* try to finish existing run */ - if (c_state_out_len > 0) { - while (True) { - if (cs_avail_out == 0) goto return_notr; - if (c_state_out_len == 1) break; - *( (UChar*)(cs_next_out) ) = c_state_out_ch; - BZ_UPDATE_CRC ( c_calculatedBlockCRC, c_state_out_ch ); - c_state_out_len--; - cs_next_out++; - cs_avail_out--; - } - s_state_out_len_eq_one: - { - if (cs_avail_out == 0) { - c_state_out_len = 1; goto return_notr; - }; - *( (UChar*)(cs_next_out) ) = c_state_out_ch; - BZ_UPDATE_CRC ( c_calculatedBlockCRC, c_state_out_ch ); - cs_next_out++; - cs_avail_out--; - } - } - /* Only caused by corrupt data stream? */ - if (c_nblock_used > s_save_nblockPP) - return True; - - /* can a new run be started? */ - if (c_nblock_used == s_save_nblockPP) { - c_state_out_len = 0; goto return_notr; - }; - c_state_out_ch = c_k0; - BZ_GET_FAST_C(k1); c_nblock_used++; - if (k1 != c_k0) { - c_k0 = k1; goto s_state_out_len_eq_one; - }; - if (c_nblock_used == s_save_nblockPP) - goto s_state_out_len_eq_one; - - c_state_out_len = 2; - BZ_GET_FAST_C(k1); c_nblock_used++; - if (c_nblock_used == s_save_nblockPP) continue; - if (k1 != c_k0) { c_k0 = k1; continue; }; - - c_state_out_len = 3; - BZ_GET_FAST_C(k1); c_nblock_used++; - if (c_nblock_used == s_save_nblockPP) continue; - if (k1 != c_k0) { c_k0 = k1; continue; }; - - BZ_GET_FAST_C(k1); c_nblock_used++; - c_state_out_len = ((Int32)k1) + 4; - BZ_GET_FAST_C(c_k0); c_nblock_used++; - } - - return_notr: - total_out_lo32_old = s->strm->total_out_lo32; - s->strm->total_out_lo32 += (avail_out_INIT - cs_avail_out); - if (s->strm->total_out_lo32 < total_out_lo32_old) - s->strm->total_out_hi32++; - - /* save */ - s->calculatedBlockCRC = c_calculatedBlockCRC; - s->state_out_ch = c_state_out_ch; - s->state_out_len = c_state_out_len; - s->nblock_used = c_nblock_used; - s->k0 = c_k0; - s->tt = c_tt; - s->tPos = c_tPos; - s->strm->next_out = cs_next_out; - s->strm->avail_out = cs_avail_out; - /* end save */ - } - return False; -} - - - -/*---------------------------------------------------*/ -__inline__ Int32 BZ2_indexIntoF ( Int32 indx, Int32 *cftab ) -{ - Int32 nb, na, mid; - nb = 0; - na = 256; - do { - mid = (nb + na) >> 1; - if (indx >= cftab[mid]) nb = mid; else na = mid; - } - while (na - nb != 1); - return nb; -} - - -/*---------------------------------------------------*/ -/* Return True iff data corruption is discovered. - Returns False if there is no problem. -*/ -static -Bool unRLE_obuf_to_output_SMALL ( DState* s ) -{ - UChar k1; - - if (s->blockRandomised) { - - while (True) { - /* try to finish existing run */ - while (True) { - if (s->strm->avail_out == 0) return False; - if (s->state_out_len == 0) break; - *( (UChar*)(s->strm->next_out) ) = s->state_out_ch; - BZ_UPDATE_CRC ( s->calculatedBlockCRC, s->state_out_ch ); - s->state_out_len--; - s->strm->next_out++; - s->strm->avail_out--; - s->strm->total_out_lo32++; - if (s->strm->total_out_lo32 == 0) s->strm->total_out_hi32++; - } - - /* can a new run be started? */ - if (s->nblock_used == s->save_nblock+1) return False; - - /* Only caused by corrupt data stream? */ - if (s->nblock_used > s->save_nblock+1) - return True; - - s->state_out_len = 1; - s->state_out_ch = s->k0; - BZ_GET_SMALL(k1); BZ_RAND_UPD_MASK; - k1 ^= BZ_RAND_MASK; s->nblock_used++; - if (s->nblock_used == s->save_nblock+1) continue; - if (k1 != s->k0) { s->k0 = k1; continue; }; - - s->state_out_len = 2; - BZ_GET_SMALL(k1); BZ_RAND_UPD_MASK; - k1 ^= BZ_RAND_MASK; s->nblock_used++; - if (s->nblock_used == s->save_nblock+1) continue; - if (k1 != s->k0) { s->k0 = k1; continue; }; - - s->state_out_len = 3; - BZ_GET_SMALL(k1); BZ_RAND_UPD_MASK; - k1 ^= BZ_RAND_MASK; s->nblock_used++; - if (s->nblock_used == s->save_nblock+1) continue; - if (k1 != s->k0) { s->k0 = k1; continue; }; - - BZ_GET_SMALL(k1); BZ_RAND_UPD_MASK; - k1 ^= BZ_RAND_MASK; s->nblock_used++; - s->state_out_len = ((Int32)k1) + 4; - BZ_GET_SMALL(s->k0); BZ_RAND_UPD_MASK; - s->k0 ^= BZ_RAND_MASK; s->nblock_used++; - } - - } else { - - while (True) { - /* try to finish existing run */ - while (True) { - if (s->strm->avail_out == 0) return False; - if (s->state_out_len == 0) break; - *( (UChar*)(s->strm->next_out) ) = s->state_out_ch; - BZ_UPDATE_CRC ( s->calculatedBlockCRC, s->state_out_ch ); - s->state_out_len--; - s->strm->next_out++; - s->strm->avail_out--; - s->strm->total_out_lo32++; - if (s->strm->total_out_lo32 == 0) s->strm->total_out_hi32++; - } - - /* can a new run be started? */ - if (s->nblock_used == s->save_nblock+1) return False; - - /* Only caused by corrupt data stream? */ - if (s->nblock_used > s->save_nblock+1) - return True; - - s->state_out_len = 1; - s->state_out_ch = s->k0; - BZ_GET_SMALL(k1); s->nblock_used++; - if (s->nblock_used == s->save_nblock+1) continue; - if (k1 != s->k0) { s->k0 = k1; continue; }; - - s->state_out_len = 2; - BZ_GET_SMALL(k1); s->nblock_used++; - if (s->nblock_used == s->save_nblock+1) continue; - if (k1 != s->k0) { s->k0 = k1; continue; }; - - s->state_out_len = 3; - BZ_GET_SMALL(k1); s->nblock_used++; - if (s->nblock_used == s->save_nblock+1) continue; - if (k1 != s->k0) { s->k0 = k1; continue; }; - - BZ_GET_SMALL(k1); s->nblock_used++; - s->state_out_len = ((Int32)k1) + 4; - BZ_GET_SMALL(s->k0); s->nblock_used++; - } - - } -} - - -/*---------------------------------------------------*/ -int BZ_API(BZ2_bzDecompress) ( bz_stream *strm ) -{ - Bool corrupt; - DState* s; - if (strm == NULL) return BZ_PARAM_ERROR; - s = strm->state; - if (s == NULL) return BZ_PARAM_ERROR; - if (s->strm != strm) return BZ_PARAM_ERROR; - - while (True) { - if (s->state == BZ_X_IDLE) return BZ_SEQUENCE_ERROR; - if (s->state == BZ_X_OUTPUT) { - if (s->smallDecompress) - corrupt = unRLE_obuf_to_output_SMALL ( s ); else - corrupt = unRLE_obuf_to_output_FAST ( s ); - if (corrupt) return BZ_DATA_ERROR; - if (s->nblock_used == s->save_nblock+1 && s->state_out_len == 0) { - BZ_FINALISE_CRC ( s->calculatedBlockCRC ); - if (s->verbosity >= 3) - VPrintf2 ( " {0x%08x, 0x%08x}", s->storedBlockCRC, - s->calculatedBlockCRC ); - if (s->verbosity >= 2) VPrintf0 ( "]" ); - if (s->calculatedBlockCRC != s->storedBlockCRC) - return BZ_DATA_ERROR; - s->calculatedCombinedCRC - = (s->calculatedCombinedCRC << 1) | - (s->calculatedCombinedCRC >> 31); - s->calculatedCombinedCRC ^= s->calculatedBlockCRC; - s->state = BZ_X_BLKHDR_1; - } else { - return BZ_OK; - } - } - if (s->state >= BZ_X_MAGIC_1) { - Int32 r = BZ2_decompress ( s ); - if (r == BZ_STREAM_END) { - if (s->verbosity >= 3) - VPrintf2 ( "\n combined CRCs: stored = 0x%08x, computed = 0x%08x", - s->storedCombinedCRC, s->calculatedCombinedCRC ); - if (s->calculatedCombinedCRC != s->storedCombinedCRC) - return BZ_DATA_ERROR; - return r; - } - if (s->state != BZ_X_OUTPUT) return r; - } - } - - AssertH ( 0, 6001 ); - - return 0; /*NOTREACHED*/ -} - - -/*---------------------------------------------------*/ -int BZ_API(BZ2_bzDecompressEnd) ( bz_stream *strm ) -{ - DState* s; - if (strm == NULL) return BZ_PARAM_ERROR; - s = strm->state; - if (s == NULL) return BZ_PARAM_ERROR; - if (s->strm != strm) return BZ_PARAM_ERROR; - - if (s->tt != NULL) BZFREE(s->tt); - if (s->ll16 != NULL) BZFREE(s->ll16); - if (s->ll4 != NULL) BZFREE(s->ll4); - - BZFREE(strm->state); - strm->state = NULL; - - return BZ_OK; -} - - -#ifndef BZ_NO_STDIO -/*---------------------------------------------------*/ -/*--- File I/O stuff ---*/ -/*---------------------------------------------------*/ - -#define BZ_SETERR(eee) \ -{ \ - if (bzerror != NULL) *bzerror = eee; \ - if (bzf != NULL) bzf->lastErr = eee; \ -} - -typedef - struct { - FILE* handle; - Char buf[BZ_MAX_UNUSED]; - Int32 bufN; - Bool writing; - bz_stream strm; - Int32 lastErr; - Bool initialisedOk; - } - bzFile; - - -/*---------------------------------------------*/ -static Bool myfeof ( FILE* f ) -{ - Int32 c = fgetc ( f ); - if (c == EOF) return True; - ungetc ( c, f ); - return False; -} - - -/*---------------------------------------------------*/ -BZFILE* BZ_API(BZ2_bzWriteOpen) - ( int* bzerror, - FILE* f, - int blockSize100k, - int verbosity, - int workFactor ) -{ - Int32 ret; - bzFile* bzf = NULL; - - BZ_SETERR(BZ_OK); - - if (f == NULL || - (blockSize100k < 1 || blockSize100k > 9) || - (workFactor < 0 || workFactor > 250) || - (verbosity < 0 || verbosity > 4)) - { BZ_SETERR(BZ_PARAM_ERROR); return NULL; }; - - if (ferror(f)) - { BZ_SETERR(BZ_IO_ERROR); return NULL; }; - - bzf = malloc ( sizeof(bzFile) ); - if (bzf == NULL) - { BZ_SETERR(BZ_MEM_ERROR); return NULL; }; - - BZ_SETERR(BZ_OK); - bzf->initialisedOk = False; - bzf->bufN = 0; - bzf->handle = f; - bzf->writing = True; - bzf->strm.bzalloc = NULL; - bzf->strm.bzfree = NULL; - bzf->strm.opaque = NULL; - - if (workFactor == 0) workFactor = 30; - ret = BZ2_bzCompressInit ( &(bzf->strm), blockSize100k, - verbosity, workFactor ); - if (ret != BZ_OK) - { BZ_SETERR(ret); free(bzf); return NULL; }; - - bzf->strm.avail_in = 0; - bzf->initialisedOk = True; - return bzf; -} - - - -/*---------------------------------------------------*/ -void BZ_API(BZ2_bzWrite) - ( int* bzerror, - BZFILE* b, - void* buf, - int len ) -{ - Int32 n, n2, ret; - bzFile* bzf = (bzFile*)b; - - BZ_SETERR(BZ_OK); - if (bzf == NULL || buf == NULL || len < 0) - { BZ_SETERR(BZ_PARAM_ERROR); return; }; - if (!(bzf->writing)) - { BZ_SETERR(BZ_SEQUENCE_ERROR); return; }; - if (ferror(bzf->handle)) - { BZ_SETERR(BZ_IO_ERROR); return; }; - - if (len == 0) - { BZ_SETERR(BZ_OK); return; }; - - bzf->strm.avail_in = len; - bzf->strm.next_in = buf; - - while (True) { - bzf->strm.avail_out = BZ_MAX_UNUSED; - bzf->strm.next_out = bzf->buf; - ret = BZ2_bzCompress ( &(bzf->strm), BZ_RUN ); - if (ret != BZ_RUN_OK) - { BZ_SETERR(ret); return; }; - - if (bzf->strm.avail_out < BZ_MAX_UNUSED) { - n = BZ_MAX_UNUSED - bzf->strm.avail_out; - n2 = fwrite ( (void*)(bzf->buf), sizeof(UChar), - n, bzf->handle ); - if (n != n2 || ferror(bzf->handle)) - { BZ_SETERR(BZ_IO_ERROR); return; }; - } - - if (bzf->strm.avail_in == 0) - { BZ_SETERR(BZ_OK); return; }; - } -} - - -/*---------------------------------------------------*/ -void BZ_API(BZ2_bzWriteClose) - ( int* bzerror, - BZFILE* b, - int abandon, - unsigned int* nbytes_in, - unsigned int* nbytes_out ) -{ - BZ2_bzWriteClose64 ( bzerror, b, abandon, - nbytes_in, NULL, nbytes_out, NULL ); -} - - -void BZ_API(BZ2_bzWriteClose64) - ( int* bzerror, - BZFILE* b, - int abandon, - unsigned int* nbytes_in_lo32, - unsigned int* nbytes_in_hi32, - unsigned int* nbytes_out_lo32, - unsigned int* nbytes_out_hi32 ) -{ - Int32 n, n2, ret; - bzFile* bzf = (bzFile*)b; - - if (bzf == NULL) - { BZ_SETERR(BZ_OK); return; }; - if (!(bzf->writing)) - { BZ_SETERR(BZ_SEQUENCE_ERROR); return; }; - if (ferror(bzf->handle)) - { BZ_SETERR(BZ_IO_ERROR); return; }; - - if (nbytes_in_lo32 != NULL) *nbytes_in_lo32 = 0; - if (nbytes_in_hi32 != NULL) *nbytes_in_hi32 = 0; - if (nbytes_out_lo32 != NULL) *nbytes_out_lo32 = 0; - if (nbytes_out_hi32 != NULL) *nbytes_out_hi32 = 0; - - if ((!abandon) && bzf->lastErr == BZ_OK) { - while (True) { - bzf->strm.avail_out = BZ_MAX_UNUSED; - bzf->strm.next_out = bzf->buf; - ret = BZ2_bzCompress ( &(bzf->strm), BZ_FINISH ); - if (ret != BZ_FINISH_OK && ret != BZ_STREAM_END) - { BZ_SETERR(ret); return; }; - - if (bzf->strm.avail_out < BZ_MAX_UNUSED) { - n = BZ_MAX_UNUSED - bzf->strm.avail_out; - n2 = fwrite ( (void*)(bzf->buf), sizeof(UChar), - n, bzf->handle ); - if (n != n2 || ferror(bzf->handle)) - { BZ_SETERR(BZ_IO_ERROR); return; }; - } - - if (ret == BZ_STREAM_END) break; - } - } - - if ( !abandon && !ferror ( bzf->handle ) ) { - fflush ( bzf->handle ); - if (ferror(bzf->handle)) - { BZ_SETERR(BZ_IO_ERROR); return; }; - } - - if (nbytes_in_lo32 != NULL) - *nbytes_in_lo32 = bzf->strm.total_in_lo32; - if (nbytes_in_hi32 != NULL) - *nbytes_in_hi32 = bzf->strm.total_in_hi32; - if (nbytes_out_lo32 != NULL) - *nbytes_out_lo32 = bzf->strm.total_out_lo32; - if (nbytes_out_hi32 != NULL) - *nbytes_out_hi32 = bzf->strm.total_out_hi32; - - BZ_SETERR(BZ_OK); - BZ2_bzCompressEnd ( &(bzf->strm) ); - free ( bzf ); -} - - -/*---------------------------------------------------*/ -BZFILE* BZ_API(BZ2_bzReadOpen) - ( int* bzerror, - FILE* f, - int verbosity, - int small, - void* unused, - int nUnused ) -{ - bzFile* bzf = NULL; - int ret; - - BZ_SETERR(BZ_OK); - - if (f == NULL || - (small != 0 && small != 1) || - (verbosity < 0 || verbosity > 4) || - (unused == NULL && nUnused != 0) || - (unused != NULL && (nUnused < 0 || nUnused > BZ_MAX_UNUSED))) - { BZ_SETERR(BZ_PARAM_ERROR); return NULL; }; - - if (ferror(f)) - { BZ_SETERR(BZ_IO_ERROR); return NULL; }; - - bzf = malloc ( sizeof(bzFile) ); - if (bzf == NULL) - { BZ_SETERR(BZ_MEM_ERROR); return NULL; }; - - BZ_SETERR(BZ_OK); - - bzf->initialisedOk = False; - bzf->handle = f; - bzf->bufN = 0; - bzf->writing = False; - bzf->strm.bzalloc = NULL; - bzf->strm.bzfree = NULL; - bzf->strm.opaque = NULL; - - while (nUnused > 0) { - bzf->buf[bzf->bufN] = *((UChar*)(unused)); bzf->bufN++; - unused = ((void*)( 1 + ((UChar*)(unused)) )); - nUnused--; - } - - ret = BZ2_bzDecompressInit ( &(bzf->strm), verbosity, small ); - if (ret != BZ_OK) - { BZ_SETERR(ret); free(bzf); return NULL; }; - - bzf->strm.avail_in = bzf->bufN; - bzf->strm.next_in = bzf->buf; - - bzf->initialisedOk = True; - return bzf; -} - - -/*---------------------------------------------------*/ -void BZ_API(BZ2_bzReadClose) ( int *bzerror, BZFILE *b ) -{ - bzFile* bzf = (bzFile*)b; - - BZ_SETERR(BZ_OK); - if (bzf == NULL) - { BZ_SETERR(BZ_OK); return; }; - - if (bzf->writing) - { BZ_SETERR(BZ_SEQUENCE_ERROR); return; }; - - if (bzf->initialisedOk) - (void)BZ2_bzDecompressEnd ( &(bzf->strm) ); - free ( bzf ); -} - - -/*---------------------------------------------------*/ -int BZ_API(BZ2_bzRead) - ( int* bzerror, - BZFILE* b, - void* buf, - int len ) -{ - Int32 n, ret; - bzFile* bzf = (bzFile*)b; - - BZ_SETERR(BZ_OK); - - if (bzf == NULL || buf == NULL || len < 0) - { BZ_SETERR(BZ_PARAM_ERROR); return 0; }; - - if (bzf->writing) - { BZ_SETERR(BZ_SEQUENCE_ERROR); return 0; }; - - if (len == 0) - { BZ_SETERR(BZ_OK); return 0; }; - - bzf->strm.avail_out = len; - bzf->strm.next_out = buf; - - while (True) { - - if (ferror(bzf->handle)) - { BZ_SETERR(BZ_IO_ERROR); return 0; }; - - if (bzf->strm.avail_in == 0 && !myfeof(bzf->handle)) { - n = fread ( bzf->buf, sizeof(UChar), - BZ_MAX_UNUSED, bzf->handle ); - if (ferror(bzf->handle)) - { BZ_SETERR(BZ_IO_ERROR); return 0; }; - bzf->bufN = n; - bzf->strm.avail_in = bzf->bufN; - bzf->strm.next_in = bzf->buf; - } - - ret = BZ2_bzDecompress ( &(bzf->strm) ); - - if (ret != BZ_OK && ret != BZ_STREAM_END) - { BZ_SETERR(ret); return 0; }; - - if (ret == BZ_OK && myfeof(bzf->handle) && - bzf->strm.avail_in == 0 && bzf->strm.avail_out > 0) - { BZ_SETERR(BZ_UNEXPECTED_EOF); return 0; }; - - if (ret == BZ_STREAM_END) - { BZ_SETERR(BZ_STREAM_END); - return len - bzf->strm.avail_out; }; - if (bzf->strm.avail_out == 0) - { BZ_SETERR(BZ_OK); return len; }; - - } - - return 0; /*not reached*/ -} - - -/*---------------------------------------------------*/ -void BZ_API(BZ2_bzReadGetUnused) - ( int* bzerror, - BZFILE* b, - void** unused, - int* nUnused ) -{ - bzFile* bzf = (bzFile*)b; - if (bzf == NULL) - { BZ_SETERR(BZ_PARAM_ERROR); return; }; - if (bzf->lastErr != BZ_STREAM_END) - { BZ_SETERR(BZ_SEQUENCE_ERROR); return; }; - if (unused == NULL || nUnused == NULL) - { BZ_SETERR(BZ_PARAM_ERROR); return; }; - - BZ_SETERR(BZ_OK); - *nUnused = bzf->strm.avail_in; - *unused = bzf->strm.next_in; -} -#endif - - -/*---------------------------------------------------*/ -/*--- Misc convenience stuff ---*/ -/*---------------------------------------------------*/ - -/*---------------------------------------------------*/ -/* -int BZ_API(BZ2_bzBuffToBuffCompress) - ( char* dest, - unsigned int* destLen, - char* source, - unsigned int sourceLen, - int blockSize100k, - int verbosity, - int workFactor ) -{ - bz_stream strm; - int ret; - - if (dest == NULL || destLen == NULL || - source == NULL || - blockSize100k < 1 || blockSize100k > 9 || - verbosity < 0 || verbosity > 4 || - workFactor < 0 || workFactor > 250) - return BZ_PARAM_ERROR; - - if (workFactor == 0) workFactor = 30; - strm.bzalloc = NULL; - strm.bzfree = NULL; - strm.opaque = NULL; - ret = BZ2_bzCompressInit ( &strm, blockSize100k, - verbosity, workFactor ); - if (ret != BZ_OK) return ret; - - strm.next_in = source; - strm.next_out = dest; - strm.avail_in = sourceLen; - strm.avail_out = *destLen; - - ret = BZ2_bzCompress ( &strm, BZ_FINISH ); - if (ret == BZ_FINISH_OK) goto output_overflow; - if (ret != BZ_STREAM_END) goto errhandler; - - / * normal termination * / - *destLen -= strm.avail_out; - BZ2_bzCompressEnd ( &strm ); - return BZ_OK; - - output_overflow: - BZ2_bzCompressEnd ( &strm ); - return BZ_OUTBUFF_FULL; - - errhandler: - BZ2_bzCompressEnd ( &strm ); - return ret; -} -*/ - -/*---------------------------------------------------*/ -/* -int BZ_API(BZ2_bzBuffToBuffDecompress) - ( char* dest, - unsigned int* destLen, - char* source, - unsigned int sourceLen, - int small, - int verbosity ) -{ - bz_stream strm; - int ret; - - if (dest == NULL || destLen == NULL || - source == NULL || - (small != 0 && small != 1) || - verbosity < 0 || verbosity > 4) - return BZ_PARAM_ERROR; - - strm.bzalloc = NULL; - strm.bzfree = NULL; - strm.opaque = NULL; - ret = BZ2_bzDecompressInit ( &strm, verbosity, small ); - if (ret != BZ_OK) return ret; - - strm.next_in = source; - strm.next_out = dest; - strm.avail_in = sourceLen; - strm.avail_out = *destLen; - - ret = BZ2_bzDecompress ( &strm ); - if (ret == BZ_OK) goto output_overflow_or_eof; - if (ret != BZ_STREAM_END) goto errhandler; - - / * normal termination * / - *destLen -= strm.avail_out; - BZ2_bzDecompressEnd ( &strm ); - return BZ_OK; - - output_overflow_or_eof: - if (strm.avail_out > 0) { - BZ2_bzDecompressEnd ( &strm ); - return BZ_UNEXPECTED_EOF; - } else { - BZ2_bzDecompressEnd ( &strm ); - return BZ_OUTBUFF_FULL; - }; - - errhandler: - BZ2_bzDecompressEnd ( &strm ); - return ret; -} -*/ - -/*---------------------------------------------------*/ -/*-- - Code contributed by Yoshioka Tsuneo (tsuneo@rr.iij4u.or.jp) - to support better zlib compatibility. - This code is not _officially_ part of libbzip2 (yet); - I haven't tested it, documented it, or considered the - threading-safeness of it. - If this code breaks, please contact both Yoshioka and me. ---*/ -/*---------------------------------------------------*/ - -/*---------------------------------------------------*/ -/*-- - return version like "0.9.5d, 4-Sept-1999". ---*/ -const char * BZ_API(BZ2_bzlibVersion)(void) -{ - return BZ_VERSION; -} - - -#ifndef BZ_NO_STDIO -/*---------------------------------------------------*/ - -#if defined(_WIN32) || defined(OS2) || defined(MSDOS) -# include -# include -# define SET_BINARY_MODE(file) setmode(fileno(file),O_BINARY) -#else -# define SET_BINARY_MODE(file) -#endif -static -BZFILE * bzopen_or_bzdopen - ( const char *path, /* no use when bzdopen */ - int fd, /* no use when bzdopen */ - const char *mode, - int open_mode) /* bzopen: 0, bzdopen:1 */ -{ - int bzerr; - char unused[BZ_MAX_UNUSED]; - int blockSize100k = 9; - int writing = 0; - char mode2[10] = ""; - FILE *fp = NULL; - BZFILE *bzfp = NULL; - int verbosity = 0; - int workFactor = 30; - int smallMode = 0; - int nUnused = 0; - - if (mode == NULL) return NULL; - while (*mode) { - switch (*mode) { - case 'r': - writing = 0; break; - case 'w': - writing = 1; break; - case 's': - smallMode = 1; break; - default: - if (isdigit((int)(*mode))) { - blockSize100k = *mode-BZ_HDR_0; - } - } - mode++; - } - strcat(mode2, writing ? "w" : "r" ); - strcat(mode2,"b"); /* binary mode */ - - if (open_mode==0) { - if (path==NULL || strcmp(path,"")==0) { - fp = (writing ? stdout : stdin); - SET_BINARY_MODE(fp); - } else { - fp = fopen(path,mode2); - } - } else { -#ifdef BZ_STRICT_ANSI - fp = NULL; -#else - fp = fdopen(fd,mode2); -#endif - } - if (fp == NULL) return NULL; - - if (writing) { - /* Guard against total chaos and anarchy -- JRS */ - if (blockSize100k < 1) blockSize100k = 1; - if (blockSize100k > 9) blockSize100k = 9; - bzfp = BZ2_bzWriteOpen(&bzerr,fp,blockSize100k, - verbosity,workFactor); - } else { - bzfp = BZ2_bzReadOpen(&bzerr,fp,verbosity,smallMode, - unused,nUnused); - } - if (bzfp == NULL) { - if (fp != stdin && fp != stdout) fclose(fp); - return NULL; - } - return bzfp; -} - - -/*---------------------------------------------------*/ -/*-- - open file for read or write. - ex) bzopen("file","w9") - case path="" or NULL => use stdin or stdout. ---*/ -BZFILE * BZ_API(BZ2_bzopen) - ( const char *path, - const char *mode ) -{ - return bzopen_or_bzdopen(path,-1,mode,/*bzopen*/0); -} - - -/*---------------------------------------------------*/ -BZFILE * BZ_API(BZ2_bzdopen) - ( int fd, - const char *mode ) -{ - return bzopen_or_bzdopen(NULL,fd,mode,/*bzdopen*/1); -} - - -/*---------------------------------------------------*/ -int BZ_API(BZ2_bzread) (BZFILE* b, void* buf, int len ) -{ - int bzerr, nread; - if (((bzFile*)b)->lastErr == BZ_STREAM_END) return 0; - nread = BZ2_bzRead(&bzerr,b,buf,len); - if (bzerr == BZ_OK || bzerr == BZ_STREAM_END) { - return nread; - } else { - return -1; - } -} - - -/*---------------------------------------------------*/ -int BZ_API(BZ2_bzwrite) (BZFILE* b, void* buf, int len ) -{ - int bzerr; - - BZ2_bzWrite(&bzerr,b,buf,len); - if(bzerr == BZ_OK){ - return len; - }else{ - return -1; - } -} - - -/*---------------------------------------------------*/ -int BZ_API(BZ2_bzflush) (BZFILE *b) -{ - /* do nothing now... */ - return 0; -} - - -/*---------------------------------------------------*/ -void BZ_API(BZ2_bzclose) (BZFILE* b) -{ - int bzerr; - FILE *fp; - - if (b==NULL) {return;} - fp = ((bzFile *)b)->handle; - if(((bzFile*)b)->writing){ - BZ2_bzWriteClose(&bzerr,b,0,NULL,NULL); - if(bzerr != BZ_OK){ - BZ2_bzWriteClose(NULL,b,1,NULL,NULL); - } - }else{ - BZ2_bzReadClose(&bzerr,b); - } - if(fp!=stdin && fp!=stdout){ - fclose(fp); - } -} - - -/*---------------------------------------------------*/ -/*-- - return last error code ---*/ -static const char *bzerrorstrings[] = { - "OK" - ,"SEQUENCE_ERROR" - ,"PARAM_ERROR" - ,"MEM_ERROR" - ,"DATA_ERROR" - ,"DATA_ERROR_MAGIC" - ,"IO_ERROR" - ,"UNEXPECTED_EOF" - ,"OUTBUFF_FULL" - ,"CONFIG_ERROR" - ,"???" /* for future */ - ,"???" /* for future */ - ,"???" /* for future */ - ,"???" /* for future */ - ,"???" /* for future */ - ,"???" /* for future */ -}; - - -const char * BZ_API(BZ2_bzerror) (BZFILE *b, int *errnum) -{ - int err = ((bzFile *)b)->lastErr; - - if(err>0) err = 0; - *errnum = err; - return bzerrorstrings[err*-1]; -} -#endif - - -/*-------------------------------------------------------------*/ -/*--- end bzlib.c ---*/ -/*-------------------------------------------------------------*/ diff --git a/src/plugins/tar/bzip/bzlib.h b/src/plugins/tar/bzip/bzlib.h deleted file mode 100644 index 4aec2e040..000000000 --- a/src/plugins/tar/bzip/bzlib.h +++ /dev/null @@ -1,282 +0,0 @@ - -/*-------------------------------------------------------------*/ -/*--- Public header file for the library. ---*/ -/*--- bzlib.h ---*/ -/*-------------------------------------------------------------*/ - -/* ------------------------------------------------------------------ - This file is part of bzip2/libbzip2, a program and library for - lossless, block-sorting data compression. - - bzip2/libbzip2 version 1.0.5 of 10 December 2007 - Copyright (C) 1996-2007 Julian Seward - - Please read the WARNING, DISCLAIMER and PATENTS sections in the - README file. - - This program is released under the terms of the license contained - in the file LICENSE. - ------------------------------------------------------------------ */ - - -#ifndef _BZLIB_H -#define _BZLIB_H - -#ifdef __cplusplus -extern "C" { -#endif - -#define BZ_RUN 0 -#define BZ_FLUSH 1 -#define BZ_FINISH 2 - -#define BZ_OK 0 -#define BZ_RUN_OK 1 -#define BZ_FLUSH_OK 2 -#define BZ_FINISH_OK 3 -#define BZ_STREAM_END 4 -#define BZ_SEQUENCE_ERROR (-1) -#define BZ_PARAM_ERROR (-2) -#define BZ_MEM_ERROR (-3) -#define BZ_DATA_ERROR (-4) -#define BZ_DATA_ERROR_MAGIC (-5) -#define BZ_IO_ERROR (-6) -#define BZ_UNEXPECTED_EOF (-7) -#define BZ_OUTBUFF_FULL (-8) -#define BZ_CONFIG_ERROR (-9) - -typedef - struct { - char *next_in; - unsigned int avail_in; - unsigned int total_in_lo32; - unsigned int total_in_hi32; - - char *next_out; - unsigned int avail_out; - unsigned int total_out_lo32; - unsigned int total_out_hi32; - - void *state; - - void *(*bzalloc)(void *,int,int); - void (*bzfree)(void *,void *); - void *opaque; - } - bz_stream; - - -#ifndef BZ_IMPORT -#define BZ_EXPORT -#endif - -#ifndef BZ_NO_STDIO -/* Need a definitition for FILE */ -#include -#endif - -#ifdef _WIN32 -# include -# ifdef small - /* windows.h define small to char */ -# undef small -# endif -# ifdef BZ_EXPORT -# define BZ_API(func) WINAPI func -# define BZ_EXTERN extern -# else - /* import windows dll dynamically */ -# define BZ_API(func) (WINAPI * func) -# define BZ_EXTERN -# endif -#else -# define BZ_API(func) func -# define BZ_EXTERN extern -#endif - - -/*-- Core (low-level) library functions --*/ - -BZ_EXTERN int BZ_API(BZ2_bzCompressInit) ( - bz_stream* strm, - int blockSize100k, - int verbosity, - int workFactor - ); - -BZ_EXTERN int BZ_API(BZ2_bzCompress) ( - bz_stream* strm, - int action - ); - -BZ_EXTERN int BZ_API(BZ2_bzCompressEnd) ( - bz_stream* strm - ); - -BZ_EXTERN int BZ_API(BZ2_bzDecompressInit) ( - bz_stream *strm, - int verbosity, - int small - ); - -BZ_EXTERN int BZ_API(BZ2_bzDecompress) ( - bz_stream* strm - ); - -BZ_EXTERN int BZ_API(BZ2_bzDecompressEnd) ( - bz_stream *strm - ); - - - -/*-- High(er) level library functions --*/ - -#ifndef BZ_NO_STDIO -#define BZ_MAX_UNUSED 5000 - -typedef void BZFILE; - -BZ_EXTERN BZFILE* BZ_API(BZ2_bzReadOpen) ( - int* bzerror, - FILE* f, - int verbosity, - int small, - void* unused, - int nUnused - ); - -BZ_EXTERN void BZ_API(BZ2_bzReadClose) ( - int* bzerror, - BZFILE* b - ); - -BZ_EXTERN void BZ_API(BZ2_bzReadGetUnused) ( - int* bzerror, - BZFILE* b, - void** unused, - int* nUnused - ); - -BZ_EXTERN int BZ_API(BZ2_bzRead) ( - int* bzerror, - BZFILE* b, - void* buf, - int len - ); - -BZ_EXTERN BZFILE* BZ_API(BZ2_bzWriteOpen) ( - int* bzerror, - FILE* f, - int blockSize100k, - int verbosity, - int workFactor - ); - -BZ_EXTERN void BZ_API(BZ2_bzWrite) ( - int* bzerror, - BZFILE* b, - void* buf, - int len - ); - -BZ_EXTERN void BZ_API(BZ2_bzWriteClose) ( - int* bzerror, - BZFILE* b, - int abandon, - unsigned int* nbytes_in, - unsigned int* nbytes_out - ); - -BZ_EXTERN void BZ_API(BZ2_bzWriteClose64) ( - int* bzerror, - BZFILE* b, - int abandon, - unsigned int* nbytes_in_lo32, - unsigned int* nbytes_in_hi32, - unsigned int* nbytes_out_lo32, - unsigned int* nbytes_out_hi32 - ); -#endif - - -/*-- Utility functions --*/ - -BZ_EXTERN int BZ_API(BZ2_bzBuffToBuffCompress) ( - char* dest, - unsigned int* destLen, - char* source, - unsigned int sourceLen, - int blockSize100k, - int verbosity, - int workFactor - ); - -BZ_EXTERN int BZ_API(BZ2_bzBuffToBuffDecompress) ( - char* dest, - unsigned int* destLen, - char* source, - unsigned int sourceLen, - int small, - int verbosity - ); - - -/*-- - Code contributed by Yoshioka Tsuneo (tsuneo@rr.iij4u.or.jp) - to support better zlib compatibility. - This code is not _officially_ part of libbzip2 (yet); - I haven't tested it, documented it, or considered the - threading-safeness of it. - If this code breaks, please contact both Yoshioka and me. ---*/ - -BZ_EXTERN const char * BZ_API(BZ2_bzlibVersion) ( - void - ); - -#ifndef BZ_NO_STDIO -BZ_EXTERN BZFILE * BZ_API(BZ2_bzopen) ( - const char *path, - const char *mode - ); - -BZ_EXTERN BZFILE * BZ_API(BZ2_bzdopen) ( - int fd, - const char *mode - ); - -BZ_EXTERN int BZ_API(BZ2_bzread) ( - BZFILE* b, - void* buf, - int len - ); - -BZ_EXTERN int BZ_API(BZ2_bzwrite) ( - BZFILE* b, - void* buf, - int len - ); - -BZ_EXTERN int BZ_API(BZ2_bzflush) ( - BZFILE* b - ); - -BZ_EXTERN void BZ_API(BZ2_bzclose) ( - BZFILE* b - ); - -BZ_EXTERN const char * BZ_API(BZ2_bzerror) ( - BZFILE *b, - int *errnum - ); -#endif - -#ifdef __cplusplus -} -#endif - -#endif - -/*-------------------------------------------------------------*/ -/*--- end bzlib.h ---*/ -/*-------------------------------------------------------------*/ diff --git a/src/plugins/tar/bzip/bzlib_private.h b/src/plugins/tar/bzip/bzlib_private.h deleted file mode 100644 index 552dacfa5..000000000 --- a/src/plugins/tar/bzip/bzlib_private.h +++ /dev/null @@ -1,509 +0,0 @@ - -/*-------------------------------------------------------------*/ -/*--- Private header file for the library. ---*/ -/*--- bzlib_private.h ---*/ -/*-------------------------------------------------------------*/ - -/* ------------------------------------------------------------------ - This file is part of bzip2/libbzip2, a program and library for - lossless, block-sorting data compression. - - bzip2/libbzip2 version 1.0.5 of 10 December 2007 - Copyright (C) 1996-2007 Julian Seward - - Please read the WARNING, DISCLAIMER and PATENTS sections in the - README file. - - This program is released under the terms of the license contained - in the file LICENSE. - ------------------------------------------------------------------ */ - - -#ifndef _BZLIB_PRIVATE_H -#define _BZLIB_PRIVATE_H - -#include - -#ifndef BZ_NO_STDIO -#include -#include -#include -#endif - -#include "bzlib.h" - - - -/*-- General stuff. --*/ - -#define BZ_VERSION "1.0.5, 10-Dec-2007" - -typedef char Char; -typedef unsigned char Bool; -typedef unsigned char UChar; -typedef int Int32; -typedef unsigned int UInt32; -typedef short Int16; -typedef unsigned short UInt16; - -#define True ((Bool)1) -#define False ((Bool)0) - -#ifndef __GNUC__ -#define __inline__ /* */ -#endif - -#ifndef BZ_NO_STDIO - -extern void BZ2_bz__AssertH__fail ( int errcode ); -#define AssertH(cond,errcode) \ - { if (!(cond)) BZ2_bz__AssertH__fail ( errcode ); } - -#if BZ_DEBUG -#define AssertD(cond,msg) \ - { if (!(cond)) { \ - fprintf ( stderr, \ - "\n\nlibbzip2(debug build): internal error\n\t%s\n", msg );\ - exit(1); \ - }} -#else -#define AssertD(cond,msg) /* */ -#endif - -#define VPrintf0(zf) \ - fprintf(stderr,zf) -#define VPrintf1(zf,za1) \ - fprintf(stderr,zf,za1) -#define VPrintf2(zf,za1,za2) \ - fprintf(stderr,zf,za1,za2) -#define VPrintf3(zf,za1,za2,za3) \ - fprintf(stderr,zf,za1,za2,za3) -#define VPrintf4(zf,za1,za2,za3,za4) \ - fprintf(stderr,zf,za1,za2,za3,za4) -#define VPrintf5(zf,za1,za2,za3,za4,za5) \ - fprintf(stderr,zf,za1,za2,za3,za4,za5) - -#else - -extern void bz_internal_error ( int errcode ); -#define AssertH(cond,errcode) \ - { if (!(cond)) bz_internal_error ( errcode ); } -#define AssertD(cond,msg) do { } while (0) -#define VPrintf0(zf) do { } while (0) -#define VPrintf1(zf,za1) do { } while (0) -#define VPrintf2(zf,za1,za2) do { } while (0) -#define VPrintf3(zf,za1,za2,za3) do { } while (0) -#define VPrintf4(zf,za1,za2,za3,za4) do { } while (0) -#define VPrintf5(zf,za1,za2,za3,za4,za5) do { } while (0) - -#endif - - -#define BZALLOC(nnn) (strm->bzalloc)(strm->opaque,(nnn),1) -#define BZFREE(ppp) (strm->bzfree)(strm->opaque,(ppp)) - - -/*-- Header bytes. --*/ - -#define BZ_HDR_B 0x42 /* 'B' */ -#define BZ_HDR_Z 0x5a /* 'Z' */ -#define BZ_HDR_h 0x68 /* 'h' */ -#define BZ_HDR_0 0x30 /* '0' */ - -/*-- Constants for the back end. --*/ - -#define BZ_MAX_ALPHA_SIZE 258 -#define BZ_MAX_CODE_LEN 23 - -#define BZ_RUNA 0 -#define BZ_RUNB 1 - -#define BZ_N_GROUPS 6 -#define BZ_G_SIZE 50 -#define BZ_N_ITERS 4 - -#define BZ_MAX_SELECTORS (2 + (900000 / BZ_G_SIZE)) - - - -/*-- Stuff for randomising repetitive blocks. --*/ - -extern Int32 BZ2_rNums[512]; - -#define BZ_RAND_DECLS \ - Int32 rNToGo; \ - Int32 rTPos \ - -#define BZ_RAND_INIT_MASK \ - s->rNToGo = 0; \ - s->rTPos = 0 \ - -#define BZ_RAND_MASK ((s->rNToGo == 1) ? 1 : 0) - -#define BZ_RAND_UPD_MASK \ - if (s->rNToGo == 0) { \ - s->rNToGo = BZ2_rNums[s->rTPos]; \ - s->rTPos++; \ - if (s->rTPos == 512) s->rTPos = 0; \ - } \ - s->rNToGo--; - - - -/*-- Stuff for doing CRCs. --*/ - -extern UInt32 BZ2_crc32Table[256]; - -#define BZ_INITIALISE_CRC(crcVar) \ -{ \ - crcVar = 0xffffffffL; \ -} - -#define BZ_FINALISE_CRC(crcVar) \ -{ \ - crcVar = ~(crcVar); \ -} - -#define BZ_UPDATE_CRC(crcVar,cha) \ -{ \ - crcVar = (crcVar << 8) ^ \ - BZ2_crc32Table[(crcVar >> 24) ^ \ - ((UChar)cha)]; \ -} - - - -/*-- States and modes for compression. --*/ - -#define BZ_M_IDLE 1 -#define BZ_M_RUNNING 2 -#define BZ_M_FLUSHING 3 -#define BZ_M_FINISHING 4 - -#define BZ_S_OUTPUT 1 -#define BZ_S_INPUT 2 - -#define BZ_N_RADIX 2 -#define BZ_N_QSORT 12 -#define BZ_N_SHELL 18 -#define BZ_N_OVERSHOOT (BZ_N_RADIX + BZ_N_QSORT + BZ_N_SHELL + 2) - - - - -/*-- Structure holding all the compression-side stuff. --*/ - -typedef - struct { - /* pointer back to the struct bz_stream */ - bz_stream* strm; - - /* mode this stream is in, and whether inputting */ - /* or outputting data */ - Int32 mode; - Int32 state; - - /* remembers avail_in when flush/finish requested */ - UInt32 avail_in_expect; - - /* for doing the block sorting */ - UInt32* arr1; - UInt32* arr2; - UInt32* ftab; - Int32 origPtr; - - /* aliases for arr1 and arr2 */ - UInt32* ptr; - UChar* block; - UInt16* mtfv; - UChar* zbits; - - /* for deciding when to use the fallback sorting algorithm */ - Int32 workFactor; - - /* run-length-encoding of the input */ - UInt32 state_in_ch; - Int32 state_in_len; - BZ_RAND_DECLS; - - /* input and output limits and current posns */ - Int32 nblock; - Int32 nblockMAX; - Int32 numZ; - Int32 state_out_pos; - - /* map of bytes used in block */ - Int32 nInUse; - Bool inUse[256]; - UChar unseqToSeq[256]; - - /* the buffer for bit stream creation */ - UInt32 bsBuff; - Int32 bsLive; - - /* block and combined CRCs */ - UInt32 blockCRC; - UInt32 combinedCRC; - - /* misc administratium */ - Int32 verbosity; - Int32 blockNo; - Int32 blockSize100k; - - /* stuff for coding the MTF values */ - Int32 nMTF; - Int32 mtfFreq [BZ_MAX_ALPHA_SIZE]; - UChar selector [BZ_MAX_SELECTORS]; - UChar selectorMtf[BZ_MAX_SELECTORS]; - - UChar len [BZ_N_GROUPS][BZ_MAX_ALPHA_SIZE]; - Int32 code [BZ_N_GROUPS][BZ_MAX_ALPHA_SIZE]; - Int32 rfreq [BZ_N_GROUPS][BZ_MAX_ALPHA_SIZE]; - /* second dimension: only 3 needed; 4 makes index calculations faster */ - UInt32 len_pack[BZ_MAX_ALPHA_SIZE][4]; - - } - EState; - - - -/*-- externs for compression. --*/ - -extern void -BZ2_blockSort ( EState* ); - -extern void -BZ2_compressBlock ( EState*, Bool ); - -extern void -BZ2_bsInitWrite ( EState* ); - -extern void -BZ2_hbAssignCodes ( Int32*, UChar*, Int32, Int32, Int32 ); - -extern void -BZ2_hbMakeCodeLengths ( UChar*, Int32*, Int32, Int32 ); - - - -/*-- states for decompression. --*/ - -#define BZ_X_IDLE 1 -#define BZ_X_OUTPUT 2 - -#define BZ_X_MAGIC_1 10 -#define BZ_X_MAGIC_2 11 -#define BZ_X_MAGIC_3 12 -#define BZ_X_MAGIC_4 13 -#define BZ_X_BLKHDR_1 14 -#define BZ_X_BLKHDR_2 15 -#define BZ_X_BLKHDR_3 16 -#define BZ_X_BLKHDR_4 17 -#define BZ_X_BLKHDR_5 18 -#define BZ_X_BLKHDR_6 19 -#define BZ_X_BCRC_1 20 -#define BZ_X_BCRC_2 21 -#define BZ_X_BCRC_3 22 -#define BZ_X_BCRC_4 23 -#define BZ_X_RANDBIT 24 -#define BZ_X_ORIGPTR_1 25 -#define BZ_X_ORIGPTR_2 26 -#define BZ_X_ORIGPTR_3 27 -#define BZ_X_MAPPING_1 28 -#define BZ_X_MAPPING_2 29 -#define BZ_X_SELECTOR_1 30 -#define BZ_X_SELECTOR_2 31 -#define BZ_X_SELECTOR_3 32 -#define BZ_X_CODING_1 33 -#define BZ_X_CODING_2 34 -#define BZ_X_CODING_3 35 -#define BZ_X_MTF_1 36 -#define BZ_X_MTF_2 37 -#define BZ_X_MTF_3 38 -#define BZ_X_MTF_4 39 -#define BZ_X_MTF_5 40 -#define BZ_X_MTF_6 41 -#define BZ_X_ENDHDR_2 42 -#define BZ_X_ENDHDR_3 43 -#define BZ_X_ENDHDR_4 44 -#define BZ_X_ENDHDR_5 45 -#define BZ_X_ENDHDR_6 46 -#define BZ_X_CCRC_1 47 -#define BZ_X_CCRC_2 48 -#define BZ_X_CCRC_3 49 -#define BZ_X_CCRC_4 50 - - - -/*-- Constants for the fast MTF decoder. --*/ - -#define MTFA_SIZE 4096 -#define MTFL_SIZE 16 - - - -/*-- Structure holding all the decompression-side stuff. --*/ - -typedef - struct { - /* pointer back to the struct bz_stream */ - bz_stream* strm; - - /* state indicator for this stream */ - Int32 state; - - /* for doing the final run-length decoding */ - UChar state_out_ch; - Int32 state_out_len; - Bool blockRandomised; - BZ_RAND_DECLS; - - /* the buffer for bit stream reading */ - UInt32 bsBuff; - Int32 bsLive; - - /* misc administratium */ - Int32 blockSize100k; - Bool smallDecompress; - Int32 currBlockNo; - Int32 verbosity; - - /* for undoing the Burrows-Wheeler transform */ - Int32 origPtr; - UInt32 tPos; - Int32 k0; - Int32 unzftab[256]; - Int32 nblock_used; - Int32 cftab[257]; - Int32 cftabCopy[257]; - - /* for undoing the Burrows-Wheeler transform (FAST) */ - UInt32 *tt; - - /* for undoing the Burrows-Wheeler transform (SMALL) */ - UInt16 *ll16; - UChar *ll4; - - /* stored and calculated CRCs */ - UInt32 storedBlockCRC; - UInt32 storedCombinedCRC; - UInt32 calculatedBlockCRC; - UInt32 calculatedCombinedCRC; - - /* map of bytes used in block */ - Int32 nInUse; - Bool inUse[256]; - Bool inUse16[16]; - UChar seqToUnseq[256]; - - /* for decoding the MTF values */ - UChar mtfa [MTFA_SIZE]; - Int32 mtfbase[256 / MTFL_SIZE]; - UChar selector [BZ_MAX_SELECTORS]; - UChar selectorMtf[BZ_MAX_SELECTORS]; - UChar len [BZ_N_GROUPS][BZ_MAX_ALPHA_SIZE]; - - Int32 limit [BZ_N_GROUPS][BZ_MAX_ALPHA_SIZE]; - Int32 base [BZ_N_GROUPS][BZ_MAX_ALPHA_SIZE]; - Int32 perm [BZ_N_GROUPS][BZ_MAX_ALPHA_SIZE]; - Int32 minLens[BZ_N_GROUPS]; - - /* save area for scalars in the main decompress code */ - Int32 save_i; - Int32 save_j; - Int32 save_t; - Int32 save_alphaSize; - Int32 save_nGroups; - Int32 save_nSelectors; - Int32 save_EOB; - Int32 save_groupNo; - Int32 save_groupPos; - Int32 save_nextSym; - Int32 save_nblockMAX; - Int32 save_nblock; - Int32 save_es; - Int32 save_N; - Int32 save_curr; - Int32 save_zt; - Int32 save_zn; - Int32 save_zvec; - Int32 save_zj; - Int32 save_gSel; - Int32 save_gMinlen; - Int32* save_gLimit; - Int32* save_gBase; - Int32* save_gPerm; - - } - DState; - - - -/*-- Macros for decompression. --*/ - -#define BZ_GET_FAST(cccc) \ - /* c_tPos is unsigned, hence test < 0 is pointless. */ \ - if (s->tPos >= (UInt32)100000 * (UInt32)s->blockSize100k) return True; \ - s->tPos = s->tt[s->tPos]; \ - cccc = (UChar)(s->tPos & 0xff); \ - s->tPos >>= 8; - -#define BZ_GET_FAST_C(cccc) \ - /* c_tPos is unsigned, hence test < 0 is pointless. */ \ - if (c_tPos >= (UInt32)100000 * (UInt32)ro_blockSize100k) return True; \ - c_tPos = c_tt[c_tPos]; \ - cccc = (UChar)(c_tPos & 0xff); \ - c_tPos >>= 8; - -#define SET_LL4(i,n) \ - { if (((i) & 0x1) == 0) \ - s->ll4[(i) >> 1] = (s->ll4[(i) >> 1] & 0xf0) | (n); else \ - s->ll4[(i) >> 1] = (s->ll4[(i) >> 1] & 0x0f) | ((n) << 4); \ - } - -#define GET_LL4(i) \ - ((((UInt32)(s->ll4[(i) >> 1])) >> (((i) << 2) & 0x4)) & 0xF) - -#define SET_LL(i,n) \ - { s->ll16[i] = (UInt16)(n & 0x0000ffff); \ - SET_LL4(i, n >> 16); \ - } - -#define GET_LL(i) \ - (((UInt32)s->ll16[i]) | (GET_LL4(i) << 16)) - -#define BZ_GET_SMALL(cccc) \ - /* c_tPos is unsigned, hence test < 0 is pointless. */ \ - if (s->tPos >= (UInt32)100000 * (UInt32)s->blockSize100k) return True; \ - cccc = BZ2_indexIntoF ( s->tPos, s->cftab ); \ - s->tPos = GET_LL(s->tPos); - - -/*-- externs for decompression. --*/ - -extern Int32 -BZ2_indexIntoF ( Int32, Int32* ); - -extern Int32 -BZ2_decompress ( DState* ); - -extern void -BZ2_hbCreateDecodeTables ( Int32*, Int32*, Int32*, UChar*, - Int32, Int32, Int32 ); - - -#endif - - -/*-- BZ_NO_STDIO seems to make NULL disappear on some platforms. --*/ - -#ifdef BZ_NO_STDIO -#ifndef NULL -#define NULL 0 -#endif -#endif - - -/*-------------------------------------------------------------*/ -/*--- end bzlib_private.h ---*/ -/*-------------------------------------------------------------*/ diff --git a/src/plugins/tar/bzip/crctable.c b/src/plugins/tar/bzip/crctable.c deleted file mode 100644 index a68647d45..000000000 --- a/src/plugins/tar/bzip/crctable.c +++ /dev/null @@ -1,104 +0,0 @@ - -/*-------------------------------------------------------------*/ -/*--- Table for doing CRCs ---*/ -/*--- crctable.c ---*/ -/*-------------------------------------------------------------*/ - -/* ------------------------------------------------------------------ - This file is part of bzip2/libbzip2, a program and library for - lossless, block-sorting data compression. - - bzip2/libbzip2 version 1.0.5 of 10 December 2007 - Copyright (C) 1996-2007 Julian Seward - - Please read the WARNING, DISCLAIMER and PATENTS sections in the - README file. - - This program is released under the terms of the license contained - in the file LICENSE. - ------------------------------------------------------------------ */ - - -#include "bzlib_private.h" - -/*-- - I think this is an implementation of the AUTODIN-II, - Ethernet & FDDI 32-bit CRC standard. Vaguely derived - from code by Rob Warnock, in Section 51 of the - comp.compression FAQ. ---*/ - -UInt32 BZ2_crc32Table[256] = { - - /*-- Ugly, innit? --*/ - - 0x00000000L, 0x04c11db7L, 0x09823b6eL, 0x0d4326d9L, - 0x130476dcL, 0x17c56b6bL, 0x1a864db2L, 0x1e475005L, - 0x2608edb8L, 0x22c9f00fL, 0x2f8ad6d6L, 0x2b4bcb61L, - 0x350c9b64L, 0x31cd86d3L, 0x3c8ea00aL, 0x384fbdbdL, - 0x4c11db70L, 0x48d0c6c7L, 0x4593e01eL, 0x4152fda9L, - 0x5f15adacL, 0x5bd4b01bL, 0x569796c2L, 0x52568b75L, - 0x6a1936c8L, 0x6ed82b7fL, 0x639b0da6L, 0x675a1011L, - 0x791d4014L, 0x7ddc5da3L, 0x709f7b7aL, 0x745e66cdL, - 0x9823b6e0L, 0x9ce2ab57L, 0x91a18d8eL, 0x95609039L, - 0x8b27c03cL, 0x8fe6dd8bL, 0x82a5fb52L, 0x8664e6e5L, - 0xbe2b5b58L, 0xbaea46efL, 0xb7a96036L, 0xb3687d81L, - 0xad2f2d84L, 0xa9ee3033L, 0xa4ad16eaL, 0xa06c0b5dL, - 0xd4326d90L, 0xd0f37027L, 0xddb056feL, 0xd9714b49L, - 0xc7361b4cL, 0xc3f706fbL, 0xceb42022L, 0xca753d95L, - 0xf23a8028L, 0xf6fb9d9fL, 0xfbb8bb46L, 0xff79a6f1L, - 0xe13ef6f4L, 0xe5ffeb43L, 0xe8bccd9aL, 0xec7dd02dL, - 0x34867077L, 0x30476dc0L, 0x3d044b19L, 0x39c556aeL, - 0x278206abL, 0x23431b1cL, 0x2e003dc5L, 0x2ac12072L, - 0x128e9dcfL, 0x164f8078L, 0x1b0ca6a1L, 0x1fcdbb16L, - 0x018aeb13L, 0x054bf6a4L, 0x0808d07dL, 0x0cc9cdcaL, - 0x7897ab07L, 0x7c56b6b0L, 0x71159069L, 0x75d48ddeL, - 0x6b93dddbL, 0x6f52c06cL, 0x6211e6b5L, 0x66d0fb02L, - 0x5e9f46bfL, 0x5a5e5b08L, 0x571d7dd1L, 0x53dc6066L, - 0x4d9b3063L, 0x495a2dd4L, 0x44190b0dL, 0x40d816baL, - 0xaca5c697L, 0xa864db20L, 0xa527fdf9L, 0xa1e6e04eL, - 0xbfa1b04bL, 0xbb60adfcL, 0xb6238b25L, 0xb2e29692L, - 0x8aad2b2fL, 0x8e6c3698L, 0x832f1041L, 0x87ee0df6L, - 0x99a95df3L, 0x9d684044L, 0x902b669dL, 0x94ea7b2aL, - 0xe0b41de7L, 0xe4750050L, 0xe9362689L, 0xedf73b3eL, - 0xf3b06b3bL, 0xf771768cL, 0xfa325055L, 0xfef34de2L, - 0xc6bcf05fL, 0xc27dede8L, 0xcf3ecb31L, 0xcbffd686L, - 0xd5b88683L, 0xd1799b34L, 0xdc3abdedL, 0xd8fba05aL, - 0x690ce0eeL, 0x6dcdfd59L, 0x608edb80L, 0x644fc637L, - 0x7a089632L, 0x7ec98b85L, 0x738aad5cL, 0x774bb0ebL, - 0x4f040d56L, 0x4bc510e1L, 0x46863638L, 0x42472b8fL, - 0x5c007b8aL, 0x58c1663dL, 0x558240e4L, 0x51435d53L, - 0x251d3b9eL, 0x21dc2629L, 0x2c9f00f0L, 0x285e1d47L, - 0x36194d42L, 0x32d850f5L, 0x3f9b762cL, 0x3b5a6b9bL, - 0x0315d626L, 0x07d4cb91L, 0x0a97ed48L, 0x0e56f0ffL, - 0x1011a0faL, 0x14d0bd4dL, 0x19939b94L, 0x1d528623L, - 0xf12f560eL, 0xf5ee4bb9L, 0xf8ad6d60L, 0xfc6c70d7L, - 0xe22b20d2L, 0xe6ea3d65L, 0xeba91bbcL, 0xef68060bL, - 0xd727bbb6L, 0xd3e6a601L, 0xdea580d8L, 0xda649d6fL, - 0xc423cd6aL, 0xc0e2d0ddL, 0xcda1f604L, 0xc960ebb3L, - 0xbd3e8d7eL, 0xb9ff90c9L, 0xb4bcb610L, 0xb07daba7L, - 0xae3afba2L, 0xaafbe615L, 0xa7b8c0ccL, 0xa379dd7bL, - 0x9b3660c6L, 0x9ff77d71L, 0x92b45ba8L, 0x9675461fL, - 0x8832161aL, 0x8cf30badL, 0x81b02d74L, 0x857130c3L, - 0x5d8a9099L, 0x594b8d2eL, 0x5408abf7L, 0x50c9b640L, - 0x4e8ee645L, 0x4a4ffbf2L, 0x470cdd2bL, 0x43cdc09cL, - 0x7b827d21L, 0x7f436096L, 0x7200464fL, 0x76c15bf8L, - 0x68860bfdL, 0x6c47164aL, 0x61043093L, 0x65c52d24L, - 0x119b4be9L, 0x155a565eL, 0x18197087L, 0x1cd86d30L, - 0x029f3d35L, 0x065e2082L, 0x0b1d065bL, 0x0fdc1becL, - 0x3793a651L, 0x3352bbe6L, 0x3e119d3fL, 0x3ad08088L, - 0x2497d08dL, 0x2056cd3aL, 0x2d15ebe3L, 0x29d4f654L, - 0xc5a92679L, 0xc1683bceL, 0xcc2b1d17L, 0xc8ea00a0L, - 0xd6ad50a5L, 0xd26c4d12L, 0xdf2f6bcbL, 0xdbee767cL, - 0xe3a1cbc1L, 0xe760d676L, 0xea23f0afL, 0xeee2ed18L, - 0xf0a5bd1dL, 0xf464a0aaL, 0xf9278673L, 0xfde69bc4L, - 0x89b8fd09L, 0x8d79e0beL, 0x803ac667L, 0x84fbdbd0L, - 0x9abc8bd5L, 0x9e7d9662L, 0x933eb0bbL, 0x97ffad0cL, - 0xafb010b1L, 0xab710d06L, 0xa6322bdfL, 0xa2f33668L, - 0xbcb4666dL, 0xb8757bdaL, 0xb5365d03L, 0xb1f740b4L -}; - - -/*-------------------------------------------------------------*/ -/*--- end crctable.c ---*/ -/*-------------------------------------------------------------*/ diff --git a/src/plugins/tar/bzip/decompress.c b/src/plugins/tar/bzip/decompress.c deleted file mode 100644 index d3b13d00a..000000000 --- a/src/plugins/tar/bzip/decompress.c +++ /dev/null @@ -1,626 +0,0 @@ - -/*-------------------------------------------------------------*/ -/*--- Decompression machinery ---*/ -/*--- decompress.c ---*/ -/*-------------------------------------------------------------*/ - -/* ------------------------------------------------------------------ - This file is part of bzip2/libbzip2, a program and library for - lossless, block-sorting data compression. - - bzip2/libbzip2 version 1.0.5 of 10 December 2007 - Copyright (C) 1996-2007 Julian Seward - - Please read the WARNING, DISCLAIMER and PATENTS sections in the - README file. - - This program is released under the terms of the license contained - in the file LICENSE. - ------------------------------------------------------------------ */ - - -#include "bzlib_private.h" - - -/*---------------------------------------------------*/ -static -void makeMaps_d ( DState* s ) -{ - Int32 i; - s->nInUse = 0; - for (i = 0; i < 256; i++) - if (s->inUse[i]) { - s->seqToUnseq[s->nInUse] = i; - s->nInUse++; - } -} - - -/*---------------------------------------------------*/ -#define RETURN(rrr) \ - { retVal = rrr; goto save_state_and_return; }; - -#define GET_BITS(lll,vvv,nnn) \ - case lll: s->state = lll; \ - while (True) { \ - if (s->bsLive >= nnn) { \ - UInt32 v; \ - v = (s->bsBuff >> \ - (s->bsLive-nnn)) & ((1 << nnn)-1); \ - s->bsLive -= nnn; \ - vvv = v; \ - break; \ - } \ - if (s->strm->avail_in == 0) RETURN(BZ_OK); \ - s->bsBuff \ - = (s->bsBuff << 8) | \ - ((UInt32) \ - (*((UChar*)(s->strm->next_in)))); \ - s->bsLive += 8; \ - s->strm->next_in++; \ - s->strm->avail_in--; \ - s->strm->total_in_lo32++; \ - if (s->strm->total_in_lo32 == 0) \ - s->strm->total_in_hi32++; \ - } - -#define GET_UCHAR(lll,uuu) \ - GET_BITS(lll,uuu,8) - -#define GET_BIT(lll,uuu) \ - GET_BITS(lll,uuu,1) - -/*---------------------------------------------------*/ -#define GET_MTF_VAL(label1,label2,lval) \ -{ \ - if (groupPos == 0) { \ - groupNo++; \ - if (groupNo >= nSelectors) \ - RETURN(BZ_DATA_ERROR); \ - groupPos = BZ_G_SIZE; \ - gSel = s->selector[groupNo]; \ - gMinlen = s->minLens[gSel]; \ - gLimit = &(s->limit[gSel][0]); \ - gPerm = &(s->perm[gSel][0]); \ - gBase = &(s->base[gSel][0]); \ - } \ - groupPos--; \ - zn = gMinlen; \ - GET_BITS(label1, zvec, zn); \ - while (1) { \ - if (zn > 20 /* the longest code */) \ - RETURN(BZ_DATA_ERROR); \ - if (zvec <= gLimit[zn]) break; \ - zn++; \ - GET_BIT(label2, zj); \ - zvec = (zvec << 1) | zj; \ - }; \ - if (zvec - gBase[zn] < 0 \ - || zvec - gBase[zn] >= BZ_MAX_ALPHA_SIZE) \ - RETURN(BZ_DATA_ERROR); \ - lval = gPerm[zvec - gBase[zn]]; \ -} - - -/*---------------------------------------------------*/ -Int32 BZ2_decompress ( DState* s ) -{ - UChar uc; - Int32 retVal; - Int32 minLen, maxLen; - bz_stream* strm = s->strm; - - /* stuff that needs to be saved/restored */ - Int32 i; - Int32 j; - Int32 t; - Int32 alphaSize; - Int32 nGroups; - Int32 nSelectors; - Int32 EOB; - Int32 groupNo; - Int32 groupPos; - Int32 nextSym; - Int32 nblockMAX; - Int32 nblock; - Int32 es; - Int32 N; - Int32 curr; - Int32 zt; - Int32 zn; - Int32 zvec; - Int32 zj; - Int32 gSel; - Int32 gMinlen; - Int32* gLimit; - Int32* gBase; - Int32* gPerm; - - if (s->state == BZ_X_MAGIC_1) { - /*initialise the save area*/ - s->save_i = 0; - s->save_j = 0; - s->save_t = 0; - s->save_alphaSize = 0; - s->save_nGroups = 0; - s->save_nSelectors = 0; - s->save_EOB = 0; - s->save_groupNo = 0; - s->save_groupPos = 0; - s->save_nextSym = 0; - s->save_nblockMAX = 0; - s->save_nblock = 0; - s->save_es = 0; - s->save_N = 0; - s->save_curr = 0; - s->save_zt = 0; - s->save_zn = 0; - s->save_zvec = 0; - s->save_zj = 0; - s->save_gSel = 0; - s->save_gMinlen = 0; - s->save_gLimit = NULL; - s->save_gBase = NULL; - s->save_gPerm = NULL; - } - - /*restore from the save area*/ - i = s->save_i; - j = s->save_j; - t = s->save_t; - alphaSize = s->save_alphaSize; - nGroups = s->save_nGroups; - nSelectors = s->save_nSelectors; - EOB = s->save_EOB; - groupNo = s->save_groupNo; - groupPos = s->save_groupPos; - nextSym = s->save_nextSym; - nblockMAX = s->save_nblockMAX; - nblock = s->save_nblock; - es = s->save_es; - N = s->save_N; - curr = s->save_curr; - zt = s->save_zt; - zn = s->save_zn; - zvec = s->save_zvec; - zj = s->save_zj; - gSel = s->save_gSel; - gMinlen = s->save_gMinlen; - gLimit = s->save_gLimit; - gBase = s->save_gBase; - gPerm = s->save_gPerm; - - retVal = BZ_OK; - - switch (s->state) { - - GET_UCHAR(BZ_X_MAGIC_1, uc); - if (uc != BZ_HDR_B) RETURN(BZ_DATA_ERROR_MAGIC); - - GET_UCHAR(BZ_X_MAGIC_2, uc); - if (uc != BZ_HDR_Z) RETURN(BZ_DATA_ERROR_MAGIC); - - GET_UCHAR(BZ_X_MAGIC_3, uc) - if (uc != BZ_HDR_h) RETURN(BZ_DATA_ERROR_MAGIC); - - GET_BITS(BZ_X_MAGIC_4, s->blockSize100k, 8) - if (s->blockSize100k < (BZ_HDR_0 + 1) || - s->blockSize100k > (BZ_HDR_0 + 9)) RETURN(BZ_DATA_ERROR_MAGIC); - s->blockSize100k -= BZ_HDR_0; - - if (s->smallDecompress) { - s->ll16 = BZALLOC( s->blockSize100k * 100000 * sizeof(UInt16) ); - s->ll4 = BZALLOC( - ((1 + s->blockSize100k * 100000) >> 1) * sizeof(UChar) - ); - if (s->ll16 == NULL || s->ll4 == NULL) RETURN(BZ_MEM_ERROR); - } else { - s->tt = BZALLOC( s->blockSize100k * 100000 * sizeof(Int32) ); - if (s->tt == NULL) RETURN(BZ_MEM_ERROR); - } - - GET_UCHAR(BZ_X_BLKHDR_1, uc); - - if (uc == 0x17) goto endhdr_2; - if (uc != 0x31) RETURN(BZ_DATA_ERROR); - GET_UCHAR(BZ_X_BLKHDR_2, uc); - if (uc != 0x41) RETURN(BZ_DATA_ERROR); - GET_UCHAR(BZ_X_BLKHDR_3, uc); - if (uc != 0x59) RETURN(BZ_DATA_ERROR); - GET_UCHAR(BZ_X_BLKHDR_4, uc); - if (uc != 0x26) RETURN(BZ_DATA_ERROR); - GET_UCHAR(BZ_X_BLKHDR_5, uc); - if (uc != 0x53) RETURN(BZ_DATA_ERROR); - GET_UCHAR(BZ_X_BLKHDR_6, uc); - if (uc != 0x59) RETURN(BZ_DATA_ERROR); - - s->currBlockNo++; - if (s->verbosity >= 2) - VPrintf1 ( "\n [%d: huff+mtf ", s->currBlockNo ); - - s->storedBlockCRC = 0; - GET_UCHAR(BZ_X_BCRC_1, uc); - s->storedBlockCRC = (s->storedBlockCRC << 8) | ((UInt32)uc); - GET_UCHAR(BZ_X_BCRC_2, uc); - s->storedBlockCRC = (s->storedBlockCRC << 8) | ((UInt32)uc); - GET_UCHAR(BZ_X_BCRC_3, uc); - s->storedBlockCRC = (s->storedBlockCRC << 8) | ((UInt32)uc); - GET_UCHAR(BZ_X_BCRC_4, uc); - s->storedBlockCRC = (s->storedBlockCRC << 8) | ((UInt32)uc); - - GET_BITS(BZ_X_RANDBIT, s->blockRandomised, 1); - - s->origPtr = 0; - GET_UCHAR(BZ_X_ORIGPTR_1, uc); - s->origPtr = (s->origPtr << 8) | ((Int32)uc); - GET_UCHAR(BZ_X_ORIGPTR_2, uc); - s->origPtr = (s->origPtr << 8) | ((Int32)uc); - GET_UCHAR(BZ_X_ORIGPTR_3, uc); - s->origPtr = (s->origPtr << 8) | ((Int32)uc); - - if (s->origPtr < 0) - RETURN(BZ_DATA_ERROR); - if (s->origPtr > 10 + 100000*s->blockSize100k) - RETURN(BZ_DATA_ERROR); - - /*--- Receive the mapping table ---*/ - for (i = 0; i < 16; i++) { - GET_BIT(BZ_X_MAPPING_1, uc); - if (uc == 1) - s->inUse16[i] = True; else - s->inUse16[i] = False; - } - - for (i = 0; i < 256; i++) s->inUse[i] = False; - - for (i = 0; i < 16; i++) - if (s->inUse16[i]) - for (j = 0; j < 16; j++) { - GET_BIT(BZ_X_MAPPING_2, uc); - if (uc == 1) s->inUse[i * 16 + j] = True; - } - makeMaps_d ( s ); - if (s->nInUse == 0) RETURN(BZ_DATA_ERROR); - alphaSize = s->nInUse+2; - - /*--- Now the selectors ---*/ - GET_BITS(BZ_X_SELECTOR_1, nGroups, 3); - if (nGroups < 2 || nGroups > 6) RETURN(BZ_DATA_ERROR); - GET_BITS(BZ_X_SELECTOR_2, nSelectors, 15); - if (nSelectors < 1) RETURN(BZ_DATA_ERROR); - for (i = 0; i < nSelectors; i++) { - j = 0; - while (True) { - GET_BIT(BZ_X_SELECTOR_3, uc); - if (uc == 0) break; - j++; - if (j >= nGroups) RETURN(BZ_DATA_ERROR); - } - s->selectorMtf[i] = j; - } - - /*--- Undo the MTF values for the selectors. ---*/ - { - UChar pos[BZ_N_GROUPS], tmp, v; - for (v = 0; v < nGroups; v++) pos[v] = v; - - for (i = 0; i < nSelectors; i++) { - v = s->selectorMtf[i]; - tmp = pos[v]; - while (v > 0) { pos[v] = pos[v-1]; v--; } - pos[0] = tmp; - s->selector[i] = tmp; - } - } - - /*--- Now the coding tables ---*/ - for (t = 0; t < nGroups; t++) { - GET_BITS(BZ_X_CODING_1, curr, 5); - for (i = 0; i < alphaSize; i++) { - while (True) { - if (curr < 1 || curr > 20) RETURN(BZ_DATA_ERROR); - GET_BIT(BZ_X_CODING_2, uc); - if (uc == 0) break; - GET_BIT(BZ_X_CODING_3, uc); - if (uc == 0) curr++; else curr--; - } - s->len[t][i] = curr; - } - } - - /*--- Create the Huffman decoding tables ---*/ - for (t = 0; t < nGroups; t++) { - minLen = 32; - maxLen = 0; - for (i = 0; i < alphaSize; i++) { - if (s->len[t][i] > maxLen) maxLen = s->len[t][i]; - if (s->len[t][i] < minLen) minLen = s->len[t][i]; - } - BZ2_hbCreateDecodeTables ( - &(s->limit[t][0]), - &(s->base[t][0]), - &(s->perm[t][0]), - &(s->len[t][0]), - minLen, maxLen, alphaSize - ); - s->minLens[t] = minLen; - } - - /*--- Now the MTF values ---*/ - - EOB = s->nInUse+1; - nblockMAX = 100000 * s->blockSize100k; - groupNo = -1; - groupPos = 0; - - for (i = 0; i <= 255; i++) s->unzftab[i] = 0; - - /*-- MTF init --*/ - { - Int32 ii, jj, kk; - kk = MTFA_SIZE-1; - for (ii = 256 / MTFL_SIZE - 1; ii >= 0; ii--) { - for (jj = MTFL_SIZE-1; jj >= 0; jj--) { - s->mtfa[kk] = (UChar)(ii * MTFL_SIZE + jj); - kk--; - } - s->mtfbase[ii] = kk + 1; - } - } - /*-- end MTF init --*/ - - nblock = 0; - GET_MTF_VAL(BZ_X_MTF_1, BZ_X_MTF_2, nextSym); - - while (True) { - - if (nextSym == EOB) break; - - if (nextSym == BZ_RUNA || nextSym == BZ_RUNB) { - - es = -1; - N = 1; - do { - if (nextSym == BZ_RUNA) es = es + (0+1) * N; else - if (nextSym == BZ_RUNB) es = es + (1+1) * N; - N = N * 2; - GET_MTF_VAL(BZ_X_MTF_3, BZ_X_MTF_4, nextSym); - } - while (nextSym == BZ_RUNA || nextSym == BZ_RUNB); - - es++; - uc = s->seqToUnseq[ s->mtfa[s->mtfbase[0]] ]; - s->unzftab[uc] += es; - - if (s->smallDecompress) - while (es > 0) { - if (nblock >= nblockMAX) RETURN(BZ_DATA_ERROR); - s->ll16[nblock] = (UInt16)uc; - nblock++; - es--; - } - else - while (es > 0) { - if (nblock >= nblockMAX) RETURN(BZ_DATA_ERROR); - s->tt[nblock] = (UInt32)uc; - nblock++; - es--; - }; - - continue; - - } else { - - if (nblock >= nblockMAX) RETURN(BZ_DATA_ERROR); - - /*-- uc = MTF ( nextSym-1 ) --*/ - { - Int32 ii, jj, kk, pp, lno, off; - UInt32 nn; - nn = (UInt32)(nextSym - 1); - - if (nn < MTFL_SIZE) { - /* avoid general-case expense */ - pp = s->mtfbase[0]; - uc = s->mtfa[pp+nn]; - while (nn > 3) { - Int32 z = pp+nn; - s->mtfa[(z) ] = s->mtfa[(z)-1]; - s->mtfa[(z)-1] = s->mtfa[(z)-2]; - s->mtfa[(z)-2] = s->mtfa[(z)-3]; - s->mtfa[(z)-3] = s->mtfa[(z)-4]; - nn -= 4; - } - while (nn > 0) { - s->mtfa[(pp+nn)] = s->mtfa[(pp+nn)-1]; nn--; - }; - s->mtfa[pp] = uc; - } else { - /* general case */ - lno = nn / MTFL_SIZE; - off = nn % MTFL_SIZE; - pp = s->mtfbase[lno] + off; - uc = s->mtfa[pp]; - while (pp > s->mtfbase[lno]) { - s->mtfa[pp] = s->mtfa[pp-1]; pp--; - }; - s->mtfbase[lno]++; - while (lno > 0) { - s->mtfbase[lno]--; - s->mtfa[s->mtfbase[lno]] - = s->mtfa[s->mtfbase[lno-1] + MTFL_SIZE - 1]; - lno--; - } - s->mtfbase[0]--; - s->mtfa[s->mtfbase[0]] = uc; - if (s->mtfbase[0] == 0) { - kk = MTFA_SIZE-1; - for (ii = 256 / MTFL_SIZE-1; ii >= 0; ii--) { - for (jj = MTFL_SIZE-1; jj >= 0; jj--) { - s->mtfa[kk] = s->mtfa[s->mtfbase[ii] + jj]; - kk--; - } - s->mtfbase[ii] = kk + 1; - } - } - } - } - /*-- end uc = MTF ( nextSym-1 ) --*/ - - s->unzftab[s->seqToUnseq[uc]]++; - if (s->smallDecompress) - s->ll16[nblock] = (UInt16)(s->seqToUnseq[uc]); else - s->tt[nblock] = (UInt32)(s->seqToUnseq[uc]); - nblock++; - - GET_MTF_VAL(BZ_X_MTF_5, BZ_X_MTF_6, nextSym); - continue; - } - } - - /* Now we know what nblock is, we can do a better sanity - check on s->origPtr. - */ - if (s->origPtr < 0 || s->origPtr >= nblock) - RETURN(BZ_DATA_ERROR); - - /*-- Set up cftab to facilitate generation of T^(-1) --*/ - s->cftab[0] = 0; - for (i = 1; i <= 256; i++) s->cftab[i] = s->unzftab[i-1]; - for (i = 1; i <= 256; i++) s->cftab[i] += s->cftab[i-1]; - for (i = 0; i <= 256; i++) { - if (s->cftab[i] < 0 || s->cftab[i] > nblock) { - /* s->cftab[i] can legitimately be == nblock */ - RETURN(BZ_DATA_ERROR); - } - } - - s->state_out_len = 0; - s->state_out_ch = 0; - BZ_INITIALISE_CRC ( s->calculatedBlockCRC ); - s->state = BZ_X_OUTPUT; - if (s->verbosity >= 2) VPrintf0 ( "rt+rld" ); - - if (s->smallDecompress) { - - /*-- Make a copy of cftab, used in generation of T --*/ - for (i = 0; i <= 256; i++) s->cftabCopy[i] = s->cftab[i]; - - /*-- compute the T vector --*/ - for (i = 0; i < nblock; i++) { - uc = (UChar)(s->ll16[i]); - SET_LL(i, s->cftabCopy[uc]); - s->cftabCopy[uc]++; - } - - /*-- Compute T^(-1) by pointer reversal on T --*/ - i = s->origPtr; - j = GET_LL(i); - do { - Int32 tmp = GET_LL(j); - SET_LL(j, i); - i = j; - j = tmp; - } - while (i != s->origPtr); - - s->tPos = s->origPtr; - s->nblock_used = 0; - if (s->blockRandomised) { - BZ_RAND_INIT_MASK; - BZ_GET_SMALL(s->k0); s->nblock_used++; - BZ_RAND_UPD_MASK; s->k0 ^= BZ_RAND_MASK; - } else { - BZ_GET_SMALL(s->k0); s->nblock_used++; - } - - } else { - - /*-- compute the T^(-1) vector --*/ - for (i = 0; i < nblock; i++) { - uc = (UChar)(s->tt[i] & 0xff); - s->tt[s->cftab[uc]] |= (i << 8); - s->cftab[uc]++; - } - - s->tPos = s->tt[s->origPtr] >> 8; - s->nblock_used = 0; - if (s->blockRandomised) { - BZ_RAND_INIT_MASK; - BZ_GET_FAST(s->k0); s->nblock_used++; - BZ_RAND_UPD_MASK; s->k0 ^= BZ_RAND_MASK; - } else { - BZ_GET_FAST(s->k0); s->nblock_used++; - } - - } - - RETURN(BZ_OK); - - - - endhdr_2: - - GET_UCHAR(BZ_X_ENDHDR_2, uc); - if (uc != 0x72) RETURN(BZ_DATA_ERROR); - GET_UCHAR(BZ_X_ENDHDR_3, uc); - if (uc != 0x45) RETURN(BZ_DATA_ERROR); - GET_UCHAR(BZ_X_ENDHDR_4, uc); - if (uc != 0x38) RETURN(BZ_DATA_ERROR); - GET_UCHAR(BZ_X_ENDHDR_5, uc); - if (uc != 0x50) RETURN(BZ_DATA_ERROR); - GET_UCHAR(BZ_X_ENDHDR_6, uc); - if (uc != 0x90) RETURN(BZ_DATA_ERROR); - - s->storedCombinedCRC = 0; - GET_UCHAR(BZ_X_CCRC_1, uc); - s->storedCombinedCRC = (s->storedCombinedCRC << 8) | ((UInt32)uc); - GET_UCHAR(BZ_X_CCRC_2, uc); - s->storedCombinedCRC = (s->storedCombinedCRC << 8) | ((UInt32)uc); - GET_UCHAR(BZ_X_CCRC_3, uc); - s->storedCombinedCRC = (s->storedCombinedCRC << 8) | ((UInt32)uc); - GET_UCHAR(BZ_X_CCRC_4, uc); - s->storedCombinedCRC = (s->storedCombinedCRC << 8) | ((UInt32)uc); - - s->state = BZ_X_IDLE; - RETURN(BZ_STREAM_END); - - default: AssertH ( False, 4001 ); - } - - AssertH ( False, 4002 ); - - save_state_and_return: - - s->save_i = i; - s->save_j = j; - s->save_t = t; - s->save_alphaSize = alphaSize; - s->save_nGroups = nGroups; - s->save_nSelectors = nSelectors; - s->save_EOB = EOB; - s->save_groupNo = groupNo; - s->save_groupPos = groupPos; - s->save_nextSym = nextSym; - s->save_nblockMAX = nblockMAX; - s->save_nblock = nblock; - s->save_es = es; - s->save_N = N; - s->save_curr = curr; - s->save_zt = zt; - s->save_zn = zn; - s->save_zvec = zvec; - s->save_zj = zj; - s->save_gSel = gSel; - s->save_gMinlen = gMinlen; - s->save_gLimit = gLimit; - s->save_gBase = gBase; - s->save_gPerm = gPerm; - - return retVal; -} - - -/*-------------------------------------------------------------*/ -/*--- end decompress.c ---*/ -/*-------------------------------------------------------------*/ diff --git a/src/plugins/tar/bzip/huffman.c b/src/plugins/tar/bzip/huffman.c deleted file mode 100644 index ca40a9597..000000000 --- a/src/plugins/tar/bzip/huffman.c +++ /dev/null @@ -1,205 +0,0 @@ - -/*-------------------------------------------------------------*/ -/*--- Huffman coding low-level stuff ---*/ -/*--- huffman.c ---*/ -/*-------------------------------------------------------------*/ - -/* ------------------------------------------------------------------ - This file is part of bzip2/libbzip2, a program and library for - lossless, block-sorting data compression. - - bzip2/libbzip2 version 1.0.5 of 10 December 2007 - Copyright (C) 1996-2007 Julian Seward - - Please read the WARNING, DISCLAIMER and PATENTS sections in the - README file. - - This program is released under the terms of the license contained - in the file LICENSE. - ------------------------------------------------------------------ */ - - -#include "bzlib_private.h" - -/*---------------------------------------------------*/ -#define WEIGHTOF(zz0) ((zz0) & 0xffffff00) -#define DEPTHOF(zz1) ((zz1) & 0x000000ff) -#define MYMAX(zz2,zz3) ((zz2) > (zz3) ? (zz2) : (zz3)) - -#define ADDWEIGHTS(zw1,zw2) \ - (WEIGHTOF(zw1)+WEIGHTOF(zw2)) | \ - (1 + MYMAX(DEPTHOF(zw1),DEPTHOF(zw2))) - -#define UPHEAP(z) \ -{ \ - Int32 zz, tmp; \ - zz = z; tmp = heap[zz]; \ - while (weight[tmp] < weight[heap[zz >> 1]]) { \ - heap[zz] = heap[zz >> 1]; \ - zz >>= 1; \ - } \ - heap[zz] = tmp; \ -} - -#define DOWNHEAP(z) \ -{ \ - Int32 zz, yy, tmp; \ - zz = z; tmp = heap[zz]; \ - while (True) { \ - yy = zz << 1; \ - if (yy > nHeap) break; \ - if (yy < nHeap && \ - weight[heap[yy+1]] < weight[heap[yy]]) \ - yy++; \ - if (weight[tmp] < weight[heap[yy]]) break; \ - heap[zz] = heap[yy]; \ - zz = yy; \ - } \ - heap[zz] = tmp; \ -} - - -/*---------------------------------------------------*/ -void BZ2_hbMakeCodeLengths ( UChar *len, - Int32 *freq, - Int32 alphaSize, - Int32 maxLen ) -{ - /*-- - Nodes and heap entries run from 1. Entry 0 - for both the heap and nodes is a sentinel. - --*/ - Int32 nNodes, nHeap, n1, n2, i, j, k; - Bool tooLong; - - Int32 heap [ BZ_MAX_ALPHA_SIZE + 2 ]; - Int32 weight [ BZ_MAX_ALPHA_SIZE * 2 ]; - Int32 parent [ BZ_MAX_ALPHA_SIZE * 2 ]; - - for (i = 0; i < alphaSize; i++) - weight[i+1] = (freq[i] == 0 ? 1 : freq[i]) << 8; - - while (True) { - - nNodes = alphaSize; - nHeap = 0; - - heap[0] = 0; - weight[0] = 0; - parent[0] = -2; - - for (i = 1; i <= alphaSize; i++) { - parent[i] = -1; - nHeap++; - heap[nHeap] = i; - UPHEAP(nHeap); - } - - AssertH( nHeap < (BZ_MAX_ALPHA_SIZE+2), 2001 ); - - while (nHeap > 1) { - n1 = heap[1]; heap[1] = heap[nHeap]; nHeap--; DOWNHEAP(1); - n2 = heap[1]; heap[1] = heap[nHeap]; nHeap--; DOWNHEAP(1); - nNodes++; - parent[n1] = parent[n2] = nNodes; - weight[nNodes] = ADDWEIGHTS(weight[n1], weight[n2]); - parent[nNodes] = -1; - nHeap++; - heap[nHeap] = nNodes; - UPHEAP(nHeap); - } - - AssertH( nNodes < (BZ_MAX_ALPHA_SIZE * 2), 2002 ); - - tooLong = False; - for (i = 1; i <= alphaSize; i++) { - j = 0; - k = i; - while (parent[k] >= 0) { k = parent[k]; j++; } - len[i-1] = j; - if (j > maxLen) tooLong = True; - } - - if (! tooLong) break; - - /* 17 Oct 04: keep-going condition for the following loop used - to be 'i < alphaSize', which missed the last element, - theoretically leading to the possibility of the compressor - looping. However, this count-scaling step is only needed if - one of the generated Huffman code words is longer than - maxLen, which up to and including version 1.0.2 was 20 bits, - which is extremely unlikely. In version 1.0.3 maxLen was - changed to 17 bits, which has minimal effect on compression - ratio, but does mean this scaling step is used from time to - time, enough to verify that it works. - - This means that bzip2-1.0.3 and later will only produce - Huffman codes with a maximum length of 17 bits. However, in - order to preserve backwards compatibility with bitstreams - produced by versions pre-1.0.3, the decompressor must still - handle lengths of up to 20. */ - - for (i = 1; i <= alphaSize; i++) { - j = weight[i] >> 8; - j = 1 + (j / 2); - weight[i] = j << 8; - } - } -} - - -/*---------------------------------------------------*/ -void BZ2_hbAssignCodes ( Int32 *code, - UChar *length, - Int32 minLen, - Int32 maxLen, - Int32 alphaSize ) -{ - Int32 n, vec, i; - - vec = 0; - for (n = minLen; n <= maxLen; n++) { - for (i = 0; i < alphaSize; i++) - if (length[i] == n) { code[i] = vec; vec++; }; - vec <<= 1; - } -} - - -/*---------------------------------------------------*/ -void BZ2_hbCreateDecodeTables ( Int32 *limit, - Int32 *base, - Int32 *perm, - UChar *length, - Int32 minLen, - Int32 maxLen, - Int32 alphaSize ) -{ - Int32 pp, i, j, vec; - - pp = 0; - for (i = minLen; i <= maxLen; i++) - for (j = 0; j < alphaSize; j++) - if (length[j] == i) { perm[pp] = j; pp++; }; - - for (i = 0; i < BZ_MAX_CODE_LEN; i++) base[i] = 0; - for (i = 0; i < alphaSize; i++) base[length[i]+1]++; - - for (i = 1; i < BZ_MAX_CODE_LEN; i++) base[i] += base[i-1]; - - for (i = 0; i < BZ_MAX_CODE_LEN; i++) limit[i] = 0; - vec = 0; - - for (i = minLen; i <= maxLen; i++) { - vec += (base[i+1] - base[i]); - limit[i] = vec-1; - vec <<= 1; - } - for (i = minLen + 1; i <= maxLen; i++) - base[i] = ((limit[i-1] + 1) << 1) - base[i]; -} - - -/*-------------------------------------------------------------*/ -/*--- end huffman.c ---*/ -/*-------------------------------------------------------------*/ diff --git a/src/plugins/tar/bzip/randtable.c b/src/plugins/tar/bzip/randtable.c deleted file mode 100644 index 178f369a4..000000000 --- a/src/plugins/tar/bzip/randtable.c +++ /dev/null @@ -1,84 +0,0 @@ - -/*-------------------------------------------------------------*/ -/*--- Table for randomising repetitive blocks ---*/ -/*--- randtable.c ---*/ -/*-------------------------------------------------------------*/ - -/* ------------------------------------------------------------------ - This file is part of bzip2/libbzip2, a program and library for - lossless, block-sorting data compression. - - bzip2/libbzip2 version 1.0.5 of 10 December 2007 - Copyright (C) 1996-2007 Julian Seward - - Please read the WARNING, DISCLAIMER and PATENTS sections in the - README file. - - This program is released under the terms of the license contained - in the file LICENSE. - ------------------------------------------------------------------ */ - - -#include "bzlib_private.h" - - -/*---------------------------------------------*/ -Int32 BZ2_rNums[512] = { - 619, 720, 127, 481, 931, 816, 813, 233, 566, 247, - 985, 724, 205, 454, 863, 491, 741, 242, 949, 214, - 733, 859, 335, 708, 621, 574, 73, 654, 730, 472, - 419, 436, 278, 496, 867, 210, 399, 680, 480, 51, - 878, 465, 811, 169, 869, 675, 611, 697, 867, 561, - 862, 687, 507, 283, 482, 129, 807, 591, 733, 623, - 150, 238, 59, 379, 684, 877, 625, 169, 643, 105, - 170, 607, 520, 932, 727, 476, 693, 425, 174, 647, - 73, 122, 335, 530, 442, 853, 695, 249, 445, 515, - 909, 545, 703, 919, 874, 474, 882, 500, 594, 612, - 641, 801, 220, 162, 819, 984, 589, 513, 495, 799, - 161, 604, 958, 533, 221, 400, 386, 867, 600, 782, - 382, 596, 414, 171, 516, 375, 682, 485, 911, 276, - 98, 553, 163, 354, 666, 933, 424, 341, 533, 870, - 227, 730, 475, 186, 263, 647, 537, 686, 600, 224, - 469, 68, 770, 919, 190, 373, 294, 822, 808, 206, - 184, 943, 795, 384, 383, 461, 404, 758, 839, 887, - 715, 67, 618, 276, 204, 918, 873, 777, 604, 560, - 951, 160, 578, 722, 79, 804, 96, 409, 713, 940, - 652, 934, 970, 447, 318, 353, 859, 672, 112, 785, - 645, 863, 803, 350, 139, 93, 354, 99, 820, 908, - 609, 772, 154, 274, 580, 184, 79, 626, 630, 742, - 653, 282, 762, 623, 680, 81, 927, 626, 789, 125, - 411, 521, 938, 300, 821, 78, 343, 175, 128, 250, - 170, 774, 972, 275, 999, 639, 495, 78, 352, 126, - 857, 956, 358, 619, 580, 124, 737, 594, 701, 612, - 669, 112, 134, 694, 363, 992, 809, 743, 168, 974, - 944, 375, 748, 52, 600, 747, 642, 182, 862, 81, - 344, 805, 988, 739, 511, 655, 814, 334, 249, 515, - 897, 955, 664, 981, 649, 113, 974, 459, 893, 228, - 433, 837, 553, 268, 926, 240, 102, 654, 459, 51, - 686, 754, 806, 760, 493, 403, 415, 394, 687, 700, - 946, 670, 656, 610, 738, 392, 760, 799, 887, 653, - 978, 321, 576, 617, 626, 502, 894, 679, 243, 440, - 680, 879, 194, 572, 640, 724, 926, 56, 204, 700, - 707, 151, 457, 449, 797, 195, 791, 558, 945, 679, - 297, 59, 87, 824, 713, 663, 412, 693, 342, 606, - 134, 108, 571, 364, 631, 212, 174, 643, 304, 329, - 343, 97, 430, 751, 497, 314, 983, 374, 822, 928, - 140, 206, 73, 263, 980, 736, 876, 478, 430, 305, - 170, 514, 364, 692, 829, 82, 855, 953, 676, 246, - 369, 970, 294, 750, 807, 827, 150, 790, 288, 923, - 804, 378, 215, 828, 592, 281, 565, 555, 710, 82, - 896, 831, 547, 261, 524, 462, 293, 465, 502, 56, - 661, 821, 976, 991, 658, 869, 905, 758, 745, 193, - 768, 550, 608, 933, 378, 286, 215, 979, 792, 961, - 61, 688, 793, 644, 986, 403, 106, 366, 905, 644, - 372, 567, 466, 434, 645, 210, 389, 550, 919, 135, - 780, 773, 635, 389, 707, 100, 626, 958, 165, 504, - 920, 176, 193, 713, 857, 265, 203, 50, 668, 108, - 645, 990, 626, 197, 510, 357, 358, 850, 858, 364, - 936, 638 -}; - - -/*-------------------------------------------------------------*/ -/*--- end randtable.c ---*/ -/*-------------------------------------------------------------*/ diff --git a/src/plugins/tar/compress/compress.h b/src/plugins/tar/compress/compress.h index 82d8e8c23..a9ab30518 100644 --- a/src/plugins/tar/compress/compress.h +++ b/src/plugins/tar/compress/compress.h @@ -27,9 +27,9 @@ class CCompress : public CZippedFile { public: CCompress(const char* filename, HANDLE file, unsigned char* buffer, unsigned long read, CQuadWord inputSize); - virtual ~CCompress(); + ~CCompress() override; - virtual BOOL IsCompressed() { return TRUE; } + BOOL IsCompressed() const override { return TRUE; } protected: unsigned short* PrefixTab; @@ -51,5 +51,5 @@ class CCompress : public CZippedFile unsigned char ReadyBits; unsigned char UsedBytes; - BOOL DecompressBlock(unsigned short needed); + BOOL DecompressBlock(unsigned short needed) override; }; diff --git a/src/plugins/tar/deb/deb.cpp b/src/plugins/tar/deb/deb.cpp index d2f87c1a3..d9c4934b8 100644 --- a/src/plugins/tar/deb/deb.cpp +++ b/src/plugins/tar/deb/deb.cpp @@ -96,15 +96,16 @@ CDEBArchive::CDEBArchive(const char* fileName, CSalamanderForOperationsAbstract* pos += sizeof(ARBlock); // Open the fist subarchive - controlArchive = new CArchive(fileName, salamander, pos, CQuadWord(SubArchiveSize, 0)); - if (!controlArchive->IsOk()) + CArchive* archive = new CArchive(fileName, salamander, pos, CQuadWord(SubArchiveSize, 0)); + if (!archive->IsOk()) { - delete controlArchive; - controlArchive = NULL; + delete archive; + archive = NULL; return; } // We are happy if at least one subarchive was recognized - bOK = TRUE; + if (AssignArchive(ARBlock.FileName, archive)) + bOK = TRUE; // Skip the subarchive and read the 3rd and last subarchive if (SubArchiveSize & 1) @@ -127,12 +128,15 @@ CDEBArchive::CDEBArchive(const char* fileName, CSalamanderForOperationsAbstract* return; } sscanf(ARBlock.FileSize, "%u", &SubArchiveSize); - dataArchive = new CArchive(fileName, salamander, pos + sizeof(ARBlock), CQuadWord(0, 0)); - if (!dataArchive->IsOk()) + pos += sizeof(ARBlock); + archive = new CArchive(fileName, salamander, pos, CQuadWord(SubArchiveSize, 0)); + if (!archive->IsOk()) { - delete dataArchive; - dataArchive = NULL; + delete archive; + archive = NULL; } + if (AssignArchive(ARBlock.FileName, archive)) + bOK = TRUE; CloseHandle(file); } @@ -315,3 +319,21 @@ BOOL CDEBArchive::UnpackWholeArchive(const char* mask, const char* targetPath) } return ret; } + +BOOL CDEBArchive::AssignArchive(const char* archName, CArchive* archive) +{ + if (!controlArchive && !strncmp(archName, DEB_STREAM_NAME_CONTROL ".", sizeof(DEB_STREAM_NAME_CONTROL ".") - 1)) + { + controlArchive = archive; + return TRUE; + } + else if (!dataArchive && !strncmp(archName, DEB_STREAM_NAME_DATA ".", sizeof(DEB_STREAM_NAME_DATA ".") - 1)) + { + dataArchive = archive; + return TRUE; + } + + // archiv se uz nebude pouzivat + delete archive; + return FALSE; +} diff --git a/src/plugins/tar/deb/deb.h b/src/plugins/tar/deb/deb.h index 6f9ca9efb..2e97183c9 100644 --- a/src/plugins/tar/deb/deb.h +++ b/src/plugins/tar/deb/deb.h @@ -31,14 +31,17 @@ class CDEBArchive : public CArchiveAbstract public: CDEBArchive(LPCTSTR fileName, CSalamanderForOperationsAbstract* salamander); - ~CDEBArchive(void); + ~CDEBArchive(void) override; - BOOL ListArchive(const char* prefix, CSalamanderDirectoryAbstract* dir); + BOOL ListArchive(const char* prefix, CSalamanderDirectoryAbstract* dir) override; BOOL UnpackOneFile(const char* nameInArchive, const CFileData* fileData, - const char* targetPath, const char* newFileName); + const char* targetPath, const char* newFileName) override; BOOL UnpackArchive(const char* targetPath, const char* archiveRoot, - SalEnumSelection nextName, void* param); - BOOL UnpackWholeArchive(const char* mask, const char* targetPath); + SalEnumSelection nextName, void* param) override; + BOOL UnpackWholeArchive(const char* mask, const char* targetPath) override; - BOOL IsOk() { return bOK; }; + BOOL IsOk() const override { return bOK; }; + +private: + BOOL AssignArchive(const char* archName, CArchive* archive); }; diff --git a/src/plugins/tar/dlldefs.h b/src/plugins/tar/dlldefs.h index 33a77891f..ae0aba4da 100644 --- a/src/plugins/tar/dlldefs.h +++ b/src/plugins/tar/dlldefs.h @@ -3,11 +3,6 @@ #pragma once -typedef unsigned int uint32_t; -typedef unsigned short uint16_t; -typedef signed int int32_t; -typedef signed short int16_t; - // general Salamander interface - valid from plugin start until its termination extern CSalamanderGeneralAbstract* SalamanderGeneral; diff --git a/src/plugins/tar/fileio.cpp b/src/plugins/tar/fileio.cpp index e722981f1..83ae7fc57 100644 --- a/src/plugins/tar/fileio.cpp +++ b/src/plugins/tar/fileio.cpp @@ -7,11 +7,13 @@ #include "fileio.h" #include "gzip/gzip.h" -#include "bzip/bzlib.h" #include "bzip/bzip.h" +#include "bzip/bzip3.h" #include "compress/compress.h" #include "rpm/rpm.h" #include "lzh/lzh.h" +#include "lzma/unlzma.h" +#include "zstd/unzstd.h" #include "tar.rh" #include "tar.rh2" @@ -97,14 +99,32 @@ CDecompressFile::CreateInstance(LPCTSTR fileName, DWORD inputOffset, CQuadWord i archive = new CBZip(fileName, file, buffer, inputOffset, read, inputSize); if (archive != NULL && !archive->IsOk() && archive->GetErrorCode() == 0) { - // not compress, try lzh + // not bzip, try lzh delete archive; archive = new CLZH(fileName, file, buffer, read); if (archive != NULL && !archive->IsOk() && archive->GetErrorCode() == 0) { - // not compressed, fall back to the base class + // not lzh, try lzma delete archive; - archive = new CDecompressFile(fileName, file, buffer, inputOffset, read, inputSize); + archive = new CLZMa(fileName, file, buffer, inputOffset, read, inputSize); + if (archive != NULL && !archive->IsOk() && archive->GetErrorCode() == 0) + { + // not lzma, try zstd + delete archive; + archive = new CZStd(fileName, file, buffer, inputOffset, read, inputSize); + if (archive != NULL && !archive->IsOk() && archive->GetErrorCode() == 0) + { + // not zstd, try bzip3 + delete archive; + archive = new CBZip3(fileName, file, buffer, inputOffset, read, inputSize); + if (archive != NULL && !archive->IsOk() && archive->GetErrorCode() == 0) + { + // not compressed, fall back to the base class + delete archive; + archive = new CDecompressFile(fileName, file, buffer, inputOffset, read, inputSize); + } + } + } } } } @@ -130,7 +150,7 @@ CDecompressFile::CreateInstance(LPCTSTR fileName, DWORD inputOffset, CQuadWord i // class constructor CDecompressFile::CDecompressFile(const char* filename, HANDLE file, unsigned char* buffer, unsigned long start, unsigned long read, CQuadWord inputSize) : FileName(filename), File(file), Buffer(buffer), DataStart(buffer), DataEnd(buffer + read), - OldName(NULL), Ok(TRUE), StreamPos(start, 0), ErrorCode(0), LastError(0), FreeBufAndFile(TRUE) + OldName(NULL), Ok(TRUE), InputPos(0, 0), StreamPos(start, 0), ErrorCode(0), LastError(0), FreeBufAndFile(TRUE) { CALL_STACK_MESSAGE3("CDecompressFile::CDecompressFile(%s, , %u)", filename, read); @@ -204,9 +224,9 @@ CDecompressFile::FReadBlock(unsigned int number) { DWORD read = (DWORD)(Buffer + BUFSIZE - DataEnd); - if (StreamPos.Value + read > InputSize.Value) + if (InputPos.Value + read > InputSize.Value) { - read = (DWORD)(InputSize.Value - StreamPos.Value); + read = (DWORD)(InputSize.Value - InputPos.Value); } if (!ReadFile(File, DataEnd, read, &read, NULL)) @@ -230,6 +250,7 @@ CDecompressFile::FReadBlock(unsigned int number) // adjust the pointers DataStart += number; StreamPos += CQuadWord(number, 0); + InputPos = min(InputPos + CQuadWord(number, 0), InputSize); // and return the result return ret; } @@ -274,6 +295,7 @@ CDecompressFile::FReadByte() } // adjust the pointers ++StreamPos; + InputPos = min(++InputPos, InputSize); return *(DataStart++); } @@ -313,6 +335,7 @@ void CDecompressFile::Rewind(unsigned short size) { DataStart -= size; StreamPos.Value -= size; + InputPos.Value -= size; } else { diff --git a/src/plugins/tar/fileio.h b/src/plugins/tar/fileio.h index 2f3c880c1..53dc4d303 100644 --- a/src/plugins/tar/fileio.h +++ b/src/plugins/tar/fileio.h @@ -16,23 +16,26 @@ class CDecompressFile CDecompressFile(const char* filename, HANDLE file, unsigned char* buffer, unsigned long start, unsigned long read, CQuadWord size); virtual ~CDecompressFile(); - virtual BOOL IsCompressed() { return FALSE; } - virtual BOOL BuggySize() { return FALSE; } + virtual BOOL IsCompressed() const { return FALSE; } // returns our current state - BOOL IsOk() { return Ok; } + BOOL IsOk() const { return Ok; } // if an error occurred, returns its code - const unsigned int GetErrorCode() { return ErrorCode; } + unsigned int GetErrorCode() const { return ErrorCode; } // if a system error occurred (I/O etc.) returns more detail (::GetLastError()) - const DWORD GetLastErr() { return LastError; } + DWORD GetLastErr() const { return LastError; } + // returns sie of bugger with unread data + size_t GetUnreadInputBufferSize() const { return min(size_t(DataEnd - DataStart), (InputSize - InputPos).LoDWord); } // returns the size of the archive on disk - CQuadWord GetStreamSize() { return InputSize; } + CQuadWord GetStreamSize() const { return InputSize; } + // returns current position in the file of the archive on disk + CQuadWord GetInputPos() const { return InputPos; } // returns the current position in the archive on disk - CQuadWord GetStreamPos() { return StreamPos; } + CQuadWord GetStreamPos() const { return StreamPos; } // returns the original file name stored in the archive (the tar name in gzip, etc.) const char* GetOldName(); // returns the name of the file it works with (the archive name) - const char* GetArchiveName() { return FileName; } + const char* GetArchiveName() const { return FileName; } // returns part or all of the last read block for further use virtual void Rewind(unsigned short size); @@ -53,7 +56,8 @@ class CDecompressFile unsigned int ErrorCode; // if an error occurred, it is specified here const char* FileName; // archive name we are working with char* OldName; // original file name before packing - CQuadWord InputSize; // archive size + CQuadWord InputSize; // archive size (partial) + CQuadWord InputPos; // position in the archive (partial) CQuadWord StreamPos; // position in the archive (for progress) HANDLE File; // opened archive DWORD LastError; // if there was a system error (I/O...), the details are here @@ -67,13 +71,13 @@ class CZippedFile : public CDecompressFile public: // constructor and destructor CZippedFile(const char* filename, HANDLE file, unsigned char* buffer, unsigned long start, unsigned long read, CQuadWord inputSize); - virtual ~CZippedFile(); + ~CZippedFile() override; - virtual BOOL IsCompressed() { return TRUE; } + BOOL IsCompressed() const override { return TRUE; } - virtual void GetFileInfo(FILETIME& lastWrite, CQuadWord& fileSize, DWORD& fileAttr); - virtual const unsigned char* GetBlock(unsigned short size, unsigned short* read); - virtual void Rewind(unsigned short size); + void GetFileInfo(FILETIME& lastWrite, CQuadWord& fileSize, DWORD& fileAttr) override; + const unsigned char* GetBlock(unsigned short size, unsigned short* read) override; + void Rewind(unsigned short size) override; protected: unsigned char* Window; // output circular buffer diff --git a/src/plugins/tar/gzip/gunzip.cpp b/src/plugins/tar/gzip/gunzip.cpp index f18fa2e5c..ac0abf2ed 100644 --- a/src/plugins/tar/gzip/gunzip.cpp +++ b/src/plugins/tar/gzip/gunzip.cpp @@ -35,7 +35,7 @@ struct SHufTable }; // CRCs -unsigned long crc_32_tab[] = +static const unsigned long crc_32_tab[] = { 0x00000000L, 0x77073096L, 0xee0e612cL, 0x990951baL, 0x076dc419L, 0x706af48fL, 0xe963a535L, 0x9e6495a3L, 0x0edb8832L, 0x79dcb8a4L, @@ -972,7 +972,7 @@ BOOL CGZip::InflateBlock() CGZip::CGZip(const char* filename, HANDLE file, unsigned char* buffer, unsigned long start, unsigned long read, CQuadWord inputSize) : CZippedFile(filename, file, buffer, start, read, inputSize), CopyInProgress(FALSE), LastBlock(FALSE), CopyCount(0), CopyDistance(0), BlockType(0), LiteralTable(NULL), LiteralBits(0), DistanceTable(NULL), DistanceBits(0), FixedLiteralTable(NULL), FixedLiteralBits(0), FixedDistanceTable(NULL), - FixedDistanceBits(0), StoredLen(0), BitBuffer(0), BitCount(0), InProgress(FALSE) + FixedDistanceBits(0), StoredLen(0), BitBuffer(0), BitCount(0), crc(0xffffffffL), InProgress(FALSE) { CALL_STACK_MESSAGE2("CGZip::CGZip(%s, , , )", filename); diff --git a/src/plugins/tar/gzip/gzip.h b/src/plugins/tar/gzip/gzip.h index 6def2caaa..e5c72ec0a 100644 --- a/src/plugins/tar/gzip/gzip.h +++ b/src/plugins/tar/gzip/gzip.h @@ -100,6 +100,6 @@ class CGZip : public CZippedFile int HufTableBuild(unsigned int* b, unsigned int n, unsigned int s, unsigned short* d, unsigned short* e, SHufTable** t, int* m); - virtual BOOL CompactBuffer(); - virtual BOOL DecompressBlock(unsigned short needed); + BOOL CompactBuffer() override; + BOOL DecompressBlock(unsigned short needed) override; }; diff --git a/src/plugins/tar/help/hh/tar/introduction_intro.htm b/src/plugins/tar/help/hh/tar/introduction_intro.htm index d97d2c37d..96e264fa9 100644 --- a/src/plugins/tar/help/hh/tar/introduction_intro.htm +++ b/src/plugins/tar/help/hh/tar/introduction_intro.htm @@ -13,8 +13,9 @@

Getting Started with TAR Plugin

-

The TAR plugin adds support for browsing and unpacking TAR, GZIP, BZIP, BZIP2, -RPM, CPIO, DEB, and Z archives. It can also display information from RPM archives.

+

The TAR plugin adds support for browsing and unpacking of TAR, GZIP, BZIP, BZIP2, +BZIP3, RPM, CPIO, DEB, XZ, ZStd and Z archives. It can also display information from +RPM archives.

See the Archiver and File Viewer sections in Using Plugins for a description of basic work with plugin archivers and viewers.

diff --git a/src/plugins/tar/lzh/lzh.h b/src/plugins/tar/lzh/lzh.h index d566a3463..e3209fdb9 100644 --- a/src/plugins/tar/lzh/lzh.h +++ b/src/plugins/tar/lzh/lzh.h @@ -9,10 +9,10 @@ class CLZH : public CZippedFile { public: CLZH(const char* filename, HANDLE file, unsigned char* buffer, unsigned long read); - virtual ~CLZH(); + ~CLZH() override; - virtual BOOL IsCompressed() { return TRUE; } + BOOL IsCompressed() const override { return TRUE; } protected: - BOOL DecompressBlock(unsigned short needed); + BOOL DecompressBlock(unsigned short needed) override; }; diff --git a/src/plugins/tar/lzma/unlzma.cpp b/src/plugins/tar/lzma/unlzma.cpp new file mode 100644 index 000000000..adfbe67c3 --- /dev/null +++ b/src/plugins/tar/lzma/unlzma.cpp @@ -0,0 +1,120 @@ +// SPDX-FileCopyrightText: 2023 Open Salamander Authors +// SPDX-License-Identifier: GPL-2.0-or-later + +#include "precomp.h" + +#include "../dlldefs.h" +#include "../fileio.h" +#include "unlzma.h" + +#include "..\tar.rh" +#include "..\tar.rh2" +#include "..\lang\lang.rh" + +CLZMa::CLZMa(const char* filename, HANDLE file, unsigned char* buffer, unsigned long start, unsigned long read, CQuadWord inputSize) : CZippedFile(filename, file, buffer, start, read, inputSize) +{ + CALL_STACK_MESSAGE2("CLZMa::CLZMa(%s, , , )", filename); + + // if the parent constructor failed, bail out immediately + if (!Ok) + return; + + // this cannot be a lzma archive if we have less than the identifier... + if (DataEnd - DataStart < 6) + { + Ok = FALSE; + FreeBufAndFile = FALSE; + return; + } + // if the "magic number" is not at the start, it is not a lzma stream + if (DataStart[0] != 0xFD || DataStart[1] != '7' || + DataStart[2] != 'z' || DataStart[3] != 'X' || + DataStart[4] != 'Z' || DataStart[5] != 0) + { + Ok = FALSE; + FreeBufAndFile = FALSE; + return; + } + // a valid archive is present; confirm the consumed header + + // stream initialization + lzma_ret ret = lzma_stream_decoder(&m_strm, UINT64_MAX, LZMA_CONCATENATED); + if (ret != LZMA_OK) + { + Ok = FALSE; + FreeBufAndFile = FALSE; + switch (ret) + { + case LZMA_MEM_ERROR: + ErrorCode = IDS_ERR_MEMORY; + break; + case LZMA_OPTIONS_ERROR: + case LZMA_PROG_ERROR: + default: + ErrorCode = IDS_ERR_INTERNAL; + break; + } + return; + } + + // done +} + +CLZMa::~CLZMa() +{ + CALL_STACK_MESSAGE1("CLZMa::~CLZMa()"); + lzma_end(&m_strm); +} + +BOOL CLZMa::DecompressBlock(unsigned short needed) +{ + if (EndReached) + return TRUE; + int ret = LZMA_OK; + lzma_action action = LZMA_RUN; + while (ret != LZMA_STREAM_END && ExtrEnd < Window + BUFSIZE) + { + unsigned char* src = DataStart; + // at least one byte must already be buffered + if (DataEnd == DataStart) + src = (unsigned char*)FReadBlock(0); + if (src == NULL) + return FALSE; + if (GetInputPos() == GetStreamSize()) + action = LZMA_FINISH; + m_strm.next_in = (uint8_t*)DataStart; + m_strm.avail_in = GetUnreadInputBufferSize(); + m_strm.next_out = (uint8_t*)ExtrEnd; + m_strm.avail_out = BUFSIZE - (unsigned int)(ExtrEnd - Window); + + ret = lzma_code(&m_strm, action); + + if (ret != LZMA_OK && ret != LZMA_STREAM_END) + { + Ok = FALSE; + switch (ret) + { + case LZMA_DATA_ERROR: + case LZMA_FORMAT_ERROR: + ErrorCode = IDS_ERR_CORRUPT; + break; + case LZMA_MEM_ERROR: + case LZMA_MEMLIMIT_ERROR: + ErrorCode = IDS_ERR_MEMORY; + break; + case LZMA_PROG_ERROR: + default: + ErrorCode = IDS_ERR_INTERNAL; + break; + } + return FALSE; + } + // commit the consumed input bytes + FReadBlock((unsigned int)(m_strm.next_in - (uint8_t*)DataStart)); + unsigned short extracted = (unsigned short)((unsigned char*)m_strm.next_out - ExtrEnd); + ExtrEnd = (unsigned char*)m_strm.next_out; + } + if (ret == LZMA_STREAM_END) + EndReached = TRUE; + return TRUE; +} diff --git a/src/plugins/tar/lzma/unlzma.h b/src/plugins/tar/lzma/unlzma.h new file mode 100644 index 000000000..f6302fec9 --- /dev/null +++ b/src/plugins/tar/lzma/unlzma.h @@ -0,0 +1,19 @@ +// SPDX-FileCopyrightText: 2023 Open Salamander Authors +// SPDX-License-Identifier: GPL-2.0-or-later + +#pragma once + +#include + +class CLZMa : public CZippedFile +{ +public: + CLZMa(const char* filename, HANDLE file, unsigned char* buffer, unsigned long start, unsigned long read, CQuadWord inputSize); + ~CLZMa() override; + +protected: + BOOL EndReached{FALSE}; // set, when all data was extracted + + lzma_stream m_strm{}; + BOOL DecompressBlock(unsigned short needed) override; +}; diff --git a/src/plugins/tar/rpm/rpm.cpp b/src/plugins/tar/rpm/rpm.cpp index 97fa2fbfd..f74a71f71 100644 --- a/src/plugins/tar/rpm/rpm.cpp +++ b/src/plugins/tar/rpm/rpm.cpp @@ -6,7 +6,7 @@ #include "../dlldefs.h" #include "../fileio.h" #include "../gzip/gzip.h" -#include "../bzip/bzlib.h" +#include #include "../bzip/bzip.h" #include "rpm.h" @@ -136,4 +136,4 @@ void CRPM::GetFileInfo(FILETIME& lastWrite, CQuadWord& fileSize, DWORD& fileAttr return ret; } return CDecompressFile::FReadBlock(number); -}*/ \ No newline at end of file +}*/ diff --git a/src/plugins/tar/rpm/rpm.h b/src/plugins/tar/rpm/rpm.h index 3cea85ea8..8d30e9f06 100644 --- a/src/plugins/tar/rpm/rpm.h +++ b/src/plugins/tar/rpm/rpm.h @@ -292,15 +292,15 @@ class CRPM : public CDecompressFile public: CRPM(const char* filename, HANDLE file, unsigned char* buffer, unsigned long read, FILE* fContents = NULL); - ~CRPM(void); + ~CRPM(void) override; BOOL RPMDumpLead(FILE* fContents, short& SignatureType); BOOL RPMReadSignature(FILE* fContents, short signatureType); BOOL RPMReadSection(FILE* fContents); BOOL RPMReadHeader(FILE* fContents); - virtual const unsigned char* GetBlock(unsigned short size, unsigned short* read = NULL); - virtual void Rewind(unsigned short size); - virtual void GetFileInfo(FILETIME& lastWrite, CQuadWord& fileSize, DWORD& fileAttr); + const unsigned char* GetBlock(unsigned short size, unsigned short* read = NULL) override; + void Rewind(unsigned short size) override; + void GetFileInfo(FILETIME& lastWrite, CQuadWord& fileSize, DWORD& fileAttr) override; // Should other functions be forwarded to Stream????? }; diff --git a/src/plugins/tar/tar.h b/src/plugins/tar/tar.h index 75ef0373e..530451d0f 100644 --- a/src/plugins/tar/tar.h +++ b/src/plugins/tar/tar.h @@ -274,7 +274,7 @@ class CArchiveAbstract SalEnumSelection nextName, void* param) = 0; virtual BOOL UnpackWholeArchive(const char* mask, const char* targetPath) = 0; - virtual BOOL IsOk() = 0; + virtual BOOL IsOk() const = 0; }; class CArchive : public CArchiveAbstract @@ -310,14 +310,14 @@ class CArchive : public CArchiveAbstract CArchive(LPCTSTR fileName, CSalamanderForOperationsAbstract* salamander, DWORD offset, CQuadWord inputSize); ~CArchive(); - BOOL IsOk() { return Ok; } + BOOL IsOk() const override { return Ok; } - BOOL ListArchive(const char* prefix, CSalamanderDirectoryAbstract* dir); + BOOL ListArchive(const char* prefix, CSalamanderDirectoryAbstract* dir) override; BOOL UnpackOneFile(const char* nameInArchive, const CFileData* fileData, - const char* targetPath, const char* newFileName); + const char* targetPath, const char* newFileName) override; BOOL UnpackArchive(const char* targetPath, const char* archiveRoot, - SalEnumSelection nextName, void* param); - BOOL UnpackWholeArchive(const char* mask, const char* targetPath); + SalEnumSelection nextName, void* param) override; + BOOL UnpackWholeArchive(const char* mask, const char* targetPath) override; BOOL DoUnpackArchive(const char* targetPath, const char* archiveRoot, CNames& names); }; diff --git a/src/plugins/tar/tardll.cpp b/src/plugins/tar/tardll.cpp index 86f9f0456..8fdadffd2 100644 --- a/src/plugins/tar/tardll.cpp +++ b/src/plugins/tar/tardll.cpp @@ -13,6 +13,12 @@ #include "tar.rh2" #include "lang\lang.rh" +// just to get versions of the 3rd party libs +#include +#include +#include +#include + // TODO: resolve case sensitivity // TODO: handle multiple files with the same name in one archive // TODO: finish the output in the RPM viewer (convert dates to a readable format, etc.) @@ -40,9 +46,10 @@ // 3 - work-in-progress version before Servant Salamander 2.5 beta 1, removed the *.CPIO viewer // 4 - work-in-progress version before Servant Salamander 2.5 beta 1, added .z archives // 5 - work-in-progress version before Servant Salamander 2.52 beta 2, added .DEB archives +// 6 - added .bzip3, .xz and .zst archives int ConfigVersion = 0; -#define CURRENT_CONFIG_VERSION 5 +#define CURRENT_CONFIG_VERSION 6 const char* CONFIG_VERSION = "Version"; // plugin interface object, its methods are called from Salamander @@ -158,7 +165,7 @@ CPluginInterfaceAbstract* WINAPI SalamanderPluginEntry(CSalamanderPluginEntryAbs VERSINFO_VERSION_NO_PLATFORM, VERSINFO_COPYRIGHT, LoadStr(IDS_PLUGIN_DESCRIPTION), - "TAR" /* do not translate */, "tar;tgz;taz;tbz;gz;bz;bz2;z;rpm;cpio;deb"); + "TAR" /* do not translate! */, "tar;tgz;taz;tbz;gz;bz;bz2;bz3;xz;zst;z;rpm;cpio;deb;ipk"); salamander->SetPluginHomePageURL("www.altap.cz"); @@ -167,12 +174,28 @@ CPluginInterfaceAbstract* WINAPI SalamanderPluginEntry(CSalamanderPluginEntryAbs void CPluginInterface::About(HWND parent) { - char buf[1000]; + // strip additional information after ',' from bzip version string + const char* bzip_ver = BZ2_bzlibVersion(); + auto bzip_ver_len = strcspn(bzip_ver, ","); + if (!bzip_ver_len) + bzip_ver_len = strlen(bzip_ver); + + char buf[3000]; _snprintf_s(buf, _TRUNCATE, - "%s " VERSINFO_VERSION "\n\n" VERSINFO_COPYRIGHT "\nbzip2 library Copyright © 1996-2010 Julian R Seward\n\n" - "%s", + "%s " VERSINFO_VERSION "\n" VERSINFO_COPYRIGHT "\n\n" + "%s\n\n" + "Built with 3rd party libraries:\n" + "- bzip2, Copyright © 1996-2025 Julian R Seward (version %.*s)\n" + "- bzip3, Copyright © by Kamila Szewczyk, 2022-2025 (version %s)\n" + "- lzma (version %s)\n" + "- Zstandard, Copyright © 2016-2025 Facebook, Inc. (version %s)\n\n", LoadStr(IDS_PLUGINNAME), - LoadStr(IDS_PLUGIN_DESCRIPTION)); + LoadStr(IDS_PLUGIN_DESCRIPTION), + static_cast(bzip_ver_len), bzip_ver, + bz3_version(), + lzma_version_string(), + ZSTD_versionString() + ); SalamanderGeneral->SalMessageBox(parent, buf, LoadStr(IDS_ABOUT), MB_OK | MB_ICONINFORMATION); } @@ -204,18 +227,20 @@ void CPluginInterface::Connect(HWND parent, CSalamanderConnectAbstract* salamand { CALL_STACK_MESSAGE1("CPluginInterface::Connect()"); + // ignored during upgrades except when upgrading to version 4 - required update because of "*.z" and others + bool upgrade = ConfigVersion < CURRENT_CONFIG_VERSION; + // base part: - salamander->AddCustomUnpacker("TAR (Plugin)", - "*.tar;*.tgz;*.tbz;*.taz;" - "*.tar.gz;*.tar.bz;*.tar.bz2;*.tar.z;" - "*_tar.gz;*_tar.bz;*_tar.bz2;*_tar.z;" - "*_tar_gz;*_tar_bz;*_tar_bz2;*_tar_z;" - "*.tar_gz;*.tar_bz;*.tar_bz2;*.tar_z;" - "*.gz;*.bz;*.bz2;*.z;" - "*.rpm;*.cpio;*.deb", - ConfigVersion < 5); // ignored during upgrades except when upgrading to version 4 - required update because of "*.z" and others - salamander->AddPanelArchiver("tgz;tbz;taz;tar;gz;bz;bz2;z;rpm;cpio;deb", FALSE, FALSE); // ignored when upgrading the plugin - salamander->AddViewer("*.rpm", FALSE); // ignored when upgrading the plugin except when upgrading from a version without the viewer (the version shipped with SS 2.0) + salamander->AddCustomUnpacker("TAR-z (Plugin)", "*.z;*.tz;*taz;*.tar.z;*_tar.z;*_tar_z;*.tar_z", upgrade); + salamander->AddCustomUnpacker("TAR-zst (Plugin)", "*.zst;*.tzs;*.tar.zst;*_tar.zst;*_tar_zst;*.tar_zst", upgrade); + salamander->AddCustomUnpacker("TAR-xz (Plugin)", "*.xz;*.txz;*.tar.xz;*_tar.xz;*_tar_xz;*.tar_xz", upgrade); + salamander->AddCustomUnpacker("TAR-bz3 (Plugin)", "*.bz3;*.tbz3;*.tar.bz3;*_tar.bz3;*_tar_bz3;*.tar_bz3", upgrade); + salamander->AddCustomUnpacker("TAR-bz2 (Plugin)", "*.bz2;*.tbz2;*.tar.bz2;*_tar.bz2;*_tar_bz2;*.tar_bz2", upgrade); + salamander->AddCustomUnpacker("TAR-bz (Plugin)", "*.bz;*.tbz;*.tar.bz;*_tar.bz;*_tar_bz;*.tar_bz;", upgrade); + salamander->AddCustomUnpacker("TAR-gz (Plugin)", "*.gz;*.tgz;*.tar.gz;*_tar.gz;*_tar_gz;*.tar_gz", upgrade); + salamander->AddCustomUnpacker("TAR (Plugin)", "*.tar;*.rpm;*.cpio;*.deb;*.ipk", upgrade); + salamander->AddPanelArchiver("tgz;tbz;taz;tar;gz;bz;bz2;bz3;xz;zst;z;rpm;cpio;deb;ipk", FALSE, FALSE); // ignored when upgrading the plugin + salamander->AddViewer("*.rpm", FALSE); // ignored when upgrading the plugin except when upgrading from a version without the viewer (the version shipped with SS 2.0) // section for upgrades: if (ConfigVersion < 1) // 1 - work-in-progress version before Servant Salamander 2.5 beta 1, added tbz, bz, bz2, and rpm @@ -244,7 +269,12 @@ void CPluginInterface::Connect(HWND parent, CSalamanderConnectAbstract* salamand } if (ConfigVersion < 5) // 5 - work-in-progress version before Servant Salamander 2.52 beta 2, added .deb archives { - salamander->AddPanelArchiver("deb", FALSE, TRUE); + salamander->AddPanelArchiver("deb;ipk", FALSE, TRUE); + } + + if (ConfigVersion < 6) // 6 - added xz, zst a bz3 archives + { + salamander->AddPanelArchiver("xz;zst;bz3", FALSE, TRUE); } } @@ -457,8 +487,8 @@ BOOL CPluginInterfaceForViewer::ViewFile(const char* name, int left, int top, in free(buffer); CloseHandle(file); buff[499] = '\0'; - strcpy(buff, LoadStr(IDS_RPMERR_TMPFILE)); - strncat(buff, name, 499 - strlen(buff)); + strcpy_s(buff, LoadStr(IDS_RPMERR_TMPFILE)); + strncat_s(buff, name, 499 - strlen(buff)); SalamanderGeneral->ShowMessageBox(buff, LoadStr(IDS_ERR_RPMTITLE), MSGBOX_ERROR); return FALSE; } @@ -503,8 +533,8 @@ BOOL CPluginInterfaceForViewer::ViewFile(const char* name, int left, int top, in textViewerData.Mode = 0; // text mode char caption[500]; strncpy_s(caption, 451, name, _TRUNCATE); - strcat(caption, " - "); - strcat(caption, LoadStr(IDS_RPM_VIEWTITLE)); + strcat_s(caption, " - "); + strcat_s(caption, LoadStr(IDS_RPM_VIEWTITLE)); textViewerData.Caption = caption; textViewerData.WholeCaption = TRUE; // show the file in Salamander's text viewer and delete it afterwards diff --git a/src/plugins/tar/tardll.h b/src/plugins/tar/tardll.h index 74141a520..67d1bcc28 100644 --- a/src/plugins/tar/tardll.h +++ b/src/plugins/tar/tardll.h @@ -11,81 +11,81 @@ class CPluginInterfaceForArchiver : public CPluginInterfaceForArchiverAbstract { public: - virtual BOOL WINAPI ListArchive(CSalamanderForOperationsAbstract* salamander, const char* fileName, - CSalamanderDirectoryAbstract* dir, - CPluginDataInterfaceAbstract*& pluginData); - virtual BOOL WINAPI UnpackArchive(CSalamanderForOperationsAbstract* salamander, const char* fileName, - CPluginDataInterfaceAbstract* pluginData, const char* targetDir, - const char* archiveRoot, SalEnumSelection next, void* nextParam); - virtual BOOL WINAPI UnpackOneFile(CSalamanderForOperationsAbstract* salamander, const char* fileName, - CPluginDataInterfaceAbstract* pluginData, const char* nameInArchive, - const CFileData* fileData, const char* targetDir, - const char* newFileName, BOOL* renamingNotSupported); - virtual BOOL WINAPI PackToArchive(CSalamanderForOperationsAbstract* salamander, const char* fileName, - const char* archiveRoot, BOOL move, const char* sourcePath, - SalEnumSelection2 next, void* nextParam) + BOOL WINAPI ListArchive(CSalamanderForOperationsAbstract* salamander, const char* fileName, + CSalamanderDirectoryAbstract* dir, + CPluginDataInterfaceAbstract*& pluginData) override; + BOOL WINAPI UnpackArchive(CSalamanderForOperationsAbstract* salamander, const char* fileName, + CPluginDataInterfaceAbstract* pluginData, const char* targetDir, + const char* archiveRoot, SalEnumSelection next, void* nextParam) override; + BOOL WINAPI UnpackOneFile(CSalamanderForOperationsAbstract* salamander, const char* fileName, + CPluginDataInterfaceAbstract* pluginData, const char* nameInArchive, + const CFileData* fileData, const char* targetDir, + const char* newFileName, BOOL* renamingNotSupported) override; + BOOL WINAPI PackToArchive(CSalamanderForOperationsAbstract* salamander, const char* fileName, + const char* archiveRoot, BOOL move, const char* sourcePath, + SalEnumSelection2 next, void* nextParam) override { return FALSE; } - virtual BOOL WINAPI DeleteFromArchive(CSalamanderForOperationsAbstract* salamander, const char* fileName, - CPluginDataInterfaceAbstract* pluginData, const char* archiveRoot, - SalEnumSelection next, void* nextParam) + BOOL WINAPI DeleteFromArchive(CSalamanderForOperationsAbstract* salamander, const char* fileName, + CPluginDataInterfaceAbstract* pluginData, const char* archiveRoot, + SalEnumSelection next, void* nextParam) override { return FALSE; } - virtual BOOL WINAPI UnpackWholeArchive(CSalamanderForOperationsAbstract* salamander, const char* fileName, - const char* mask, const char* targetDir, BOOL delArchiveWhenDone, - CDynamicString* archiveVolumes); - virtual BOOL WINAPI CanCloseArchive(CSalamanderForOperationsAbstract* salamander, const char* fileName, - BOOL force, int panel) + BOOL WINAPI UnpackWholeArchive(CSalamanderForOperationsAbstract* salamander, const char* fileName, + const char* mask, const char* targetDir, BOOL delArchiveWhenDone, + CDynamicString* archiveVolumes) override; + BOOL WINAPI CanCloseArchive(CSalamanderForOperationsAbstract* salamander, const char* fileName, + BOOL force, int panel) override { return TRUE; } - virtual BOOL WINAPI GetCacheInfo(char* tempPath, BOOL* ownDelete, BOOL* cacheCopies) { return FALSE; } - virtual void WINAPI DeleteTmpCopy(const char* fileName, BOOL firstFile) {} - virtual BOOL WINAPI PrematureDeleteTmpCopy(HWND parent, int copiesCount) { return FALSE; } + BOOL WINAPI GetCacheInfo(char* tempPath, BOOL* ownDelete, BOOL* cacheCopies) override { return FALSE; } + void WINAPI DeleteTmpCopy(const char* fileName, BOOL firstFile) override {} + BOOL WINAPI PrematureDeleteTmpCopy(HWND parent, int copiesCount) override { return FALSE; } }; class CPluginInterfaceForViewer : public CPluginInterfaceForViewerAbstract { public: - virtual BOOL WINAPI ViewFile(const char* name, int left, int top, int width, int height, - UINT showCmd, BOOL alwaysOnTop, BOOL returnUnlock, HANDLE* unlock, - BOOL* unlockOwner, CSalamanderPluginViewerData* viewerData, - int enumFilesSourceUID, int enumFilesCurrentIndex); - virtual BOOL WINAPI CanViewFile(const char* name) { return TRUE; } + BOOL WINAPI ViewFile(const char* name, int left, int top, int width, int height, + UINT showCmd, BOOL alwaysOnTop, BOOL returnUnlock, HANDLE* unlock, + BOOL* unlockOwner, CSalamanderPluginViewerData* viewerData, + int enumFilesSourceUID, int enumFilesCurrentIndex) override; + BOOL WINAPI CanViewFile(const char* name) override { return TRUE; } }; class CPluginInterface : public CPluginInterfaceAbstract { public: - virtual void WINAPI About(HWND parent); + void WINAPI About(HWND parent) override; - virtual BOOL WINAPI Release(HWND parent, BOOL force) { return TRUE; } + BOOL WINAPI Release(HWND parent, BOOL force) override { return TRUE; } - virtual void WINAPI LoadConfiguration(HWND parent, HKEY regKey, CSalamanderRegistryAbstract* registry); - virtual void WINAPI SaveConfiguration(HWND parent, HKEY regKey, CSalamanderRegistryAbstract* registry); + void WINAPI LoadConfiguration(HWND parent, HKEY regKey, CSalamanderRegistryAbstract* registry) override; + void WINAPI SaveConfiguration(HWND parent, HKEY regKey, CSalamanderRegistryAbstract* registry) override; - virtual void WINAPI Configuration(HWND parent) + void WINAPI Configuration(HWND parent) override { } - virtual void WINAPI Connect(HWND parent, CSalamanderConnectAbstract* salamander); + void WINAPI Connect(HWND parent, CSalamanderConnectAbstract* salamander) override; - virtual void WINAPI ReleasePluginDataInterface(CPluginDataInterfaceAbstract* pluginData) + void WINAPI ReleasePluginDataInterface(CPluginDataInterfaceAbstract* pluginData) override { return; } - virtual CPluginInterfaceForArchiverAbstract* WINAPI GetInterfaceForArchiver(); - virtual CPluginInterfaceForViewerAbstract* WINAPI GetInterfaceForViewer(); - virtual CPluginInterfaceForMenuExtAbstract* WINAPI GetInterfaceForMenuExt() { return NULL; } - virtual CPluginInterfaceForFSAbstract* WINAPI GetInterfaceForFS() { return NULL; } - virtual CPluginInterfaceForThumbLoaderAbstract* WINAPI GetInterfaceForThumbLoader() { return NULL; } + CPluginInterfaceForArchiverAbstract* WINAPI GetInterfaceForArchiver() override; + CPluginInterfaceForViewerAbstract* WINAPI GetInterfaceForViewer() override; + CPluginInterfaceForMenuExtAbstract* WINAPI GetInterfaceForMenuExt() override { return NULL; } + CPluginInterfaceForFSAbstract* WINAPI GetInterfaceForFS() override { return NULL; } + CPluginInterfaceForThumbLoaderAbstract* WINAPI GetInterfaceForThumbLoader() override { return NULL; } - virtual void WINAPI Event(int event, DWORD param) {} - virtual void WINAPI ClearHistory(HWND parent) {} - virtual void WINAPI AcceptChangeOnPathNotification(const char* path, BOOL includingSubdirs) {} + void WINAPI Event(int event, DWORD param) override {} + void WINAPI ClearHistory(HWND parent) override {} + void WINAPI AcceptChangeOnPathNotification(const char* path, BOOL includingSubdirs) override {} - virtual void WINAPI PasswordManagerEvent(HWND parent, int event) {} + void WINAPI PasswordManagerEvent(HWND parent, int event) override {} }; diff --git a/src/plugins/tar/untar.cpp b/src/plugins/tar/untar.cpp index 9190e2d0b..abc88117c 100644 --- a/src/plugins/tar/untar.cpp +++ b/src/plugins/tar/untar.cpp @@ -127,7 +127,6 @@ BOOL FromOctalQ(const unsigned char* ptr, const int length, CQuadWord& result) SCommonHeader::SCommonHeader() { Path = NULL; - ; Name = NULL; FileInfo.Name = NULL; Initialize(); @@ -242,9 +241,9 @@ BOOL CArchive::ListArchive(const char* prefix, CSalamanderDirectoryAbstract* dir if (prefix) { - strcpy(path, prefix); + strcpy_s(path, prefix); if (header.Path) - strcat(path, header.Path); + strcat_s(path, header.Path); } // add either a new file or a directory if (!header.IsDir) @@ -605,10 +604,10 @@ int CArchive::WriteOutData(const SCommonHeader& header, const char* targetPath, { char progresstxt[1000]; if (!toSkip) - strcpy(progresstxt, LoadStr(IDS_UNPACKPROGRESS_TEXT)); + strcpy_s(progresstxt, LoadStr(IDS_UNPACKPROGRESS_TEXT)); else - strcpy(progresstxt, LoadStr(IDS_SKIPPROGRESS_TEXT)); - strcat(progresstxt, header.Name); + strcpy_s(progresstxt, LoadStr(IDS_SKIPPROGRESS_TEXT)); + strcat_s(progresstxt, header.Name); SalamanderIf->ProgressDialogAddText(progresstxt, TRUE); } } @@ -790,8 +789,8 @@ int CArchive::WriteOutData(const SCommonHeader& header, const char* targetPath, { char buffer[1000]; DWORD err = GetLastError(); - strcpy(buffer, LoadStr(IDS_TARERR_FWRITE)); - strcat(buffer, SalamanderGeneral->GetErrorText(err)); + strcpy_s(buffer, LoadStr(IDS_TARERR_FWRITE)); + strcat_s(buffer, SalamanderGeneral->GetErrorText(err)); SalamanderGeneral->ShowMessageBox(buffer, LoadStr(IDS_TARERR_TITLE), MSGBOX_ERROR); DeleteFile(extractedName); free(extractedName); @@ -1062,6 +1061,7 @@ int CArchive::ReadArchiveHeader(SCommonHeader& header, BOOL probe) break; } // otherwise it is the start of the name; fall through to copying + [[fallthrough]]; default: // copy characters until the next slash while (*src != '\0' && *src != '\\' && *src != '/') @@ -1753,8 +1753,8 @@ BOOL CArchive::UnpackStream(const char* targetPath, BOOL doProgress, if (doProgress) { char progresstxt[1000]; - strcpy(progresstxt, LoadStr(IDS_UNPACKPROGRESS_TEXT)); - strcat(progresstxt, header.Name); + strcpy_s(progresstxt, LoadStr(IDS_UNPACKPROGRESS_TEXT)); + strcat_s(progresstxt, header.Name); SalamanderIf->ProgressDialogAddText(progresstxt, TRUE); } // the size field in the header may not be reliable; keep unpacking while data remains @@ -1821,8 +1821,8 @@ BOOL CArchive::UnpackStream(const char* targetPath, BOOL doProgress, { char buffer[1000]; DWORD err = GetLastError(); - strcpy(buffer, LoadStr(IDS_TARERR_FWRITE)); - strcat(buffer, SalamanderGeneral->GetErrorText(err)); + strcpy_s(buffer, LoadStr(IDS_TARERR_FWRITE)); + strcat_s(buffer, SalamanderGeneral->GetErrorText(err)); SalamanderGeneral->ShowMessageBox(buffer, LoadStr(IDS_TARERR_TITLE), MSGBOX_ERROR); DeleteFile(extractedName); free(extractedName); diff --git a/src/plugins/tar/vcpkg.json b/src/plugins/tar/vcpkg.json new file mode 100644 index 000000000..72729dd47 --- /dev/null +++ b/src/plugins/tar/vcpkg.json @@ -0,0 +1,9 @@ +{ + "dependencies": [ + "bzip2", + "bzip3", + "liblzma", + "zstd" + ], + "builtin-baseline": "66c0373dc7fca549e5803087b9487edfe3aca0a1" +} diff --git a/src/plugins/tar/vcxproj/tar.vcxproj b/src/plugins/tar/vcxproj/tar.vcxproj index 9b1f384d9..6a12f69d4 100644 --- a/src/plugins/tar/vcxproj/tar.vcxproj +++ b/src/plugins/tar/vcxproj/tar.vcxproj @@ -100,6 +100,12 @@ + + true + true + true + true + stdcpplatest @@ -125,56 +131,7 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + @@ -185,6 +142,8 @@ + + @@ -201,6 +160,8 @@ + + @@ -227,10 +188,8 @@ - - - - + + @@ -243,6 +202,8 @@ + + @@ -253,6 +214,8 @@ + + diff --git a/src/plugins/tar/vcxproj/tar.vcxproj.filters b/src/plugins/tar/vcxproj/tar.vcxproj.filters index 9416f6f01..634b0664f 100644 --- a/src/plugins/tar/vcxproj/tar.vcxproj.filters +++ b/src/plugins/tar/vcxproj/tar.vcxproj.filters @@ -34,6 +34,12 @@ {d598a82c-4f20-4296-a42b-e27d8d25cbb6} + + {4a4672c0-e6c6-4eb9-a9dc-9db2aa071d80} + + + {b9574fa6-0ec0-4458-b4c0-3f9d4ab0d553} + @@ -57,21 +63,6 @@ bzip - - bzip - - - bzip - - - bzip - - - bzip - - - bzip - deb @@ -90,6 +81,15 @@ compress + + zstd + + + lzma + + + bzip + @@ -143,12 +143,6 @@ bzip - - bzip - - - bzip - deb @@ -167,6 +161,18 @@ shared + + zstd + + + lzma + + + bzip + + + bzip + diff --git a/src/plugins/tar/versinfo.rh2 b/src/plugins/tar/versinfo.rh2 index 619f3a490..6ab933130 100644 --- a/src/plugins/tar/versinfo.rh2 +++ b/src/plugins/tar/versinfo.rh2 @@ -10,12 +10,12 @@ // look at shared\versinfo.rc #define VERSINFO_MAJOR 3 -#define VERSINFO_MINORA 3 -#define VERSINFO_MINORB 4 +#define VERSINFO_MINORA 5 +#define VERSINFO_MINORB 0 #include "spl_vers.h" // Extract version and build numbers. -#define VERSINFO_COPYRIGHT "Copyright © 1999-2023 Open Salamander Authors" +#define VERSINFO_COPYRIGHT "Copyright © 1999-2025 Open Salamander Authors" #define VERSINFO_COMPANY "Open Salamander" #define VERSINFO_DESCRIPTION "TAR plugin for Open Salamander" diff --git a/src/plugins/tar/zstd/unzstd.cpp b/src/plugins/tar/zstd/unzstd.cpp new file mode 100644 index 000000000..8ff553666 --- /dev/null +++ b/src/plugins/tar/zstd/unzstd.cpp @@ -0,0 +1,115 @@ +// SPDX-FileCopyrightText: 2023 Open Salamander Authors +// SPDX-License-Identifier: GPL-2.0-or-later + +#include "precomp.h" + +#include "../dlldefs.h" +#include "../fileio.h" +#include "unzstd.h" + +#include "..\tar.rh" +#include "..\tar.rh2" +#include "..\lang\lang.rh" + +#include + +CZStd::CZStd(const char* filename, HANDLE file, unsigned char* buffer, unsigned long start, unsigned long read, CQuadWord inputSize) : CZippedFile(filename, file, buffer, start, read, inputSize) +{ + CALL_STACK_MESSAGE2("CZStd::CZStd(%s, , , )", filename); + + // if the parent constructor failed, bail out immediately + if (!Ok) + return; + + // this cannot be a zstd archive if we have less than the identifier... + if (DataEnd - DataStart < 4) + { + Ok = FALSE; + FreeBufAndFile = FALSE; + return; + } + // if the "magic number" is not at the start, it is not a zstd stream + if (DataStart[0] != 0x28 || DataStart[1] != 0xB5 || + DataStart[2] != 0x2F || DataStart[3] != 0xFD) + { + Ok = FALSE; + FreeBufAndFile = FALSE; + return; + } + // a valid archive is present; confirm the consumed header + + // stream initialization + if (!m_DContext) + { + ErrorCode = IDS_ERR_INTERNAL; + return; + } + + // done +} + +CZStd::~CZStd() +{ + CALL_STACK_MESSAGE1("CZStd::~CZStd()"); + if (m_DContext) + ZSTD_freeDCtx(m_DContext); +} + +BOOL CZStd::DecompressBlock(unsigned short needed) +{ + if (EndReached) + return TRUE; + size_t lastRet = 1; + while (lastRet != 0 && ExtrEnd < Window + BUFSIZE) + { + unsigned char* src = DataStart; + // at least one byte must already be buffered + if (DataEnd == DataStart) + src = (unsigned char*)FReadBlock(0); + if (src == NULL) + return FALSE; + + ZSTD_inBuffer input = {DataStart, GetUnreadInputBufferSize(), 0}; + + while (lastRet != 0 && input.pos < input.size) + { + ZSTD_outBuffer output = {ExtrEnd, BUFSIZE - (unsigned int)(ExtrEnd - Window), 0}; + lastRet = ZSTD_decompressStream(m_DContext, &output, &input); + + if (ZSTD_isError(lastRet)) + { + Ok = FALSE; + switch (ZSTD_getErrorCode(lastRet)) + { + case ZSTD_error_prefix_unknown: + case ZSTD_error_dstSize_tooSmall: + case ZSTD_error_corruption_detected: + case ZSTD_error_checksum_wrong: + ErrorCode = IDS_ERR_CORRUPT; + break; + case ZSTD_error_memory_allocation: + ErrorCode = IDS_ERR_MEMORY; + break; + default: + ErrorCode = IDS_ERR_INTERNAL; + break; + } + return FALSE; + } + + // commit the consumed input bytes + FReadBlock((unsigned int)(((unsigned char*)input.src + input.pos) - (unsigned char*)DataStart)); + unsigned short extracted = (unsigned short)(((unsigned char*)output.dst + output.pos) - ExtrEnd); + ExtrEnd = (unsigned char*)output.dst + output.pos; + + // output buffer is full, let process it + if (output.pos == output.size) + break; + } + } + + if (lastRet == 0) + EndReached = TRUE; + + return TRUE; +} diff --git a/src/plugins/tar/zstd/unzstd.h b/src/plugins/tar/zstd/unzstd.h new file mode 100644 index 000000000..2ed9f25c9 --- /dev/null +++ b/src/plugins/tar/zstd/unzstd.h @@ -0,0 +1,19 @@ +// SPDX-FileCopyrightText: 2023 Open Salamander Authors +// SPDX-License-Identifier: GPL-2.0-or-later + +#pragma once + +#include + +class CZStd : public CZippedFile +{ +public: + CZStd(const char* filename, HANDLE file, unsigned char* buffer, unsigned long start, unsigned long read, CQuadWord inputSize); + ~CZStd() override; + +protected: + BOOL EndReached{FALSE}; // set, when all data was extracted + + ZSTD_DCtx* m_DContext{}; // zstd decompression context + BOOL DecompressBlock(unsigned short needed) override; +};