| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,77 @@ | ||
| project(bzip2 C) | ||
|
|
||
| include(CheckTypeSize) | ||
| include(CheckFunctionExists) | ||
| include(CheckIncludeFile) | ||
| include(CheckCSourceCompiles) | ||
|
|
||
| check_include_file(sys/types.h HAVE_SYS_TYPES_H) | ||
| check_include_file(stdint.h HAVE_STDINT_H) | ||
| check_include_file(stddef.h HAVE_STDDEF_H) | ||
|
|
||
| # Check to see if we have large file support | ||
| set(CMAKE_REQUIRED_DEFINITIONS -D_LARGEFILE64_SOURCE=1) | ||
| # We add these other definitions here because CheckTypeSize.cmake | ||
| # in CMake 2.4.x does not automatically do so and we want | ||
| # compatibility with CMake 2.4.x. | ||
| if(HAVE_SYS_TYPES_H) | ||
| list(APPEND CMAKE_REQUIRED_DEFINITIONS -DHAVE_SYS_TYPES_H) | ||
| endif() | ||
| if(HAVE_STDINT_H) | ||
| list(APPEND CMAKE_REQUIRED_DEFINITIONS -DHAVE_STDINT_H) | ||
| endif() | ||
| if(HAVE_STDDEF_H) | ||
| list(APPEND CMAKE_REQUIRED_DEFINITIONS -DHAVE_STDDEF_H) | ||
| endif() | ||
| check_type_size(off64_t OFF64_T) | ||
| if(HAVE_OFF64_T) | ||
| add_definitions(-D_LARGEFILE64_SOURCE=1) | ||
| endif() | ||
| set(CMAKE_REQUIRED_DEFINITIONS) # clear variable | ||
|
|
||
| # Check for fseeko | ||
| check_function_exists(fseeko HAVE_FSEEKO) | ||
| if(NOT HAVE_FSEEKO) | ||
| add_definitions(-DNO_FSEEKO) | ||
| endif() | ||
|
|
||
| # | ||
| # Check for unistd.h | ||
| # | ||
| check_include_file(unistd.h HAVE_UNISTD_H) | ||
| if(HAVE_UNISTD_H) | ||
| add_definitions(-DHAVE_UNISTD_H) | ||
| endif() | ||
|
|
||
| if(MSVC) | ||
| add_definitions(-D_CRT_SECURE_NO_DEPRECATE) | ||
| add_definitions(-D_CRT_NONSTDC_NO_DEPRECATE) | ||
| endif() | ||
|
|
||
| #============================================================================ | ||
| # bzip2 | ||
| #============================================================================ | ||
|
|
||
| set(BZIP2_PUBLIC_HDRS | ||
| bzlib.h | ||
| ) | ||
| set(BZIP2_PRIVATE_HDRS | ||
| bzlib_private.h | ||
| ) | ||
| set(BZIP2_SRCS | ||
| blocksort.c | ||
| huffman.c | ||
| crctable.c | ||
| randtable.c | ||
| compress.c | ||
| decompress.c | ||
| bzlib.c | ||
| ) | ||
|
|
||
| add_library(bzip2 STATIC ${BZIP2_SRCS} ${BZIP2_PUBLIC_HDRS} ${BZIP2_PRIVATE_HDRS}) | ||
| add_library(BZip2::BZip2 ALIAS bzip2) | ||
|
|
||
| target_include_directories(bzip2 | ||
| PUBLIC | ||
| ${CMAKE_CURRENT_SOURCE_DIR} | ||
| ) |
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,42 @@ | ||
|
|
||
| -------------------------------------------------------------------------- | ||
|
|
||
| This program, "bzip2", the associated library "libbzip2", and all | ||
| documentation, are copyright (C) 1996-2019 Julian R Seward. All | ||
| rights reserved. | ||
|
|
||
| Redistribution and use in source and binary forms, with or without | ||
| modification, are permitted provided that the following conditions | ||
| are met: | ||
|
|
||
| 1. Redistributions of source code must retain the above copyright | ||
| notice, this list of conditions and the following disclaimer. | ||
|
|
||
| 2. The origin of this software must not be misrepresented; you must | ||
| not claim that you wrote the original software. If you use this | ||
| software in a product, an acknowledgment in the product | ||
| documentation would be appreciated but is not required. | ||
|
|
||
| 3. Altered source versions must be plainly marked as such, and must | ||
| not be misrepresented as being the original software. | ||
|
|
||
| 4. The name of the author may not be used to endorse or promote | ||
| products derived from this software without specific prior written | ||
| permission. | ||
|
|
||
| THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS | ||
| OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED | ||
| WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE | ||
| ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY | ||
| DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL | ||
| DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE | ||
| GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS | ||
| INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, | ||
| WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING | ||
| NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS | ||
| SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. | ||
|
|
||
| Julian Seward, jseward@acm.org | ||
| bzip2/libbzip2 version 1.0.8 of 13 July 2019 | ||
|
|
||
| -------------------------------------------------------------------------- |
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,64 @@ | ||
| <?xml version="1.0" encoding="utf-8"?> | ||
| <Project DefaultTargets="Build" ToolsVersion="16.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003"> | ||
| <ItemGroup Label="ProjectConfigurations"> | ||
| <ProjectConfiguration Include="Debug|ARM64"> | ||
| <Configuration>Debug</Configuration> | ||
| <Platform>ARM64</Platform> | ||
| </ProjectConfiguration> | ||
| <ProjectConfiguration Include="Debug|x64"> | ||
| <Configuration>Debug</Configuration> | ||
| <Platform>x64</Platform> | ||
| </ProjectConfiguration> | ||
| <ProjectConfiguration Include="Release|ARM64"> | ||
| <Configuration>Release</Configuration> | ||
| <Platform>ARM64</Platform> | ||
| </ProjectConfiguration> | ||
| <ProjectConfiguration Include="Release|x64"> | ||
| <Configuration>Release</Configuration> | ||
| <Platform>x64</Platform> | ||
| </ProjectConfiguration> | ||
| </ItemGroup> | ||
| <PropertyGroup Label="Globals"> | ||
| <VCProjectVersion>16.0</VCProjectVersion> | ||
| <ProjectGuid>{1D8C51D2-FFA4-418E-B183-9F42B6A6717E}</ProjectGuid> | ||
| <RootNamespace>bzip2</RootNamespace> | ||
| <WindowsTargetPlatformVersion>10.0</WindowsTargetPlatformVersion> | ||
| </PropertyGroup> | ||
| <Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" /> | ||
| <PropertyGroup Label="Configuration"> | ||
| <ConfigurationType>StaticLibrary</ConfigurationType> | ||
| <PlatformToolset>v142</PlatformToolset> | ||
| <CharacterSet>Unicode</CharacterSet> | ||
| </PropertyGroup> | ||
| <PropertyGroup Condition="'$(Configuration)'=='Debug'" Label="Configuration"> | ||
| <UseDebugLibraries>true</UseDebugLibraries> | ||
| </PropertyGroup> | ||
| <PropertyGroup Condition="'$(Configuration)'=='Release'" Label="Configuration"> | ||
| <UseDebugLibraries>false</UseDebugLibraries> | ||
| </PropertyGroup> | ||
| <Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" /> | ||
| <ImportGroup Label="ExtensionSettings"> | ||
| </ImportGroup> | ||
| <ImportGroup Label="PropertySheets"> | ||
| <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" /> | ||
| <Import Project="..\..\Source\VSProps\Base.props" /> | ||
| <Import Project="..\..\Source\VSProps\ClDisableAllWarnings.props" /> | ||
| </ImportGroup> | ||
| <PropertyGroup Label="UserMacros" /> | ||
| <ItemGroup> | ||
| <ClCompile Include="blocksort.c" /> | ||
| <ClCompile Include="bzlib.c" /> | ||
| <ClCompile Include="compress.c" /> | ||
| <ClCompile Include="crctable.c" /> | ||
| <ClCompile Include="decompress.c" /> | ||
| <ClCompile Include="huffman.c" /> | ||
| <ClCompile Include="randtable.c" /> | ||
| </ItemGroup> | ||
| <ItemGroup> | ||
| <ClInclude Include="bzlib.h" /> | ||
| <ClInclude Include="bzlib_private.h" /> | ||
| </ItemGroup> | ||
| <Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" /> | ||
| <ImportGroup Label="ExtensionTargets"> | ||
| </ImportGroup> | ||
| </Project> |
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,16 @@ | ||
| <?xml version="1.0" encoding="utf-8"?> | ||
| <Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003"> | ||
| <ItemGroup> | ||
| <ClCompile Include="blocksort.c" /> | ||
| <ClCompile Include="bzlib.c" /> | ||
| <ClCompile Include="compress.c" /> | ||
| <ClCompile Include="crctable.c" /> | ||
| <ClCompile Include="decompress.c" /> | ||
| <ClCompile Include="huffman.c" /> | ||
| <ClCompile Include="randtable.c" /> | ||
| </ItemGroup> | ||
| <ItemGroup> | ||
| <ClInclude Include="bzlib.h" /> | ||
| <ClInclude Include="bzlib_private.h" /> | ||
| </ItemGroup> | ||
| </Project> |
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,282 @@ | ||
|
|
||
| /*-------------------------------------------------------------*/ | ||
| /*--- 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.8 of 13 July 2019 | ||
| Copyright (C) 1996-2019 Julian Seward <jseward@acm.org> | ||
| 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 <stdio.h> | ||
| #endif | ||
|
|
||
| #ifdef _WIN32 | ||
| # include <windows.h> | ||
| # 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 ---*/ | ||
| /*-------------------------------------------------------------*/ |
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,104 @@ | ||
|
|
||
| /*-------------------------------------------------------------*/ | ||
| /*--- 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.8 of 13 July 2019 | ||
| Copyright (C) 1996-2019 Julian Seward <jseward@acm.org> | ||
| 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 ---*/ | ||
| /*-------------------------------------------------------------*/ |
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,205 @@ | ||
|
|
||
| /*-------------------------------------------------------------*/ | ||
| /*--- 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.8 of 13 July 2019 | ||
| Copyright (C) 1996-2019 Julian Seward <jseward@acm.org> | ||
| 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 ---*/ | ||
| /*-------------------------------------------------------------*/ |
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,84 @@ | ||
|
|
||
| /*-------------------------------------------------------------*/ | ||
| /*--- 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.8 of 13 July 2019 | ||
| Copyright (C) 1996-2019 Julian Seward <jseward@acm.org> | ||
| 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 ---*/ | ||
| /*-------------------------------------------------------------*/ |
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,226 @@ | ||
| project(lzma C) | ||
|
|
||
| include(CheckTypeSize) | ||
| include(CheckFunctionExists) | ||
| include(CheckIncludeFile) | ||
| include(CheckCSourceCompiles) | ||
|
|
||
| check_include_file(sys/types.h HAVE_SYS_TYPES_H) | ||
| check_include_file(stdint.h HAVE_STDINT_H) | ||
| check_include_file(stddef.h HAVE_STDDEF_H) | ||
|
|
||
| # Check to see if we have large file support | ||
| set(CMAKE_REQUIRED_DEFINITIONS -D_LARGEFILE64_SOURCE=1) | ||
| # We add these other definitions here because CheckTypeSize.cmake | ||
| # in CMake 2.4.x does not automatically do so and we want | ||
| # compatibility with CMake 2.4.x. | ||
| if(HAVE_SYS_TYPES_H) | ||
| list(APPEND CMAKE_REQUIRED_DEFINITIONS -DHAVE_SYS_TYPES_H) | ||
| endif() | ||
| if(HAVE_STDINT_H) | ||
| list(APPEND CMAKE_REQUIRED_DEFINITIONS -DHAVE_STDINT_H) | ||
| endif() | ||
| if(HAVE_STDDEF_H) | ||
| list(APPEND CMAKE_REQUIRED_DEFINITIONS -DHAVE_STDDEF_H) | ||
| endif() | ||
| check_type_size(off64_t OFF64_T) | ||
| if(HAVE_OFF64_T) | ||
| add_definitions(-D_LARGEFILE64_SOURCE=1) | ||
| endif() | ||
| set(CMAKE_REQUIRED_DEFINITIONS) # clear variable | ||
|
|
||
| # Check for fseeko | ||
| check_function_exists(fseeko HAVE_FSEEKO) | ||
| if(NOT HAVE_FSEEKO) | ||
| add_definitions(-DNO_FSEEKO) | ||
| endif() | ||
|
|
||
| # | ||
| # Check for unistd.h | ||
| # | ||
| check_include_file(unistd.h HAVE_UNISTD_H) | ||
| if(HAVE_UNISTD_H) | ||
| add_definitions(-DHAVE_UNISTD_H) | ||
| endif() | ||
|
|
||
|
|
||
| if(MSVC) | ||
| add_definitions(-D_CRT_SECURE_NO_DEPRECATE) | ||
| add_definitions(-D_CRT_NONSTDC_NO_DEPRECATE) | ||
| endif() | ||
|
|
||
| add_definitions(-DHAVE_CONFIG_H) | ||
| add_definitions(-DLZMA_API_STATIC) | ||
|
|
||
| #============================================================================ | ||
| # lzma | ||
| #============================================================================ | ||
|
|
||
| set(LZMA_PUBLIC_HDRS | ||
| api/lzma.h | ||
| api/lzma/base.h | ||
| api/lzma/bcj.h | ||
| api/lzma/block.h | ||
| api/lzma/check.h | ||
| api/lzma/container.h | ||
| api/lzma/delta.h | ||
| api/lzma/filter.h | ||
| api/lzma/hardware.h | ||
| api/lzma/index.h | ||
| api/lzma/index_hash.h | ||
| api/lzma/lzma12.h | ||
| api/lzma/stream_flags.h | ||
| api/lzma/version.h | ||
| api/lzma/vli.h | ||
| ) | ||
|
|
||
| set(LZMA_SRCS | ||
| check/check.c | ||
| check/check.h | ||
| check/crc32_fast.c | ||
| check/crc32_table_be.h | ||
| check/crc32_table.c | ||
| check/crc32_table_le.h | ||
| check/crc64_fast.c | ||
| check/crc64_table_be.h | ||
| check/crc64_table.c | ||
| check/crc64_table_le.h | ||
| check/crc_macros.h | ||
| check/sha256.c | ||
| common/alone_decoder.c | ||
| common/alone_decoder.h | ||
| common/alone_encoder.c | ||
| common/auto_decoder.c | ||
| common/block_buffer_decoder.c | ||
| common/block_buffer_encoder.c | ||
| common/block_buffer_encoder.h | ||
| common/block_decoder.c | ||
| common/block_decoder.h | ||
| common/block_encoder.c | ||
| common/block_encoder.h | ||
| common/block_header_decoder.c | ||
| common/block_header_encoder.c | ||
| common/block_util.c | ||
| common/common.c | ||
| common/common.h | ||
| common/easy_buffer_encoder.c | ||
| common/easy_decoder_memusage.c | ||
| common/easy_encoder.c | ||
| common/easy_encoder_memusage.c | ||
| common/easy_preset.c | ||
| common/easy_preset.h | ||
| common/filter_buffer_decoder.c | ||
| common/filter_buffer_encoder.c | ||
| common/filter_common.c | ||
| common/filter_common.h | ||
| common/filter_decoder.c | ||
| common/filter_decoder.h | ||
| common/filter_encoder.c | ||
| common/filter_encoder.h | ||
| common/filter_flags_decoder.c | ||
| common/filter_flags_encoder.c | ||
| common/hardware_cputhreads.c | ||
| common/hardware_physmem.c | ||
| common/index.c | ||
| common/index_decoder.c | ||
| common/index_encoder.c | ||
| common/index_encoder.h | ||
| common/index.h | ||
| common/index_hash.c | ||
| common/memcmplen.h | ||
| common/outqueue.c | ||
| common/outqueue.h | ||
| common/stream_buffer_decoder.c | ||
| common/stream_buffer_encoder.c | ||
| common/stream_decoder.c | ||
| common/stream_decoder.h | ||
| common/stream_encoder.c | ||
| common/stream_encoder_mt.c | ||
| common/stream_flags_common.c | ||
| common/stream_flags_common.h | ||
| common/stream_flags_decoder.c | ||
| common/stream_flags_encoder.c | ||
| common/vli_decoder.c | ||
| common/vli_encoder.c | ||
| common/vli_size.c | ||
| delta/delta_common.c | ||
| delta/delta_common.h | ||
| delta/delta_decoder.c | ||
| delta/delta_decoder.h | ||
| delta/delta_encoder.c | ||
| delta/delta_encoder.h | ||
| delta/delta_private.h | ||
| lz/lz_decoder.c | ||
| lz/lz_decoder.h | ||
| lz/lz_encoder.c | ||
| lz/lz_encoder.h | ||
| lz/lz_encoder_hash.h | ||
| lz/lz_encoder_hash_table.h | ||
| lz/lz_encoder_mf.c | ||
| lzma/fastpos.h | ||
| lzma/fastpos_table.c | ||
| lzma/lzma2_decoder.c | ||
| lzma/lzma2_decoder.h | ||
| lzma/lzma2_encoder.c | ||
| lzma/lzma2_encoder.h | ||
| lzma/lzma_common.h | ||
| lzma/lzma_decoder.c | ||
| lzma/lzma_decoder.h | ||
| lzma/lzma_encoder.c | ||
| lzma/lzma_encoder.h | ||
| lzma/lzma_encoder_optimum_fast.c | ||
| lzma/lzma_encoder_optimum_normal.c | ||
| lzma/lzma_encoder_presets.c | ||
| lzma/lzma_encoder_private.h | ||
| rangecoder/price.h | ||
| rangecoder/price_table.c | ||
| rangecoder/range_common.h | ||
| rangecoder/range_decoder.h | ||
| rangecoder/range_encoder.h | ||
| simple/simple_coder.c | ||
| simple/simple_coder.h | ||
| simple/simple_decoder.c | ||
| simple/simple_decoder.h | ||
| simple/simple_encoder.c | ||
| simple/simple_encoder.h | ||
| simple/simple_private.h | ||
| tuklib/mythread.h | ||
| tuklib/sysdefs.h | ||
| tuklib/tuklib_common.h | ||
| tuklib/tuklib_config.h | ||
| tuklib/tuklib_cpucores.c | ||
| tuklib/tuklib_cpucores.h | ||
| tuklib/tuklib_exit.c | ||
| tuklib/tuklib_exit.h | ||
| tuklib/tuklib_gettext.h | ||
| tuklib/tuklib_integer.h | ||
| tuklib/tuklib_mbstr_fw.c | ||
| tuklib/tuklib_mbstr.h | ||
| tuklib/tuklib_mbstr_width.c | ||
| tuklib/tuklib_open_stdxxx.c | ||
| tuklib/tuklib_open_stdxxx.h | ||
| tuklib/tuklib_physmem.c | ||
| tuklib/tuklib_physmem.h | ||
| tuklib/tuklib_progname.c | ||
| tuklib/tuklib_progname.h | ||
| ) | ||
|
|
||
| add_library(lzma STATIC ${LZMA_SRCS} ${LZMA_PUBLIC_HDRS}) | ||
| add_library(LibLZMA::LibLZMA ALIAS lzma) | ||
|
|
||
| target_compile_definitions(lzma PUBLIC LZMA_API_STATIC) | ||
|
|
||
| target_include_directories(lzma | ||
| PUBLIC | ||
| ${CMAKE_CURRENT_SOURCE_DIR}/api | ||
| PRIVATE | ||
| ${CMAKE_CURRENT_SOURCE_DIR}/ | ||
| ${CMAKE_CURRENT_SOURCE_DIR}/check | ||
| ${CMAKE_CURRENT_SOURCE_DIR}/common | ||
| ${CMAKE_CURRENT_SOURCE_DIR}/delta | ||
| ${CMAKE_CURRENT_SOURCE_DIR}/lz | ||
| ${CMAKE_CURRENT_SOURCE_DIR}/lzma | ||
| ${CMAKE_CURRENT_SOURCE_DIR}/rangecoder | ||
| ${CMAKE_CURRENT_SOURCE_DIR}/simple | ||
| ${CMAKE_CURRENT_SOURCE_DIR}/tuklib | ||
| ) |
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,65 @@ | ||
|
|
||
| XZ Utils Licensing | ||
| ================== | ||
|
|
||
| Different licenses apply to different files in this package. Here | ||
| is a rough summary of which licenses apply to which parts of this | ||
| package (but check the individual files to be sure!): | ||
|
|
||
| - liblzma is in the public domain. | ||
|
|
||
| - xz, xzdec, and lzmadec command line tools are in the public | ||
| domain unless GNU getopt_long had to be compiled and linked | ||
| in from the lib directory. The getopt_long code is under | ||
| GNU LGPLv2.1+. | ||
|
|
||
| - The scripts to grep, diff, and view compressed files have been | ||
| adapted from gzip. These scripts and their documentation are | ||
| under GNU GPLv2+. | ||
|
|
||
| - All the documentation in the doc directory and most of the | ||
| XZ Utils specific documentation files in other directories | ||
| are in the public domain. | ||
|
|
||
| - Translated messages are in the public domain. | ||
|
|
||
| - The build system contains public domain files, and files that | ||
| are under GNU GPLv2+ or GNU GPLv3+. None of these files end up | ||
| in the binaries being built. | ||
|
|
||
| - Test files and test code in the tests directory, and debugging | ||
| utilities in the debug directory are in the public domain. | ||
|
|
||
| - The extra directory may contain public domain files, and files | ||
| that are under various free software licenses. | ||
|
|
||
| You can do whatever you want with the files that have been put into | ||
| the public domain. If you find public domain legally problematic, | ||
| take the previous sentence as a license grant. If you still find | ||
| the lack of copyright legally problematic, you have too many | ||
| lawyers. | ||
|
|
||
| As usual, this software is provided "as is", without any warranty. | ||
|
|
||
| If you copy significant amounts of public domain code from XZ Utils | ||
| into your project, acknowledging this somewhere in your software is | ||
| polite (especially if it is proprietary, non-free software), but | ||
| naturally it is not legally required. Here is an example of a good | ||
| notice to put into "about box" or into documentation: | ||
|
|
||
| This software includes code from XZ Utils <https://tukaani.org/xz/>. | ||
|
|
||
| The following license texts are included in the following files: | ||
| - COPYING.LGPLv2.1: GNU Lesser General Public License version 2.1 | ||
| - COPYING.GPLv2: GNU General Public License version 2 | ||
| - COPYING.GPLv3: GNU General Public License version 3 | ||
|
|
||
| Note that the toolchain (compiler, linker etc.) may add some code | ||
| pieces that are copyrighted. Thus, it is possible that e.g. liblzma | ||
| binary wouldn't actually be in the public domain in its entirety | ||
| even though it contains no copyrighted code from the XZ Utils source | ||
| package. | ||
|
|
||
| If you have questions, don't hesitate to ask the author(s) for more | ||
| information. | ||
|
|
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,325 @@ | ||
| /** | ||
| * \file api/lzma.h | ||
| * \brief The public API of liblzma data compression library | ||
| * | ||
| * liblzma is a public domain general-purpose data compression library with | ||
| * a zlib-like API. The native file format is .xz, but also the old .lzma | ||
| * format and raw (no headers) streams are supported. Multiple compression | ||
| * algorithms (filters) are supported. Currently LZMA2 is the primary filter. | ||
| * | ||
| * liblzma is part of XZ Utils <http://tukaani.org/xz/>. XZ Utils includes | ||
| * a gzip-like command line tool named xz and some other tools. XZ Utils | ||
| * is developed and maintained by Lasse Collin. | ||
| * | ||
| * Major parts of liblzma are based on Igor Pavlov's public domain LZMA SDK | ||
| * <http://7-zip.org/sdk.html>. | ||
| * | ||
| * The SHA-256 implementation is based on the public domain code found from | ||
| * 7-Zip <http://7-zip.org/>, which has a modified version of the public | ||
| * domain SHA-256 code found from Crypto++ <http://www.cryptopp.com/>. | ||
| * The SHA-256 code in Crypto++ was written by Kevin Springle and Wei Dai. | ||
| */ | ||
|
|
||
| /* | ||
| * Author: Lasse Collin | ||
| * | ||
| * This file has been put into the public domain. | ||
| * You can do whatever you want with this file. | ||
| */ | ||
|
|
||
| #ifndef LZMA_H | ||
| #define LZMA_H | ||
|
|
||
| /***************************** | ||
| * Required standard headers * | ||
| *****************************/ | ||
|
|
||
| /* | ||
| * liblzma API headers need some standard types and macros. To allow | ||
| * including lzma.h without requiring the application to include other | ||
| * headers first, lzma.h includes the required standard headers unless | ||
| * they already seem to be included already or if LZMA_MANUAL_HEADERS | ||
| * has been defined. | ||
| * | ||
| * Here's what types and macros are needed and from which headers: | ||
| * - stddef.h: size_t, NULL | ||
| * - stdint.h: uint8_t, uint32_t, uint64_t, UINT32_C(n), uint64_C(n), | ||
| * UINT32_MAX, UINT64_MAX | ||
| * | ||
| * However, inttypes.h is a little more portable than stdint.h, although | ||
| * inttypes.h declares some unneeded things compared to plain stdint.h. | ||
| * | ||
| * The hacks below aren't perfect, specifically they assume that inttypes.h | ||
| * exists and that it typedefs at least uint8_t, uint32_t, and uint64_t, | ||
| * and that, in case of incomplete inttypes.h, unsigned int is 32-bit. | ||
| * If the application already takes care of setting up all the types and | ||
| * macros properly (for example by using gnulib's stdint.h or inttypes.h), | ||
| * we try to detect that the macros are already defined and don't include | ||
| * inttypes.h here again. However, you may define LZMA_MANUAL_HEADERS to | ||
| * force this file to never include any system headers. | ||
| * | ||
| * Some could argue that liblzma API should provide all the required types, | ||
| * for example lzma_uint64, LZMA_UINT64_C(n), and LZMA_UINT64_MAX. This was | ||
| * seen as an unnecessary mess, since most systems already provide all the | ||
| * necessary types and macros in the standard headers. | ||
| * | ||
| * Note that liblzma API still has lzma_bool, because using stdbool.h would | ||
| * break C89 and C++ programs on many systems. sizeof(bool) in C99 isn't | ||
| * necessarily the same as sizeof(bool) in C++. | ||
| */ | ||
|
|
||
| #ifndef LZMA_MANUAL_HEADERS | ||
| /* | ||
| * I suppose this works portably also in C++. Note that in C++, | ||
| * we need to get size_t into the global namespace. | ||
| */ | ||
| # include <stddef.h> | ||
|
|
||
| /* | ||
| * Skip inttypes.h if we already have all the required macros. If we | ||
| * have the macros, we assume that we have the matching typedefs too. | ||
| */ | ||
| # if !defined(UINT32_C) || !defined(UINT64_C) \ | ||
| || !defined(UINT32_MAX) || !defined(UINT64_MAX) | ||
| /* | ||
| * MSVC versions older than 2013 have no C99 support, and | ||
| * thus they cannot be used to compile liblzma. Using an | ||
| * existing liblzma.dll with old MSVC can work though(*), | ||
| * but we need to define the required standard integer | ||
| * types here in a MSVC-specific way. | ||
| * | ||
| * (*) If you do this, the existing liblzma.dll probably uses | ||
| * a different runtime library than your MSVC-built | ||
| * application. Mixing runtimes is generally bad, but | ||
| * in this case it should work as long as you avoid | ||
| * the few rarely-needed liblzma functions that allocate | ||
| * memory and expect the caller to free it using free(). | ||
| */ | ||
| # if defined(_WIN32) && defined(_MSC_VER) && _MSC_VER < 1800 | ||
| typedef unsigned __int8 uint8_t; | ||
| typedef unsigned __int32 uint32_t; | ||
| typedef unsigned __int64 uint64_t; | ||
| # else | ||
| /* Use the standard inttypes.h. */ | ||
| # ifdef __cplusplus | ||
| /* | ||
| * C99 sections 7.18.2 and 7.18.4 specify | ||
| * that C++ implementations define the limit | ||
| * and constant macros only if specifically | ||
| * requested. Note that if you want the | ||
| * format macros (PRIu64 etc.) too, you need | ||
| * to define __STDC_FORMAT_MACROS before | ||
| * including lzma.h, since re-including | ||
| * inttypes.h with __STDC_FORMAT_MACROS | ||
| * defined doesn't necessarily work. | ||
| */ | ||
| # ifndef __STDC_LIMIT_MACROS | ||
| # define __STDC_LIMIT_MACROS 1 | ||
| # endif | ||
| # ifndef __STDC_CONSTANT_MACROS | ||
| # define __STDC_CONSTANT_MACROS 1 | ||
| # endif | ||
| # endif | ||
|
|
||
| # include <inttypes.h> | ||
| # endif | ||
|
|
||
| /* | ||
| * Some old systems have only the typedefs in inttypes.h, and | ||
| * lack all the macros. For those systems, we need a few more | ||
| * hacks. We assume that unsigned int is 32-bit and unsigned | ||
| * long is either 32-bit or 64-bit. If these hacks aren't | ||
| * enough, the application has to setup the types manually | ||
| * before including lzma.h. | ||
| */ | ||
| # ifndef UINT32_C | ||
| # if defined(_WIN32) && defined(_MSC_VER) | ||
| # define UINT32_C(n) n ## UI32 | ||
| # else | ||
| # define UINT32_C(n) n ## U | ||
| # endif | ||
| # endif | ||
|
|
||
| # ifndef UINT64_C | ||
| # if defined(_WIN32) && defined(_MSC_VER) | ||
| # define UINT64_C(n) n ## UI64 | ||
| # else | ||
| /* Get ULONG_MAX. */ | ||
| # include <limits.h> | ||
| # if ULONG_MAX == 4294967295UL | ||
| # define UINT64_C(n) n ## ULL | ||
| # else | ||
| # define UINT64_C(n) n ## UL | ||
| # endif | ||
| # endif | ||
| # endif | ||
|
|
||
| # ifndef UINT32_MAX | ||
| # define UINT32_MAX (UINT32_C(4294967295)) | ||
| # endif | ||
|
|
||
| # ifndef UINT64_MAX | ||
| # define UINT64_MAX (UINT64_C(18446744073709551615)) | ||
| # endif | ||
| # endif | ||
| #endif /* ifdef LZMA_MANUAL_HEADERS */ | ||
|
|
||
|
|
||
| /****************** | ||
| * LZMA_API macro * | ||
| ******************/ | ||
|
|
||
| /* | ||
| * Some systems require that the functions and function pointers are | ||
| * declared specially in the headers. LZMA_API_IMPORT is for importing | ||
| * symbols and LZMA_API_CALL is to specify the calling convention. | ||
| * | ||
| * By default it is assumed that the application will link dynamically | ||
| * against liblzma. #define LZMA_API_STATIC in your application if you | ||
| * want to link against static liblzma. If you don't care about portability | ||
| * to operating systems like Windows, or at least don't care about linking | ||
| * against static liblzma on them, don't worry about LZMA_API_STATIC. That | ||
| * is, most developers will never need to use LZMA_API_STATIC. | ||
| * | ||
| * The GCC variants are a special case on Windows (Cygwin and MinGW). | ||
| * We rely on GCC doing the right thing with its auto-import feature, | ||
| * and thus don't use __declspec(dllimport). This way developers don't | ||
| * need to worry about LZMA_API_STATIC. Also the calling convention is | ||
| * omitted on Cygwin but not on MinGW. | ||
| */ | ||
| #ifndef LZMA_API_IMPORT | ||
| # if !defined(LZMA_API_STATIC) && defined(_WIN32) && !defined(__GNUC__) | ||
| # define LZMA_API_IMPORT __declspec(dllimport) | ||
| # else | ||
| # define LZMA_API_IMPORT | ||
| # endif | ||
| #endif | ||
|
|
||
| #ifndef LZMA_API_CALL | ||
| # if defined(_WIN32) && !defined(__CYGWIN__) | ||
| # define LZMA_API_CALL __cdecl | ||
| # else | ||
| # define LZMA_API_CALL | ||
| # endif | ||
| #endif | ||
|
|
||
| #ifndef LZMA_API | ||
| # define LZMA_API(type) LZMA_API_IMPORT type LZMA_API_CALL | ||
| #endif | ||
|
|
||
|
|
||
| /*********** | ||
| * nothrow * | ||
| ***********/ | ||
|
|
||
| /* | ||
| * None of the functions in liblzma may throw an exception. Even | ||
| * the functions that use callback functions won't throw exceptions, | ||
| * because liblzma would break if a callback function threw an exception. | ||
| */ | ||
| #ifndef lzma_nothrow | ||
| # if defined(__cplusplus) | ||
| # if __cplusplus >= 201103L | ||
| # define lzma_nothrow noexcept | ||
| # else | ||
| # define lzma_nothrow throw() | ||
| # endif | ||
| # elif __GNUC__ > 3 || (__GNUC__ == 3 && __GNUC_MINOR__ >= 3) | ||
| # define lzma_nothrow __attribute__((__nothrow__)) | ||
| # else | ||
| # define lzma_nothrow | ||
| # endif | ||
| #endif | ||
|
|
||
|
|
||
| /******************** | ||
| * GNU C extensions * | ||
| ********************/ | ||
|
|
||
| /* | ||
| * GNU C extensions are used conditionally in the public API. It doesn't | ||
| * break anything if these are sometimes enabled and sometimes not, only | ||
| * affects warnings and optimizations. | ||
| */ | ||
| #if __GNUC__ >= 3 | ||
| # ifndef lzma_attribute | ||
| # define lzma_attribute(attr) __attribute__(attr) | ||
| # endif | ||
|
|
||
| /* warn_unused_result was added in GCC 3.4. */ | ||
| # ifndef lzma_attr_warn_unused_result | ||
| # if __GNUC__ == 3 && __GNUC_MINOR__ < 4 | ||
| # define lzma_attr_warn_unused_result | ||
| # endif | ||
| # endif | ||
|
|
||
| #else | ||
| # ifndef lzma_attribute | ||
| # define lzma_attribute(attr) | ||
| # endif | ||
| #endif | ||
|
|
||
|
|
||
| #ifndef lzma_attr_pure | ||
| # define lzma_attr_pure lzma_attribute((__pure__)) | ||
| #endif | ||
|
|
||
| #ifndef lzma_attr_const | ||
| # define lzma_attr_const lzma_attribute((__const__)) | ||
| #endif | ||
|
|
||
| #ifndef lzma_attr_warn_unused_result | ||
| # define lzma_attr_warn_unused_result \ | ||
| lzma_attribute((__warn_unused_result__)) | ||
| #endif | ||
|
|
||
|
|
||
| /************** | ||
| * Subheaders * | ||
| **************/ | ||
|
|
||
| #ifdef __cplusplus | ||
| extern "C" { | ||
| #endif | ||
|
|
||
| /* | ||
| * Subheaders check that this is defined. It is to prevent including | ||
| * them directly from applications. | ||
| */ | ||
| #define LZMA_H_INTERNAL 1 | ||
|
|
||
| /* Basic features */ | ||
| #include "lzma/version.h" | ||
| #include "lzma/base.h" | ||
| #include "lzma/vli.h" | ||
| #include "lzma/check.h" | ||
|
|
||
| /* Filters */ | ||
| #include "lzma/filter.h" | ||
| #include "lzma/bcj.h" | ||
| #include "lzma/delta.h" | ||
| #include "lzma/lzma12.h" | ||
|
|
||
| /* Container formats */ | ||
| #include "lzma/container.h" | ||
|
|
||
| /* Advanced features */ | ||
| #include "lzma/stream_flags.h" | ||
| #include "lzma/block.h" | ||
| #include "lzma/index.h" | ||
| #include "lzma/index_hash.h" | ||
|
|
||
| /* Hardware information */ | ||
| #include "lzma/hardware.h" | ||
|
|
||
| /* | ||
| * All subheaders included. Undefine LZMA_H_INTERNAL to prevent applications | ||
| * re-including the subheaders. | ||
| */ | ||
| #undef LZMA_H_INTERNAL | ||
|
|
||
| #ifdef __cplusplus | ||
| } | ||
| #endif | ||
|
|
||
| #endif /* ifndef LZMA_H */ |
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,90 @@ | ||
| /** | ||
| * \file lzma/bcj.h | ||
| * \brief Branch/Call/Jump conversion filters | ||
| */ | ||
|
|
||
| /* | ||
| * Author: Lasse Collin | ||
| * | ||
| * This file has been put into the public domain. | ||
| * You can do whatever you want with this file. | ||
| * | ||
| * See ../lzma.h for information about liblzma as a whole. | ||
| */ | ||
|
|
||
| #ifndef LZMA_H_INTERNAL | ||
| # error Never include this file directly. Use <lzma.h> instead. | ||
| #endif | ||
|
|
||
|
|
||
| /* Filter IDs for lzma_filter.id */ | ||
|
|
||
| #define LZMA_FILTER_X86 LZMA_VLI_C(0x04) | ||
| /**< | ||
| * Filter for x86 binaries | ||
| */ | ||
|
|
||
| #define LZMA_FILTER_POWERPC LZMA_VLI_C(0x05) | ||
| /**< | ||
| * Filter for Big endian PowerPC binaries | ||
| */ | ||
|
|
||
| #define LZMA_FILTER_IA64 LZMA_VLI_C(0x06) | ||
| /**< | ||
| * Filter for IA-64 (Itanium) binaries. | ||
| */ | ||
|
|
||
| #define LZMA_FILTER_ARM LZMA_VLI_C(0x07) | ||
| /**< | ||
| * Filter for ARM binaries. | ||
| */ | ||
|
|
||
| #define LZMA_FILTER_ARMTHUMB LZMA_VLI_C(0x08) | ||
| /**< | ||
| * Filter for ARM-Thumb binaries. | ||
| */ | ||
|
|
||
| #define LZMA_FILTER_SPARC LZMA_VLI_C(0x09) | ||
| /**< | ||
| * Filter for SPARC binaries. | ||
| */ | ||
|
|
||
|
|
||
| /** | ||
| * \brief Options for BCJ filters | ||
| * | ||
| * The BCJ filters never change the size of the data. Specifying options | ||
| * for them is optional: if pointer to options is NULL, default value is | ||
| * used. You probably never need to specify options to BCJ filters, so just | ||
| * set the options pointer to NULL and be happy. | ||
| * | ||
| * If options with non-default values have been specified when encoding, | ||
| * the same options must also be specified when decoding. | ||
| * | ||
| * \note At the moment, none of the BCJ filters support | ||
| * LZMA_SYNC_FLUSH. If LZMA_SYNC_FLUSH is specified, | ||
| * LZMA_OPTIONS_ERROR will be returned. If there is need, | ||
| * partial support for LZMA_SYNC_FLUSH can be added in future. | ||
| * Partial means that flushing would be possible only at | ||
| * offsets that are multiple of 2, 4, or 16 depending on | ||
| * the filter, except x86 which cannot be made to support | ||
| * LZMA_SYNC_FLUSH predictably. | ||
| */ | ||
| typedef struct { | ||
| /** | ||
| * \brief Start offset for conversions | ||
| * | ||
| * This setting is useful only when the same filter is used | ||
| * _separately_ for multiple sections of the same executable file, | ||
| * and the sections contain cross-section branch/call/jump | ||
| * instructions. In that case it is beneficial to set the start | ||
| * offset of the non-first sections so that the relative addresses | ||
| * of the cross-section branch/call/jump instructions will use the | ||
| * same absolute addresses as in the first section. | ||
| * | ||
| * When the pointer to options is NULL, the default value (zero) | ||
| * is used. | ||
| */ | ||
| uint32_t start_offset; | ||
|
|
||
| } lzma_options_bcj; |
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,150 @@ | ||
| /** | ||
| * \file lzma/check.h | ||
| * \brief Integrity checks | ||
| */ | ||
|
|
||
| /* | ||
| * Author: Lasse Collin | ||
| * | ||
| * This file has been put into the public domain. | ||
| * You can do whatever you want with this file. | ||
| * | ||
| * See ../lzma.h for information about liblzma as a whole. | ||
| */ | ||
|
|
||
| #ifndef LZMA_H_INTERNAL | ||
| # error Never include this file directly. Use <lzma.h> instead. | ||
| #endif | ||
|
|
||
|
|
||
| /** | ||
| * \brief Type of the integrity check (Check ID) | ||
| * | ||
| * The .xz format supports multiple types of checks that are calculated | ||
| * from the uncompressed data. They vary in both speed and ability to | ||
| * detect errors. | ||
| */ | ||
| typedef enum { | ||
| LZMA_CHECK_NONE = 0, | ||
| /**< | ||
| * No Check is calculated. | ||
| * | ||
| * Size of the Check field: 0 bytes | ||
| */ | ||
|
|
||
| LZMA_CHECK_CRC32 = 1, | ||
| /**< | ||
| * CRC32 using the polynomial from the IEEE 802.3 standard | ||
| * | ||
| * Size of the Check field: 4 bytes | ||
| */ | ||
|
|
||
| LZMA_CHECK_CRC64 = 4, | ||
| /**< | ||
| * CRC64 using the polynomial from the ECMA-182 standard | ||
| * | ||
| * Size of the Check field: 8 bytes | ||
| */ | ||
|
|
||
| LZMA_CHECK_SHA256 = 10 | ||
| /**< | ||
| * SHA-256 | ||
| * | ||
| * Size of the Check field: 32 bytes | ||
| */ | ||
| } lzma_check; | ||
|
|
||
|
|
||
| /** | ||
| * \brief Maximum valid Check ID | ||
| * | ||
| * The .xz file format specification specifies 16 Check IDs (0-15). Some | ||
| * of them are only reserved, that is, no actual Check algorithm has been | ||
| * assigned. When decoding, liblzma still accepts unknown Check IDs for | ||
| * future compatibility. If a valid but unsupported Check ID is detected, | ||
| * liblzma can indicate a warning; see the flags LZMA_TELL_NO_CHECK, | ||
| * LZMA_TELL_UNSUPPORTED_CHECK, and LZMA_TELL_ANY_CHECK in container.h. | ||
| */ | ||
| #define LZMA_CHECK_ID_MAX 15 | ||
|
|
||
|
|
||
| /** | ||
| * \brief Test if the given Check ID is supported | ||
| * | ||
| * Return true if the given Check ID is supported by this liblzma build. | ||
| * Otherwise false is returned. It is safe to call this with a value that | ||
| * is not in the range [0, 15]; in that case the return value is always false. | ||
| * | ||
| * You can assume that LZMA_CHECK_NONE and LZMA_CHECK_CRC32 are always | ||
| * supported (even if liblzma is built with limited features). | ||
| */ | ||
| extern LZMA_API(lzma_bool) lzma_check_is_supported(lzma_check check) | ||
| lzma_nothrow lzma_attr_const; | ||
|
|
||
|
|
||
| /** | ||
| * \brief Get the size of the Check field with the given Check ID | ||
| * | ||
| * Although not all Check IDs have a check algorithm associated, the size of | ||
| * every Check is already frozen. This function returns the size (in bytes) of | ||
| * the Check field with the specified Check ID. The values are: | ||
| * { 0, 4, 4, 4, 8, 8, 8, 16, 16, 16, 32, 32, 32, 64, 64, 64 } | ||
| * | ||
| * If the argument is not in the range [0, 15], UINT32_MAX is returned. | ||
| */ | ||
| extern LZMA_API(uint32_t) lzma_check_size(lzma_check check) | ||
| lzma_nothrow lzma_attr_const; | ||
|
|
||
|
|
||
| /** | ||
| * \brief Maximum size of a Check field | ||
| */ | ||
| #define LZMA_CHECK_SIZE_MAX 64 | ||
|
|
||
|
|
||
| /** | ||
| * \brief Calculate CRC32 | ||
| * | ||
| * Calculate CRC32 using the polynomial from the IEEE 802.3 standard. | ||
| * | ||
| * \param buf Pointer to the input buffer | ||
| * \param size Size of the input buffer | ||
| * \param crc Previously returned CRC value. This is used to | ||
| * calculate the CRC of a big buffer in smaller chunks. | ||
| * Set to zero when starting a new calculation. | ||
| * | ||
| * \return Updated CRC value, which can be passed to this function | ||
| * again to continue CRC calculation. | ||
| */ | ||
| extern LZMA_API(uint32_t) lzma_crc32( | ||
| const uint8_t *buf, size_t size, uint32_t crc) | ||
| lzma_nothrow lzma_attr_pure; | ||
|
|
||
|
|
||
| /** | ||
| * \brief Calculate CRC64 | ||
| * | ||
| * Calculate CRC64 using the polynomial from the ECMA-182 standard. | ||
| * | ||
| * This function is used similarly to lzma_crc32(). See its documentation. | ||
| */ | ||
| extern LZMA_API(uint64_t) lzma_crc64( | ||
| const uint8_t *buf, size_t size, uint64_t crc) | ||
| lzma_nothrow lzma_attr_pure; | ||
|
|
||
|
|
||
| /* | ||
| * SHA-256 functions are currently not exported to public API. | ||
| * Contact Lasse Collin if you think it should be. | ||
| */ | ||
|
|
||
|
|
||
| /** | ||
| * \brief Get the type of the integrity check | ||
| * | ||
| * This function can be called only immediately after lzma_code() has | ||
| * returned LZMA_NO_CHECK, LZMA_UNSUPPORTED_CHECK, or LZMA_GET_CHECK. | ||
| * Calling this function in any other situation has undefined behavior. | ||
| */ | ||
| extern LZMA_API(lzma_check) lzma_get_check(const lzma_stream *strm) | ||
| lzma_nothrow; |
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,77 @@ | ||
| /** | ||
| * \file lzma/delta.h | ||
| * \brief Delta filter | ||
| */ | ||
|
|
||
| /* | ||
| * Author: Lasse Collin | ||
| * | ||
| * This file has been put into the public domain. | ||
| * You can do whatever you want with this file. | ||
| * | ||
| * See ../lzma.h for information about liblzma as a whole. | ||
| */ | ||
|
|
||
| #ifndef LZMA_H_INTERNAL | ||
| # error Never include this file directly. Use <lzma.h> instead. | ||
| #endif | ||
|
|
||
|
|
||
| /** | ||
| * \brief Filter ID | ||
| * | ||
| * Filter ID of the Delta filter. This is used as lzma_filter.id. | ||
| */ | ||
| #define LZMA_FILTER_DELTA LZMA_VLI_C(0x03) | ||
|
|
||
|
|
||
| /** | ||
| * \brief Type of the delta calculation | ||
| * | ||
| * Currently only byte-wise delta is supported. Other possible types could | ||
| * be, for example, delta of 16/32/64-bit little/big endian integers, but | ||
| * these are not currently planned since byte-wise delta is almost as good. | ||
| */ | ||
| typedef enum { | ||
| LZMA_DELTA_TYPE_BYTE | ||
| } lzma_delta_type; | ||
|
|
||
|
|
||
| /** | ||
| * \brief Options for the Delta filter | ||
| * | ||
| * These options are needed by both encoder and decoder. | ||
| */ | ||
| typedef struct { | ||
| /** For now, this must always be LZMA_DELTA_TYPE_BYTE. */ | ||
| lzma_delta_type type; | ||
|
|
||
| /** | ||
| * \brief Delta distance | ||
| * | ||
| * With the only currently supported type, LZMA_DELTA_TYPE_BYTE, | ||
| * the distance is as bytes. | ||
| * | ||
| * Examples: | ||
| * - 16-bit stereo audio: distance = 4 bytes | ||
| * - 24-bit RGB image data: distance = 3 bytes | ||
| */ | ||
| uint32_t dist; | ||
| # define LZMA_DELTA_DIST_MIN 1 | ||
| # define LZMA_DELTA_DIST_MAX 256 | ||
|
|
||
| /* | ||
| * Reserved space to allow possible future extensions without | ||
| * breaking the ABI. You should not touch these, because the names | ||
| * of these variables may change. These are and will never be used | ||
| * when type is LZMA_DELTA_TYPE_BYTE, so it is safe to leave these | ||
| * uninitialized. | ||
| */ | ||
| uint32_t reserved_int1; | ||
| uint32_t reserved_int2; | ||
| uint32_t reserved_int3; | ||
| uint32_t reserved_int4; | ||
| void *reserved_ptr1; | ||
| void *reserved_ptr2; | ||
|
|
||
| } lzma_options_delta; |
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,64 @@ | ||
| /** | ||
| * \file lzma/hardware.h | ||
| * \brief Hardware information | ||
| * | ||
| * Since liblzma can consume a lot of system resources, it also provides | ||
| * ways to limit the resource usage. Applications linking against liblzma | ||
| * need to do the actual decisions how much resources to let liblzma to use. | ||
| * To ease making these decisions, liblzma provides functions to find out | ||
| * the relevant capabilities of the underlaying hardware. Currently there | ||
| * is only a function to find out the amount of RAM, but in the future there | ||
| * will be also a function to detect how many concurrent threads the system | ||
| * can run. | ||
| * | ||
| * \note On some operating systems, these function may temporarily | ||
| * load a shared library or open file descriptor(s) to find out | ||
| * the requested hardware information. Unless the application | ||
| * assumes that specific file descriptors are not touched by | ||
| * other threads, this should have no effect on thread safety. | ||
| * Possible operations involving file descriptors will restart | ||
| * the syscalls if they return EINTR. | ||
| */ | ||
|
|
||
| /* | ||
| * Author: Lasse Collin | ||
| * | ||
| * This file has been put into the public domain. | ||
| * You can do whatever you want with this file. | ||
| * | ||
| * See ../lzma.h for information about liblzma as a whole. | ||
| */ | ||
|
|
||
| #ifndef LZMA_H_INTERNAL | ||
| # error Never include this file directly. Use <lzma.h> instead. | ||
| #endif | ||
|
|
||
|
|
||
| /** | ||
| * \brief Get the total amount of physical memory (RAM) in bytes | ||
| * | ||
| * This function may be useful when determining a reasonable memory | ||
| * usage limit for decompressing or how much memory it is OK to use | ||
| * for compressing. | ||
| * | ||
| * \return On success, the total amount of physical memory in bytes | ||
| * is returned. If the amount of RAM cannot be determined, | ||
| * zero is returned. This can happen if an error occurs | ||
| * or if there is no code in liblzma to detect the amount | ||
| * of RAM on the specific operating system. | ||
| */ | ||
| extern LZMA_API(uint64_t) lzma_physmem(void) lzma_nothrow; | ||
|
|
||
|
|
||
| /** | ||
| * \brief Get the number of processor cores or threads | ||
| * | ||
| * This function may be useful when determining how many threads to use. | ||
| * If the hardware supports more than one thread per CPU core, the number | ||
| * of hardware threads is returned if that information is available. | ||
| * | ||
| * \brief On success, the number of available CPU threads or cores is | ||
| * returned. If this information isn't available or an error | ||
| * occurs, zero is returned. | ||
| */ | ||
| extern LZMA_API(uint32_t) lzma_cputhreads(void) lzma_nothrow; |
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,107 @@ | ||
| /** | ||
| * \file lzma/index_hash.h | ||
| * \brief Validate Index by using a hash function | ||
| * | ||
| * Hashing makes it possible to use constant amount of memory to validate | ||
| * Index of arbitrary size. | ||
| */ | ||
|
|
||
| /* | ||
| * Author: Lasse Collin | ||
| * | ||
| * This file has been put into the public domain. | ||
| * You can do whatever you want with this file. | ||
| * | ||
| * See ../lzma.h for information about liblzma as a whole. | ||
| */ | ||
|
|
||
| #ifndef LZMA_H_INTERNAL | ||
| # error Never include this file directly. Use <lzma.h> instead. | ||
| #endif | ||
|
|
||
| /** | ||
| * \brief Opaque data type to hold the Index hash | ||
| */ | ||
| typedef struct lzma_index_hash_s lzma_index_hash; | ||
|
|
||
|
|
||
| /** | ||
| * \brief Allocate and initialize a new lzma_index_hash structure | ||
| * | ||
| * If index_hash is NULL, a new lzma_index_hash structure is allocated, | ||
| * initialized, and a pointer to it returned. If allocation fails, NULL | ||
| * is returned. | ||
| * | ||
| * If index_hash is non-NULL, it is reinitialized and the same pointer | ||
| * returned. In this case, return value cannot be NULL or a different | ||
| * pointer than the index_hash that was given as an argument. | ||
| */ | ||
| extern LZMA_API(lzma_index_hash *) lzma_index_hash_init( | ||
| lzma_index_hash *index_hash, const lzma_allocator *allocator) | ||
| lzma_nothrow lzma_attr_warn_unused_result; | ||
|
|
||
|
|
||
| /** | ||
| * \brief Deallocate lzma_index_hash structure | ||
| */ | ||
| extern LZMA_API(void) lzma_index_hash_end( | ||
| lzma_index_hash *index_hash, const lzma_allocator *allocator) | ||
| lzma_nothrow; | ||
|
|
||
|
|
||
| /** | ||
| * \brief Add a new Record to an Index hash | ||
| * | ||
| * \param index Pointer to a lzma_index_hash structure | ||
| * \param unpadded_size Unpadded Size of a Block | ||
| * \param uncompressed_size Uncompressed Size of a Block | ||
| * | ||
| * \return - LZMA_OK | ||
| * - LZMA_DATA_ERROR: Compressed or uncompressed size of the | ||
| * Stream or size of the Index field would grow too big. | ||
| * - LZMA_PROG_ERROR: Invalid arguments or this function is being | ||
| * used when lzma_index_hash_decode() has already been used. | ||
| */ | ||
| extern LZMA_API(lzma_ret) lzma_index_hash_append(lzma_index_hash *index_hash, | ||
| lzma_vli unpadded_size, lzma_vli uncompressed_size) | ||
| lzma_nothrow lzma_attr_warn_unused_result; | ||
|
|
||
|
|
||
| /** | ||
| * \brief Decode and validate the Index field | ||
| * | ||
| * After telling the sizes of all Blocks with lzma_index_hash_append(), | ||
| * the actual Index field is decoded with this function. Specifically, | ||
| * once decoding of the Index field has been started, no more Records | ||
| * can be added using lzma_index_hash_append(). | ||
| * | ||
| * This function doesn't use lzma_stream structure to pass the input data. | ||
| * Instead, the input buffer is specified using three arguments. This is | ||
| * because it matches better the internal APIs of liblzma. | ||
| * | ||
| * \param index_hash Pointer to a lzma_index_hash structure | ||
| * \param in Pointer to the beginning of the input buffer | ||
| * \param in_pos in[*in_pos] is the next byte to process | ||
| * \param in_size in[in_size] is the first byte not to process | ||
| * | ||
| * \return - LZMA_OK: So far good, but more input is needed. | ||
| * - LZMA_STREAM_END: Index decoded successfully and it matches | ||
| * the Records given with lzma_index_hash_append(). | ||
| * - LZMA_DATA_ERROR: Index is corrupt or doesn't match the | ||
| * information given with lzma_index_hash_append(). | ||
| * - LZMA_BUF_ERROR: Cannot progress because *in_pos >= in_size. | ||
| * - LZMA_PROG_ERROR | ||
| */ | ||
| extern LZMA_API(lzma_ret) lzma_index_hash_decode(lzma_index_hash *index_hash, | ||
| const uint8_t *in, size_t *in_pos, size_t in_size) | ||
| lzma_nothrow lzma_attr_warn_unused_result; | ||
|
|
||
|
|
||
| /** | ||
| * \brief Get the size of the Index field as bytes | ||
| * | ||
| * This is needed to verify the Backward Size field in the Stream Footer. | ||
| */ | ||
| extern LZMA_API(lzma_vli) lzma_index_hash_size( | ||
| const lzma_index_hash *index_hash) | ||
| lzma_nothrow lzma_attr_pure; |
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,223 @@ | ||
| /** | ||
| * \file lzma/stream_flags.h | ||
| * \brief .xz Stream Header and Stream Footer encoder and decoder | ||
| */ | ||
|
|
||
| /* | ||
| * Author: Lasse Collin | ||
| * | ||
| * This file has been put into the public domain. | ||
| * You can do whatever you want with this file. | ||
| * | ||
| * See ../lzma.h for information about liblzma as a whole. | ||
| */ | ||
|
|
||
| #ifndef LZMA_H_INTERNAL | ||
| # error Never include this file directly. Use <lzma.h> instead. | ||
| #endif | ||
|
|
||
|
|
||
| /** | ||
| * \brief Size of Stream Header and Stream Footer | ||
| * | ||
| * Stream Header and Stream Footer have the same size and they are not | ||
| * going to change even if a newer version of the .xz file format is | ||
| * developed in future. | ||
| */ | ||
| #define LZMA_STREAM_HEADER_SIZE 12 | ||
|
|
||
|
|
||
| /** | ||
| * \brief Options for encoding/decoding Stream Header and Stream Footer | ||
| */ | ||
| typedef struct { | ||
| /** | ||
| * \brief Stream Flags format version | ||
| * | ||
| * To prevent API and ABI breakages if new features are needed in | ||
| * Stream Header or Stream Footer, a version number is used to | ||
| * indicate which fields in this structure are in use. For now, | ||
| * version must always be zero. With non-zero version, the | ||
| * lzma_stream_header_encode() and lzma_stream_footer_encode() | ||
| * will return LZMA_OPTIONS_ERROR. | ||
| * | ||
| * lzma_stream_header_decode() and lzma_stream_footer_decode() | ||
| * will always set this to the lowest value that supports all the | ||
| * features indicated by the Stream Flags field. The application | ||
| * must check that the version number set by the decoding functions | ||
| * is supported by the application. Otherwise it is possible that | ||
| * the application will decode the Stream incorrectly. | ||
| */ | ||
| uint32_t version; | ||
|
|
||
| /** | ||
| * \brief Backward Size | ||
| * | ||
| * Backward Size must be a multiple of four bytes. In this Stream | ||
| * format version, Backward Size is the size of the Index field. | ||
| * | ||
| * Backward Size isn't actually part of the Stream Flags field, but | ||
| * it is convenient to include in this structure anyway. Backward | ||
| * Size is present only in the Stream Footer. There is no need to | ||
| * initialize backward_size when encoding Stream Header. | ||
| * | ||
| * lzma_stream_header_decode() always sets backward_size to | ||
| * LZMA_VLI_UNKNOWN so that it is convenient to use | ||
| * lzma_stream_flags_compare() when both Stream Header and Stream | ||
| * Footer have been decoded. | ||
| */ | ||
| lzma_vli backward_size; | ||
| # define LZMA_BACKWARD_SIZE_MIN 4 | ||
| # define LZMA_BACKWARD_SIZE_MAX (LZMA_VLI_C(1) << 34) | ||
|
|
||
| /** | ||
| * \brief Check ID | ||
| * | ||
| * This indicates the type of the integrity check calculated from | ||
| * uncompressed data. | ||
| */ | ||
| lzma_check check; | ||
|
|
||
| /* | ||
| * Reserved space to allow possible future extensions without | ||
| * breaking the ABI. You should not touch these, because the | ||
| * names of these variables may change. | ||
| * | ||
| * (We will never be able to use all of these since Stream Flags | ||
| * is just two bytes plus Backward Size of four bytes. But it's | ||
| * nice to have the proper types when they are needed.) | ||
| */ | ||
| lzma_reserved_enum reserved_enum1; | ||
| lzma_reserved_enum reserved_enum2; | ||
| lzma_reserved_enum reserved_enum3; | ||
| lzma_reserved_enum reserved_enum4; | ||
| lzma_bool reserved_bool1; | ||
| lzma_bool reserved_bool2; | ||
| lzma_bool reserved_bool3; | ||
| lzma_bool reserved_bool4; | ||
| lzma_bool reserved_bool5; | ||
| lzma_bool reserved_bool6; | ||
| lzma_bool reserved_bool7; | ||
| lzma_bool reserved_bool8; | ||
| uint32_t reserved_int1; | ||
| uint32_t reserved_int2; | ||
|
|
||
| } lzma_stream_flags; | ||
|
|
||
|
|
||
| /** | ||
| * \brief Encode Stream Header | ||
| * | ||
| * \param options Stream Header options to be encoded. | ||
| * options->backward_size is ignored and doesn't | ||
| * need to be initialized. | ||
| * \param out Beginning of the output buffer of | ||
| * LZMA_STREAM_HEADER_SIZE bytes. | ||
| * | ||
| * \return - LZMA_OK: Encoding was successful. | ||
| * - LZMA_OPTIONS_ERROR: options->version is not supported by | ||
| * this liblzma version. | ||
| * - LZMA_PROG_ERROR: Invalid options. | ||
| */ | ||
| extern LZMA_API(lzma_ret) lzma_stream_header_encode( | ||
| const lzma_stream_flags *options, uint8_t *out) | ||
| lzma_nothrow lzma_attr_warn_unused_result; | ||
|
|
||
|
|
||
| /** | ||
| * \brief Encode Stream Footer | ||
| * | ||
| * \param options Stream Footer options to be encoded. | ||
| * \param out Beginning of the output buffer of | ||
| * LZMA_STREAM_HEADER_SIZE bytes. | ||
| * | ||
| * \return - LZMA_OK: Encoding was successful. | ||
| * - LZMA_OPTIONS_ERROR: options->version is not supported by | ||
| * this liblzma version. | ||
| * - LZMA_PROG_ERROR: Invalid options. | ||
| */ | ||
| extern LZMA_API(lzma_ret) lzma_stream_footer_encode( | ||
| const lzma_stream_flags *options, uint8_t *out) | ||
| lzma_nothrow lzma_attr_warn_unused_result; | ||
|
|
||
|
|
||
| /** | ||
| * \brief Decode Stream Header | ||
| * | ||
| * \param options Target for the decoded Stream Header options. | ||
| * \param in Beginning of the input buffer of | ||
| * LZMA_STREAM_HEADER_SIZE bytes. | ||
| * | ||
| * options->backward_size is always set to LZMA_VLI_UNKNOWN. This is to | ||
| * help comparing Stream Flags from Stream Header and Stream Footer with | ||
| * lzma_stream_flags_compare(). | ||
| * | ||
| * \return - LZMA_OK: Decoding was successful. | ||
| * - LZMA_FORMAT_ERROR: Magic bytes don't match, thus the given | ||
| * buffer cannot be Stream Header. | ||
| * - LZMA_DATA_ERROR: CRC32 doesn't match, thus the header | ||
| * is corrupt. | ||
| * - LZMA_OPTIONS_ERROR: Unsupported options are present | ||
| * in the header. | ||
| * | ||
| * \note When decoding .xz files that contain multiple Streams, it may | ||
| * make sense to print "file format not recognized" only if | ||
| * decoding of the Stream Header of the _first_ Stream gives | ||
| * LZMA_FORMAT_ERROR. If non-first Stream Header gives | ||
| * LZMA_FORMAT_ERROR, the message used for LZMA_DATA_ERROR is | ||
| * probably more appropriate. | ||
| * | ||
| * For example, Stream decoder in liblzma uses LZMA_DATA_ERROR if | ||
| * LZMA_FORMAT_ERROR is returned by lzma_stream_header_decode() | ||
| * when decoding non-first Stream. | ||
| */ | ||
| extern LZMA_API(lzma_ret) lzma_stream_header_decode( | ||
| lzma_stream_flags *options, const uint8_t *in) | ||
| lzma_nothrow lzma_attr_warn_unused_result; | ||
|
|
||
|
|
||
| /** | ||
| * \brief Decode Stream Footer | ||
| * | ||
| * \param options Target for the decoded Stream Header options. | ||
| * \param in Beginning of the input buffer of | ||
| * LZMA_STREAM_HEADER_SIZE bytes. | ||
| * | ||
| * \return - LZMA_OK: Decoding was successful. | ||
| * - LZMA_FORMAT_ERROR: Magic bytes don't match, thus the given | ||
| * buffer cannot be Stream Footer. | ||
| * - LZMA_DATA_ERROR: CRC32 doesn't match, thus the Stream Footer | ||
| * is corrupt. | ||
| * - LZMA_OPTIONS_ERROR: Unsupported options are present | ||
| * in Stream Footer. | ||
| * | ||
| * \note If Stream Header was already decoded successfully, but | ||
| * decoding Stream Footer returns LZMA_FORMAT_ERROR, the | ||
| * application should probably report some other error message | ||
| * than "file format not recognized", since the file more likely | ||
| * is corrupt (possibly truncated). Stream decoder in liblzma | ||
| * uses LZMA_DATA_ERROR in this situation. | ||
| */ | ||
| extern LZMA_API(lzma_ret) lzma_stream_footer_decode( | ||
| lzma_stream_flags *options, const uint8_t *in) | ||
| lzma_nothrow lzma_attr_warn_unused_result; | ||
|
|
||
|
|
||
| /** | ||
| * \brief Compare two lzma_stream_flags structures | ||
| * | ||
| * backward_size values are compared only if both are not | ||
| * LZMA_VLI_UNKNOWN. | ||
| * | ||
| * \return - LZMA_OK: Both are equal. If either had backward_size set | ||
| * to LZMA_VLI_UNKNOWN, backward_size values were not | ||
| * compared or validated. | ||
| * - LZMA_DATA_ERROR: The structures differ. | ||
| * - LZMA_OPTIONS_ERROR: version in either structure is greater | ||
| * than the maximum supported version (currently zero). | ||
| * - LZMA_PROG_ERROR: Invalid value, e.g. invalid check or | ||
| * backward_size. | ||
| */ | ||
| extern LZMA_API(lzma_ret) lzma_stream_flags_compare( | ||
| const lzma_stream_flags *a, const lzma_stream_flags *b) | ||
| lzma_nothrow lzma_attr_pure; |
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,121 @@ | ||
| /** | ||
| * \file lzma/version.h | ||
| * \brief Version number | ||
| */ | ||
|
|
||
| /* | ||
| * Author: Lasse Collin | ||
| * | ||
| * This file has been put into the public domain. | ||
| * You can do whatever you want with this file. | ||
| * | ||
| * See ../lzma.h for information about liblzma as a whole. | ||
| */ | ||
|
|
||
| #ifndef LZMA_H_INTERNAL | ||
| # error Never include this file directly. Use <lzma.h> instead. | ||
| #endif | ||
|
|
||
|
|
||
| /* | ||
| * Version number split into components | ||
| */ | ||
| #define LZMA_VERSION_MAJOR 5 | ||
| #define LZMA_VERSION_MINOR 2 | ||
| #define LZMA_VERSION_PATCH 4 | ||
| #define LZMA_VERSION_STABILITY LZMA_VERSION_STABILITY_STABLE | ||
|
|
||
| #ifndef LZMA_VERSION_COMMIT | ||
| # define LZMA_VERSION_COMMIT "" | ||
| #endif | ||
|
|
||
|
|
||
| /* | ||
| * Map symbolic stability levels to integers. | ||
| */ | ||
| #define LZMA_VERSION_STABILITY_ALPHA 0 | ||
| #define LZMA_VERSION_STABILITY_BETA 1 | ||
| #define LZMA_VERSION_STABILITY_STABLE 2 | ||
|
|
||
|
|
||
| /** | ||
| * \brief Compile-time version number | ||
| * | ||
| * The version number is of format xyyyzzzs where | ||
| * - x = major | ||
| * - yyy = minor | ||
| * - zzz = revision | ||
| * - s indicates stability: 0 = alpha, 1 = beta, 2 = stable | ||
| * | ||
| * The same xyyyzzz triplet is never reused with different stability levels. | ||
| * For example, if 5.1.0alpha has been released, there will never be 5.1.0beta | ||
| * or 5.1.0 stable. | ||
| * | ||
| * \note The version number of liblzma has nothing to with | ||
| * the version number of Igor Pavlov's LZMA SDK. | ||
| */ | ||
| #define LZMA_VERSION (LZMA_VERSION_MAJOR * UINT32_C(10000000) \ | ||
| + LZMA_VERSION_MINOR * UINT32_C(10000) \ | ||
| + LZMA_VERSION_PATCH * UINT32_C(10) \ | ||
| + LZMA_VERSION_STABILITY) | ||
|
|
||
|
|
||
| /* | ||
| * Macros to construct the compile-time version string | ||
| */ | ||
| #if LZMA_VERSION_STABILITY == LZMA_VERSION_STABILITY_ALPHA | ||
| # define LZMA_VERSION_STABILITY_STRING "alpha" | ||
| #elif LZMA_VERSION_STABILITY == LZMA_VERSION_STABILITY_BETA | ||
| # define LZMA_VERSION_STABILITY_STRING "beta" | ||
| #elif LZMA_VERSION_STABILITY == LZMA_VERSION_STABILITY_STABLE | ||
| # define LZMA_VERSION_STABILITY_STRING "" | ||
| #else | ||
| # error Incorrect LZMA_VERSION_STABILITY | ||
| #endif | ||
|
|
||
| #define LZMA_VERSION_STRING_C_(major, minor, patch, stability, commit) \ | ||
| #major "." #minor "." #patch stability commit | ||
|
|
||
| #define LZMA_VERSION_STRING_C(major, minor, patch, stability, commit) \ | ||
| LZMA_VERSION_STRING_C_(major, minor, patch, stability, commit) | ||
|
|
||
|
|
||
| /** | ||
| * \brief Compile-time version as a string | ||
| * | ||
| * This can be for example "4.999.5alpha", "4.999.8beta", or "5.0.0" (stable | ||
| * versions don't have any "stable" suffix). In future, a snapshot built | ||
| * from source code repository may include an additional suffix, for example | ||
| * "4.999.8beta-21-g1d92". The commit ID won't be available in numeric form | ||
| * in LZMA_VERSION macro. | ||
| */ | ||
| #define LZMA_VERSION_STRING LZMA_VERSION_STRING_C( \ | ||
| LZMA_VERSION_MAJOR, LZMA_VERSION_MINOR, \ | ||
| LZMA_VERSION_PATCH, LZMA_VERSION_STABILITY_STRING, \ | ||
| LZMA_VERSION_COMMIT) | ||
|
|
||
|
|
||
| /* #ifndef is needed for use with windres (MinGW or Cygwin). */ | ||
| #ifndef LZMA_H_INTERNAL_RC | ||
|
|
||
| /** | ||
| * \brief Run-time version number as an integer | ||
| * | ||
| * Return the value of LZMA_VERSION macro at the compile time of liblzma. | ||
| * This allows the application to compare if it was built against the same, | ||
| * older, or newer version of liblzma that is currently running. | ||
| */ | ||
| extern LZMA_API(uint32_t) lzma_version_number(void) | ||
| lzma_nothrow lzma_attr_const; | ||
|
|
||
|
|
||
| /** | ||
| * \brief Run-time version as a string | ||
| * | ||
| * This function may be useful if you want to display which version of | ||
| * liblzma your application is currently using. | ||
| */ | ||
| extern LZMA_API(const char *) lzma_version_string(void) | ||
| lzma_nothrow lzma_attr_const; | ||
|
|
||
| #endif |
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,166 @@ | ||
| /** | ||
| * \file lzma/vli.h | ||
| * \brief Variable-length integer handling | ||
| * | ||
| * In the .xz format, most integers are encoded in a variable-length | ||
| * representation, which is sometimes called little endian base-128 encoding. | ||
| * This saves space when smaller values are more likely than bigger values. | ||
| * | ||
| * The encoding scheme encodes seven bits to every byte, using minimum | ||
| * number of bytes required to represent the given value. Encodings that use | ||
| * non-minimum number of bytes are invalid, thus every integer has exactly | ||
| * one encoded representation. The maximum number of bits in a VLI is 63, | ||
| * thus the vli argument must be less than or equal to UINT64_MAX / 2. You | ||
| * should use LZMA_VLI_MAX for clarity. | ||
| */ | ||
|
|
||
| /* | ||
| * Author: Lasse Collin | ||
| * | ||
| * This file has been put into the public domain. | ||
| * You can do whatever you want with this file. | ||
| * | ||
| * See ../lzma.h for information about liblzma as a whole. | ||
| */ | ||
|
|
||
| #ifndef LZMA_H_INTERNAL | ||
| # error Never include this file directly. Use <lzma.h> instead. | ||
| #endif | ||
|
|
||
|
|
||
| /** | ||
| * \brief Maximum supported value of a variable-length integer | ||
| */ | ||
| #define LZMA_VLI_MAX (UINT64_MAX / 2) | ||
|
|
||
| /** | ||
| * \brief VLI value to denote that the value is unknown | ||
| */ | ||
| #define LZMA_VLI_UNKNOWN UINT64_MAX | ||
|
|
||
| /** | ||
| * \brief Maximum supported encoded length of variable length integers | ||
| */ | ||
| #define LZMA_VLI_BYTES_MAX 9 | ||
|
|
||
| /** | ||
| * \brief VLI constant suffix | ||
| */ | ||
| #define LZMA_VLI_C(n) UINT64_C(n) | ||
|
|
||
|
|
||
| /** | ||
| * \brief Variable-length integer type | ||
| * | ||
| * Valid VLI values are in the range [0, LZMA_VLI_MAX]. Unknown value is | ||
| * indicated with LZMA_VLI_UNKNOWN, which is the maximum value of the | ||
| * underlaying integer type. | ||
| * | ||
| * lzma_vli will be uint64_t for the foreseeable future. If a bigger size | ||
| * is needed in the future, it is guaranteed that 2 * LZMA_VLI_MAX will | ||
| * not overflow lzma_vli. This simplifies integer overflow detection. | ||
| */ | ||
| typedef uint64_t lzma_vli; | ||
|
|
||
|
|
||
| /** | ||
| * \brief Validate a variable-length integer | ||
| * | ||
| * This is useful to test that application has given acceptable values | ||
| * for example in the uncompressed_size and compressed_size variables. | ||
| * | ||
| * \return True if the integer is representable as VLI or if it | ||
| * indicates unknown value. | ||
| */ | ||
| #define lzma_vli_is_valid(vli) \ | ||
| ((vli) <= LZMA_VLI_MAX || (vli) == LZMA_VLI_UNKNOWN) | ||
|
|
||
|
|
||
| /** | ||
| * \brief Encode a variable-length integer | ||
| * | ||
| * This function has two modes: single-call and multi-call. Single-call mode | ||
| * encodes the whole integer at once; it is an error if the output buffer is | ||
| * too small. Multi-call mode saves the position in *vli_pos, and thus it is | ||
| * possible to continue encoding if the buffer becomes full before the whole | ||
| * integer has been encoded. | ||
| * | ||
| * \param vli Integer to be encoded | ||
| * \param vli_pos How many VLI-encoded bytes have already been written | ||
| * out. When starting to encode a new integer in | ||
| * multi-call mode, *vli_pos must be set to zero. | ||
| * To use single-call encoding, set vli_pos to NULL. | ||
| * \param out Beginning of the output buffer | ||
| * \param out_pos The next byte will be written to out[*out_pos]. | ||
| * \param out_size Size of the out buffer; the first byte into | ||
| * which no data is written to is out[out_size]. | ||
| * | ||
| * \return Slightly different return values are used in multi-call and | ||
| * single-call modes. | ||
| * | ||
| * Single-call (vli_pos == NULL): | ||
| * - LZMA_OK: Integer successfully encoded. | ||
| * - LZMA_PROG_ERROR: Arguments are not sane. This can be due | ||
| * to too little output space; single-call mode doesn't use | ||
| * LZMA_BUF_ERROR, since the application should have checked | ||
| * the encoded size with lzma_vli_size(). | ||
| * | ||
| * Multi-call (vli_pos != NULL): | ||
| * - LZMA_OK: So far all OK, but the integer is not | ||
| * completely written out yet. | ||
| * - LZMA_STREAM_END: Integer successfully encoded. | ||
| * - LZMA_BUF_ERROR: No output space was provided. | ||
| * - LZMA_PROG_ERROR: Arguments are not sane. | ||
| */ | ||
| extern LZMA_API(lzma_ret) lzma_vli_encode(lzma_vli vli, size_t *vli_pos, | ||
| uint8_t *out, size_t *out_pos, size_t out_size) lzma_nothrow; | ||
|
|
||
|
|
||
| /** | ||
| * \brief Decode a variable-length integer | ||
| * | ||
| * Like lzma_vli_encode(), this function has single-call and multi-call modes. | ||
| * | ||
| * \param vli Pointer to decoded integer. The decoder will | ||
| * initialize it to zero when *vli_pos == 0, so | ||
| * application isn't required to initialize *vli. | ||
| * \param vli_pos How many bytes have already been decoded. When | ||
| * starting to decode a new integer in multi-call | ||
| * mode, *vli_pos must be initialized to zero. To | ||
| * use single-call decoding, set vli_pos to NULL. | ||
| * \param in Beginning of the input buffer | ||
| * \param in_pos The next byte will be read from in[*in_pos]. | ||
| * \param in_size Size of the input buffer; the first byte that | ||
| * won't be read is in[in_size]. | ||
| * | ||
| * \return Slightly different return values are used in multi-call and | ||
| * single-call modes. | ||
| * | ||
| * Single-call (vli_pos == NULL): | ||
| * - LZMA_OK: Integer successfully decoded. | ||
| * - LZMA_DATA_ERROR: Integer is corrupt. This includes hitting | ||
| * the end of the input buffer before the whole integer was | ||
| * decoded; providing no input at all will use LZMA_DATA_ERROR. | ||
| * - LZMA_PROG_ERROR: Arguments are not sane. | ||
| * | ||
| * Multi-call (vli_pos != NULL): | ||
| * - LZMA_OK: So far all OK, but the integer is not | ||
| * completely decoded yet. | ||
| * - LZMA_STREAM_END: Integer successfully decoded. | ||
| * - LZMA_DATA_ERROR: Integer is corrupt. | ||
| * - LZMA_BUF_ERROR: No input was provided. | ||
| * - LZMA_PROG_ERROR: Arguments are not sane. | ||
| */ | ||
| extern LZMA_API(lzma_ret) lzma_vli_decode(lzma_vli *vli, size_t *vli_pos, | ||
| const uint8_t *in, size_t *in_pos, size_t in_size) | ||
| lzma_nothrow; | ||
|
|
||
|
|
||
| /** | ||
| * \brief Get the number of bytes required to encode a VLI | ||
| * | ||
| * \return Number of bytes on success (1-9). If vli isn't valid, | ||
| * zero is returned. | ||
| */ | ||
| extern LZMA_API(uint32_t) lzma_vli_size(lzma_vli vli) | ||
| lzma_nothrow lzma_attr_pure; |
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,174 @@ | ||
| /////////////////////////////////////////////////////////////////////////////// | ||
| // | ||
| /// \file check.c | ||
| /// \brief Single API to access different integrity checks | ||
| // | ||
| // Author: Lasse Collin | ||
| // | ||
| // This file has been put into the public domain. | ||
| // You can do whatever you want with this file. | ||
| // | ||
| /////////////////////////////////////////////////////////////////////////////// | ||
|
|
||
| #include "check.h" | ||
|
|
||
|
|
||
| extern LZMA_API(lzma_bool) | ||
| lzma_check_is_supported(lzma_check type) | ||
| { | ||
| if ((unsigned int)(type) > LZMA_CHECK_ID_MAX) | ||
| return false; | ||
|
|
||
| static const lzma_bool available_checks[LZMA_CHECK_ID_MAX + 1] = { | ||
| true, // LZMA_CHECK_NONE | ||
|
|
||
| #ifdef HAVE_CHECK_CRC32 | ||
| true, | ||
| #else | ||
| false, | ||
| #endif | ||
|
|
||
| false, // Reserved | ||
| false, // Reserved | ||
|
|
||
| #ifdef HAVE_CHECK_CRC64 | ||
| true, | ||
| #else | ||
| false, | ||
| #endif | ||
|
|
||
| false, // Reserved | ||
| false, // Reserved | ||
| false, // Reserved | ||
| false, // Reserved | ||
| false, // Reserved | ||
|
|
||
| #ifdef HAVE_CHECK_SHA256 | ||
| true, | ||
| #else | ||
| false, | ||
| #endif | ||
|
|
||
| false, // Reserved | ||
| false, // Reserved | ||
| false, // Reserved | ||
| false, // Reserved | ||
| false, // Reserved | ||
| }; | ||
|
|
||
| return available_checks[(unsigned int)(type)]; | ||
| } | ||
|
|
||
|
|
||
| extern LZMA_API(uint32_t) | ||
| lzma_check_size(lzma_check type) | ||
| { | ||
| if ((unsigned int)(type) > LZMA_CHECK_ID_MAX) | ||
| return UINT32_MAX; | ||
|
|
||
| // See file-format.txt section 2.1.1.2. | ||
| static const uint8_t check_sizes[LZMA_CHECK_ID_MAX + 1] = { | ||
| 0, | ||
| 4, 4, 4, | ||
| 8, 8, 8, | ||
| 16, 16, 16, | ||
| 32, 32, 32, | ||
| 64, 64, 64 | ||
| }; | ||
|
|
||
| return check_sizes[(unsigned int)(type)]; | ||
| } | ||
|
|
||
|
|
||
| extern void | ||
| lzma_check_init(lzma_check_state *check, lzma_check type) | ||
| { | ||
| switch (type) { | ||
| case LZMA_CHECK_NONE: | ||
| break; | ||
|
|
||
| #ifdef HAVE_CHECK_CRC32 | ||
| case LZMA_CHECK_CRC32: | ||
| check->state.crc32 = 0; | ||
| break; | ||
| #endif | ||
|
|
||
| #ifdef HAVE_CHECK_CRC64 | ||
| case LZMA_CHECK_CRC64: | ||
| check->state.crc64 = 0; | ||
| break; | ||
| #endif | ||
|
|
||
| #ifdef HAVE_CHECK_SHA256 | ||
| case LZMA_CHECK_SHA256: | ||
| lzma_sha256_init(check); | ||
| break; | ||
| #endif | ||
|
|
||
| default: | ||
| break; | ||
| } | ||
|
|
||
| return; | ||
| } | ||
|
|
||
|
|
||
| extern void | ||
| lzma_check_update(lzma_check_state *check, lzma_check type, | ||
| const uint8_t *buf, size_t size) | ||
| { | ||
| switch (type) { | ||
| #ifdef HAVE_CHECK_CRC32 | ||
| case LZMA_CHECK_CRC32: | ||
| check->state.crc32 = lzma_crc32(buf, size, check->state.crc32); | ||
| break; | ||
| #endif | ||
|
|
||
| #ifdef HAVE_CHECK_CRC64 | ||
| case LZMA_CHECK_CRC64: | ||
| check->state.crc64 = lzma_crc64(buf, size, check->state.crc64); | ||
| break; | ||
| #endif | ||
|
|
||
| #ifdef HAVE_CHECK_SHA256 | ||
| case LZMA_CHECK_SHA256: | ||
| lzma_sha256_update(buf, size, check); | ||
| break; | ||
| #endif | ||
|
|
||
| default: | ||
| break; | ||
| } | ||
|
|
||
| return; | ||
| } | ||
|
|
||
|
|
||
| extern void | ||
| lzma_check_finish(lzma_check_state *check, lzma_check type) | ||
| { | ||
| switch (type) { | ||
| #ifdef HAVE_CHECK_CRC32 | ||
| case LZMA_CHECK_CRC32: | ||
| check->buffer.u32[0] = conv32le(check->state.crc32); | ||
| break; | ||
| #endif | ||
|
|
||
| #ifdef HAVE_CHECK_CRC64 | ||
| case LZMA_CHECK_CRC64: | ||
| check->buffer.u64[0] = conv64le(check->state.crc64); | ||
| break; | ||
| #endif | ||
|
|
||
| #ifdef HAVE_CHECK_SHA256 | ||
| case LZMA_CHECK_SHA256: | ||
| lzma_sha256_finish(check); | ||
| break; | ||
| #endif | ||
|
|
||
| default: | ||
| break; | ||
| } | ||
|
|
||
| return; | ||
| } |
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,172 @@ | ||
| /////////////////////////////////////////////////////////////////////////////// | ||
| // | ||
| /// \file check.h | ||
| /// \brief Internal API to different integrity check functions | ||
| // | ||
| // Author: Lasse Collin | ||
| // | ||
| // This file has been put into the public domain. | ||
| // You can do whatever you want with this file. | ||
| // | ||
| /////////////////////////////////////////////////////////////////////////////// | ||
|
|
||
| #ifndef LZMA_CHECK_H | ||
| #define LZMA_CHECK_H | ||
|
|
||
| #include "common.h" | ||
|
|
||
| // If the function for external SHA-256 is missing, use the internal SHA-256 | ||
| // code. Due to how configure works, these defines can only get defined when | ||
| // both a usable header and a type have already been found. | ||
| #if !(defined(HAVE_CC_SHA256_INIT) \ | ||
| || defined(HAVE_SHA256_INIT) \ | ||
| || defined(HAVE_SHA256INIT)) | ||
| # define HAVE_INTERNAL_SHA256 1 | ||
| #endif | ||
|
|
||
| #if defined(HAVE_INTERNAL_SHA256) | ||
| // Nothing | ||
| #elif defined(HAVE_COMMONCRYPTO_COMMONDIGEST_H) | ||
| # include <CommonCrypto/CommonDigest.h> | ||
| #elif defined(HAVE_SHA256_H) | ||
| # include <sys/types.h> | ||
| # include <sha256.h> | ||
| #elif defined(HAVE_SHA2_H) | ||
| # include <sys/types.h> | ||
| # include <sha2.h> | ||
| #endif | ||
|
|
||
| #if defined(HAVE_INTERNAL_SHA256) | ||
| /// State for the internal SHA-256 implementation | ||
| typedef struct { | ||
| /// Internal state | ||
| uint32_t state[8]; | ||
|
|
||
| /// Size of the message excluding padding | ||
| uint64_t size; | ||
| } lzma_sha256_state; | ||
| #elif defined(HAVE_CC_SHA256_CTX) | ||
| typedef CC_SHA256_CTX lzma_sha256_state; | ||
| #elif defined(HAVE_SHA256_CTX) | ||
| typedef SHA256_CTX lzma_sha256_state; | ||
| #elif defined(HAVE_SHA2_CTX) | ||
| typedef SHA2_CTX lzma_sha256_state; | ||
| #endif | ||
|
|
||
| #if defined(HAVE_INTERNAL_SHA256) | ||
| // Nothing | ||
| #elif defined(HAVE_CC_SHA256_INIT) | ||
| # define LZMA_SHA256FUNC(x) CC_SHA256_ ## x | ||
| #elif defined(HAVE_SHA256_INIT) | ||
| # define LZMA_SHA256FUNC(x) SHA256_ ## x | ||
| #elif defined(HAVE_SHA256INIT) | ||
| # define LZMA_SHA256FUNC(x) SHA256 ## x | ||
| #endif | ||
|
|
||
| // Index hashing needs the best possible hash function (preferably | ||
| // a cryptographic hash) for maximum reliability. | ||
| #if defined(HAVE_CHECK_SHA256) | ||
| # define LZMA_CHECK_BEST LZMA_CHECK_SHA256 | ||
| #elif defined(HAVE_CHECK_CRC64) | ||
| # define LZMA_CHECK_BEST LZMA_CHECK_CRC64 | ||
| #else | ||
| # define LZMA_CHECK_BEST LZMA_CHECK_CRC32 | ||
| #endif | ||
|
|
||
|
|
||
| /// \brief Structure to hold internal state of the check being calculated | ||
| /// | ||
| /// \note This is not in the public API because this structure may | ||
| /// change in future if new integrity check algorithms are added. | ||
| typedef struct { | ||
| /// Buffer to hold the final result and a temporary buffer for SHA256. | ||
| union { | ||
| uint8_t u8[64]; | ||
| uint32_t u32[16]; | ||
| uint64_t u64[8]; | ||
| } buffer; | ||
|
|
||
| /// Check-specific data | ||
| union { | ||
| uint32_t crc32; | ||
| uint64_t crc64; | ||
| lzma_sha256_state sha256; | ||
| } state; | ||
|
|
||
| } lzma_check_state; | ||
|
|
||
|
|
||
| /// lzma_crc32_table[0] is needed by LZ encoder so we need to keep | ||
| /// the array two-dimensional. | ||
| #ifdef HAVE_SMALL | ||
| extern uint32_t lzma_crc32_table[1][256]; | ||
| extern void lzma_crc32_init(void); | ||
| #else | ||
| extern const uint32_t lzma_crc32_table[8][256]; | ||
| extern const uint64_t lzma_crc64_table[4][256]; | ||
| #endif | ||
|
|
||
|
|
||
| /// \brief Initialize *check depending on type | ||
| /// | ||
| /// \return LZMA_OK on success. LZMA_UNSUPPORTED_CHECK if the type is not | ||
| /// supported by the current version or build of liblzma. | ||
| /// LZMA_PROG_ERROR if type > LZMA_CHECK_ID_MAX. | ||
| extern void lzma_check_init(lzma_check_state *check, lzma_check type); | ||
|
|
||
| /// Update the check state | ||
| extern void lzma_check_update(lzma_check_state *check, lzma_check type, | ||
| const uint8_t *buf, size_t size); | ||
|
|
||
| /// Finish the check calculation and store the result to check->buffer.u8. | ||
| extern void lzma_check_finish(lzma_check_state *check, lzma_check type); | ||
|
|
||
|
|
||
| #ifndef LZMA_SHA256FUNC | ||
|
|
||
| /// Prepare SHA-256 state for new input. | ||
| extern void lzma_sha256_init(lzma_check_state *check); | ||
|
|
||
| /// Update the SHA-256 hash state | ||
| extern void lzma_sha256_update( | ||
| const uint8_t *buf, size_t size, lzma_check_state *check); | ||
|
|
||
| /// Finish the SHA-256 calculation and store the result to check->buffer.u8. | ||
| extern void lzma_sha256_finish(lzma_check_state *check); | ||
|
|
||
|
|
||
| #else | ||
|
|
||
| static inline void | ||
| lzma_sha256_init(lzma_check_state *check) | ||
| { | ||
| LZMA_SHA256FUNC(Init)(&check->state.sha256); | ||
| } | ||
|
|
||
|
|
||
| static inline void | ||
| lzma_sha256_update(const uint8_t *buf, size_t size, lzma_check_state *check) | ||
| { | ||
| #if defined(HAVE_CC_SHA256_INIT) && SIZE_MAX > UINT32_MAX | ||
| // Darwin's CC_SHA256_Update takes uint32_t as the buffer size, | ||
| // so use a loop to support size_t. | ||
| while (size > UINT32_MAX) { | ||
| LZMA_SHA256FUNC(Update)(&check->state.sha256, buf, UINT32_MAX); | ||
| buf += UINT32_MAX; | ||
| size -= UINT32_MAX; | ||
| } | ||
| #endif | ||
|
|
||
| LZMA_SHA256FUNC(Update)(&check->state.sha256, buf, size); | ||
| } | ||
|
|
||
|
|
||
| static inline void | ||
| lzma_sha256_finish(lzma_check_state *check) | ||
| { | ||
| LZMA_SHA256FUNC(Final)(check->buffer.u8, &check->state.sha256); | ||
| } | ||
|
|
||
| #endif | ||
|
|
||
| #endif |
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,82 @@ | ||
| /////////////////////////////////////////////////////////////////////////////// | ||
| // | ||
| /// \file crc32.c | ||
| /// \brief CRC32 calculation | ||
| /// | ||
| /// Calculate the CRC32 using the slice-by-eight algorithm. | ||
| /// It is explained in this document: | ||
| /// http://www.intel.com/technology/comms/perfnet/download/CRC_generators.pdf | ||
| /// The code in this file is not the same as in Intel's paper, but | ||
| /// the basic principle is identical. | ||
| // | ||
| // Author: Lasse Collin | ||
| // | ||
| // This file has been put into the public domain. | ||
| // You can do whatever you want with this file. | ||
| // | ||
| /////////////////////////////////////////////////////////////////////////////// | ||
|
|
||
| #include "check.h" | ||
| #include "crc_macros.h" | ||
|
|
||
|
|
||
| // If you make any changes, do some benchmarking! Seemingly unrelated | ||
| // changes can very easily ruin the performance (and very probably is | ||
| // very compiler dependent). | ||
| extern LZMA_API(uint32_t) | ||
| lzma_crc32(const uint8_t *buf, size_t size, uint32_t crc) | ||
| { | ||
| crc = ~crc; | ||
|
|
||
| #ifdef WORDS_BIGENDIAN | ||
| crc = bswap32(crc); | ||
| #endif | ||
|
|
||
| if (size > 8) { | ||
| // Fix the alignment, if needed. The if statement above | ||
| // ensures that this won't read past the end of buf[]. | ||
| while ((uintptr_t)(buf) & 7) { | ||
| crc = lzma_crc32_table[0][*buf++ ^ A(crc)] ^ S8(crc); | ||
| --size; | ||
| } | ||
|
|
||
| // Calculate the position where to stop. | ||
| const uint8_t *const limit = buf + (size & ~(size_t)(7)); | ||
|
|
||
| // Calculate how many bytes must be calculated separately | ||
| // before returning the result. | ||
| size &= (size_t)(7); | ||
|
|
||
| // Calculate the CRC32 using the slice-by-eight algorithm. | ||
| while (buf < limit) { | ||
| crc ^= *(const uint32_t *)(buf); | ||
| buf += 4; | ||
|
|
||
| crc = lzma_crc32_table[7][A(crc)] | ||
| ^ lzma_crc32_table[6][B(crc)] | ||
| ^ lzma_crc32_table[5][C(crc)] | ||
| ^ lzma_crc32_table[4][D(crc)]; | ||
|
|
||
| const uint32_t tmp = *(const uint32_t *)(buf); | ||
| buf += 4; | ||
|
|
||
| // At least with some compilers, it is critical for | ||
| // performance, that the crc variable is XORed | ||
| // between the two table-lookup pairs. | ||
| crc = lzma_crc32_table[3][A(tmp)] | ||
| ^ lzma_crc32_table[2][B(tmp)] | ||
| ^ crc | ||
| ^ lzma_crc32_table[1][C(tmp)] | ||
| ^ lzma_crc32_table[0][D(tmp)]; | ||
| } | ||
| } | ||
|
|
||
| while (size-- != 0) | ||
| crc = lzma_crc32_table[0][*buf++ ^ A(crc)] ^ S8(crc); | ||
|
|
||
| #ifdef WORDS_BIGENDIAN | ||
| crc = bswap32(crc); | ||
| #endif | ||
|
|
||
| return ~crc; | ||
| } |
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,19 @@ | ||
| /////////////////////////////////////////////////////////////////////////////// | ||
| // | ||
| /// \file crc32_table.c | ||
| /// \brief Precalculated CRC32 table with correct endianness | ||
| // | ||
| // Author: Lasse Collin | ||
| // | ||
| // This file has been put into the public domain. | ||
| // You can do whatever you want with this file. | ||
| // | ||
| /////////////////////////////////////////////////////////////////////////////// | ||
|
|
||
| #include "common.h" | ||
|
|
||
| #ifdef WORDS_BIGENDIAN | ||
| # include "crc32_table_be.h" | ||
| #else | ||
| # include "crc32_table_le.h" | ||
| #endif |