From 80c6fcf574c77c8dd23a8c7f4173b8ad19b5b7c5 Mon Sep 17 00:00:00 2001 From: Soar Qin Date: Wed, 20 Dec 2023 15:56:34 +0800 Subject: [PATCH] Add license and move `CompressSave` to repo `DSP_Mods_TO` --- CompressSave/CompressSave.cs | 389 --- CompressSave/CompressSave.csproj | 30 - CompressSave/I18N.cs | 128 - CompressSave/LZ4WrapC/CMakeLists.txt | 16 - CompressSave/LZ4WrapC/LZ4Wrap.c | 154 - CompressSave/LZ4WrapC/LZ4Wrap.h | 46 - CompressSave/LZ4WrapC/dllmain.c | 20 - CompressSave/LZ4WrapC/lz4/LICENSE | 24 - CompressSave/LZ4WrapC/lz4/README.md | 187 -- CompressSave/LZ4WrapC/lz4/lz4.c | 2751 ----------------- CompressSave/LZ4WrapC/lz4/lz4.h | 862 ------ CompressSave/LZ4WrapC/lz4/lz4frame.c | 2076 ------------- CompressSave/LZ4WrapC/lz4/lz4frame.h | 707 ----- CompressSave/LZ4WrapC/lz4/lz4frame_static.h | 47 - CompressSave/LZ4WrapC/lz4/lz4hc.c | 1637 ---------- CompressSave/LZ4WrapC/lz4/lz4hc.h | 413 --- CompressSave/LZ4WrapC/lz4/xxhash.c | 1030 ------ CompressSave/LZ4WrapC/lz4/xxhash.h | 328 -- CompressSave/NoneWrapC/CMakeLists.txt | 11 - CompressSave/NoneWrapC/dllmain.c | 20 - CompressSave/NoneWrapC/nonewrap.c | 62 - CompressSave/NoneWrapC/nonewrap.h | 36 - CompressSave/PatchUILoadGame.cs | 83 - CompressSave/PatchUISaveGame.cs | 237 -- CompressSave/README.md | 197 +- CompressSave/SaveUtil.cs | 108 - CompressSave/Wrapper/BlackHoleStream.cs | 46 - CompressSave/Wrapper/BufferWriter.cs | 291 -- CompressSave/Wrapper/CompressionStream.cs | 223 -- CompressSave/Wrapper/DecompressionStream.cs | 154 - CompressSave/Wrapper/DoubleBuffer.cs | 115 - CompressSave/Wrapper/LZ4Wrapper.cs | 69 - CompressSave/Wrapper/NoneWrapper.cs | 69 - CompressSave/Wrapper/PeekableReader.cs | 11 - CompressSave/Wrapper/WrapperDefines.cs | 64 - CompressSave/Wrapper/ZstdWrapper.cs | 69 - CompressSave/ZstdWrapC/CMakeLists.txt | 17 - CompressSave/ZstdWrapC/dllmain.c | 20 - CompressSave/ZstdWrapC/zstdwrap.c | 84 - CompressSave/ZstdWrapC/zstdwrap.h | 34 - CompressSave/package/icon.png | Bin 53761 -> 0 bytes CompressSave/package/manifest.json | 7 - CompressSave/package/plugins/x64/lz4wrap.dll | Bin 225792 -> 0 bytes CompressSave/package/plugins/x64/nonewrap.dll | Bin 15360 -> 0 bytes CompressSave/package/plugins/x64/zstdwrap.dll | Bin 922112 -> 0 bytes DSP_Mods.sln | 9 +- LICENSE | 21 + README.md | 3 +- 48 files changed, 26 insertions(+), 12879 deletions(-) delete mode 100644 CompressSave/CompressSave.cs delete mode 100644 CompressSave/CompressSave.csproj delete mode 100644 CompressSave/I18N.cs delete mode 100644 CompressSave/LZ4WrapC/CMakeLists.txt delete mode 100644 CompressSave/LZ4WrapC/LZ4Wrap.c delete mode 100644 CompressSave/LZ4WrapC/LZ4Wrap.h delete mode 100644 CompressSave/LZ4WrapC/dllmain.c delete mode 100644 CompressSave/LZ4WrapC/lz4/LICENSE delete mode 100644 CompressSave/LZ4WrapC/lz4/README.md delete mode 100644 CompressSave/LZ4WrapC/lz4/lz4.c delete mode 100644 CompressSave/LZ4WrapC/lz4/lz4.h delete mode 100644 CompressSave/LZ4WrapC/lz4/lz4frame.c delete mode 100644 CompressSave/LZ4WrapC/lz4/lz4frame.h delete mode 100644 CompressSave/LZ4WrapC/lz4/lz4frame_static.h delete mode 100644 CompressSave/LZ4WrapC/lz4/lz4hc.c delete mode 100644 CompressSave/LZ4WrapC/lz4/lz4hc.h delete mode 100644 CompressSave/LZ4WrapC/lz4/xxhash.c delete mode 100644 CompressSave/LZ4WrapC/lz4/xxhash.h delete mode 100644 CompressSave/NoneWrapC/CMakeLists.txt delete mode 100644 CompressSave/NoneWrapC/dllmain.c delete mode 100644 CompressSave/NoneWrapC/nonewrap.c delete mode 100644 CompressSave/NoneWrapC/nonewrap.h delete mode 100644 CompressSave/PatchUILoadGame.cs delete mode 100644 CompressSave/PatchUISaveGame.cs delete mode 100644 CompressSave/SaveUtil.cs delete mode 100644 CompressSave/Wrapper/BlackHoleStream.cs delete mode 100644 CompressSave/Wrapper/BufferWriter.cs delete mode 100644 CompressSave/Wrapper/CompressionStream.cs delete mode 100644 CompressSave/Wrapper/DecompressionStream.cs delete mode 100644 CompressSave/Wrapper/DoubleBuffer.cs delete mode 100644 CompressSave/Wrapper/LZ4Wrapper.cs delete mode 100644 CompressSave/Wrapper/NoneWrapper.cs delete mode 100644 CompressSave/Wrapper/PeekableReader.cs delete mode 100644 CompressSave/Wrapper/WrapperDefines.cs delete mode 100644 CompressSave/Wrapper/ZstdWrapper.cs delete mode 100644 CompressSave/ZstdWrapC/CMakeLists.txt delete mode 100644 CompressSave/ZstdWrapC/dllmain.c delete mode 100644 CompressSave/ZstdWrapC/zstdwrap.c delete mode 100644 CompressSave/ZstdWrapC/zstdwrap.h delete mode 100644 CompressSave/package/icon.png delete mode 100644 CompressSave/package/manifest.json delete mode 100644 CompressSave/package/plugins/x64/lz4wrap.dll delete mode 100644 CompressSave/package/plugins/x64/nonewrap.dll delete mode 100644 CompressSave/package/plugins/x64/zstdwrap.dll create mode 100644 LICENSE diff --git a/CompressSave/CompressSave.cs b/CompressSave/CompressSave.cs deleted file mode 100644 index 2972aaf..0000000 --- a/CompressSave/CompressSave.cs +++ /dev/null @@ -1,389 +0,0 @@ -using System; -using System.Collections.Generic; -using System.IO; -using System.Reflection.Emit; -using BepInEx; -using BepInEx.Configuration; -using HarmonyLib; -using CompressSave.Wrapper; - -namespace CompressSave; - -public enum CompressionType -{ - None = 0, - LZ4 = 1, - Zstd = 2, -} - -[BepInPlugin(PluginInfo.PLUGIN_GUID, PluginInfo.PLUGIN_NAME, PluginInfo.PLUGIN_VERSION)] -public class CompressSave : BaseUnityPlugin -{ - private Harmony _patchSave, _patchUISave, _patchUILoad; - public static string StringFromCompresstionType(CompressionType type) - { - return type switch - { - CompressionType.LZ4 => "lz4", - CompressionType.Zstd => "zstd", - CompressionType.None => "none", - _ => throw new ArgumentException("Unknown compression type.") - }; - } - - private static CompressionType CompressionTypeFromString(string str) - { - return str switch - { - "lz4" => CompressionType.LZ4, - "zstd" => CompressionType.Zstd, - _ => CompressionType.None - }; - } - - public void Awake() - { - SaveUtil.Logger = Logger; - if (LZ4API.Avaliable && ZstdAPI.Avaliable) - { - PatchSave.CompressionTypeForSavesConfig = Config.Bind("Compression", "Type", StringFromCompresstionType(PatchSave.CompressionTypeForSaves), - new ConfigDescription("Set default compression type for manual saves.", - new AcceptableValueList("lz4", "zstd", "none"), new { })); - PatchSave.CompressionTypeForSaves = CompressionTypeFromString(PatchSave.CompressionTypeForSavesConfig.Value); - PatchSave.CompressionTypeForAutoSavesConfig = Config.Bind("Compression", "TypeForAuto", StringFromCompresstionType(PatchSave.CompressionTypeForAutoSaves), - new ConfigDescription("Set default compression type for auto saves and last-exit save.", - new AcceptableValueList("lz4", "zstd", "none"), new { })); - PatchSave.CompressionTypeForAutoSaves = CompressionTypeFromString(PatchSave.CompressionTypeForAutoSavesConfig.Value); - PatchSave.CompressionLevelForSaves = Config.Bind("Compression", "Level", PatchSave.CompressionLevelForSaves, - "Set default compression level for manual saves.\n0 for default level.\n3 ~ 12 for lz4, -5 ~ 22 for zstd.\nSmaller level leads to faster speed and less compression ratio.") - .Value; - PatchSave.CompressionLevelForAutoSaves = Config.Bind("Compression", "LevelForAuto", PatchSave.CompressionLevelForAutoSaves, - "Set default compression level for auto saves and last-exit save.\n0 for default level.\n3 ~ 12 for lz4, -5 ~ 22 for zstd.\nSmaller level leads to faster speed and less compression ratio.") - .Value; - PatchSave.EnableForAutoSaves = Config.Bind("Compression", "EnableForAutoSaves", true, - "Enable the feature for auto saves and last-exit save."); - PatchSave.CreateCompressBuffer(); - if (GameConfig.gameVersion != SaveUtil.VerifiedVersion) - { - SaveUtil.Logger.LogWarning( - $"Save version mismatch. Expect:{SaveUtil.VerifiedVersion}, Current:{GameConfig.gameVersion}. MOD may not work as expected."); - } - - _patchSave = Harmony.CreateAndPatchAll(typeof(PatchSave)); - if (PatchSave.EnableCompress) - _patchUISave = Harmony.CreateAndPatchAll(typeof(PatchUISaveGame)); - _patchUILoad = Harmony.CreateAndPatchAll(typeof(PatchUILoadGame)); - } - else - SaveUtil.Logger.LogWarning("Either nonewrap.dll, lz4warp.dll or zstdwrap.dll is not avaliable."); - I18N.Init(); - I18N.Add("Store", "Store (No Compression)", "存储(不压缩)"); - I18N.Add("Decompress", "Decompress", "解压存档"); - I18N.Add("Save with Compression", "Save (Compress)", "压缩保存"); - I18N.Add("Compression for auto saves", "Compression for auto saves", "  自动存档压缩方式"); - I18N.Add("Compression for manual saves", "Compression for manual saves", "  手动存档压缩方式"); - I18N.Apply(); - } - - public void OnDestroy() - { - if (_patchUISave != null) - { - PatchUISaveGame.OnDestroy(); - _patchUISave.UnpatchSelf(); - _patchUISave = null; - } - if (_patchUILoad != null) - { - PatchUILoadGame.OnDestroy(); - _patchUILoad.UnpatchSelf(); - _patchUILoad = null; - } - _patchSave?.UnpatchSelf(); - _patchSave = null; - } -} - -public class PatchSave -{ - public static readonly WrapperDefines LZ4Wrapper = new LZ4API(), ZstdWrapper = new ZstdAPI(); - private static readonly WrapperDefines NoneWrapper = new NoneAPI(); - private static CompressionStream.CompressBuffer _compressBuffer; - public static bool UseCompressSave; - private static CompressionType _compressionTypeForLoading = CompressionType.None; - private static CompressionType _compressionTypeForSaving = CompressionType.Zstd; - private static int _compressionLevelForSaving; - public static CompressionType CompressionTypeForSaves = CompressionType.Zstd; - public static CompressionType CompressionTypeForAutoSaves = CompressionType.Zstd; - public static ConfigEntry CompressionTypeForSavesConfig; - public static ConfigEntry CompressionTypeForAutoSavesConfig; - public static int CompressionLevelForSaves; - public static int CompressionLevelForAutoSaves; - public static ConfigEntry EnableForAutoSaves; - private static Stream _compressionStream; - public static bool EnableCompress; - - public static void CreateCompressBuffer() - { - const int bufSize = CompressionStream.Mb; - var outBufSize = LZ4Wrapper.CompressBufferBound(bufSize); - outBufSize = Math.Max(outBufSize, ZstdWrapper.CompressBufferBound(bufSize)); - outBufSize = Math.Max(outBufSize, NoneWrapper.CompressBufferBound(bufSize)); - _compressBuffer = CompressionStream.CreateBuffer((int)outBufSize, bufSize); - _compressionTypeForSaving = CompressionTypeForSaves; - _compressionLevelForSaving = CompressionLevelForSaves; - } - - private static void WriteHeader(FileStream fileStream) - { - if (fileStream == null) throw new ArgumentNullException(nameof(fileStream)); - switch (_compressionTypeForSaving) - { - case CompressionType.Zstd: - for (var i = 0; i < 3; i++) - fileStream.WriteByte(0xCC); - fileStream.WriteByte(0xCD); - break; - case CompressionType.LZ4: - for (var i = 0; i < 4; i++) - fileStream.WriteByte(0xCC); - break; - case CompressionType.None: - break; - default: - throw new ArgumentException("Unknown compression type."); - } - } - - [HarmonyPrefix] - [HarmonyPatch(typeof(GameSave), "AutoSave")] - [HarmonyPatch(typeof(GameSave), "SaveAsLastExit")] - private static void BeforeAutoSave() - { - UseCompressSave = EnableForAutoSaves.Value && EnableCompress; - if (!UseCompressSave) return; - _compressionTypeForSaving = CompressionTypeForAutoSaves; - _compressionLevelForSaving = CompressionLevelForAutoSaves; - } - - [HarmonyTranspiler] - [HarmonyPatch(typeof(GameSave), "SaveCurrentGame")] - private static IEnumerable SaveCurrentGame_Transpiler(IEnumerable instructions, ILGenerator generator) - { - /* BinaryWriter binaryWriter = new BinaryWriter(fileStream); => Create compressionStream and replace binaryWriter. - * set PerformanceMonitor.BeginStream to compressionStream. - * fileStream.Seek(6L, SeekOrigin.Begin); binaryWriter.Write(position); => Disable seek&write function. - * binaryWriter.Dispose(); => Dispose compressionStream before fileStream close. - */ - var matcher = new CodeMatcher(instructions, generator); - try - { - matcher.MatchForward(false, - new CodeMatch(OpCodes.Newobj, AccessTools.Constructor(typeof(BinaryWriter), new [] { typeof(FileStream) })) - ).Set( - OpCodes.Call, AccessTools.Method(typeof(PatchSave), "CreateBinaryWriter") - ).MatchForward(false, - new CodeMatch(OpCodes.Call, AccessTools.Method(typeof(PerformanceMonitor), "BeginStream")) - ).Set( - OpCodes.Call, AccessTools.Method(typeof(PatchSave), "MonitorStream") - ).MatchForward(false, - new CodeMatch(OpCodes.Callvirt, AccessTools.Method(typeof(Stream), "Seek")) - ).Set( - OpCodes.Call, AccessTools.Method(typeof(PatchSave), "FileLengthWrite0") - ).MatchForward(false, - new CodeMatch(OpCodes.Callvirt, AccessTools.Method(typeof(BinaryWriter), "Write", new [] { typeof(long) })) - ).Set( - OpCodes.Call, AccessTools.Method(typeof(PatchSave), "FileLengthWrite1") - ).MatchForward(false, - new CodeMatch(OpCodes.Callvirt, AccessTools.Method(typeof(IDisposable), "Dispose")) - ).Advance(1).Insert( - new CodeInstruction(OpCodes.Call, AccessTools.Method(typeof(PatchSave), "DisposeCompressionStream")) - ); - EnableCompress = true; - return matcher.InstructionEnumeration(); - } - catch (Exception ex) - { - SaveUtil.Logger.LogError( - "SaveCurrentGame_Transpiler failed. Mod version not compatible with game version."); - SaveUtil.Logger.LogError(ex); - } - return matcher.InstructionEnumeration(); - } - - public static void MonitorStream(Stream fileStream) - { - PerformanceMonitor.BeginStream(UseCompressSave ? _compressionStream : fileStream); - } - - public static BinaryWriter CreateBinaryWriter(FileStream fileStream) - { - if (UseCompressSave) - { - SaveUtil.Logger.LogDebug("Begin compress save"); - WriteHeader(fileStream); - _compressionStream = _compressionTypeForSaving switch - { - CompressionType.LZ4 => new CompressionStream(LZ4Wrapper, _compressionLevelForSaving, fileStream, _compressBuffer, true), - CompressionType.Zstd => new CompressionStream(ZstdWrapper, _compressionLevelForSaving, fileStream, _compressBuffer, true), - CompressionType.None => new CompressionStream(NoneWrapper, 0, fileStream, _compressBuffer, true), - _ => _compressionStream - }; - - return ((CompressionStream)_compressionStream).BufferWriter; - } - - SaveUtil.Logger.LogDebug("Begin normal save"); - return new BinaryWriter(fileStream); - } - - public static long FileLengthWrite0(FileStream fileStream, long offset, SeekOrigin origin) - { - return UseCompressSave ? 0L : fileStream.Seek(offset, origin); - } - - public static void FileLengthWrite1(BinaryWriter binaryWriter, long value) - { - if (UseCompressSave) return; - binaryWriter.Write(value); - } - - public static void DisposeCompressionStream() - { - if (!UseCompressSave) return; - if (_compressionStream == null) - { - UseCompressSave = false; - return; - } - var writeflag = _compressionStream.CanWrite; - Stream stream = null; - if (writeflag && _compressionTypeForSaving == CompressionType.None) - { - stream = ((CompressionStream)_compressionStream).OutStream; - } - // Dispose need to be done before fstream closed. - _compressionStream.Dispose(); - _compressionStream = null; - if (!writeflag) return; - // Reset UseCompressSave after writing to file - if (stream != null) - { - // Ugly implementation, but it works. May find a better solution someday. - var saveLen = stream.Seek(0L, SeekOrigin.End); - stream.Seek(6L, SeekOrigin.Begin); - var writer = new BinaryWriter(stream); - writer.Write(saveLen); - writer.Dispose(); - } - _compressionTypeForSaving = CompressionTypeForSaves; - _compressionLevelForSaving = CompressionLevelForSaves; - UseCompressSave = false; - } - - [HarmonyTranspiler] - [HarmonyPatch(typeof(GameSave), "LoadCurrentGame")] - [HarmonyPatch(typeof(GameSave), "LoadGameDesc")] - [HarmonyPatch(typeof(GameSave), "ReadHeader")] - [HarmonyPatch(typeof(GameSave), "ReadHeaderAndDescAndProperty")] - [HarmonyPatch(typeof(GameSave), "ReadModes")] - private static IEnumerable LoadCurrentGame_Transpiler(IEnumerable instructions, ILGenerator generator) - { - /* using (BinaryReader binaryReader = new BinaryReader(fileStream)) => Create decompressionStream and replace binaryReader. - * set PerformanceMonitor.BeginStream to decompressionStream. - * if (fileStream.Length != binaryReader.ReadInt64()) => Replace binaryReader.ReadInt64() to pass file length check. - * fileStream.Seek((long)num2, SeekOrigin.Current); => Use decompressionStream.Read to seek forward - * binaryReader.Dispose(); => Dispose decompressionStream before fileStream close. - */ - var matcher = new CodeMatcher(instructions, generator); - try - { - matcher.MatchForward(false, - new CodeMatch(OpCodes.Newobj, AccessTools.Constructor(typeof(BinaryReader), new [] { typeof(FileStream) })) - ).Set( - OpCodes.Call, AccessTools.Method(typeof(PatchSave), "CreateBinaryReader") - ).MatchForward(false, - new CodeMatch(OpCodes.Call, AccessTools.Method(typeof(PerformanceMonitor), "BeginStream")) - ); - - if (matcher.IsValid) - matcher.Set(OpCodes.Call, AccessTools.Method(typeof(PatchSave), "MonitorStream")); - - matcher.Start().MatchForward(false, - new CodeMatch(OpCodes.Callvirt, AccessTools.Method(typeof(BinaryReader), "ReadInt64")) - ).Set( - OpCodes.Call, AccessTools.Method(typeof(PatchSave), "FileLengthRead") - ).MatchForward(false, - new CodeMatch(OpCodes.Callvirt, AccessTools.Method(typeof(IDisposable), "Dispose")) - ).Advance(1).Insert( - new CodeInstruction(OpCodes.Call, AccessTools.Method(typeof(PatchSave), "DisposeCompressionStream")) - ).MatchBack(false, - new CodeMatch(OpCodes.Callvirt, AccessTools.Method(typeof(Stream), "Seek")) - ); - if (matcher.IsValid) - matcher.Set(OpCodes.Call, AccessTools.Method(typeof(PatchSave), "ReadSeek")); - - return matcher.InstructionEnumeration(); - } - catch (Exception ex) - { - SaveUtil.Logger.LogError( - "LoadCurrentGame_Transpiler failed. Mod version not compatible with game version."); - SaveUtil.Logger.LogError(ex); - } - - return matcher.InstructionEnumeration(); - } - - public static BinaryReader CreateBinaryReader(FileStream fileStream) - { - switch (_compressionTypeForLoading = SaveUtil.SaveGetCompressType(fileStream)) - { - case CompressionType.LZ4: - UseCompressSave = true; - _compressionStream = new DecompressionStream(LZ4Wrapper, fileStream); - return new PeekableReader((DecompressionStream)_compressionStream); - case CompressionType.Zstd: - UseCompressSave = true; - _compressionStream = new DecompressionStream(ZstdWrapper, fileStream); - return new PeekableReader((DecompressionStream)_compressionStream); - case CompressionType.None: - UseCompressSave = false; - fileStream.Seek(0, SeekOrigin.Begin); - return new BinaryReader(fileStream); - default: - throw new ArgumentOutOfRangeException(); - } - } - - public static long FileLengthRead(BinaryReader binaryReader) - { - switch (_compressionTypeForLoading) - { - case CompressionType.LZ4: - case CompressionType.Zstd: - binaryReader.ReadInt64(); - return _compressionStream.Length; - case CompressionType.None: - return binaryReader.ReadInt64(); - default: - throw new ArgumentOutOfRangeException(); - } - } - - public static long ReadSeek(FileStream fileStream, long offset, SeekOrigin origin) - { - switch (_compressionTypeForLoading) - { - case CompressionType.LZ4: - case CompressionType.Zstd: - while (offset > 0) - offset -= _compressionStream.Read(_compressBuffer.OutBuffer, 0, (int)offset); - return _compressionStream.Position; - case CompressionType.None: - return fileStream.Seek(offset, origin); - default: - throw new ArgumentOutOfRangeException(); - } - } -} \ No newline at end of file diff --git a/CompressSave/CompressSave.csproj b/CompressSave/CompressSave.csproj deleted file mode 100644 index eac343c..0000000 --- a/CompressSave/CompressSave.csproj +++ /dev/null @@ -1,30 +0,0 @@ - - - - - CompressSave - org.soardev.compresssave - DSP MOD - CompressSave - 1.3.5 - true - latest - net472 - https://nuget.bepinex.dev/v3/index.json - - - - - - - - - - - - - - - - - - diff --git a/CompressSave/I18N.cs b/CompressSave/I18N.cs deleted file mode 100644 index eaa43cb..0000000 --- a/CompressSave/I18N.cs +++ /dev/null @@ -1,128 +0,0 @@ -using System; -using System.Collections.Generic; -using HarmonyLib; - -public static class I18N -{ - private static bool _initialized; - private static bool _dirty; - - public static void Init() - { - Harmony.CreateAndPatchAll(typeof(I18N)); - } - - public static bool Initialized() => _initialized; - private static readonly List> Keys = []; - private static readonly Dictionary> Strings = []; - - public static void Add(string key, string enus, string zhcn = null) - { - if (zhcn == null && key == enus) return; - Keys.Add(Tuple.Create(key, enus, -1)); - if (Strings.TryGetValue(2052, out var zhcnList)) - { - zhcnList.Add(string.IsNullOrEmpty(zhcn) ? enus : zhcn); - } - else - { - Strings.Add(2052, [string.IsNullOrEmpty(zhcn) ? enus : zhcn]); - } - _dirty = true; - } - - private static void ApplyIndexers() - { - var indexer = Localization.namesIndexer; - var index = indexer.Count; - var len = Keys.Count; - for (var i = 0; i < len; i++) - { - var (key, def, value) = Keys[i]; - if (value >= 0) continue; - if (indexer.TryGetValue(key, out var idx)) - { - Keys[i] = Tuple.Create(key, def, idx); - continue; - } - indexer[key] = index; - Keys[i] = Tuple.Create(key, def, index); - index++; - } - _dirty = false; - var strings = Localization.strings; - if (strings == null) return; - var len2 = strings.Length; - for (var i = 0; i < len2; i++) - { - ApplyLanguage(i); - if (i != Localization.currentLanguageIndex) continue; - Localization.currentStrings = Localization.strings[i]; - Localization.currentFloats = Localization.floats[i]; - } - } - - private static void ApplyLanguage(int index) - { - var indexerLength = Localization.namesIndexer.Count; - var strs = Localization.strings[index]; - if (strs == null) return; - if (strs.Length < indexerLength) - { - var newStrs = new string[indexerLength]; - Array.Copy(strs, newStrs, strs.Length); - strs = newStrs; - Localization.strings[index] = strs; - } - var floats = Localization.floats[index]; - if (floats != null) - { - if (floats.Length < indexerLength) - { - var newFloats = new float[indexerLength]; - Array.Copy(floats, newFloats, floats.Length); - floats = newFloats; - Localization.floats[index] = floats; - } - } - - var keyLength = Keys.Count; - if (Strings.TryGetValue(Localization.Languages[index].lcId, out var list)) - { - for (var j = 0; j < keyLength; j++) - { - strs[Keys[j].Item3] = list[j]; - } - } - else - { - for (var j = 0; j < keyLength; j++) - { - strs[Keys[j].Item3] = Keys[j].Item2; - } - } - } - - public static void Apply() - { - if (!_initialized) return; - if (Keys.Count == 0) return; - if (!_dirty) return; - ApplyIndexers(); - } - - [HarmonyPostfix, HarmonyPriority(Priority.Last), HarmonyPatch(typeof(Localization), nameof(Localization.LoadSettings))] - private static void Localization_LoadSettings_Postfix() - { - if (_initialized) return; - _initialized = true; - Apply(); - } - - [HarmonyPostfix, HarmonyPriority(Priority.Last), HarmonyPatch(typeof(Localization), nameof(Localization.LoadLanguage))] - private static void Localization_LoadLanguage_Postfix(int index) - { - if (!_initialized) return; - ApplyLanguage(index); - } -} \ No newline at end of file diff --git a/CompressSave/LZ4WrapC/CMakeLists.txt b/CompressSave/LZ4WrapC/CMakeLists.txt deleted file mode 100644 index d726611..0000000 --- a/CompressSave/LZ4WrapC/CMakeLists.txt +++ /dev/null @@ -1,16 +0,0 @@ -cmake_minimum_required(VERSION 3.2) - -project(lz4wrap) - -add_library(lz4wrap SHARED - lz4/lz4.c lz4/lz4.h - lz4/lz4frame.c lz4/lz4frame.h lz4/lz4frame_static.h - lz4/lz4hc.c lz4/lz4hc.h - lz4/xxhash.c lz4/xxhash.h - dllmain.c LZ4Wrap.c LZ4Wrap.h) - -target_compile_definitions(lz4wrap PRIVATE LZ4WRAP_EXPORTS) -target_include_directories(lz4wrap PRIVATE lz4) -if(WIN32) - set_target_properties(lz4wrap PROPERTIES PREFIX "") -endif() diff --git a/CompressSave/LZ4WrapC/LZ4Wrap.c b/CompressSave/LZ4WrapC/LZ4Wrap.c deleted file mode 100644 index 542b318..0000000 --- a/CompressSave/LZ4WrapC/LZ4Wrap.c +++ /dev/null @@ -1,154 +0,0 @@ -// MathLibrary.cpp : Defines the exported functions for the DLL. -#include "LZ4Wrap.h" - -#include -#include -#include -#include -#define Check(assert,errorcode) if(!(assert)) {printf(LZ4F_getErrorName(errorcode)); return errorcode;} - - - -static CContext* CreateCompressContext() -{ - return (CContext*)malloc(sizeof(CContext)); -} - -void __stdcall CompressContextFree(CContext* ctx) -{ - if (ctx != NULL) - { - LZ4F_freeCompressionContext(ctx->cctx); - LZ4F_freeCDict(ctx->dict); - free(ctx); - } -} - -static LZ4F_preferences_t kPrefs = { - { LZ4F_max4MB, LZ4F_blockLinked, LZ4F_contentChecksumEnabled, LZ4F_frame, - 0 /* unknown content size */, 0/* no dictID */ , LZ4F_blockChecksumEnabled }, - 0, /* compression level; 0 == default */ - 0, /* autoflush */ - 0, /* favor decompression speed */ - { 0, 0, 0 }, /* reserved, must be set to 0 */ -}; - -size_t __stdcall CompressBufferBound(size_t inBufferSize) -{ - return LZ4F_compressBound(inBufferSize, &kPrefs) + LZ4F_HEADER_SIZE_MAX; -} - -CContext* CreateCompressContextFromBuffer(void* dict, size_t dictSize) { - CContext* ctx = CreateCompressContext(); - if (dict) - ctx->dict = LZ4F_createCDict(dict, dictSize); - else - ctx->dict = NULL; - if (ctx == NULL) return NULL; - LZ4F_compressionContext_t innerctx; - - LZ4F_errorCode_t ctxCreation = LZ4F_createCompressionContext(&innerctx, LZ4F_VERSION); - if (LZ4F_isError(ctxCreation)) - { - LZ4F_freeCompressionContext(innerctx); - CompressContextFree(ctx); - return NULL; - } - ctx->cctx = innerctx; - - return ctx; -} - -size_t __stdcall CompressBegin(CContext** pctx, int compressionLevel, void* outBuff , size_t outCapacity, void* dict, size_t dictSize) -{ - CContext* ctx = CreateCompressContextFromBuffer(dict, dictSize); - if (ctx == NULL) return -1; - - if (outCapacity < LZ4F_HEADER_SIZE_MAX || outCapacity < LZ4F_compressBound(0, &kPrefs)) return LZ4F_ERROR_dstMaxSize_tooSmall; - - kPrefs.compressionLevel = compressionLevel; - /* write frame header */ - size_t const headerSize = ctx->dict == NULL - ? LZ4F_compressBegin(ctx->cctx, outBuff, outCapacity, &kPrefs) - : LZ4F_compressBegin_usingCDict(ctx->cctx, outBuff, outCapacity, ctx->dict, &kPrefs); - - if (LZ4F_isError(headerSize)) - { - return headerSize; - } - *pctx = ctx; - return headerSize; -} - - -size_t __stdcall CompressUpdate(CContext* ctx,void* dstBuffer, size_t dstCapacity,const void* srcBuffer, size_t srcSize) -{ - size_t result = ctx->dict == NULL - ? LZ4F_compressUpdate(ctx->cctx, dstBuffer, dstCapacity, srcBuffer, srcSize, NULL) - : LZ4F_compressFrame_usingCDict(ctx->cctx, dstBuffer, dstCapacity, srcBuffer, srcSize, ctx->dict, NULL); - if (LZ4F_isError(result)) - { - const char *str = LZ4F_getErrorName(result); - fprintf(stderr, "%s\n", str); - } - return result; -} - -size_t __stdcall CompressEnd(CContext* ctx, void* dstBuffer, size_t dstCapacity) -{ - size_t writeSize = LZ4F_compressEnd(ctx->cctx, dstBuffer, dstCapacity, NULL); - return writeSize; -} - -static size_t get_block_size(const LZ4F_frameInfo_t* info) { - switch (info->blockSizeID) { - case LZ4F_default: - case LZ4F_max64KB: return 1 << 16; - case LZ4F_max256KB: return 1 << 18; - case LZ4F_max1MB: return 1 << 20; - case LZ4F_max4MB: return 1 << 22; - default: - return -1; - } -} -//return: input bytes expects for next call -size_t __stdcall DecompressBegin(DContext **pdctx,void *inBuffer,size_t *inBufferSize, size_t *blockSize, void* dict, size_t dictSize) -{ - DContext* dctx = (DContext*)malloc(sizeof(DContext)); - size_t const dctxStatus = LZ4F_createDecompressionContext(&dctx->dctx, LZ4F_VERSION); - Check(!LZ4F_isError(dctxStatus), dctxStatus); - - Check(*inBufferSize >= LZ4F_HEADER_SIZE_MAX, LZ4F_ERROR_dstMaxSize_tooSmall); - - LZ4F_frameInfo_t info; - size_t const fires = LZ4F_getFrameInfo(dctx->dctx, &info, inBuffer, inBufferSize); - Check(!LZ4F_isError(fires), fires); - - *blockSize = get_block_size(&info); - dctx->dict = dict; - dctx->dictSize = dictSize; - *pdctx = dctx; - return fires; -} - -void __stdcall DecompressContextReset(DContext* dctx) -{ - LZ4F_resetDecompressionContext(dctx->dctx); -} - -size_t __stdcall DecompressUpdate(DContext* dctx, void* outBuffer, size_t * outBufferSize, void* inBuffer, size_t * inBufferSize) -{ - size_t ret = dctx->dict == NULL - ? LZ4F_decompress(dctx->dctx, outBuffer, outBufferSize, inBuffer, inBufferSize, NULL) - : LZ4F_decompress_usingDict(dctx->dctx, outBuffer, outBufferSize, inBuffer, inBufferSize, dctx->dict, dctx->dictSize, NULL); - Check(!LZ4F_isError(ret), ret); - return ret; -} - -size_t __stdcall DecompressEnd(DContext* dctx) -{ - if (!dctx) return 0; - size_t r = LZ4F_freeDecompressionContext(dctx->dctx); - free(dctx); - return r; -} diff --git a/CompressSave/LZ4WrapC/LZ4Wrap.h b/CompressSave/LZ4WrapC/LZ4Wrap.h deleted file mode 100644 index 6a76374..0000000 --- a/CompressSave/LZ4WrapC/LZ4Wrap.h +++ /dev/null @@ -1,46 +0,0 @@ -#pragma once -#define LZ4F_STATIC_LINKING_ONLY -#if defined(__cplusplus) -#define API_EXTERN_C extern "C" -#else -#define API_EXTERN_C -#endif -#ifdef LZ4WRAP_EXPORTS -#define LZ4API API_EXTERN_C __declspec(dllexport) -#else -#define LZ4API API_EXTERN_C __declspec(dllimport) -#endif - -#include -#include - -typedef struct -{ - LZ4F_cctx* cctx; - LZ4F_CDict* dict; -} CContext; - -typedef struct -{ - LZ4F_dctx* dctx; - void* dict; - size_t dictSize; -} DContext; - -LZ4API void __stdcall CompressContextFree(CContext* ctx); - -LZ4API size_t __stdcall CompressBufferBound(size_t inBufferSize); - -LZ4API size_t __stdcall CompressBegin(CContext** ctx, int compressionLevel, void* outBuff, size_t outCapacity, void* dict, size_t dictSize); - -LZ4API size_t __stdcall CompressUpdate(CContext* ctx, void* dstBuffer, size_t dstCapacity, const void* srcBuffer, size_t srcSize); - -LZ4API size_t __stdcall CompressEnd(CContext* ctx, void* dstBuffer, size_t dstCapacity); - -LZ4API size_t __stdcall DecompressBegin(DContext** pdctx, void* inBuffer, size_t* inBufferSize, size_t* blockSize, void* dict, size_t dictSize); - -LZ4API void __stdcall DecompressContextReset(DContext* dctx); - -LZ4API size_t __stdcall DecompressUpdate(DContext* dctx, void* outBuffer, size_t* outBufferSize, void* inBuffer, size_t* inBufferSize); - -LZ4API size_t __stdcall DecompressEnd(DContext* dctx); diff --git a/CompressSave/LZ4WrapC/dllmain.c b/CompressSave/LZ4WrapC/dllmain.c deleted file mode 100644 index 896c9b5..0000000 --- a/CompressSave/LZ4WrapC/dllmain.c +++ /dev/null @@ -1,20 +0,0 @@ -// dllmain.cpp : Defines the entry point for the DLL application. -#include - -BOOL APIENTRY DllMain( HMODULE hModule, - DWORD ul_reason_for_call, - LPVOID lpReserved - ) -{ - switch (ul_reason_for_call) - { - case DLL_PROCESS_ATTACH: - DisableThreadLibraryCalls(hModule); - break; - case DLL_THREAD_ATTACH: - case DLL_THREAD_DETACH: - case DLL_PROCESS_DETACH: - break; - } - return TRUE; -} diff --git a/CompressSave/LZ4WrapC/lz4/LICENSE b/CompressSave/LZ4WrapC/lz4/LICENSE deleted file mode 100644 index 4884916..0000000 --- a/CompressSave/LZ4WrapC/lz4/LICENSE +++ /dev/null @@ -1,24 +0,0 @@ -LZ4 Library -Copyright (c) 2011-2020, Yann Collet -All rights reserved. - -Redistribution and use in source and binary forms, with or without modification, -are permitted provided that the following conditions are met: - -* Redistributions of source code must retain the above copyright notice, this - list of conditions and the following disclaimer. - -* Redistributions in binary form must reproduce the above copyright notice, this - list of conditions and the following disclaimer in the documentation and/or - other materials provided with the distribution. - -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "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 COPYRIGHT HOLDER OR CONTRIBUTORS 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. diff --git a/CompressSave/LZ4WrapC/lz4/README.md b/CompressSave/LZ4WrapC/lz4/README.md deleted file mode 100644 index a86cd0d..0000000 --- a/CompressSave/LZ4WrapC/lz4/README.md +++ /dev/null @@ -1,187 +0,0 @@ -LZ4 - Library Files -================================ - -The `/lib` directory contains many files, but depending on project's objectives, -not all of them are required. -Limited systems may want to reduce the nb of source files to include -as a way to reduce binary size and dependencies. - -Capabilities are added at the "level" granularity, detailed below. - -#### Level 1 : Minimal LZ4 build - -The minimum required is **`lz4.c`** and **`lz4.h`**, -which provides the fast compression and decompression algorithms. -They generate and decode data using the [LZ4 block format]. - - -#### Level 2 : High Compression variant - -For more compression ratio at the cost of compression speed, -the High Compression variant called **lz4hc** is available. -Add files **`lz4hc.c`** and **`lz4hc.h`**. -This variant also compresses data using the [LZ4 block format], -and depends on regular `lib/lz4.*` source files. - - -#### Level 3 : Frame support, for interoperability - -In order to produce compressed data compatible with `lz4` command line utility, -it's necessary to use the [official interoperable frame format]. -This format is generated and decoded automatically by the **lz4frame** library. -Its public API is described in `lib/lz4frame.h`. -In order to work properly, lz4frame needs all other modules present in `/lib`, -including, lz4 and lz4hc, and also **xxhash**. -So it's necessary to also include `xxhash.c` and `xxhash.h`. - - -#### Level 4 : File compression operations - -As a helper around file operations, -the library has been recently extended with `lz4file.c` and `lz4file.h` -(still considered experimental at the time of this writing). -These helpers allow opening, reading, writing, and closing files -using transparent LZ4 compression / decompression. -As a consequence, using `lz4file` adds a dependency on ``. - -`lz4file` relies on `lz4frame` in order to produce compressed data -conformant to the [LZ4 Frame format] specification. -Consequently, to enable this capability, -it's necessary to include all `*.c` and `*.h` files from `lib/` directory. - - -#### Advanced / Experimental API - -Definitions which are not guaranteed to remain stable in future versions, -are protected behind macros, such as `LZ4_STATIC_LINKING_ONLY`. -As the name suggests, these definitions should only be invoked -in the context of static linking ***only***. -Otherwise, dependent application may fail on API or ABI break in the future. -The associated symbols are also not exposed by the dynamic library by default. -Should they be nonetheless needed, it's possible to force their publication -by using build macros `LZ4_PUBLISH_STATIC_FUNCTIONS` -and `LZ4F_PUBLISH_STATIC_FUNCTIONS`. - - -#### Build macros - -The following build macro can be selected to adjust source code behavior at compilation time : - -- `LZ4_FAST_DEC_LOOP` : this triggers a speed optimized decompression loop, more powerful on modern cpus. - This loop works great on `x86`, `x64` and `aarch64` cpus, and is automatically enabled for them. - It's also possible to enable or disable it manually, by passing `LZ4_FAST_DEC_LOOP=1` or `0` to the preprocessor. - For example, with `gcc` : `-DLZ4_FAST_DEC_LOOP=1`, - and with `make` : `CPPFLAGS+=-DLZ4_FAST_DEC_LOOP=1 make lz4`. - -- `LZ4_DISTANCE_MAX` : control the maximum offset that the compressor will allow. - Set to 65535 by default, which is the maximum value supported by lz4 format. - Reducing maximum distance will reduce opportunities for LZ4 to find matches, - hence will produce a worse compression ratio. - Setting a smaller max distance could allow compatibility with specific decoders with limited memory budget. - This build macro only influences the compressed output of the compressor. - -- `LZ4_DISABLE_DEPRECATE_WARNINGS` : invoking a deprecated function will make the compiler generate a warning. - This is meant to invite users to update their source code. - Should this be a problem, it's generally possible to make the compiler ignore these warnings, - for example with `-Wno-deprecated-declarations` on `gcc`, - or `_CRT_SECURE_NO_WARNINGS` for Visual Studio. - This build macro offers another project-specific method - by defining `LZ4_DISABLE_DEPRECATE_WARNINGS` before including the LZ4 header files. - -- `LZ4_FORCE_SW_BITCOUNT` : by default, the compression algorithm tries to determine lengths - by using bitcount instructions, generally implemented as fast single instructions in many cpus. - In case the target cpus doesn't support it, or compiler intrinsic doesn't work, or feature bad performance, - it's possible to use an optimized software path instead. - This is achieved by setting this build macros. - In most cases, it's not expected to be necessary, - but it can be legitimately considered for less common platforms. - -- `LZ4_ALIGN_TEST` : alignment test ensures that the memory area - passed as argument to become a compression state is suitably aligned. - This test can be disabled if it proves flaky, by setting this value to 0. - -- `LZ4_USER_MEMORY_FUNCTIONS` : replace calls to ``'s `malloc()`, `calloc()` and `free()` - by user-defined functions, which must be named `LZ4_malloc()`, `LZ4_calloc()` and `LZ4_free()`. - User functions must be available at link time. - -- `LZ4_STATIC_LINKING_ONLY_DISABLE_MEMORY_ALLOCATION` : - Remove support of dynamic memory allocation. - For more details, see description of this macro in `lib/lz4.c`. - -- `LZ4_FREESTANDING` : by setting this build macro to 1, - LZ4/HC removes dependencies on the C standard library, - including allocation functions and `memmove()`, `memcpy()`, and `memset()`. - This build macro is designed to help use LZ4/HC in restricted environments - (embedded, bootloader, etc). - For more details, see description of this macro in `lib/lz4.h`. - -- `LZ4_HEAPMODE` : Select how stateless compression functions like `LZ4_compress_default()` - allocate memory for their hash table, - in memory stack (0:default, fastest), or in memory heap (1:requires malloc()). - -- `LZ4HC_HEAPMODE` : Select how stateless HC compression functions like `LZ4_compress_HC()` - allocate memory for their workspace: - in stack (0), or in heap (1:default). - Since workspace is rather large, stack can be inconvenient, hence heap mode is recommended. - -- `LZ4F_HEAPMODE` : selects how `LZ4F_compressFrame()` allocates the compression state, - either on stack (default, value 0) or using heap memory (value 1). - - -#### Makefile variables - -The following `Makefile` variables can be selected to alter the profile of produced binaries : -- `BUILD_SHARED` : generate `libzstd` dynamic library (enabled by default) -- `BUILD_STATIC` : generate `libzstd` static library (enabled by default) - - -#### Amalgamation - -lz4 source code can be amalgamated into a single file. -One can combine all source code into `lz4_all.c` by using following command: -``` -cat lz4.c lz4hc.c lz4frame.c > lz4_all.c -``` -(`cat` file order is important) then compile `lz4_all.c`. -All `*.h` files present in `/lib` remain necessary to compile `lz4_all.c`. - - -#### Windows : using MinGW+MSYS to create DLL - -DLL can be created using MinGW+MSYS with the `make liblz4` command. -This command creates `dll\liblz4.dll` and the import library `dll\liblz4.lib`. -To override the `dlltool` command when cross-compiling on Linux, just set the `DLLTOOL` variable. Example of cross compilation on Linux with mingw-w64 64 bits: -``` -make BUILD_STATIC=no CC=x86_64-w64-mingw32-gcc DLLTOOL=x86_64-w64-mingw32-dlltool OS=Windows_NT -``` -The import library is only required with Visual C++. -The header files `lz4.h`, `lz4hc.h`, `lz4frame.h` and the dynamic library -`dll\liblz4.dll` are required to compile a project using gcc/MinGW. -The dynamic library has to be added to linking options. -It means that if a project that uses LZ4 consists of a single `test-dll.c` -file it should be linked with `dll\liblz4.dll`. For example: -``` - $(CC) $(CFLAGS) -Iinclude/ test-dll.c -o test-dll dll\liblz4.dll -``` -The compiled executable will require LZ4 DLL which is available at `dll\liblz4.dll`. - - -#### Miscellaneous - -Other files present in the directory are not source code. They are : - - - `LICENSE` : contains the BSD license text - - `Makefile` : `make` script to compile and install lz4 library (static and dynamic) - - `liblz4.pc.in` : for `pkg-config` (used in `make install`) - - `README.md` : this file - -[official interoperable frame format]: ../doc/lz4_Frame_format.md -[LZ4 Frame format]: ../doc/lz4_Frame_format.md -[LZ4 block format]: ../doc/lz4_Block_format.md - - -#### License - -All source material within __lib__ directory are BSD 2-Clause licensed. -See [LICENSE](LICENSE) for details. -The license is also reminded at the top of each source file. diff --git a/CompressSave/LZ4WrapC/lz4/lz4.c b/CompressSave/LZ4WrapC/lz4/lz4.c deleted file mode 100644 index 0982f95..0000000 --- a/CompressSave/LZ4WrapC/lz4/lz4.c +++ /dev/null @@ -1,2751 +0,0 @@ -/* - LZ4 - Fast LZ compression algorithm - Copyright (C) 2011-2020, Yann Collet. - - BSD 2-Clause License (http://www.opensource.org/licenses/bsd-license.php) - - Redistribution and use in source and binary forms, with or without - modification, are permitted provided that the following conditions are - met: - - * Redistributions of source code must retain the above copyright - notice, this list of conditions and the following disclaimer. - * Redistributions in binary form must reproduce the above - copyright notice, this list of conditions and the following disclaimer - in the documentation and/or other materials provided with the - distribution. - - THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - "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 COPYRIGHT - OWNER OR CONTRIBUTORS 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. - - You can contact the author at : - - LZ4 homepage : http://www.lz4.org - - LZ4 source repository : https://github.com/lz4/lz4 -*/ - -/*-************************************ -* Tuning parameters -**************************************/ -/* - * LZ4_HEAPMODE : - * Select how stateless compression functions like `LZ4_compress_default()` - * allocate memory for their hash table, - * in memory stack (0:default, fastest), or in memory heap (1:requires malloc()). - */ -#ifndef LZ4_HEAPMODE -# define LZ4_HEAPMODE 0 -#endif - -/* - * LZ4_ACCELERATION_DEFAULT : - * Select "acceleration" for LZ4_compress_fast() when parameter value <= 0 - */ -#define LZ4_ACCELERATION_DEFAULT 1 -/* - * LZ4_ACCELERATION_MAX : - * Any "acceleration" value higher than this threshold - * get treated as LZ4_ACCELERATION_MAX instead (fix #876) - */ -#define LZ4_ACCELERATION_MAX 65537 - - -/*-************************************ -* CPU Feature Detection -**************************************/ -/* LZ4_FORCE_MEMORY_ACCESS - * By default, access to unaligned memory is controlled by `memcpy()`, which is safe and portable. - * Unfortunately, on some target/compiler combinations, the generated assembly is sub-optimal. - * The below switch allow to select different access method for improved performance. - * Method 0 (default) : use `memcpy()`. Safe and portable. - * Method 1 : `__packed` statement. It depends on compiler extension (ie, not portable). - * This method is safe if your compiler supports it, and *generally* as fast or faster than `memcpy`. - * Method 2 : direct access. This method is portable but violate C standard. - * It can generate buggy code on targets which assembly generation depends on alignment. - * But in some circumstances, it's the only known way to get the most performance (ie GCC + ARMv6) - * See https://fastcompression.blogspot.fr/2015/08/accessing-unaligned-memory.html for details. - * Prefer these methods in priority order (0 > 1 > 2) - */ -#ifndef LZ4_FORCE_MEMORY_ACCESS /* can be defined externally */ -# if defined(__GNUC__) && \ - ( defined(__ARM_ARCH_6__) || defined(__ARM_ARCH_6J__) || defined(__ARM_ARCH_6K__) \ - || defined(__ARM_ARCH_6Z__) || defined(__ARM_ARCH_6ZK__) || defined(__ARM_ARCH_6T2__) ) -# define LZ4_FORCE_MEMORY_ACCESS 2 -# elif (defined(__INTEL_COMPILER) && !defined(_WIN32)) || defined(__GNUC__) -# define LZ4_FORCE_MEMORY_ACCESS 1 -# endif -#endif - -/* - * LZ4_FORCE_SW_BITCOUNT - * Define this parameter if your target system or compiler does not support hardware bit count - */ -#if defined(_MSC_VER) && defined(_WIN32_WCE) /* Visual Studio for WinCE doesn't support Hardware bit count */ -# undef LZ4_FORCE_SW_BITCOUNT /* avoid double def */ -# define LZ4_FORCE_SW_BITCOUNT -#endif - - - -/*-************************************ -* Dependency -**************************************/ -/* - * LZ4_SRC_INCLUDED: - * Amalgamation flag, whether lz4.c is included - */ -#ifndef LZ4_SRC_INCLUDED -# define LZ4_SRC_INCLUDED 1 -#endif - -#ifndef LZ4_STATIC_LINKING_ONLY -#define LZ4_STATIC_LINKING_ONLY -#endif - -#ifndef LZ4_DISABLE_DEPRECATE_WARNINGS -#define LZ4_DISABLE_DEPRECATE_WARNINGS /* due to LZ4_decompress_safe_withPrefix64k */ -#endif - -#define LZ4_STATIC_LINKING_ONLY /* LZ4_DISTANCE_MAX */ -#include "lz4.h" -/* see also "memory routines" below */ - - -/*-************************************ -* Compiler Options -**************************************/ -#if defined(_MSC_VER) && (_MSC_VER >= 1400) /* Visual Studio 2005+ */ -# include /* only present in VS2005+ */ -# pragma warning(disable : 4127) /* disable: C4127: conditional expression is constant */ -# pragma warning(disable : 6237) /* disable: C6237: conditional expression is always 0 */ -#endif /* _MSC_VER */ - -#ifndef LZ4_FORCE_INLINE -# ifdef _MSC_VER /* Visual Studio */ -# define LZ4_FORCE_INLINE static __forceinline -# else -# if defined (__cplusplus) || defined (__STDC_VERSION__) && __STDC_VERSION__ >= 199901L /* C99 */ -# ifdef __GNUC__ -# define LZ4_FORCE_INLINE static inline __attribute__((always_inline)) -# else -# define LZ4_FORCE_INLINE static inline -# endif -# else -# define LZ4_FORCE_INLINE static -# endif /* __STDC_VERSION__ */ -# endif /* _MSC_VER */ -#endif /* LZ4_FORCE_INLINE */ - -/* LZ4_FORCE_O2 and LZ4_FORCE_INLINE - * gcc on ppc64le generates an unrolled SIMDized loop for LZ4_wildCopy8, - * together with a simple 8-byte copy loop as a fall-back path. - * However, this optimization hurts the decompression speed by >30%, - * because the execution does not go to the optimized loop - * for typical compressible data, and all of the preamble checks - * before going to the fall-back path become useless overhead. - * This optimization happens only with the -O3 flag, and -O2 generates - * a simple 8-byte copy loop. - * With gcc on ppc64le, all of the LZ4_decompress_* and LZ4_wildCopy8 - * functions are annotated with __attribute__((optimize("O2"))), - * and also LZ4_wildCopy8 is forcibly inlined, so that the O2 attribute - * of LZ4_wildCopy8 does not affect the compression speed. - */ -#if defined(__PPC64__) && defined(__LITTLE_ENDIAN__) && defined(__GNUC__) && !defined(__clang__) -# define LZ4_FORCE_O2 __attribute__((optimize("O2"))) -# undef LZ4_FORCE_INLINE -# define LZ4_FORCE_INLINE static __inline __attribute__((optimize("O2"),always_inline)) -#else -# define LZ4_FORCE_O2 -#endif - -#if (defined(__GNUC__) && (__GNUC__ >= 3)) || (defined(__INTEL_COMPILER) && (__INTEL_COMPILER >= 800)) || defined(__clang__) -# define expect(expr,value) (__builtin_expect ((expr),(value)) ) -#else -# define expect(expr,value) (expr) -#endif - -#ifndef likely -#define likely(expr) expect((expr) != 0, 1) -#endif -#ifndef unlikely -#define unlikely(expr) expect((expr) != 0, 0) -#endif - -/* Should the alignment test prove unreliable, for some reason, - * it can be disabled by setting LZ4_ALIGN_TEST to 0 */ -#ifndef LZ4_ALIGN_TEST /* can be externally provided */ -# define LZ4_ALIGN_TEST 1 -#endif - - -/*-************************************ -* Memory routines -**************************************/ - -/*! LZ4_STATIC_LINKING_ONLY_DISABLE_MEMORY_ALLOCATION : - * Disable relatively high-level LZ4/HC functions that use dynamic memory - * allocation functions (malloc(), calloc(), free()). - * - * Note that this is a compile-time switch. And since it disables - * public/stable LZ4 v1 API functions, we don't recommend using this - * symbol to generate a library for distribution. - * - * The following public functions are removed when this symbol is defined. - * - lz4 : LZ4_createStream, LZ4_freeStream, - * LZ4_createStreamDecode, LZ4_freeStreamDecode, LZ4_create (deprecated) - * - lz4hc : LZ4_createStreamHC, LZ4_freeStreamHC, - * LZ4_createHC (deprecated), LZ4_freeHC (deprecated) - * - lz4frame, lz4file : All LZ4F_* functions - */ -#if defined(LZ4_STATIC_LINKING_ONLY_DISABLE_MEMORY_ALLOCATION) -# define ALLOC(s) lz4_error_memory_allocation_is_disabled -# define ALLOC_AND_ZERO(s) lz4_error_memory_allocation_is_disabled -# define FREEMEM(p) lz4_error_memory_allocation_is_disabled -#elif defined(LZ4_USER_MEMORY_FUNCTIONS) -/* memory management functions can be customized by user project. - * Below functions must exist somewhere in the Project - * and be available at link time */ -void* LZ4_malloc(size_t s); -void* LZ4_calloc(size_t n, size_t s); -void LZ4_free(void* p); -# define ALLOC(s) LZ4_malloc(s) -# define ALLOC_AND_ZERO(s) LZ4_calloc(1,s) -# define FREEMEM(p) LZ4_free(p) -#else -# include /* malloc, calloc, free */ -# define ALLOC(s) malloc(s) -# define ALLOC_AND_ZERO(s) calloc(1,s) -# define FREEMEM(p) free(p) -#endif - -#if ! LZ4_FREESTANDING -# include /* memset, memcpy */ -#endif -#if !defined(LZ4_memset) -# define LZ4_memset(p,v,s) memset((p),(v),(s)) -#endif -#define MEM_INIT(p,v,s) LZ4_memset((p),(v),(s)) - - -/*-************************************ -* Common Constants -**************************************/ -#define MINMATCH 4 - -#define WILDCOPYLENGTH 8 -#define LASTLITERALS 5 /* see ../doc/lz4_Block_format.md#parsing-restrictions */ -#define MFLIMIT 12 /* see ../doc/lz4_Block_format.md#parsing-restrictions */ -#define MATCH_SAFEGUARD_DISTANCE ((2*WILDCOPYLENGTH) - MINMATCH) /* ensure it's possible to write 2 x wildcopyLength without overflowing output buffer */ -#define FASTLOOP_SAFE_DISTANCE 64 -static const int LZ4_minLength = (MFLIMIT+1); - -#define KB *(1 <<10) -#define MB *(1 <<20) -#define GB *(1U<<30) - -#define LZ4_DISTANCE_ABSOLUTE_MAX 65535 -#if (LZ4_DISTANCE_MAX > LZ4_DISTANCE_ABSOLUTE_MAX) /* max supported by LZ4 format */ -# error "LZ4_DISTANCE_MAX is too big : must be <= 65535" -#endif - -#define ML_BITS 4 -#define ML_MASK ((1U<=1) -# include -#else -# ifndef assert -# define assert(condition) ((void)0) -# endif -#endif - -#define LZ4_STATIC_ASSERT(c) { enum { LZ4_static_assert = 1/(int)(!!(c)) }; } /* use after variable declarations */ - -#if defined(LZ4_DEBUG) && (LZ4_DEBUG>=2) -# include - static int g_debuglog_enable = 1; -# define DEBUGLOG(l, ...) { \ - if ((g_debuglog_enable) && (l<=LZ4_DEBUG)) { \ - fprintf(stderr, __FILE__ " %i: ", __LINE__); \ - fprintf(stderr, __VA_ARGS__); \ - fprintf(stderr, " \n"); \ - } } -#else -# define DEBUGLOG(l, ...) {} /* disabled */ -#endif - -static int LZ4_isAligned(const void* ptr, size_t alignment) -{ - return ((size_t)ptr & (alignment -1)) == 0; -} - - -/*-************************************ -* Types -**************************************/ -#include -#if defined(__cplusplus) || (defined (__STDC_VERSION__) && (__STDC_VERSION__ >= 199901L) /* C99 */) -# include - typedef uint8_t BYTE; - typedef uint16_t U16; - typedef uint32_t U32; - typedef int32_t S32; - typedef uint64_t U64; - typedef uintptr_t uptrval; -#else -# if UINT_MAX != 4294967295UL -# error "LZ4 code (when not C++ or C99) assumes that sizeof(int) == 4" -# endif - typedef unsigned char BYTE; - typedef unsigned short U16; - typedef unsigned int U32; - typedef signed int S32; - typedef unsigned long long U64; - typedef size_t uptrval; /* generally true, except OpenVMS-64 */ -#endif - -#if defined(__x86_64__) - typedef U64 reg_t; /* 64-bits in x32 mode */ -#else - typedef size_t reg_t; /* 32-bits in x32 mode */ -#endif - -typedef enum { - notLimited = 0, - limitedOutput = 1, - fillOutput = 2 -} limitedOutput_directive; - - -/*-************************************ -* Reading and writing into memory -**************************************/ - -/** - * LZ4 relies on memcpy with a constant size being inlined. In freestanding - * environments, the compiler can't assume the implementation of memcpy() is - * standard compliant, so it can't apply its specialized memcpy() inlining - * logic. When possible, use __builtin_memcpy() to tell the compiler to analyze - * memcpy() as if it were standard compliant, so it can inline it in freestanding - * environments. This is needed when decompressing the Linux Kernel, for example. - */ -#if !defined(LZ4_memcpy) -# if defined(__GNUC__) && (__GNUC__ >= 4) -# define LZ4_memcpy(dst, src, size) __builtin_memcpy(dst, src, size) -# else -# define LZ4_memcpy(dst, src, size) memcpy(dst, src, size) -# endif -#endif - -#if !defined(LZ4_memmove) -# if defined(__GNUC__) && (__GNUC__ >= 4) -# define LZ4_memmove __builtin_memmove -# else -# define LZ4_memmove memmove -# endif -#endif - -static unsigned LZ4_isLittleEndian(void) -{ - const union { U32 u; BYTE c[4]; } one = { 1 }; /* don't use static : performance detrimental */ - return one.c[0]; -} - - -#if defined(LZ4_FORCE_MEMORY_ACCESS) && (LZ4_FORCE_MEMORY_ACCESS==2) -/* lie to the compiler about data alignment; use with caution */ - -static U16 LZ4_read16(const void* memPtr) { return *(const U16*) memPtr; } -static U32 LZ4_read32(const void* memPtr) { return *(const U32*) memPtr; } -static reg_t LZ4_read_ARCH(const void* memPtr) { return *(const reg_t*) memPtr; } - -static void LZ4_write16(void* memPtr, U16 value) { *(U16*)memPtr = value; } -static void LZ4_write32(void* memPtr, U32 value) { *(U32*)memPtr = value; } - -#elif defined(LZ4_FORCE_MEMORY_ACCESS) && (LZ4_FORCE_MEMORY_ACCESS==1) - -/* __pack instructions are safer, but compiler specific, hence potentially problematic for some compilers */ -/* currently only defined for gcc and icc */ -typedef struct { U16 u16; } __attribute__((packed)) LZ4_unalign16; -typedef struct { U32 u32; } __attribute__((packed)) LZ4_unalign32; -typedef struct { reg_t uArch; } __attribute__((packed)) LZ4_unalignST; - -static U16 LZ4_read16(const void* ptr) { return ((const LZ4_unalign16*)ptr)->u16; } -static U32 LZ4_read32(const void* ptr) { return ((const LZ4_unalign32*)ptr)->u32; } -static reg_t LZ4_read_ARCH(const void* ptr) { return ((const LZ4_unalignST*)ptr)->uArch; } - -static void LZ4_write16(void* memPtr, U16 value) { ((LZ4_unalign16*)memPtr)->u16 = value; } -static void LZ4_write32(void* memPtr, U32 value) { ((LZ4_unalign32*)memPtr)->u32 = value; } - -#else /* safe and portable access using memcpy() */ - -static U16 LZ4_read16(const void* memPtr) -{ - U16 val; LZ4_memcpy(&val, memPtr, sizeof(val)); return val; -} - -static U32 LZ4_read32(const void* memPtr) -{ - U32 val; LZ4_memcpy(&val, memPtr, sizeof(val)); return val; -} - -static reg_t LZ4_read_ARCH(const void* memPtr) -{ - reg_t val; LZ4_memcpy(&val, memPtr, sizeof(val)); return val; -} - -static void LZ4_write16(void* memPtr, U16 value) -{ - LZ4_memcpy(memPtr, &value, sizeof(value)); -} - -static void LZ4_write32(void* memPtr, U32 value) -{ - LZ4_memcpy(memPtr, &value, sizeof(value)); -} - -#endif /* LZ4_FORCE_MEMORY_ACCESS */ - - -static U16 LZ4_readLE16(const void* memPtr) -{ - if (LZ4_isLittleEndian()) { - return LZ4_read16(memPtr); - } else { - const BYTE* p = (const BYTE*)memPtr; - return (U16)((U16)p[0] + (p[1]<<8)); - } -} - -static void LZ4_writeLE16(void* memPtr, U16 value) -{ - if (LZ4_isLittleEndian()) { - LZ4_write16(memPtr, value); - } else { - BYTE* p = (BYTE*)memPtr; - p[0] = (BYTE) value; - p[1] = (BYTE)(value>>8); - } -} - -/* customized variant of memcpy, which can overwrite up to 8 bytes beyond dstEnd */ -LZ4_FORCE_INLINE -void LZ4_wildCopy8(void* dstPtr, const void* srcPtr, void* dstEnd) -{ - BYTE* d = (BYTE*)dstPtr; - const BYTE* s = (const BYTE*)srcPtr; - BYTE* const e = (BYTE*)dstEnd; - - do { LZ4_memcpy(d,s,8); d+=8; s+=8; } while (d= 16. */ -LZ4_FORCE_INLINE void -LZ4_wildCopy32(void* dstPtr, const void* srcPtr, void* dstEnd) -{ - BYTE* d = (BYTE*)dstPtr; - const BYTE* s = (const BYTE*)srcPtr; - BYTE* const e = (BYTE*)dstEnd; - - do { LZ4_memcpy(d,s,16); LZ4_memcpy(d+16,s+16,16); d+=32; s+=32; } while (d= dstPtr + MINMATCH - * - there is at least 8 bytes available to write after dstEnd */ -LZ4_FORCE_INLINE void -LZ4_memcpy_using_offset(BYTE* dstPtr, const BYTE* srcPtr, BYTE* dstEnd, const size_t offset) -{ - BYTE v[8]; - - assert(dstEnd >= dstPtr + MINMATCH); - - switch(offset) { - case 1: - MEM_INIT(v, *srcPtr, 8); - break; - case 2: - LZ4_memcpy(v, srcPtr, 2); - LZ4_memcpy(&v[2], srcPtr, 2); -#if defined(_MSC_VER) && (_MSC_VER <= 1936) /* MSVC 2022 ver 17.6 or earlier */ -# pragma warning(push) -# pragma warning(disable : 6385) /* warning C6385: Reading invalid data from 'v'. */ -#endif - LZ4_memcpy(&v[4], v, 4); -#if defined(_MSC_VER) && (_MSC_VER <= 1936) /* MSVC 2022 ver 17.6 or earlier */ -# pragma warning(pop) -#endif - break; - case 4: - LZ4_memcpy(v, srcPtr, 4); - LZ4_memcpy(&v[4], srcPtr, 4); - break; - default: - LZ4_memcpy_using_offset_base(dstPtr, srcPtr, dstEnd, offset); - return; - } - - LZ4_memcpy(dstPtr, v, 8); - dstPtr += 8; - while (dstPtr < dstEnd) { - LZ4_memcpy(dstPtr, v, 8); - dstPtr += 8; - } -} -#endif - - -/*-************************************ -* Common functions -**************************************/ -static unsigned LZ4_NbCommonBytes (reg_t val) -{ - assert(val != 0); - if (LZ4_isLittleEndian()) { - if (sizeof(val) == 8) { -# if defined(_MSC_VER) && (_MSC_VER >= 1800) && (defined(_M_AMD64) && !defined(_M_ARM64EC)) && !defined(LZ4_FORCE_SW_BITCOUNT) -/*-************************************************************************************************* -* ARM64EC is a Microsoft-designed ARM64 ABI compatible with AMD64 applications on ARM64 Windows 11. -* The ARM64EC ABI does not support AVX/AVX2/AVX512 instructions, nor their relevant intrinsics -* including _tzcnt_u64. Therefore, we need to neuter the _tzcnt_u64 code path for ARM64EC. -****************************************************************************************************/ -# if defined(__clang__) && (__clang_major__ < 10) - /* Avoid undefined clang-cl intrinsics issue. - * See https://github.com/lz4/lz4/pull/1017 for details. */ - return (unsigned)__builtin_ia32_tzcnt_u64(val) >> 3; -# else - /* x64 CPUS without BMI support interpret `TZCNT` as `REP BSF` */ - return (unsigned)_tzcnt_u64(val) >> 3; -# endif -# elif defined(_MSC_VER) && defined(_WIN64) && !defined(LZ4_FORCE_SW_BITCOUNT) - unsigned long r = 0; - _BitScanForward64(&r, (U64)val); - return (unsigned)r >> 3; -# elif (defined(__clang__) || (defined(__GNUC__) && ((__GNUC__ > 3) || \ - ((__GNUC__ == 3) && (__GNUC_MINOR__ >= 4))))) && \ - !defined(LZ4_FORCE_SW_BITCOUNT) - return (unsigned)__builtin_ctzll((U64)val) >> 3; -# else - const U64 m = 0x0101010101010101ULL; - val ^= val - 1; - return (unsigned)(((U64)((val & (m - 1)) * m)) >> 56); -# endif - } else /* 32 bits */ { -# if defined(_MSC_VER) && (_MSC_VER >= 1400) && !defined(LZ4_FORCE_SW_BITCOUNT) - unsigned long r; - _BitScanForward(&r, (U32)val); - return (unsigned)r >> 3; -# elif (defined(__clang__) || (defined(__GNUC__) && ((__GNUC__ > 3) || \ - ((__GNUC__ == 3) && (__GNUC_MINOR__ >= 4))))) && \ - !defined(__TINYC__) && !defined(LZ4_FORCE_SW_BITCOUNT) - return (unsigned)__builtin_ctz((U32)val) >> 3; -# else - const U32 m = 0x01010101; - return (unsigned)((((val - 1) ^ val) & (m - 1)) * m) >> 24; -# endif - } - } else /* Big Endian CPU */ { - if (sizeof(val)==8) { -# if (defined(__clang__) || (defined(__GNUC__) && ((__GNUC__ > 3) || \ - ((__GNUC__ == 3) && (__GNUC_MINOR__ >= 4))))) && \ - !defined(__TINYC__) && !defined(LZ4_FORCE_SW_BITCOUNT) - return (unsigned)__builtin_clzll((U64)val) >> 3; -# else -#if 1 - /* this method is probably faster, - * but adds a 128 bytes lookup table */ - static const unsigned char ctz7_tab[128] = { - 7, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0, - 4, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0, - 5, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0, - 4, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0, - 6, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0, - 4, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0, - 5, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0, - 4, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0, - }; - U64 const mask = 0x0101010101010101ULL; - U64 const t = (((val >> 8) - mask) | val) & mask; - return ctz7_tab[(t * 0x0080402010080402ULL) >> 57]; -#else - /* this method doesn't consume memory space like the previous one, - * but it contains several branches, - * that may end up slowing execution */ - static const U32 by32 = sizeof(val)*4; /* 32 on 64 bits (goal), 16 on 32 bits. - Just to avoid some static analyzer complaining about shift by 32 on 32-bits target. - Note that this code path is never triggered in 32-bits mode. */ - unsigned r; - if (!(val>>by32)) { r=4; } else { r=0; val>>=by32; } - if (!(val>>16)) { r+=2; val>>=8; } else { val>>=24; } - r += (!val); - return r; -#endif -# endif - } else /* 32 bits */ { -# if (defined(__clang__) || (defined(__GNUC__) && ((__GNUC__ > 3) || \ - ((__GNUC__ == 3) && (__GNUC_MINOR__ >= 4))))) && \ - !defined(LZ4_FORCE_SW_BITCOUNT) - return (unsigned)__builtin_clz((U32)val) >> 3; -# else - val >>= 8; - val = ((((val + 0x00FFFF00) | 0x00FFFFFF) + val) | - (val + 0x00FF0000)) >> 24; - return (unsigned)val ^ 3; -# endif - } - } -} - - -#define STEPSIZE sizeof(reg_t) -LZ4_FORCE_INLINE -unsigned LZ4_count(const BYTE* pIn, const BYTE* pMatch, const BYTE* pInLimit) -{ - const BYTE* const pStart = pIn; - - if (likely(pIn < pInLimit-(STEPSIZE-1))) { - reg_t const diff = LZ4_read_ARCH(pMatch) ^ LZ4_read_ARCH(pIn); - if (!diff) { - pIn+=STEPSIZE; pMatch+=STEPSIZE; - } else { - return LZ4_NbCommonBytes(diff); - } } - - while (likely(pIn < pInLimit-(STEPSIZE-1))) { - reg_t const diff = LZ4_read_ARCH(pMatch) ^ LZ4_read_ARCH(pIn); - if (!diff) { pIn+=STEPSIZE; pMatch+=STEPSIZE; continue; } - pIn += LZ4_NbCommonBytes(diff); - return (unsigned)(pIn - pStart); - } - - if ((STEPSIZE==8) && (pIn<(pInLimit-3)) && (LZ4_read32(pMatch) == LZ4_read32(pIn))) { pIn+=4; pMatch+=4; } - if ((pIn<(pInLimit-1)) && (LZ4_read16(pMatch) == LZ4_read16(pIn))) { pIn+=2; pMatch+=2; } - if ((pIn compression run slower on incompressible data */ - - -/*-************************************ -* Local Structures and types -**************************************/ -typedef enum { clearedTable = 0, byPtr, byU32, byU16 } tableType_t; - -/** - * This enum distinguishes several different modes of accessing previous - * content in the stream. - * - * - noDict : There is no preceding content. - * - withPrefix64k : Table entries up to ctx->dictSize before the current blob - * blob being compressed are valid and refer to the preceding - * content (of length ctx->dictSize), which is available - * contiguously preceding in memory the content currently - * being compressed. - * - usingExtDict : Like withPrefix64k, but the preceding content is somewhere - * else in memory, starting at ctx->dictionary with length - * ctx->dictSize. - * - usingDictCtx : Everything concerning the preceding content is - * in a separate context, pointed to by ctx->dictCtx. - * ctx->dictionary, ctx->dictSize, and table entries - * in the current context that refer to positions - * preceding the beginning of the current compression are - * ignored. Instead, ctx->dictCtx->dictionary and ctx->dictCtx - * ->dictSize describe the location and size of the preceding - * content, and matches are found by looking in the ctx - * ->dictCtx->hashTable. - */ -typedef enum { noDict = 0, withPrefix64k, usingExtDict, usingDictCtx } dict_directive; -typedef enum { noDictIssue = 0, dictSmall } dictIssue_directive; - - -/*-************************************ -* Local Utils -**************************************/ -int LZ4_versionNumber (void) { return LZ4_VERSION_NUMBER; } -const char* LZ4_versionString(void) { return LZ4_VERSION_STRING; } -int LZ4_compressBound(int isize) { return LZ4_COMPRESSBOUND(isize); } -int LZ4_sizeofState(void) { return sizeof(LZ4_stream_t); } - - -/*-**************************************** -* Internal Definitions, used only in Tests -*******************************************/ -#if defined (__cplusplus) -extern "C" { -#endif - -int LZ4_compress_forceExtDict (LZ4_stream_t* LZ4_dict, const char* source, char* dest, int srcSize); - -int LZ4_decompress_safe_forceExtDict(const char* source, char* dest, - int compressedSize, int maxOutputSize, - const void* dictStart, size_t dictSize); -int LZ4_decompress_safe_partial_forceExtDict(const char* source, char* dest, - int compressedSize, int targetOutputSize, int dstCapacity, - const void* dictStart, size_t dictSize); -#if defined (__cplusplus) -} -#endif - -/*-****************************** -* Compression functions -********************************/ -LZ4_FORCE_INLINE U32 LZ4_hash4(U32 sequence, tableType_t const tableType) -{ - if (tableType == byU16) - return ((sequence * 2654435761U) >> ((MINMATCH*8)-(LZ4_HASHLOG+1))); - else - return ((sequence * 2654435761U) >> ((MINMATCH*8)-LZ4_HASHLOG)); -} - -LZ4_FORCE_INLINE U32 LZ4_hash5(U64 sequence, tableType_t const tableType) -{ - const U32 hashLog = (tableType == byU16) ? LZ4_HASHLOG+1 : LZ4_HASHLOG; - if (LZ4_isLittleEndian()) { - const U64 prime5bytes = 889523592379ULL; - return (U32)(((sequence << 24) * prime5bytes) >> (64 - hashLog)); - } else { - const U64 prime8bytes = 11400714785074694791ULL; - return (U32)(((sequence >> 24) * prime8bytes) >> (64 - hashLog)); - } -} - -LZ4_FORCE_INLINE U32 LZ4_hashPosition(const void* const p, tableType_t const tableType) -{ - if ((sizeof(reg_t)==8) && (tableType != byU16)) return LZ4_hash5(LZ4_read_ARCH(p), tableType); - return LZ4_hash4(LZ4_read32(p), tableType); -} - -LZ4_FORCE_INLINE void LZ4_clearHash(U32 h, void* tableBase, tableType_t const tableType) -{ - switch (tableType) - { - default: /* fallthrough */ - case clearedTable: { /* illegal! */ assert(0); return; } - case byPtr: { const BYTE** hashTable = (const BYTE**)tableBase; hashTable[h] = NULL; return; } - case byU32: { U32* hashTable = (U32*) tableBase; hashTable[h] = 0; return; } - case byU16: { U16* hashTable = (U16*) tableBase; hashTable[h] = 0; return; } - } -} - -LZ4_FORCE_INLINE void LZ4_putIndexOnHash(U32 idx, U32 h, void* tableBase, tableType_t const tableType) -{ - switch (tableType) - { - default: /* fallthrough */ - case clearedTable: /* fallthrough */ - case byPtr: { /* illegal! */ assert(0); return; } - case byU32: { U32* hashTable = (U32*) tableBase; hashTable[h] = idx; return; } - case byU16: { U16* hashTable = (U16*) tableBase; assert(idx < 65536); hashTable[h] = (U16)idx; return; } - } -} - -/* LZ4_putPosition*() : only used in byPtr mode */ -LZ4_FORCE_INLINE void LZ4_putPositionOnHash(const BYTE* p, U32 h, - void* tableBase, tableType_t const tableType) -{ - const BYTE** const hashTable = (const BYTE**)tableBase; - assert(tableType == byPtr); (void)tableType; - hashTable[h] = p; -} - -LZ4_FORCE_INLINE void LZ4_putPosition(const BYTE* p, void* tableBase, tableType_t tableType) -{ - U32 const h = LZ4_hashPosition(p, tableType); - LZ4_putPositionOnHash(p, h, tableBase, tableType); -} - -/* LZ4_getIndexOnHash() : - * Index of match position registered in hash table. - * hash position must be calculated by using base+index, or dictBase+index. - * Assumption 1 : only valid if tableType == byU32 or byU16. - * Assumption 2 : h is presumed valid (within limits of hash table) - */ -LZ4_FORCE_INLINE U32 LZ4_getIndexOnHash(U32 h, const void* tableBase, tableType_t tableType) -{ - LZ4_STATIC_ASSERT(LZ4_MEMORY_USAGE > 2); - if (tableType == byU32) { - const U32* const hashTable = (const U32*) tableBase; - assert(h < (1U << (LZ4_MEMORY_USAGE-2))); - return hashTable[h]; - } - if (tableType == byU16) { - const U16* const hashTable = (const U16*) tableBase; - assert(h < (1U << (LZ4_MEMORY_USAGE-1))); - return hashTable[h]; - } - assert(0); return 0; /* forbidden case */ -} - -static const BYTE* LZ4_getPositionOnHash(U32 h, const void* tableBase, tableType_t tableType) -{ - assert(tableType == byPtr); (void)tableType; - { const BYTE* const* hashTable = (const BYTE* const*) tableBase; return hashTable[h]; } -} - -LZ4_FORCE_INLINE const BYTE* -LZ4_getPosition(const BYTE* p, - const void* tableBase, tableType_t tableType) -{ - U32 const h = LZ4_hashPosition(p, tableType); - return LZ4_getPositionOnHash(h, tableBase, tableType); -} - -LZ4_FORCE_INLINE void -LZ4_prepareTable(LZ4_stream_t_internal* const cctx, - const int inputSize, - const tableType_t tableType) { - /* If the table hasn't been used, it's guaranteed to be zeroed out, and is - * therefore safe to use no matter what mode we're in. Otherwise, we figure - * out if it's safe to leave as is or whether it needs to be reset. - */ - if ((tableType_t)cctx->tableType != clearedTable) { - assert(inputSize >= 0); - if ((tableType_t)cctx->tableType != tableType - || ((tableType == byU16) && cctx->currentOffset + (unsigned)inputSize >= 0xFFFFU) - || ((tableType == byU32) && cctx->currentOffset > 1 GB) - || tableType == byPtr - || inputSize >= 4 KB) - { - DEBUGLOG(4, "LZ4_prepareTable: Resetting table in %p", cctx); - MEM_INIT(cctx->hashTable, 0, LZ4_HASHTABLESIZE); - cctx->currentOffset = 0; - cctx->tableType = (U32)clearedTable; - } else { - DEBUGLOG(4, "LZ4_prepareTable: Re-use hash table (no reset)"); - } - } - - /* Adding a gap, so all previous entries are > LZ4_DISTANCE_MAX back, - * is faster than compressing without a gap. - * However, compressing with currentOffset == 0 is faster still, - * so we preserve that case. - */ - if (cctx->currentOffset != 0 && tableType == byU32) { - DEBUGLOG(5, "LZ4_prepareTable: adding 64KB to currentOffset"); - cctx->currentOffset += 64 KB; - } - - /* Finally, clear history */ - cctx->dictCtx = NULL; - cctx->dictionary = NULL; - cctx->dictSize = 0; -} - -/** LZ4_compress_generic() : - * inlined, to ensure branches are decided at compilation time. - * The following conditions are presumed already validated: - * - source != NULL - * - inputSize > 0 - */ -LZ4_FORCE_INLINE int LZ4_compress_generic_validated( - LZ4_stream_t_internal* const cctx, - const char* const source, - char* const dest, - const int inputSize, - int* inputConsumed, /* only written when outputDirective == fillOutput */ - const int maxOutputSize, - const limitedOutput_directive outputDirective, - const tableType_t tableType, - const dict_directive dictDirective, - const dictIssue_directive dictIssue, - const int acceleration) -{ - int result; - const BYTE* ip = (const BYTE*)source; - - U32 const startIndex = cctx->currentOffset; - const BYTE* base = (const BYTE*)source - startIndex; - const BYTE* lowLimit; - - const LZ4_stream_t_internal* dictCtx = (const LZ4_stream_t_internal*) cctx->dictCtx; - const BYTE* const dictionary = - dictDirective == usingDictCtx ? dictCtx->dictionary : cctx->dictionary; - const U32 dictSize = - dictDirective == usingDictCtx ? dictCtx->dictSize : cctx->dictSize; - const U32 dictDelta = - (dictDirective == usingDictCtx) ? startIndex - dictCtx->currentOffset : 0; /* make indexes in dictCtx comparable with indexes in current context */ - - int const maybe_extMem = (dictDirective == usingExtDict) || (dictDirective == usingDictCtx); - U32 const prefixIdxLimit = startIndex - dictSize; /* used when dictDirective == dictSmall */ - const BYTE* const dictEnd = dictionary ? dictionary + dictSize : dictionary; - const BYTE* anchor = (const BYTE*) source; - const BYTE* const iend = ip + inputSize; - const BYTE* const mflimitPlusOne = iend - MFLIMIT + 1; - const BYTE* const matchlimit = iend - LASTLITERALS; - - /* the dictCtx currentOffset is indexed on the start of the dictionary, - * while a dictionary in the current context precedes the currentOffset */ - const BYTE* dictBase = (dictionary == NULL) ? NULL : - (dictDirective == usingDictCtx) ? - dictionary + dictSize - dictCtx->currentOffset : - dictionary + dictSize - startIndex; - - BYTE* op = (BYTE*) dest; - BYTE* const olimit = op + maxOutputSize; - - U32 offset = 0; - U32 forwardH; - - DEBUGLOG(5, "LZ4_compress_generic_validated: srcSize=%i, tableType=%u", inputSize, tableType); - assert(ip != NULL); - if (tableType == byU16) assert(inputSize= 1); - - lowLimit = (const BYTE*)source - (dictDirective == withPrefix64k ? dictSize : 0); - - /* Update context state */ - if (dictDirective == usingDictCtx) { - /* Subsequent linked blocks can't use the dictionary. */ - /* Instead, they use the block we just compressed. */ - cctx->dictCtx = NULL; - cctx->dictSize = (U32)inputSize; - } else { - cctx->dictSize += (U32)inputSize; - } - cctx->currentOffset += (U32)inputSize; - cctx->tableType = (U32)tableType; - - if (inputSizehashTable, byPtr); - } else { - LZ4_putIndexOnHash(startIndex, h, cctx->hashTable, tableType); - } } - ip++; forwardH = LZ4_hashPosition(ip, tableType); - - /* Main Loop */ - for ( ; ; ) { - const BYTE* match; - BYTE* token; - const BYTE* filledIp; - - /* Find a match */ - if (tableType == byPtr) { - const BYTE* forwardIp = ip; - int step = 1; - int searchMatchNb = acceleration << LZ4_skipTrigger; - do { - U32 const h = forwardH; - ip = forwardIp; - forwardIp += step; - step = (searchMatchNb++ >> LZ4_skipTrigger); - - if (unlikely(forwardIp > mflimitPlusOne)) goto _last_literals; - assert(ip < mflimitPlusOne); - - match = LZ4_getPositionOnHash(h, cctx->hashTable, tableType); - forwardH = LZ4_hashPosition(forwardIp, tableType); - LZ4_putPositionOnHash(ip, h, cctx->hashTable, tableType); - - } while ( (match+LZ4_DISTANCE_MAX < ip) - || (LZ4_read32(match) != LZ4_read32(ip)) ); - - } else { /* byU32, byU16 */ - - const BYTE* forwardIp = ip; - int step = 1; - int searchMatchNb = acceleration << LZ4_skipTrigger; - do { - U32 const h = forwardH; - U32 const current = (U32)(forwardIp - base); - U32 matchIndex = LZ4_getIndexOnHash(h, cctx->hashTable, tableType); - assert(matchIndex <= current); - assert(forwardIp - base < (ptrdiff_t)(2 GB - 1)); - ip = forwardIp; - forwardIp += step; - step = (searchMatchNb++ >> LZ4_skipTrigger); - - if (unlikely(forwardIp > mflimitPlusOne)) goto _last_literals; - assert(ip < mflimitPlusOne); - - if (dictDirective == usingDictCtx) { - if (matchIndex < startIndex) { - /* there was no match, try the dictionary */ - assert(tableType == byU32); - matchIndex = LZ4_getIndexOnHash(h, dictCtx->hashTable, byU32); - match = dictBase + matchIndex; - matchIndex += dictDelta; /* make dictCtx index comparable with current context */ - lowLimit = dictionary; - } else { - match = base + matchIndex; - lowLimit = (const BYTE*)source; - } - } else if (dictDirective == usingExtDict) { - if (matchIndex < startIndex) { - DEBUGLOG(7, "extDict candidate: matchIndex=%5u < startIndex=%5u", matchIndex, startIndex); - assert(startIndex - matchIndex >= MINMATCH); - assert(dictBase); - match = dictBase + matchIndex; - lowLimit = dictionary; - } else { - match = base + matchIndex; - lowLimit = (const BYTE*)source; - } - } else { /* single continuous memory segment */ - match = base + matchIndex; - } - forwardH = LZ4_hashPosition(forwardIp, tableType); - LZ4_putIndexOnHash(current, h, cctx->hashTable, tableType); - - DEBUGLOG(7, "candidate at pos=%u (offset=%u \n", matchIndex, current - matchIndex); - if ((dictIssue == dictSmall) && (matchIndex < prefixIdxLimit)) { continue; } /* match outside of valid area */ - assert(matchIndex < current); - if ( ((tableType != byU16) || (LZ4_DISTANCE_MAX < LZ4_DISTANCE_ABSOLUTE_MAX)) - && (matchIndex+LZ4_DISTANCE_MAX < current)) { - continue; - } /* too far */ - assert((current - matchIndex) <= LZ4_DISTANCE_MAX); /* match now expected within distance */ - - if (LZ4_read32(match) == LZ4_read32(ip)) { - if (maybe_extMem) offset = current - matchIndex; - break; /* match found */ - } - - } while(1); - } - - /* Catch up */ - filledIp = ip; - while (((ip>anchor) & (match > lowLimit)) && (unlikely(ip[-1]==match[-1]))) { ip--; match--; } - - /* Encode Literals */ - { unsigned const litLength = (unsigned)(ip - anchor); - token = op++; - if ((outputDirective == limitedOutput) && /* Check output buffer overflow */ - (unlikely(op + litLength + (2 + 1 + LASTLITERALS) + (litLength/255) > olimit)) ) { - return 0; /* cannot compress within `dst` budget. Stored indexes in hash table are nonetheless fine */ - } - if ((outputDirective == fillOutput) && - (unlikely(op + (litLength+240)/255 /* litlen */ + litLength /* literals */ + 2 /* offset */ + 1 /* token */ + MFLIMIT - MINMATCH /* min last literals so last match is <= end - MFLIMIT */ > olimit))) { - op--; - goto _last_literals; - } - if (litLength >= RUN_MASK) { - int len = (int)(litLength - RUN_MASK); - *token = (RUN_MASK<= 255 ; len-=255) *op++ = 255; - *op++ = (BYTE)len; - } - else *token = (BYTE)(litLength< olimit)) { - /* the match was too close to the end, rewind and go to last literals */ - op = token; - goto _last_literals; - } - - /* Encode Offset */ - if (maybe_extMem) { /* static test */ - DEBUGLOG(6, " with offset=%u (ext if > %i)", offset, (int)(ip - (const BYTE*)source)); - assert(offset <= LZ4_DISTANCE_MAX && offset > 0); - LZ4_writeLE16(op, (U16)offset); op+=2; - } else { - DEBUGLOG(6, " with offset=%u (same segment)", (U32)(ip - match)); - assert(ip-match <= LZ4_DISTANCE_MAX); - LZ4_writeLE16(op, (U16)(ip - match)); op+=2; - } - - /* Encode MatchLength */ - { unsigned matchCode; - - if ( (dictDirective==usingExtDict || dictDirective==usingDictCtx) - && (lowLimit==dictionary) /* match within extDict */ ) { - const BYTE* limit = ip + (dictEnd-match); - assert(dictEnd > match); - if (limit > matchlimit) limit = matchlimit; - matchCode = LZ4_count(ip+MINMATCH, match+MINMATCH, limit); - ip += (size_t)matchCode + MINMATCH; - if (ip==limit) { - unsigned const more = LZ4_count(limit, (const BYTE*)source, matchlimit); - matchCode += more; - ip += more; - } - DEBUGLOG(6, " with matchLength=%u starting in extDict", matchCode+MINMATCH); - } else { - matchCode = LZ4_count(ip+MINMATCH, match+MINMATCH, matchlimit); - ip += (size_t)matchCode + MINMATCH; - DEBUGLOG(6, " with matchLength=%u", matchCode+MINMATCH); - } - - if ((outputDirective) && /* Check output buffer overflow */ - (unlikely(op + (1 + LASTLITERALS) + (matchCode+240)/255 > olimit)) ) { - if (outputDirective == fillOutput) { - /* Match description too long : reduce it */ - U32 newMatchCode = 15 /* in token */ - 1 /* to avoid needing a zero byte */ + ((U32)(olimit - op) - 1 - LASTLITERALS) * 255; - ip -= matchCode - newMatchCode; - assert(newMatchCode < matchCode); - matchCode = newMatchCode; - if (unlikely(ip <= filledIp)) { - /* We have already filled up to filledIp so if ip ends up less than filledIp - * we have positions in the hash table beyond the current position. This is - * a problem if we reuse the hash table. So we have to remove these positions - * from the hash table. - */ - const BYTE* ptr; - DEBUGLOG(5, "Clearing %u positions", (U32)(filledIp - ip)); - for (ptr = ip; ptr <= filledIp; ++ptr) { - U32 const h = LZ4_hashPosition(ptr, tableType); - LZ4_clearHash(h, cctx->hashTable, tableType); - } - } - } else { - assert(outputDirective == limitedOutput); - return 0; /* cannot compress within `dst` budget. Stored indexes in hash table are nonetheless fine */ - } - } - if (matchCode >= ML_MASK) { - *token += ML_MASK; - matchCode -= ML_MASK; - LZ4_write32(op, 0xFFFFFFFF); - while (matchCode >= 4*255) { - op+=4; - LZ4_write32(op, 0xFFFFFFFF); - matchCode -= 4*255; - } - op += matchCode / 255; - *op++ = (BYTE)(matchCode % 255); - } else - *token += (BYTE)(matchCode); - } - /* Ensure we have enough space for the last literals. */ - assert(!(outputDirective == fillOutput && op + 1 + LASTLITERALS > olimit)); - - anchor = ip; - - /* Test end of chunk */ - if (ip >= mflimitPlusOne) break; - - /* Fill table */ - { U32 const h = LZ4_hashPosition(ip-2, tableType); - if (tableType == byPtr) { - LZ4_putPositionOnHash(ip-2, h, cctx->hashTable, byPtr); - } else { - U32 const idx = (U32)((ip-2) - base); - LZ4_putIndexOnHash(idx, h, cctx->hashTable, tableType); - } } - - /* Test next position */ - if (tableType == byPtr) { - - match = LZ4_getPosition(ip, cctx->hashTable, tableType); - LZ4_putPosition(ip, cctx->hashTable, tableType); - if ( (match+LZ4_DISTANCE_MAX >= ip) - && (LZ4_read32(match) == LZ4_read32(ip)) ) - { token=op++; *token=0; goto _next_match; } - - } else { /* byU32, byU16 */ - - U32 const h = LZ4_hashPosition(ip, tableType); - U32 const current = (U32)(ip-base); - U32 matchIndex = LZ4_getIndexOnHash(h, cctx->hashTable, tableType); - assert(matchIndex < current); - if (dictDirective == usingDictCtx) { - if (matchIndex < startIndex) { - /* there was no match, try the dictionary */ - assert(tableType == byU32); - matchIndex = LZ4_getIndexOnHash(h, dictCtx->hashTable, byU32); - match = dictBase + matchIndex; - lowLimit = dictionary; /* required for match length counter */ - matchIndex += dictDelta; - } else { - match = base + matchIndex; - lowLimit = (const BYTE*)source; /* required for match length counter */ - } - } else if (dictDirective==usingExtDict) { - if (matchIndex < startIndex) { - assert(dictBase); - match = dictBase + matchIndex; - lowLimit = dictionary; /* required for match length counter */ - } else { - match = base + matchIndex; - lowLimit = (const BYTE*)source; /* required for match length counter */ - } - } else { /* single memory segment */ - match = base + matchIndex; - } - LZ4_putIndexOnHash(current, h, cctx->hashTable, tableType); - assert(matchIndex < current); - if ( ((dictIssue==dictSmall) ? (matchIndex >= prefixIdxLimit) : 1) - && (((tableType==byU16) && (LZ4_DISTANCE_MAX == LZ4_DISTANCE_ABSOLUTE_MAX)) ? 1 : (matchIndex+LZ4_DISTANCE_MAX >= current)) - && (LZ4_read32(match) == LZ4_read32(ip)) ) { - token=op++; - *token=0; - if (maybe_extMem) offset = current - matchIndex; - DEBUGLOG(6, "seq.start:%i, literals=%u, match.start:%i", - (int)(anchor-(const BYTE*)source), 0, (int)(ip-(const BYTE*)source)); - goto _next_match; - } - } - - /* Prepare next loop */ - forwardH = LZ4_hashPosition(++ip, tableType); - - } - -_last_literals: - /* Encode Last Literals */ - { size_t lastRun = (size_t)(iend - anchor); - if ( (outputDirective) && /* Check output buffer overflow */ - (op + lastRun + 1 + ((lastRun+255-RUN_MASK)/255) > olimit)) { - if (outputDirective == fillOutput) { - /* adapt lastRun to fill 'dst' */ - assert(olimit >= op); - lastRun = (size_t)(olimit-op) - 1/*token*/; - lastRun -= (lastRun + 256 - RUN_MASK) / 256; /*additional length tokens*/ - } else { - assert(outputDirective == limitedOutput); - return 0; /* cannot compress within `dst` budget. Stored indexes in hash table are nonetheless fine */ - } - } - DEBUGLOG(6, "Final literal run : %i literals", (int)lastRun); - if (lastRun >= RUN_MASK) { - size_t accumulator = lastRun - RUN_MASK; - *op++ = RUN_MASK << ML_BITS; - for(; accumulator >= 255 ; accumulator-=255) *op++ = 255; - *op++ = (BYTE) accumulator; - } else { - *op++ = (BYTE)(lastRun< 0); - DEBUGLOG(5, "LZ4_compress_generic: compressed %i bytes into %i bytes", inputSize, result); - return result; -} - -/** LZ4_compress_generic() : - * inlined, to ensure branches are decided at compilation time; - * takes care of src == (NULL, 0) - * and forward the rest to LZ4_compress_generic_validated */ -LZ4_FORCE_INLINE int LZ4_compress_generic( - LZ4_stream_t_internal* const cctx, - const char* const src, - char* const dst, - const int srcSize, - int *inputConsumed, /* only written when outputDirective == fillOutput */ - const int dstCapacity, - const limitedOutput_directive outputDirective, - const tableType_t tableType, - const dict_directive dictDirective, - const dictIssue_directive dictIssue, - const int acceleration) -{ - DEBUGLOG(5, "LZ4_compress_generic: srcSize=%i, dstCapacity=%i", - srcSize, dstCapacity); - - if ((U32)srcSize > (U32)LZ4_MAX_INPUT_SIZE) { return 0; } /* Unsupported srcSize, too large (or negative) */ - if (srcSize == 0) { /* src == NULL supported if srcSize == 0 */ - if (outputDirective != notLimited && dstCapacity <= 0) return 0; /* no output, can't write anything */ - DEBUGLOG(5, "Generating an empty block"); - assert(outputDirective == notLimited || dstCapacity >= 1); - assert(dst != NULL); - dst[0] = 0; - if (outputDirective == fillOutput) { - assert (inputConsumed != NULL); - *inputConsumed = 0; - } - return 1; - } - assert(src != NULL); - - return LZ4_compress_generic_validated(cctx, src, dst, srcSize, - inputConsumed, /* only written into if outputDirective == fillOutput */ - dstCapacity, outputDirective, - tableType, dictDirective, dictIssue, acceleration); -} - - -int LZ4_compress_fast_extState(void* state, const char* source, char* dest, int inputSize, int maxOutputSize, int acceleration) -{ - LZ4_stream_t_internal* const ctx = & LZ4_initStream(state, sizeof(LZ4_stream_t)) -> internal_donotuse; - assert(ctx != NULL); - if (acceleration < 1) acceleration = LZ4_ACCELERATION_DEFAULT; - if (acceleration > LZ4_ACCELERATION_MAX) acceleration = LZ4_ACCELERATION_MAX; - if (maxOutputSize >= LZ4_compressBound(inputSize)) { - if (inputSize < LZ4_64Klimit) { - return LZ4_compress_generic(ctx, source, dest, inputSize, NULL, 0, notLimited, byU16, noDict, noDictIssue, acceleration); - } else { - const tableType_t tableType = ((sizeof(void*)==4) && ((uptrval)source > LZ4_DISTANCE_MAX)) ? byPtr : byU32; - return LZ4_compress_generic(ctx, source, dest, inputSize, NULL, 0, notLimited, tableType, noDict, noDictIssue, acceleration); - } - } else { - if (inputSize < LZ4_64Klimit) { - return LZ4_compress_generic(ctx, source, dest, inputSize, NULL, maxOutputSize, limitedOutput, byU16, noDict, noDictIssue, acceleration); - } else { - const tableType_t tableType = ((sizeof(void*)==4) && ((uptrval)source > LZ4_DISTANCE_MAX)) ? byPtr : byU32; - return LZ4_compress_generic(ctx, source, dest, inputSize, NULL, maxOutputSize, limitedOutput, tableType, noDict, noDictIssue, acceleration); - } - } -} - -/** - * LZ4_compress_fast_extState_fastReset() : - * A variant of LZ4_compress_fast_extState(). - * - * Using this variant avoids an expensive initialization step. It is only safe - * to call if the state buffer is known to be correctly initialized already - * (see comment in lz4.h on LZ4_resetStream_fast() for a definition of - * "correctly initialized"). - */ -int LZ4_compress_fast_extState_fastReset(void* state, const char* src, char* dst, int srcSize, int dstCapacity, int acceleration) -{ - LZ4_stream_t_internal* const ctx = &((LZ4_stream_t*)state)->internal_donotuse; - if (acceleration < 1) acceleration = LZ4_ACCELERATION_DEFAULT; - if (acceleration > LZ4_ACCELERATION_MAX) acceleration = LZ4_ACCELERATION_MAX; - assert(ctx != NULL); - - if (dstCapacity >= LZ4_compressBound(srcSize)) { - if (srcSize < LZ4_64Klimit) { - const tableType_t tableType = byU16; - LZ4_prepareTable(ctx, srcSize, tableType); - if (ctx->currentOffset) { - return LZ4_compress_generic(ctx, src, dst, srcSize, NULL, 0, notLimited, tableType, noDict, dictSmall, acceleration); - } else { - return LZ4_compress_generic(ctx, src, dst, srcSize, NULL, 0, notLimited, tableType, noDict, noDictIssue, acceleration); - } - } else { - const tableType_t tableType = ((sizeof(void*)==4) && ((uptrval)src > LZ4_DISTANCE_MAX)) ? byPtr : byU32; - LZ4_prepareTable(ctx, srcSize, tableType); - return LZ4_compress_generic(ctx, src, dst, srcSize, NULL, 0, notLimited, tableType, noDict, noDictIssue, acceleration); - } - } else { - if (srcSize < LZ4_64Klimit) { - const tableType_t tableType = byU16; - LZ4_prepareTable(ctx, srcSize, tableType); - if (ctx->currentOffset) { - return LZ4_compress_generic(ctx, src, dst, srcSize, NULL, dstCapacity, limitedOutput, tableType, noDict, dictSmall, acceleration); - } else { - return LZ4_compress_generic(ctx, src, dst, srcSize, NULL, dstCapacity, limitedOutput, tableType, noDict, noDictIssue, acceleration); - } - } else { - const tableType_t tableType = ((sizeof(void*)==4) && ((uptrval)src > LZ4_DISTANCE_MAX)) ? byPtr : byU32; - LZ4_prepareTable(ctx, srcSize, tableType); - return LZ4_compress_generic(ctx, src, dst, srcSize, NULL, dstCapacity, limitedOutput, tableType, noDict, noDictIssue, acceleration); - } - } -} - - -int LZ4_compress_fast(const char* src, char* dest, int srcSize, int dstCapacity, int acceleration) -{ - int result; -#if (LZ4_HEAPMODE) - LZ4_stream_t* const ctxPtr = (LZ4_stream_t*)ALLOC(sizeof(LZ4_stream_t)); /* malloc-calloc always properly aligned */ - if (ctxPtr == NULL) return 0; -#else - LZ4_stream_t ctx; - LZ4_stream_t* const ctxPtr = &ctx; -#endif - result = LZ4_compress_fast_extState(ctxPtr, src, dest, srcSize, dstCapacity, acceleration); - -#if (LZ4_HEAPMODE) - FREEMEM(ctxPtr); -#endif - return result; -} - - -int LZ4_compress_default(const char* src, char* dst, int srcSize, int dstCapacity) -{ - return LZ4_compress_fast(src, dst, srcSize, dstCapacity, 1); -} - - -/* Note!: This function leaves the stream in an unclean/broken state! - * It is not safe to subsequently use the same state with a _fastReset() or - * _continue() call without resetting it. */ -static int LZ4_compress_destSize_extState (LZ4_stream_t* state, const char* src, char* dst, int* srcSizePtr, int targetDstSize) -{ - void* const s = LZ4_initStream(state, sizeof (*state)); - assert(s != NULL); (void)s; - - if (targetDstSize >= LZ4_compressBound(*srcSizePtr)) { /* compression success is guaranteed */ - return LZ4_compress_fast_extState(state, src, dst, *srcSizePtr, targetDstSize, 1); - } else { - if (*srcSizePtr < LZ4_64Klimit) { - return LZ4_compress_generic(&state->internal_donotuse, src, dst, *srcSizePtr, srcSizePtr, targetDstSize, fillOutput, byU16, noDict, noDictIssue, 1); - } else { - tableType_t const addrMode = ((sizeof(void*)==4) && ((uptrval)src > LZ4_DISTANCE_MAX)) ? byPtr : byU32; - return LZ4_compress_generic(&state->internal_donotuse, src, dst, *srcSizePtr, srcSizePtr, targetDstSize, fillOutput, addrMode, noDict, noDictIssue, 1); - } } -} - - -int LZ4_compress_destSize(const char* src, char* dst, int* srcSizePtr, int targetDstSize) -{ -#if (LZ4_HEAPMODE) - LZ4_stream_t* const ctx = (LZ4_stream_t*)ALLOC(sizeof(LZ4_stream_t)); /* malloc-calloc always properly aligned */ - if (ctx == NULL) return 0; -#else - LZ4_stream_t ctxBody; - LZ4_stream_t* const ctx = &ctxBody; -#endif - - int result = LZ4_compress_destSize_extState(ctx, src, dst, srcSizePtr, targetDstSize); - -#if (LZ4_HEAPMODE) - FREEMEM(ctx); -#endif - return result; -} - - - -/*-****************************** -* Streaming functions -********************************/ - -#if !defined(LZ4_STATIC_LINKING_ONLY_DISABLE_MEMORY_ALLOCATION) -LZ4_stream_t* LZ4_createStream(void) -{ - LZ4_stream_t* const lz4s = (LZ4_stream_t*)ALLOC(sizeof(LZ4_stream_t)); - LZ4_STATIC_ASSERT(sizeof(LZ4_stream_t) >= sizeof(LZ4_stream_t_internal)); - DEBUGLOG(4, "LZ4_createStream %p", lz4s); - if (lz4s == NULL) return NULL; - LZ4_initStream(lz4s, sizeof(*lz4s)); - return lz4s; -} -#endif - -static size_t LZ4_stream_t_alignment(void) -{ -#if LZ4_ALIGN_TEST - typedef struct { char c; LZ4_stream_t t; } t_a; - return sizeof(t_a) - sizeof(LZ4_stream_t); -#else - return 1; /* effectively disabled */ -#endif -} - -LZ4_stream_t* LZ4_initStream (void* buffer, size_t size) -{ - DEBUGLOG(5, "LZ4_initStream"); - if (buffer == NULL) { return NULL; } - if (size < sizeof(LZ4_stream_t)) { return NULL; } - if (!LZ4_isAligned(buffer, LZ4_stream_t_alignment())) return NULL; - MEM_INIT(buffer, 0, sizeof(LZ4_stream_t_internal)); - return (LZ4_stream_t*)buffer; -} - -/* resetStream is now deprecated, - * prefer initStream() which is more general */ -void LZ4_resetStream (LZ4_stream_t* LZ4_stream) -{ - DEBUGLOG(5, "LZ4_resetStream (ctx:%p)", LZ4_stream); - MEM_INIT(LZ4_stream, 0, sizeof(LZ4_stream_t_internal)); -} - -void LZ4_resetStream_fast(LZ4_stream_t* ctx) { - LZ4_prepareTable(&(ctx->internal_donotuse), 0, byU32); -} - -#if !defined(LZ4_STATIC_LINKING_ONLY_DISABLE_MEMORY_ALLOCATION) -int LZ4_freeStream (LZ4_stream_t* LZ4_stream) -{ - if (!LZ4_stream) return 0; /* support free on NULL */ - DEBUGLOG(5, "LZ4_freeStream %p", LZ4_stream); - FREEMEM(LZ4_stream); - return (0); -} -#endif - - -#define HASH_UNIT sizeof(reg_t) -int LZ4_loadDict (LZ4_stream_t* LZ4_dict, const char* dictionary, int dictSize) -{ - LZ4_stream_t_internal* const dict = &LZ4_dict->internal_donotuse; - const tableType_t tableType = byU32; - const BYTE* p = (const BYTE*)dictionary; - const BYTE* const dictEnd = p + dictSize; - U32 idx32; - - DEBUGLOG(4, "LZ4_loadDict (%i bytes from %p into %p)", dictSize, dictionary, LZ4_dict); - - /* It's necessary to reset the context, - * and not just continue it with prepareTable() - * to avoid any risk of generating overflowing matchIndex - * when compressing using this dictionary */ - LZ4_resetStream(LZ4_dict); - - /* We always increment the offset by 64 KB, since, if the dict is longer, - * we truncate it to the last 64k, and if it's shorter, we still want to - * advance by a whole window length so we can provide the guarantee that - * there are only valid offsets in the window, which allows an optimization - * in LZ4_compress_fast_continue() where it uses noDictIssue even when the - * dictionary isn't a full 64k. */ - dict->currentOffset += 64 KB; - - if (dictSize < (int)HASH_UNIT) { - return 0; - } - - if ((dictEnd - p) > 64 KB) p = dictEnd - 64 KB; - dict->dictionary = p; - dict->dictSize = (U32)(dictEnd - p); - dict->tableType = (U32)tableType; - idx32 = dict->currentOffset - dict->dictSize; - - while (p <= dictEnd-HASH_UNIT) { - U32 const h = LZ4_hashPosition(p, tableType); - LZ4_putIndexOnHash(idx32, h, dict->hashTable, tableType); - p+=3; idx32+=3; - } - - return (int)dict->dictSize; -} - -void LZ4_attach_dictionary(LZ4_stream_t* workingStream, const LZ4_stream_t* dictionaryStream) -{ - const LZ4_stream_t_internal* dictCtx = (dictionaryStream == NULL) ? NULL : - &(dictionaryStream->internal_donotuse); - - DEBUGLOG(4, "LZ4_attach_dictionary (%p, %p, size %u)", - workingStream, dictionaryStream, - dictCtx != NULL ? dictCtx->dictSize : 0); - - if (dictCtx != NULL) { - /* If the current offset is zero, we will never look in the - * external dictionary context, since there is no value a table - * entry can take that indicate a miss. In that case, we need - * to bump the offset to something non-zero. - */ - if (workingStream->internal_donotuse.currentOffset == 0) { - workingStream->internal_donotuse.currentOffset = 64 KB; - } - - /* Don't actually attach an empty dictionary. - */ - if (dictCtx->dictSize == 0) { - dictCtx = NULL; - } - } - workingStream->internal_donotuse.dictCtx = dictCtx; -} - - -static void LZ4_renormDictT(LZ4_stream_t_internal* LZ4_dict, int nextSize) -{ - assert(nextSize >= 0); - if (LZ4_dict->currentOffset + (unsigned)nextSize > 0x80000000) { /* potential ptrdiff_t overflow (32-bits mode) */ - /* rescale hash table */ - U32 const delta = LZ4_dict->currentOffset - 64 KB; - const BYTE* dictEnd = LZ4_dict->dictionary + LZ4_dict->dictSize; - int i; - DEBUGLOG(4, "LZ4_renormDictT"); - for (i=0; ihashTable[i] < delta) LZ4_dict->hashTable[i]=0; - else LZ4_dict->hashTable[i] -= delta; - } - LZ4_dict->currentOffset = 64 KB; - if (LZ4_dict->dictSize > 64 KB) LZ4_dict->dictSize = 64 KB; - LZ4_dict->dictionary = dictEnd - LZ4_dict->dictSize; - } -} - - -int LZ4_compress_fast_continue (LZ4_stream_t* LZ4_stream, - const char* source, char* dest, - int inputSize, int maxOutputSize, - int acceleration) -{ - const tableType_t tableType = byU32; - LZ4_stream_t_internal* const streamPtr = &LZ4_stream->internal_donotuse; - const char* dictEnd = streamPtr->dictSize ? (const char*)streamPtr->dictionary + streamPtr->dictSize : NULL; - - DEBUGLOG(5, "LZ4_compress_fast_continue (inputSize=%i, dictSize=%u)", inputSize, streamPtr->dictSize); - - LZ4_renormDictT(streamPtr, inputSize); /* fix index overflow */ - if (acceleration < 1) acceleration = LZ4_ACCELERATION_DEFAULT; - if (acceleration > LZ4_ACCELERATION_MAX) acceleration = LZ4_ACCELERATION_MAX; - - /* invalidate tiny dictionaries */ - if ( (streamPtr->dictSize < 4) /* tiny dictionary : not enough for a hash */ - && (dictEnd != source) /* prefix mode */ - && (inputSize > 0) /* tolerance : don't lose history, in case next invocation would use prefix mode */ - && (streamPtr->dictCtx == NULL) /* usingDictCtx */ - ) { - DEBUGLOG(5, "LZ4_compress_fast_continue: dictSize(%u) at addr:%p is too small", streamPtr->dictSize, streamPtr->dictionary); - /* remove dictionary existence from history, to employ faster prefix mode */ - streamPtr->dictSize = 0; - streamPtr->dictionary = (const BYTE*)source; - dictEnd = source; - } - - /* Check overlapping input/dictionary space */ - { const char* const sourceEnd = source + inputSize; - if ((sourceEnd > (const char*)streamPtr->dictionary) && (sourceEnd < dictEnd)) { - streamPtr->dictSize = (U32)(dictEnd - sourceEnd); - if (streamPtr->dictSize > 64 KB) streamPtr->dictSize = 64 KB; - if (streamPtr->dictSize < 4) streamPtr->dictSize = 0; - streamPtr->dictionary = (const BYTE*)dictEnd - streamPtr->dictSize; - } - } - - /* prefix mode : source data follows dictionary */ - if (dictEnd == source) { - if ((streamPtr->dictSize < 64 KB) && (streamPtr->dictSize < streamPtr->currentOffset)) - return LZ4_compress_generic(streamPtr, source, dest, inputSize, NULL, maxOutputSize, limitedOutput, tableType, withPrefix64k, dictSmall, acceleration); - else - return LZ4_compress_generic(streamPtr, source, dest, inputSize, NULL, maxOutputSize, limitedOutput, tableType, withPrefix64k, noDictIssue, acceleration); - } - - /* external dictionary mode */ - { int result; - if (streamPtr->dictCtx) { - /* We depend here on the fact that dictCtx'es (produced by - * LZ4_loadDict) guarantee that their tables contain no references - * to offsets between dictCtx->currentOffset - 64 KB and - * dictCtx->currentOffset - dictCtx->dictSize. This makes it safe - * to use noDictIssue even when the dict isn't a full 64 KB. - */ - if (inputSize > 4 KB) { - /* For compressing large blobs, it is faster to pay the setup - * cost to copy the dictionary's tables into the active context, - * so that the compression loop is only looking into one table. - */ - LZ4_memcpy(streamPtr, streamPtr->dictCtx, sizeof(*streamPtr)); - result = LZ4_compress_generic(streamPtr, source, dest, inputSize, NULL, maxOutputSize, limitedOutput, tableType, usingExtDict, noDictIssue, acceleration); - } else { - result = LZ4_compress_generic(streamPtr, source, dest, inputSize, NULL, maxOutputSize, limitedOutput, tableType, usingDictCtx, noDictIssue, acceleration); - } - } else { /* small data <= 4 KB */ - if ((streamPtr->dictSize < 64 KB) && (streamPtr->dictSize < streamPtr->currentOffset)) { - result = LZ4_compress_generic(streamPtr, source, dest, inputSize, NULL, maxOutputSize, limitedOutput, tableType, usingExtDict, dictSmall, acceleration); - } else { - result = LZ4_compress_generic(streamPtr, source, dest, inputSize, NULL, maxOutputSize, limitedOutput, tableType, usingExtDict, noDictIssue, acceleration); - } - } - streamPtr->dictionary = (const BYTE*)source; - streamPtr->dictSize = (U32)inputSize; - return result; - } -} - - -/* Hidden debug function, to force-test external dictionary mode */ -int LZ4_compress_forceExtDict (LZ4_stream_t* LZ4_dict, const char* source, char* dest, int srcSize) -{ - LZ4_stream_t_internal* const streamPtr = &LZ4_dict->internal_donotuse; - int result; - - LZ4_renormDictT(streamPtr, srcSize); - - if ((streamPtr->dictSize < 64 KB) && (streamPtr->dictSize < streamPtr->currentOffset)) { - result = LZ4_compress_generic(streamPtr, source, dest, srcSize, NULL, 0, notLimited, byU32, usingExtDict, dictSmall, 1); - } else { - result = LZ4_compress_generic(streamPtr, source, dest, srcSize, NULL, 0, notLimited, byU32, usingExtDict, noDictIssue, 1); - } - - streamPtr->dictionary = (const BYTE*)source; - streamPtr->dictSize = (U32)srcSize; - - return result; -} - - -/*! LZ4_saveDict() : - * If previously compressed data block is not guaranteed to remain available at its memory location, - * save it into a safer place (char* safeBuffer). - * Note : no need to call LZ4_loadDict() afterwards, dictionary is immediately usable, - * one can therefore call LZ4_compress_fast_continue() right after. - * @return : saved dictionary size in bytes (necessarily <= dictSize), or 0 if error. - */ -int LZ4_saveDict (LZ4_stream_t* LZ4_dict, char* safeBuffer, int dictSize) -{ - LZ4_stream_t_internal* const dict = &LZ4_dict->internal_donotuse; - - DEBUGLOG(5, "LZ4_saveDict : dictSize=%i, safeBuffer=%p", dictSize, safeBuffer); - - if ((U32)dictSize > 64 KB) { dictSize = 64 KB; } /* useless to define a dictionary > 64 KB */ - if ((U32)dictSize > dict->dictSize) { dictSize = (int)dict->dictSize; } - - if (safeBuffer == NULL) assert(dictSize == 0); - if (dictSize > 0) { - const BYTE* const previousDictEnd = dict->dictionary + dict->dictSize; - assert(dict->dictionary); - LZ4_memmove(safeBuffer, previousDictEnd - dictSize, (size_t)dictSize); - } - - dict->dictionary = (const BYTE*)safeBuffer; - dict->dictSize = (U32)dictSize; - - return dictSize; -} - - - -/*-******************************* - * Decompression functions - ********************************/ - -typedef enum { decode_full_block = 0, partial_decode = 1 } earlyEnd_directive; - -#undef MIN -#define MIN(a,b) ( (a) < (b) ? (a) : (b) ) - - -/* variant for decompress_unsafe() - * does not know end of input - * presumes input is well formed - * note : will consume at least one byte */ -static size_t read_long_length_no_check(const BYTE** pp) -{ - size_t b, l = 0; - do { b = **pp; (*pp)++; l += b; } while (b==255); - DEBUGLOG(6, "read_long_length_no_check: +length=%zu using %zu input bytes", l, l/255 + 1) - return l; -} - -/* core decoder variant for LZ4_decompress_fast*() - * for legacy support only : these entry points are deprecated. - * - Presumes input is correctly formed (no defense vs malformed inputs) - * - Does not know input size (presume input buffer is "large enough") - * - Decompress a full block (only) - * @return : nb of bytes read from input. - * Note : this variant is not optimized for speed, just for maintenance. - * the goal is to remove support of decompress_fast*() variants by v2.0 -**/ -LZ4_FORCE_INLINE int -LZ4_decompress_unsafe_generic( - const BYTE* const istart, - BYTE* const ostart, - int decompressedSize, - - size_t prefixSize, - const BYTE* const dictStart, /* only if dict==usingExtDict */ - const size_t dictSize /* note: =0 if dictStart==NULL */ - ) -{ - const BYTE* ip = istart; - BYTE* op = (BYTE*)ostart; - BYTE* const oend = ostart + decompressedSize; - const BYTE* const prefixStart = ostart - prefixSize; - - DEBUGLOG(5, "LZ4_decompress_unsafe_generic"); - if (dictStart == NULL) assert(dictSize == 0); - - while (1) { - /* start new sequence */ - unsigned token = *ip++; - - /* literals */ - { size_t ll = token >> ML_BITS; - if (ll==15) { - /* long literal length */ - ll += read_long_length_no_check(&ip); - } - if ((size_t)(oend-op) < ll) return -1; /* output buffer overflow */ - LZ4_memmove(op, ip, ll); /* support in-place decompression */ - op += ll; - ip += ll; - if ((size_t)(oend-op) < MFLIMIT) { - if (op==oend) break; /* end of block */ - DEBUGLOG(5, "invalid: literals end at distance %zi from end of block", oend-op); - /* incorrect end of block : - * last match must start at least MFLIMIT==12 bytes before end of output block */ - return -1; - } } - - /* match */ - { size_t ml = token & 15; - size_t const offset = LZ4_readLE16(ip); - ip+=2; - - if (ml==15) { - /* long literal length */ - ml += read_long_length_no_check(&ip); - } - ml += MINMATCH; - - if ((size_t)(oend-op) < ml) return -1; /* output buffer overflow */ - - { const BYTE* match = op - offset; - - /* out of range */ - if (offset > (size_t)(op - prefixStart) + dictSize) { - DEBUGLOG(6, "offset out of range"); - return -1; - } - - /* check special case : extDict */ - if (offset > (size_t)(op - prefixStart)) { - /* extDict scenario */ - const BYTE* const dictEnd = dictStart + dictSize; - const BYTE* extMatch = dictEnd - (offset - (size_t)(op-prefixStart)); - size_t const extml = (size_t)(dictEnd - extMatch); - if (extml > ml) { - /* match entirely within extDict */ - LZ4_memmove(op, extMatch, ml); - op += ml; - ml = 0; - } else { - /* match split between extDict & prefix */ - LZ4_memmove(op, extMatch, extml); - op += extml; - ml -= extml; - } - match = prefixStart; - } - - /* match copy - slow variant, supporting overlap copy */ - { size_t u; - for (u=0; u= ipmax before start of loop. Returns initial_error if so. - * @error (output) - error code. Must be set to 0 before call. -**/ -typedef size_t Rvl_t; -static const Rvl_t rvl_error = (Rvl_t)(-1); -LZ4_FORCE_INLINE Rvl_t -read_variable_length(const BYTE** ip, const BYTE* ilimit, - int initial_check) -{ - Rvl_t s, length = 0; - assert(ip != NULL); - assert(*ip != NULL); - assert(ilimit != NULL); - if (initial_check && unlikely((*ip) >= ilimit)) { /* read limit reached */ - return rvl_error; - } - do { - s = **ip; - (*ip)++; - length += s; - if (unlikely((*ip) > ilimit)) { /* read limit reached */ - return rvl_error; - } - /* accumulator overflow detection (32-bit mode only) */ - if ((sizeof(length)<8) && unlikely(length > ((Rvl_t)(-1)/2)) ) { - return rvl_error; - } - } while (s==255); - - return length; -} - -/*! LZ4_decompress_generic() : - * This generic decompression function covers all use cases. - * It shall be instantiated several times, using different sets of directives. - * Note that it is important for performance that this function really get inlined, - * in order to remove useless branches during compilation optimization. - */ -LZ4_FORCE_INLINE int -LZ4_decompress_generic( - const char* const src, - char* const dst, - int srcSize, - int outputSize, /* If endOnInput==endOnInputSize, this value is `dstCapacity` */ - - earlyEnd_directive partialDecoding, /* full, partial */ - dict_directive dict, /* noDict, withPrefix64k, usingExtDict */ - const BYTE* const lowPrefix, /* always <= dst, == dst when no prefix */ - const BYTE* const dictStart, /* only if dict==usingExtDict */ - const size_t dictSize /* note : = 0 if noDict */ - ) -{ - if ((src == NULL) || (outputSize < 0)) { return -1; } - - { const BYTE* ip = (const BYTE*) src; - const BYTE* const iend = ip + srcSize; - - BYTE* op = (BYTE*) dst; - BYTE* const oend = op + outputSize; - BYTE* cpy; - - const BYTE* const dictEnd = (dictStart == NULL) ? NULL : dictStart + dictSize; - - const int checkOffset = (dictSize < (int)(64 KB)); - - - /* Set up the "end" pointers for the shortcut. */ - const BYTE* const shortiend = iend - 14 /*maxLL*/ - 2 /*offset*/; - const BYTE* const shortoend = oend - 14 /*maxLL*/ - 18 /*maxML*/; - - const BYTE* match; - size_t offset; - unsigned token; - size_t length; - - - DEBUGLOG(5, "LZ4_decompress_generic (srcSize:%i, dstSize:%i)", srcSize, outputSize); - - /* Special cases */ - assert(lowPrefix <= op); - if (unlikely(outputSize==0)) { - /* Empty output buffer */ - if (partialDecoding) return 0; - return ((srcSize==1) && (*ip==0)) ? 0 : -1; - } - if (unlikely(srcSize==0)) { return -1; } - - /* LZ4_FAST_DEC_LOOP: - * designed for modern OoO performance cpus, - * where copying reliably 32-bytes is preferable to an unpredictable branch. - * note : fast loop may show a regression for some client arm chips. */ -#if LZ4_FAST_DEC_LOOP - if ((oend - op) < FASTLOOP_SAFE_DISTANCE) { - DEBUGLOG(6, "skip fast decode loop"); - goto safe_decode; - } - - /* Fast loop : decode sequences as long as output < oend-FASTLOOP_SAFE_DISTANCE */ - DEBUGLOG(6, "using fast decode loop"); - while (1) { - /* Main fastloop assertion: We can always wildcopy FASTLOOP_SAFE_DISTANCE */ - assert(oend - op >= FASTLOOP_SAFE_DISTANCE); - assert(ip < iend); - token = *ip++; - length = token >> ML_BITS; /* literal length */ - - /* decode literal length */ - if (length == RUN_MASK) { - size_t const addl = read_variable_length(&ip, iend-RUN_MASK, 1); - if (addl == rvl_error) { - DEBUGLOG(6, "error reading long literal length"); - goto _output_error; - } - length += addl; - if (unlikely((uptrval)(op)+length<(uptrval)(op))) { goto _output_error; } /* overflow detection */ - if (unlikely((uptrval)(ip)+length<(uptrval)(ip))) { goto _output_error; } /* overflow detection */ - - /* copy literals */ - cpy = op+length; - LZ4_STATIC_ASSERT(MFLIMIT >= WILDCOPYLENGTH); - if ((cpy>oend-32) || (ip+length>iend-32)) { goto safe_literal_copy; } - LZ4_wildCopy32(op, ip, cpy); - ip += length; op = cpy; - } else { - cpy = op+length; - DEBUGLOG(7, "copy %u bytes in a 16-bytes stripe", (unsigned)length); - /* We don't need to check oend, since we check it once for each loop below */ - if (ip > iend-(16 + 1/*max lit + offset + nextToken*/)) { goto safe_literal_copy; } - /* Literals can only be <= 14, but hope compilers optimize better when copy by a register size */ - LZ4_memcpy(op, ip, 16); - ip += length; op = cpy; - } - - /* get offset */ - offset = LZ4_readLE16(ip); ip+=2; - DEBUGLOG(6, " offset = %zu", offset); - match = op - offset; - assert(match <= op); /* overflow check */ - - /* get matchlength */ - length = token & ML_MASK; - - if (length == ML_MASK) { - size_t const addl = read_variable_length(&ip, iend - LASTLITERALS + 1, 0); - if (addl == rvl_error) { - DEBUGLOG(6, "error reading long match length"); - goto _output_error; - } - length += addl; - length += MINMATCH; - if (unlikely((uptrval)(op)+length<(uptrval)op)) { goto _output_error; } /* overflow detection */ - if ((checkOffset) && (unlikely(match + dictSize < lowPrefix))) { - DEBUGLOG(6, "Error : offset outside buffers"); - goto _output_error; - } - if (op + length >= oend - FASTLOOP_SAFE_DISTANCE) { - goto safe_match_copy; - } - } else { - length += MINMATCH; - if (op + length >= oend - FASTLOOP_SAFE_DISTANCE) { - goto safe_match_copy; - } - - /* Fastpath check: skip LZ4_wildCopy32 when true */ - if ((dict == withPrefix64k) || (match >= lowPrefix)) { - if (offset >= 8) { - assert(match >= lowPrefix); - assert(match <= op); - assert(op + 18 <= oend); - - LZ4_memcpy(op, match, 8); - LZ4_memcpy(op+8, match+8, 8); - LZ4_memcpy(op+16, match+16, 2); - op += length; - continue; - } } } - - if ( checkOffset && (unlikely(match + dictSize < lowPrefix)) ) { - DEBUGLOG(6, "Error : pos=%zi, offset=%zi => outside buffers", op-lowPrefix, op-match); - goto _output_error; - } - /* match starting within external dictionary */ - if ((dict==usingExtDict) && (match < lowPrefix)) { - assert(dictEnd != NULL); - if (unlikely(op+length > oend-LASTLITERALS)) { - if (partialDecoding) { - DEBUGLOG(7, "partialDecoding: dictionary match, close to dstEnd"); - length = MIN(length, (size_t)(oend-op)); - } else { - DEBUGLOG(6, "end-of-block condition violated") - goto _output_error; - } } - - if (length <= (size_t)(lowPrefix-match)) { - /* match fits entirely within external dictionary : just copy */ - LZ4_memmove(op, dictEnd - (lowPrefix-match), length); - op += length; - } else { - /* match stretches into both external dictionary and current block */ - size_t const copySize = (size_t)(lowPrefix - match); - size_t const restSize = length - copySize; - LZ4_memcpy(op, dictEnd - copySize, copySize); - op += copySize; - if (restSize > (size_t)(op - lowPrefix)) { /* overlap copy */ - BYTE* const endOfMatch = op + restSize; - const BYTE* copyFrom = lowPrefix; - while (op < endOfMatch) { *op++ = *copyFrom++; } - } else { - LZ4_memcpy(op, lowPrefix, restSize); - op += restSize; - } } - continue; - } - - /* copy match within block */ - cpy = op + length; - - assert((op <= oend) && (oend-op >= 32)); - if (unlikely(offset<16)) { - LZ4_memcpy_using_offset(op, match, cpy, offset); - } else { - LZ4_wildCopy32(op, match, cpy); - } - - op = cpy; /* wildcopy correction */ - } - safe_decode: -#endif - - /* Main Loop : decode remaining sequences where output < FASTLOOP_SAFE_DISTANCE */ - DEBUGLOG(6, "using safe decode loop"); - while (1) { - assert(ip < iend); - token = *ip++; - length = token >> ML_BITS; /* literal length */ - - /* A two-stage shortcut for the most common case: - * 1) If the literal length is 0..14, and there is enough space, - * enter the shortcut and copy 16 bytes on behalf of the literals - * (in the fast mode, only 8 bytes can be safely copied this way). - * 2) Further if the match length is 4..18, copy 18 bytes in a similar - * manner; but we ensure that there's enough space in the output for - * those 18 bytes earlier, upon entering the shortcut (in other words, - * there is a combined check for both stages). - */ - if ( (length != RUN_MASK) - /* strictly "less than" on input, to re-enter the loop with at least one byte */ - && likely((ip < shortiend) & (op <= shortoend)) ) { - /* Copy the literals */ - LZ4_memcpy(op, ip, 16); - op += length; ip += length; - - /* The second stage: prepare for match copying, decode full info. - * If it doesn't work out, the info won't be wasted. */ - length = token & ML_MASK; /* match length */ - offset = LZ4_readLE16(ip); ip += 2; - match = op - offset; - assert(match <= op); /* check overflow */ - - /* Do not deal with overlapping matches. */ - if ( (length != ML_MASK) - && (offset >= 8) - && (dict==withPrefix64k || match >= lowPrefix) ) { - /* Copy the match. */ - LZ4_memcpy(op + 0, match + 0, 8); - LZ4_memcpy(op + 8, match + 8, 8); - LZ4_memcpy(op +16, match +16, 2); - op += length + MINMATCH; - /* Both stages worked, load the next token. */ - continue; - } - - /* The second stage didn't work out, but the info is ready. - * Propel it right to the point of match copying. */ - goto _copy_match; - } - - /* decode literal length */ - if (length == RUN_MASK) { - size_t const addl = read_variable_length(&ip, iend-RUN_MASK, 1); - if (addl == rvl_error) { goto _output_error; } - length += addl; - if (unlikely((uptrval)(op)+length<(uptrval)(op))) { goto _output_error; } /* overflow detection */ - if (unlikely((uptrval)(ip)+length<(uptrval)(ip))) { goto _output_error; } /* overflow detection */ - } - - /* copy literals */ - cpy = op+length; -#if LZ4_FAST_DEC_LOOP - safe_literal_copy: -#endif - LZ4_STATIC_ASSERT(MFLIMIT >= WILDCOPYLENGTH); - if ((cpy>oend-MFLIMIT) || (ip+length>iend-(2+1+LASTLITERALS))) { - /* We've either hit the input parsing restriction or the output parsing restriction. - * In the normal scenario, decoding a full block, it must be the last sequence, - * otherwise it's an error (invalid input or dimensions). - * In partialDecoding scenario, it's necessary to ensure there is no buffer overflow. - */ - if (partialDecoding) { - /* Since we are partial decoding we may be in this block because of the output parsing - * restriction, which is not valid since the output buffer is allowed to be undersized. - */ - DEBUGLOG(7, "partialDecoding: copying literals, close to input or output end") - DEBUGLOG(7, "partialDecoding: literal length = %u", (unsigned)length); - DEBUGLOG(7, "partialDecoding: remaining space in dstBuffer : %i", (int)(oend - op)); - DEBUGLOG(7, "partialDecoding: remaining space in srcBuffer : %i", (int)(iend - ip)); - /* Finishing in the middle of a literals segment, - * due to lack of input. - */ - if (ip+length > iend) { - length = (size_t)(iend-ip); - cpy = op + length; - } - /* Finishing in the middle of a literals segment, - * due to lack of output space. - */ - if (cpy > oend) { - cpy = oend; - assert(op<=oend); - length = (size_t)(oend-op); - } - } else { - /* We must be on the last sequence (or invalid) because of the parsing limitations - * so check that we exactly consume the input and don't overrun the output buffer. - */ - if ((ip+length != iend) || (cpy > oend)) { - DEBUGLOG(6, "should have been last run of literals") - DEBUGLOG(6, "ip(%p) + length(%i) = %p != iend (%p)", ip, (int)length, ip+length, iend); - DEBUGLOG(6, "or cpy(%p) > oend(%p)", cpy, oend); - goto _output_error; - } - } - LZ4_memmove(op, ip, length); /* supports overlapping memory regions, for in-place decompression scenarios */ - ip += length; - op += length; - /* Necessarily EOF when !partialDecoding. - * When partialDecoding, it is EOF if we've either - * filled the output buffer or - * can't proceed with reading an offset for following match. - */ - if (!partialDecoding || (cpy == oend) || (ip >= (iend-2))) { - break; - } - } else { - LZ4_wildCopy8(op, ip, cpy); /* can overwrite up to 8 bytes beyond cpy */ - ip += length; op = cpy; - } - - /* get offset */ - offset = LZ4_readLE16(ip); ip+=2; - match = op - offset; - - /* get matchlength */ - length = token & ML_MASK; - - _copy_match: - if (length == ML_MASK) { - size_t const addl = read_variable_length(&ip, iend - LASTLITERALS + 1, 0); - if (addl == rvl_error) { goto _output_error; } - length += addl; - if (unlikely((uptrval)(op)+length<(uptrval)op)) goto _output_error; /* overflow detection */ - } - length += MINMATCH; - -#if LZ4_FAST_DEC_LOOP - safe_match_copy: -#endif - if ((checkOffset) && (unlikely(match + dictSize < lowPrefix))) goto _output_error; /* Error : offset outside buffers */ - /* match starting within external dictionary */ - if ((dict==usingExtDict) && (match < lowPrefix)) { - assert(dictEnd != NULL); - if (unlikely(op+length > oend-LASTLITERALS)) { - if (partialDecoding) length = MIN(length, (size_t)(oend-op)); - else goto _output_error; /* doesn't respect parsing restriction */ - } - - if (length <= (size_t)(lowPrefix-match)) { - /* match fits entirely within external dictionary : just copy */ - LZ4_memmove(op, dictEnd - (lowPrefix-match), length); - op += length; - } else { - /* match stretches into both external dictionary and current block */ - size_t const copySize = (size_t)(lowPrefix - match); - size_t const restSize = length - copySize; - LZ4_memcpy(op, dictEnd - copySize, copySize); - op += copySize; - if (restSize > (size_t)(op - lowPrefix)) { /* overlap copy */ - BYTE* const endOfMatch = op + restSize; - const BYTE* copyFrom = lowPrefix; - while (op < endOfMatch) *op++ = *copyFrom++; - } else { - LZ4_memcpy(op, lowPrefix, restSize); - op += restSize; - } } - continue; - } - assert(match >= lowPrefix); - - /* copy match within block */ - cpy = op + length; - - /* partialDecoding : may end anywhere within the block */ - assert(op<=oend); - if (partialDecoding && (cpy > oend-MATCH_SAFEGUARD_DISTANCE)) { - size_t const mlen = MIN(length, (size_t)(oend-op)); - const BYTE* const matchEnd = match + mlen; - BYTE* const copyEnd = op + mlen; - if (matchEnd > op) { /* overlap copy */ - while (op < copyEnd) { *op++ = *match++; } - } else { - LZ4_memcpy(op, match, mlen); - } - op = copyEnd; - if (op == oend) { break; } - continue; - } - - if (unlikely(offset<8)) { - LZ4_write32(op, 0); /* silence msan warning when offset==0 */ - op[0] = match[0]; - op[1] = match[1]; - op[2] = match[2]; - op[3] = match[3]; - match += inc32table[offset]; - LZ4_memcpy(op+4, match, 4); - match -= dec64table[offset]; - } else { - LZ4_memcpy(op, match, 8); - match += 8; - } - op += 8; - - if (unlikely(cpy > oend-MATCH_SAFEGUARD_DISTANCE)) { - BYTE* const oCopyLimit = oend - (WILDCOPYLENGTH-1); - if (cpy > oend-LASTLITERALS) { goto _output_error; } /* Error : last LASTLITERALS bytes must be literals (uncompressed) */ - if (op < oCopyLimit) { - LZ4_wildCopy8(op, match, oCopyLimit); - match += oCopyLimit - op; - op = oCopyLimit; - } - while (op < cpy) { *op++ = *match++; } - } else { - LZ4_memcpy(op, match, 8); - if (length > 16) { LZ4_wildCopy8(op+8, match+8, cpy); } - } - op = cpy; /* wildcopy correction */ - } - - /* end of decoding */ - DEBUGLOG(5, "decoded %i bytes", (int) (((char*)op)-dst)); - return (int) (((char*)op)-dst); /* Nb of output bytes decoded */ - - /* Overflow error detected */ - _output_error: - return (int) (-(((const char*)ip)-src))-1; - } -} - - -/*===== Instantiate the API decoding functions. =====*/ - -LZ4_FORCE_O2 -int LZ4_decompress_safe(const char* source, char* dest, int compressedSize, int maxDecompressedSize) -{ - return LZ4_decompress_generic(source, dest, compressedSize, maxDecompressedSize, - decode_full_block, noDict, - (BYTE*)dest, NULL, 0); -} - -LZ4_FORCE_O2 -int LZ4_decompress_safe_partial(const char* src, char* dst, int compressedSize, int targetOutputSize, int dstCapacity) -{ - dstCapacity = MIN(targetOutputSize, dstCapacity); - return LZ4_decompress_generic(src, dst, compressedSize, dstCapacity, - partial_decode, - noDict, (BYTE*)dst, NULL, 0); -} - -LZ4_FORCE_O2 -int LZ4_decompress_fast(const char* source, char* dest, int originalSize) -{ - DEBUGLOG(5, "LZ4_decompress_fast"); - return LZ4_decompress_unsafe_generic( - (const BYTE*)source, (BYTE*)dest, originalSize, - 0, NULL, 0); -} - -/*===== Instantiate a few more decoding cases, used more than once. =====*/ - -LZ4_FORCE_O2 /* Exported, an obsolete API function. */ -int LZ4_decompress_safe_withPrefix64k(const char* source, char* dest, int compressedSize, int maxOutputSize) -{ - return LZ4_decompress_generic(source, dest, compressedSize, maxOutputSize, - decode_full_block, withPrefix64k, - (BYTE*)dest - 64 KB, NULL, 0); -} - -LZ4_FORCE_O2 -static int LZ4_decompress_safe_partial_withPrefix64k(const char* source, char* dest, int compressedSize, int targetOutputSize, int dstCapacity) -{ - dstCapacity = MIN(targetOutputSize, dstCapacity); - return LZ4_decompress_generic(source, dest, compressedSize, dstCapacity, - partial_decode, withPrefix64k, - (BYTE*)dest - 64 KB, NULL, 0); -} - -/* Another obsolete API function, paired with the previous one. */ -int LZ4_decompress_fast_withPrefix64k(const char* source, char* dest, int originalSize) -{ - return LZ4_decompress_unsafe_generic( - (const BYTE*)source, (BYTE*)dest, originalSize, - 64 KB, NULL, 0); -} - -LZ4_FORCE_O2 -static int LZ4_decompress_safe_withSmallPrefix(const char* source, char* dest, int compressedSize, int maxOutputSize, - size_t prefixSize) -{ - return LZ4_decompress_generic(source, dest, compressedSize, maxOutputSize, - decode_full_block, noDict, - (BYTE*)dest-prefixSize, NULL, 0); -} - -LZ4_FORCE_O2 -static int LZ4_decompress_safe_partial_withSmallPrefix(const char* source, char* dest, int compressedSize, int targetOutputSize, int dstCapacity, - size_t prefixSize) -{ - dstCapacity = MIN(targetOutputSize, dstCapacity); - return LZ4_decompress_generic(source, dest, compressedSize, dstCapacity, - partial_decode, noDict, - (BYTE*)dest-prefixSize, NULL, 0); -} - -LZ4_FORCE_O2 -int LZ4_decompress_safe_forceExtDict(const char* source, char* dest, - int compressedSize, int maxOutputSize, - const void* dictStart, size_t dictSize) -{ - DEBUGLOG(5, "LZ4_decompress_safe_forceExtDict"); - return LZ4_decompress_generic(source, dest, compressedSize, maxOutputSize, - decode_full_block, usingExtDict, - (BYTE*)dest, (const BYTE*)dictStart, dictSize); -} - -LZ4_FORCE_O2 -int LZ4_decompress_safe_partial_forceExtDict(const char* source, char* dest, - int compressedSize, int targetOutputSize, int dstCapacity, - const void* dictStart, size_t dictSize) -{ - dstCapacity = MIN(targetOutputSize, dstCapacity); - return LZ4_decompress_generic(source, dest, compressedSize, dstCapacity, - partial_decode, usingExtDict, - (BYTE*)dest, (const BYTE*)dictStart, dictSize); -} - -LZ4_FORCE_O2 -static int LZ4_decompress_fast_extDict(const char* source, char* dest, int originalSize, - const void* dictStart, size_t dictSize) -{ - return LZ4_decompress_unsafe_generic( - (const BYTE*)source, (BYTE*)dest, originalSize, - 0, (const BYTE*)dictStart, dictSize); -} - -/* The "double dictionary" mode, for use with e.g. ring buffers: the first part - * of the dictionary is passed as prefix, and the second via dictStart + dictSize. - * These routines are used only once, in LZ4_decompress_*_continue(). - */ -LZ4_FORCE_INLINE -int LZ4_decompress_safe_doubleDict(const char* source, char* dest, int compressedSize, int maxOutputSize, - size_t prefixSize, const void* dictStart, size_t dictSize) -{ - return LZ4_decompress_generic(source, dest, compressedSize, maxOutputSize, - decode_full_block, usingExtDict, - (BYTE*)dest-prefixSize, (const BYTE*)dictStart, dictSize); -} - -/*===== streaming decompression functions =====*/ - -#if !defined(LZ4_STATIC_LINKING_ONLY_DISABLE_MEMORY_ALLOCATION) -LZ4_streamDecode_t* LZ4_createStreamDecode(void) -{ - LZ4_STATIC_ASSERT(sizeof(LZ4_streamDecode_t) >= sizeof(LZ4_streamDecode_t_internal)); - return (LZ4_streamDecode_t*) ALLOC_AND_ZERO(sizeof(LZ4_streamDecode_t)); -} - -int LZ4_freeStreamDecode (LZ4_streamDecode_t* LZ4_stream) -{ - if (LZ4_stream == NULL) { return 0; } /* support free on NULL */ - FREEMEM(LZ4_stream); - return 0; -} -#endif - -/*! LZ4_setStreamDecode() : - * Use this function to instruct where to find the dictionary. - * This function is not necessary if previous data is still available where it was decoded. - * Loading a size of 0 is allowed (same effect as no dictionary). - * @return : 1 if OK, 0 if error - */ -int LZ4_setStreamDecode (LZ4_streamDecode_t* LZ4_streamDecode, const char* dictionary, int dictSize) -{ - LZ4_streamDecode_t_internal* lz4sd = &LZ4_streamDecode->internal_donotuse; - lz4sd->prefixSize = (size_t)dictSize; - if (dictSize) { - assert(dictionary != NULL); - lz4sd->prefixEnd = (const BYTE*) dictionary + dictSize; - } else { - lz4sd->prefixEnd = (const BYTE*) dictionary; - } - lz4sd->externalDict = NULL; - lz4sd->extDictSize = 0; - return 1; -} - -/*! LZ4_decoderRingBufferSize() : - * when setting a ring buffer for streaming decompression (optional scenario), - * provides the minimum size of this ring buffer - * to be compatible with any source respecting maxBlockSize condition. - * Note : in a ring buffer scenario, - * blocks are presumed decompressed next to each other. - * When not enough space remains for next block (remainingSize < maxBlockSize), - * decoding resumes from beginning of ring buffer. - * @return : minimum ring buffer size, - * or 0 if there is an error (invalid maxBlockSize). - */ -int LZ4_decoderRingBufferSize(int maxBlockSize) -{ - if (maxBlockSize < 0) return 0; - if (maxBlockSize > LZ4_MAX_INPUT_SIZE) return 0; - if (maxBlockSize < 16) maxBlockSize = 16; - return LZ4_DECODER_RING_BUFFER_SIZE(maxBlockSize); -} - -/* -*_continue() : - These decoding functions allow decompression of multiple blocks in "streaming" mode. - Previously decoded blocks must still be available at the memory position where they were decoded. - If it's not possible, save the relevant part of decoded data into a safe buffer, - and indicate where it stands using LZ4_setStreamDecode() -*/ -LZ4_FORCE_O2 -int LZ4_decompress_safe_continue (LZ4_streamDecode_t* LZ4_streamDecode, const char* source, char* dest, int compressedSize, int maxOutputSize) -{ - LZ4_streamDecode_t_internal* lz4sd = &LZ4_streamDecode->internal_donotuse; - int result; - - if (lz4sd->prefixSize == 0) { - /* The first call, no dictionary yet. */ - assert(lz4sd->extDictSize == 0); - result = LZ4_decompress_safe(source, dest, compressedSize, maxOutputSize); - if (result <= 0) return result; - lz4sd->prefixSize = (size_t)result; - lz4sd->prefixEnd = (BYTE*)dest + result; - } else if (lz4sd->prefixEnd == (BYTE*)dest) { - /* They're rolling the current segment. */ - if (lz4sd->prefixSize >= 64 KB - 1) - result = LZ4_decompress_safe_withPrefix64k(source, dest, compressedSize, maxOutputSize); - else if (lz4sd->extDictSize == 0) - result = LZ4_decompress_safe_withSmallPrefix(source, dest, compressedSize, maxOutputSize, - lz4sd->prefixSize); - else - result = LZ4_decompress_safe_doubleDict(source, dest, compressedSize, maxOutputSize, - lz4sd->prefixSize, lz4sd->externalDict, lz4sd->extDictSize); - if (result <= 0) return result; - lz4sd->prefixSize += (size_t)result; - lz4sd->prefixEnd += result; - } else { - /* The buffer wraps around, or they're switching to another buffer. */ - lz4sd->extDictSize = lz4sd->prefixSize; - lz4sd->externalDict = lz4sd->prefixEnd - lz4sd->extDictSize; - result = LZ4_decompress_safe_forceExtDict(source, dest, compressedSize, maxOutputSize, - lz4sd->externalDict, lz4sd->extDictSize); - if (result <= 0) return result; - lz4sd->prefixSize = (size_t)result; - lz4sd->prefixEnd = (BYTE*)dest + result; - } - - return result; -} - -LZ4_FORCE_O2 int -LZ4_decompress_fast_continue (LZ4_streamDecode_t* LZ4_streamDecode, - const char* source, char* dest, int originalSize) -{ - LZ4_streamDecode_t_internal* const lz4sd = - (assert(LZ4_streamDecode!=NULL), &LZ4_streamDecode->internal_donotuse); - int result; - - DEBUGLOG(5, "LZ4_decompress_fast_continue (toDecodeSize=%i)", originalSize); - assert(originalSize >= 0); - - if (lz4sd->prefixSize == 0) { - DEBUGLOG(5, "first invocation : no prefix nor extDict"); - assert(lz4sd->extDictSize == 0); - result = LZ4_decompress_fast(source, dest, originalSize); - if (result <= 0) return result; - lz4sd->prefixSize = (size_t)originalSize; - lz4sd->prefixEnd = (BYTE*)dest + originalSize; - } else if (lz4sd->prefixEnd == (BYTE*)dest) { - DEBUGLOG(5, "continue using existing prefix"); - result = LZ4_decompress_unsafe_generic( - (const BYTE*)source, (BYTE*)dest, originalSize, - lz4sd->prefixSize, - lz4sd->externalDict, lz4sd->extDictSize); - if (result <= 0) return result; - lz4sd->prefixSize += (size_t)originalSize; - lz4sd->prefixEnd += originalSize; - } else { - DEBUGLOG(5, "prefix becomes extDict"); - lz4sd->extDictSize = lz4sd->prefixSize; - lz4sd->externalDict = lz4sd->prefixEnd - lz4sd->extDictSize; - result = LZ4_decompress_fast_extDict(source, dest, originalSize, - lz4sd->externalDict, lz4sd->extDictSize); - if (result <= 0) return result; - lz4sd->prefixSize = (size_t)originalSize; - lz4sd->prefixEnd = (BYTE*)dest + originalSize; - } - - return result; -} - - -/* -Advanced decoding functions : -*_usingDict() : - These decoding functions work the same as "_continue" ones, - the dictionary must be explicitly provided within parameters -*/ - -int LZ4_decompress_safe_usingDict(const char* source, char* dest, int compressedSize, int maxOutputSize, const char* dictStart, int dictSize) -{ - if (dictSize==0) - return LZ4_decompress_safe(source, dest, compressedSize, maxOutputSize); - if (dictStart+dictSize == dest) { - if (dictSize >= 64 KB - 1) { - return LZ4_decompress_safe_withPrefix64k(source, dest, compressedSize, maxOutputSize); - } - assert(dictSize >= 0); - return LZ4_decompress_safe_withSmallPrefix(source, dest, compressedSize, maxOutputSize, (size_t)dictSize); - } - assert(dictSize >= 0); - return LZ4_decompress_safe_forceExtDict(source, dest, compressedSize, maxOutputSize, dictStart, (size_t)dictSize); -} - -int LZ4_decompress_safe_partial_usingDict(const char* source, char* dest, int compressedSize, int targetOutputSize, int dstCapacity, const char* dictStart, int dictSize) -{ - if (dictSize==0) - return LZ4_decompress_safe_partial(source, dest, compressedSize, targetOutputSize, dstCapacity); - if (dictStart+dictSize == dest) { - if (dictSize >= 64 KB - 1) { - return LZ4_decompress_safe_partial_withPrefix64k(source, dest, compressedSize, targetOutputSize, dstCapacity); - } - assert(dictSize >= 0); - return LZ4_decompress_safe_partial_withSmallPrefix(source, dest, compressedSize, targetOutputSize, dstCapacity, (size_t)dictSize); - } - assert(dictSize >= 0); - return LZ4_decompress_safe_partial_forceExtDict(source, dest, compressedSize, targetOutputSize, dstCapacity, dictStart, (size_t)dictSize); -} - -int LZ4_decompress_fast_usingDict(const char* source, char* dest, int originalSize, const char* dictStart, int dictSize) -{ - if (dictSize==0 || dictStart+dictSize == dest) - return LZ4_decompress_unsafe_generic( - (const BYTE*)source, (BYTE*)dest, originalSize, - (size_t)dictSize, NULL, 0); - assert(dictSize >= 0); - return LZ4_decompress_fast_extDict(source, dest, originalSize, dictStart, (size_t)dictSize); -} - - -/*=************************************************* -* Obsolete Functions -***************************************************/ -/* obsolete compression functions */ -int LZ4_compress_limitedOutput(const char* source, char* dest, int inputSize, int maxOutputSize) -{ - return LZ4_compress_default(source, dest, inputSize, maxOutputSize); -} -int LZ4_compress(const char* src, char* dest, int srcSize) -{ - return LZ4_compress_default(src, dest, srcSize, LZ4_compressBound(srcSize)); -} -int LZ4_compress_limitedOutput_withState (void* state, const char* src, char* dst, int srcSize, int dstSize) -{ - return LZ4_compress_fast_extState(state, src, dst, srcSize, dstSize, 1); -} -int LZ4_compress_withState (void* state, const char* src, char* dst, int srcSize) -{ - return LZ4_compress_fast_extState(state, src, dst, srcSize, LZ4_compressBound(srcSize), 1); -} -int LZ4_compress_limitedOutput_continue (LZ4_stream_t* LZ4_stream, const char* src, char* dst, int srcSize, int dstCapacity) -{ - return LZ4_compress_fast_continue(LZ4_stream, src, dst, srcSize, dstCapacity, 1); -} -int LZ4_compress_continue (LZ4_stream_t* LZ4_stream, const char* source, char* dest, int inputSize) -{ - return LZ4_compress_fast_continue(LZ4_stream, source, dest, inputSize, LZ4_compressBound(inputSize), 1); -} - -/* -These decompression functions are deprecated and should no longer be used. -They are only provided here for compatibility with older user programs. -- LZ4_uncompress is totally equivalent to LZ4_decompress_fast -- LZ4_uncompress_unknownOutputSize is totally equivalent to LZ4_decompress_safe -*/ -int LZ4_uncompress (const char* source, char* dest, int outputSize) -{ - return LZ4_decompress_fast(source, dest, outputSize); -} -int LZ4_uncompress_unknownOutputSize (const char* source, char* dest, int isize, int maxOutputSize) -{ - return LZ4_decompress_safe(source, dest, isize, maxOutputSize); -} - -/* Obsolete Streaming functions */ - -int LZ4_sizeofStreamState(void) { return sizeof(LZ4_stream_t); } - -int LZ4_resetStreamState(void* state, char* inputBuffer) -{ - (void)inputBuffer; - LZ4_resetStream((LZ4_stream_t*)state); - return 0; -} - -#if !defined(LZ4_STATIC_LINKING_ONLY_DISABLE_MEMORY_ALLOCATION) -void* LZ4_create (char* inputBuffer) -{ - (void)inputBuffer; - return LZ4_createStream(); -} -#endif - -char* LZ4_slideInputBuffer (void* state) -{ - /* avoid const char * -> char * conversion warning */ - return (char *)(uptrval)((LZ4_stream_t*)state)->internal_donotuse.dictionary; -} - -#endif /* LZ4_COMMONDEFS_ONLY */ diff --git a/CompressSave/LZ4WrapC/lz4/lz4.h b/CompressSave/LZ4WrapC/lz4/lz4.h deleted file mode 100644 index f85b038..0000000 --- a/CompressSave/LZ4WrapC/lz4/lz4.h +++ /dev/null @@ -1,862 +0,0 @@ -/* - * LZ4 - Fast LZ compression algorithm - * Header File - * Copyright (C) 2011-2020, Yann Collet. - - BSD 2-Clause License (http://www.opensource.org/licenses/bsd-license.php) - - Redistribution and use in source and binary forms, with or without - modification, are permitted provided that the following conditions are - met: - - * Redistributions of source code must retain the above copyright - notice, this list of conditions and the following disclaimer. - * Redistributions in binary form must reproduce the above - copyright notice, this list of conditions and the following disclaimer - in the documentation and/or other materials provided with the - distribution. - - THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - "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 COPYRIGHT - OWNER OR CONTRIBUTORS 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. - - You can contact the author at : - - LZ4 homepage : http://www.lz4.org - - LZ4 source repository : https://github.com/lz4/lz4 -*/ -#if defined (__cplusplus) -extern "C" { -#endif - -#ifndef LZ4_H_2983827168210 -#define LZ4_H_2983827168210 - -/* --- Dependency --- */ -#include /* size_t */ - - -/** - Introduction - - LZ4 is lossless compression algorithm, providing compression speed >500 MB/s per core, - scalable with multi-cores CPU. It features an extremely fast decoder, with speed in - multiple GB/s per core, typically reaching RAM speed limits on multi-core systems. - - The LZ4 compression library provides in-memory compression and decompression functions. - It gives full buffer control to user. - Compression can be done in: - - a single step (described as Simple Functions) - - a single step, reusing a context (described in Advanced Functions) - - unbounded multiple steps (described as Streaming compression) - - lz4.h generates and decodes LZ4-compressed blocks (doc/lz4_Block_format.md). - Decompressing such a compressed block requires additional metadata. - Exact metadata depends on exact decompression function. - For the typical case of LZ4_decompress_safe(), - metadata includes block's compressed size, and maximum bound of decompressed size. - Each application is free to encode and pass such metadata in whichever way it wants. - - lz4.h only handle blocks, it can not generate Frames. - - Blocks are different from Frames (doc/lz4_Frame_format.md). - Frames bundle both blocks and metadata in a specified manner. - Embedding metadata is required for compressed data to be self-contained and portable. - Frame format is delivered through a companion API, declared in lz4frame.h. - The `lz4` CLI can only manage frames. -*/ - -/*^*************************************************************** -* Export parameters -*****************************************************************/ -/* -* LZ4_DLL_EXPORT : -* Enable exporting of functions when building a Windows DLL -* LZ4LIB_VISIBILITY : -* Control library symbols visibility. -*/ -#ifndef LZ4LIB_VISIBILITY -# if defined(__GNUC__) && (__GNUC__ >= 4) -# define LZ4LIB_VISIBILITY __attribute__ ((visibility ("default"))) -# else -# define LZ4LIB_VISIBILITY -# endif -#endif -#if defined(LZ4_DLL_EXPORT) && (LZ4_DLL_EXPORT==1) -# define LZ4LIB_API __declspec(dllexport) LZ4LIB_VISIBILITY -#elif defined(LZ4_DLL_IMPORT) && (LZ4_DLL_IMPORT==1) -# define LZ4LIB_API __declspec(dllimport) LZ4LIB_VISIBILITY /* It isn't required but allows to generate better code, saving a function pointer load from the IAT and an indirect jump.*/ -#else -# define LZ4LIB_API LZ4LIB_VISIBILITY -#endif - -/*! LZ4_FREESTANDING : - * When this macro is set to 1, it enables "freestanding mode" that is - * suitable for typical freestanding environment which doesn't support - * standard C library. - * - * - LZ4_FREESTANDING is a compile-time switch. - * - It requires the following macros to be defined: - * LZ4_memcpy, LZ4_memmove, LZ4_memset. - * - It only enables LZ4/HC functions which don't use heap. - * All LZ4F_* functions are not supported. - * - See tests/freestanding.c to check its basic setup. - */ -#if defined(LZ4_FREESTANDING) && (LZ4_FREESTANDING == 1) -# define LZ4_HEAPMODE 0 -# define LZ4HC_HEAPMODE 0 -# define LZ4_STATIC_LINKING_ONLY_DISABLE_MEMORY_ALLOCATION 1 -# if !defined(LZ4_memcpy) -# error "LZ4_FREESTANDING requires macro 'LZ4_memcpy'." -# endif -# if !defined(LZ4_memset) -# error "LZ4_FREESTANDING requires macro 'LZ4_memset'." -# endif -# if !defined(LZ4_memmove) -# error "LZ4_FREESTANDING requires macro 'LZ4_memmove'." -# endif -#elif ! defined(LZ4_FREESTANDING) -# define LZ4_FREESTANDING 0 -#endif - - -/*------ Version ------*/ -#define LZ4_VERSION_MAJOR 1 /* for breaking interface changes */ -#define LZ4_VERSION_MINOR 9 /* for new (non-breaking) interface capabilities */ -#define LZ4_VERSION_RELEASE 4 /* for tweaks, bug-fixes, or development */ - -#define LZ4_VERSION_NUMBER (LZ4_VERSION_MAJOR *100*100 + LZ4_VERSION_MINOR *100 + LZ4_VERSION_RELEASE) - -#define LZ4_LIB_VERSION LZ4_VERSION_MAJOR.LZ4_VERSION_MINOR.LZ4_VERSION_RELEASE -#define LZ4_QUOTE(str) #str -#define LZ4_EXPAND_AND_QUOTE(str) LZ4_QUOTE(str) -#define LZ4_VERSION_STRING LZ4_EXPAND_AND_QUOTE(LZ4_LIB_VERSION) /* requires v1.7.3+ */ - -LZ4LIB_API int LZ4_versionNumber (void); /**< library version number; useful to check dll version; requires v1.3.0+ */ -LZ4LIB_API const char* LZ4_versionString (void); /**< library version string; useful to check dll version; requires v1.7.5+ */ - - -/*-************************************ -* Tuning parameter -**************************************/ -#define LZ4_MEMORY_USAGE_MIN 10 -#define LZ4_MEMORY_USAGE_DEFAULT 14 -#define LZ4_MEMORY_USAGE_MAX 20 - -/*! - * LZ4_MEMORY_USAGE : - * Memory usage formula : N->2^N Bytes (examples : 10 -> 1KB; 12 -> 4KB ; 16 -> 64KB; 20 -> 1MB; ) - * Increasing memory usage improves compression ratio, at the cost of speed. - * Reduced memory usage may improve speed at the cost of ratio, thanks to better cache locality. - * Default value is 14, for 16KB, which nicely fits into Intel x86 L1 cache - */ -#ifndef LZ4_MEMORY_USAGE -# define LZ4_MEMORY_USAGE LZ4_MEMORY_USAGE_DEFAULT -#endif - -#if (LZ4_MEMORY_USAGE < LZ4_MEMORY_USAGE_MIN) -# error "LZ4_MEMORY_USAGE is too small !" -#endif - -#if (LZ4_MEMORY_USAGE > LZ4_MEMORY_USAGE_MAX) -# error "LZ4_MEMORY_USAGE is too large !" -#endif - -/*-************************************ -* Simple Functions -**************************************/ -/*! LZ4_compress_default() : - * Compresses 'srcSize' bytes from buffer 'src' - * into already allocated 'dst' buffer of size 'dstCapacity'. - * Compression is guaranteed to succeed if 'dstCapacity' >= LZ4_compressBound(srcSize). - * It also runs faster, so it's a recommended setting. - * If the function cannot compress 'src' into a more limited 'dst' budget, - * compression stops *immediately*, and the function result is zero. - * In which case, 'dst' content is undefined (invalid). - * srcSize : max supported value is LZ4_MAX_INPUT_SIZE. - * dstCapacity : size of buffer 'dst' (which must be already allocated) - * @return : the number of bytes written into buffer 'dst' (necessarily <= dstCapacity) - * or 0 if compression fails - * Note : This function is protected against buffer overflow scenarios (never writes outside 'dst' buffer, nor read outside 'source' buffer). - */ -LZ4LIB_API int LZ4_compress_default(const char* src, char* dst, int srcSize, int dstCapacity); - -/*! LZ4_decompress_safe() : - * @compressedSize : is the exact complete size of the compressed block. - * @dstCapacity : is the size of destination buffer (which must be already allocated), - * is an upper bound of decompressed size. - * @return : the number of bytes decompressed into destination buffer (necessarily <= dstCapacity) - * If destination buffer is not large enough, decoding will stop and output an error code (negative value). - * If the source stream is detected malformed, the function will stop decoding and return a negative result. - * Note 1 : This function is protected against malicious data packets : - * it will never writes outside 'dst' buffer, nor read outside 'source' buffer, - * even if the compressed block is maliciously modified to order the decoder to do these actions. - * In such case, the decoder stops immediately, and considers the compressed block malformed. - * Note 2 : compressedSize and dstCapacity must be provided to the function, the compressed block does not contain them. - * The implementation is free to send / store / derive this information in whichever way is most beneficial. - * If there is a need for a different format which bundles together both compressed data and its metadata, consider looking at lz4frame.h instead. - */ -LZ4LIB_API int LZ4_decompress_safe (const char* src, char* dst, int compressedSize, int dstCapacity); - - -/*-************************************ -* Advanced Functions -**************************************/ -#define LZ4_MAX_INPUT_SIZE 0x7E000000 /* 2 113 929 216 bytes */ -#define LZ4_COMPRESSBOUND(isize) ((unsigned)(isize) > (unsigned)LZ4_MAX_INPUT_SIZE ? 0 : (isize) + ((isize)/255) + 16) - -/*! LZ4_compressBound() : - Provides the maximum size that LZ4 compression may output in a "worst case" scenario (input data not compressible) - This function is primarily useful for memory allocation purposes (destination buffer size). - Macro LZ4_COMPRESSBOUND() is also provided for compilation-time evaluation (stack memory allocation for example). - Note that LZ4_compress_default() compresses faster when dstCapacity is >= LZ4_compressBound(srcSize) - inputSize : max supported value is LZ4_MAX_INPUT_SIZE - return : maximum output size in a "worst case" scenario - or 0, if input size is incorrect (too large or negative) -*/ -LZ4LIB_API int LZ4_compressBound(int inputSize); - -/*! LZ4_compress_fast() : - Same as LZ4_compress_default(), but allows selection of "acceleration" factor. - The larger the acceleration value, the faster the algorithm, but also the lesser the compression. - It's a trade-off. It can be fine tuned, with each successive value providing roughly +~3% to speed. - An acceleration value of "1" is the same as regular LZ4_compress_default() - Values <= 0 will be replaced by LZ4_ACCELERATION_DEFAULT (currently == 1, see lz4.c). - Values > LZ4_ACCELERATION_MAX will be replaced by LZ4_ACCELERATION_MAX (currently == 65537, see lz4.c). -*/ -LZ4LIB_API int LZ4_compress_fast (const char* src, char* dst, int srcSize, int dstCapacity, int acceleration); - - -/*! LZ4_compress_fast_extState() : - * Same as LZ4_compress_fast(), using an externally allocated memory space for its state. - * Use LZ4_sizeofState() to know how much memory must be allocated, - * and allocate it on 8-bytes boundaries (using `malloc()` typically). - * Then, provide this buffer as `void* state` to compression function. - */ -LZ4LIB_API int LZ4_sizeofState(void); -LZ4LIB_API int LZ4_compress_fast_extState (void* state, const char* src, char* dst, int srcSize, int dstCapacity, int acceleration); - - -/*! LZ4_compress_destSize() : - * Reverse the logic : compresses as much data as possible from 'src' buffer - * into already allocated buffer 'dst', of size >= 'targetDestSize'. - * This function either compresses the entire 'src' content into 'dst' if it's large enough, - * or fill 'dst' buffer completely with as much data as possible from 'src'. - * note: acceleration parameter is fixed to "default". - * - * *srcSizePtr : will be modified to indicate how many bytes where read from 'src' to fill 'dst'. - * New value is necessarily <= input value. - * @return : Nb bytes written into 'dst' (necessarily <= targetDestSize) - * or 0 if compression fails. - * - * Note : from v1.8.2 to v1.9.1, this function had a bug (fixed in v1.9.2+): - * the produced compressed content could, in specific circumstances, - * require to be decompressed into a destination buffer larger - * by at least 1 byte than the content to decompress. - * If an application uses `LZ4_compress_destSize()`, - * it's highly recommended to update liblz4 to v1.9.2 or better. - * If this can't be done or ensured, - * the receiving decompression function should provide - * a dstCapacity which is > decompressedSize, by at least 1 byte. - * See https://github.com/lz4/lz4/issues/859 for details - */ -LZ4LIB_API int LZ4_compress_destSize (const char* src, char* dst, int* srcSizePtr, int targetDstSize); - - -/*! LZ4_decompress_safe_partial() : - * Decompress an LZ4 compressed block, of size 'srcSize' at position 'src', - * into destination buffer 'dst' of size 'dstCapacity'. - * Up to 'targetOutputSize' bytes will be decoded. - * The function stops decoding on reaching this objective. - * This can be useful to boost performance - * whenever only the beginning of a block is required. - * - * @return : the number of bytes decoded in `dst` (necessarily <= targetOutputSize) - * If source stream is detected malformed, function returns a negative result. - * - * Note 1 : @return can be < targetOutputSize, if compressed block contains less data. - * - * Note 2 : targetOutputSize must be <= dstCapacity - * - * Note 3 : this function effectively stops decoding on reaching targetOutputSize, - * so dstCapacity is kind of redundant. - * This is because in older versions of this function, - * decoding operation would still write complete sequences. - * Therefore, there was no guarantee that it would stop writing at exactly targetOutputSize, - * it could write more bytes, though only up to dstCapacity. - * Some "margin" used to be required for this operation to work properly. - * Thankfully, this is no longer necessary. - * The function nonetheless keeps the same signature, in an effort to preserve API compatibility. - * - * Note 4 : If srcSize is the exact size of the block, - * then targetOutputSize can be any value, - * including larger than the block's decompressed size. - * The function will, at most, generate block's decompressed size. - * - * Note 5 : If srcSize is _larger_ than block's compressed size, - * then targetOutputSize **MUST** be <= block's decompressed size. - * Otherwise, *silent corruption will occur*. - */ -LZ4LIB_API int LZ4_decompress_safe_partial (const char* src, char* dst, int srcSize, int targetOutputSize, int dstCapacity); - - -/*-********************************************* -* Streaming Compression Functions -***********************************************/ -typedef union LZ4_stream_u LZ4_stream_t; /* incomplete type (defined later) */ - -/** - Note about RC_INVOKED - - - RC_INVOKED is predefined symbol of rc.exe (the resource compiler which is part of MSVC/Visual Studio). - https://docs.microsoft.com/en-us/windows/win32/menurc/predefined-macros - - - Since rc.exe is a legacy compiler, it truncates long symbol (> 30 chars) - and reports warning "RC4011: identifier truncated". - - - To eliminate the warning, we surround long preprocessor symbol with - "#if !defined(RC_INVOKED) ... #endif" block that means - "skip this block when rc.exe is trying to read it". -*/ -#if !defined(RC_INVOKED) /* https://docs.microsoft.com/en-us/windows/win32/menurc/predefined-macros */ -#if !defined(LZ4_STATIC_LINKING_ONLY_DISABLE_MEMORY_ALLOCATION) -LZ4LIB_API LZ4_stream_t* LZ4_createStream(void); -LZ4LIB_API int LZ4_freeStream (LZ4_stream_t* streamPtr); -#endif /* !defined(LZ4_STATIC_LINKING_ONLY_DISABLE_MEMORY_ALLOCATION) */ -#endif - -/*! LZ4_resetStream_fast() : v1.9.0+ - * Use this to prepare an LZ4_stream_t for a new chain of dependent blocks - * (e.g., LZ4_compress_fast_continue()). - * - * An LZ4_stream_t must be initialized once before usage. - * This is automatically done when created by LZ4_createStream(). - * However, should the LZ4_stream_t be simply declared on stack (for example), - * it's necessary to initialize it first, using LZ4_initStream(). - * - * After init, start any new stream with LZ4_resetStream_fast(). - * A same LZ4_stream_t can be re-used multiple times consecutively - * and compress multiple streams, - * provided that it starts each new stream with LZ4_resetStream_fast(). - * - * LZ4_resetStream_fast() is much faster than LZ4_initStream(), - * but is not compatible with memory regions containing garbage data. - * - * Note: it's only useful to call LZ4_resetStream_fast() - * in the context of streaming compression. - * The *extState* functions perform their own resets. - * Invoking LZ4_resetStream_fast() before is redundant, and even counterproductive. - */ -LZ4LIB_API void LZ4_resetStream_fast (LZ4_stream_t* streamPtr); - -/*! LZ4_loadDict() : - * Use this function to reference a static dictionary into LZ4_stream_t. - * The dictionary must remain available during compression. - * LZ4_loadDict() triggers a reset, so any previous data will be forgotten. - * The same dictionary will have to be loaded on decompression side for successful decoding. - * Dictionary are useful for better compression of small data (KB range). - * While LZ4 accept any input as dictionary, - * results are generally better when using Zstandard's Dictionary Builder. - * Loading a size of 0 is allowed, and is the same as reset. - * @return : loaded dictionary size, in bytes (necessarily <= 64 KB) - */ -LZ4LIB_API int LZ4_loadDict (LZ4_stream_t* streamPtr, const char* dictionary, int dictSize); - -/*! LZ4_compress_fast_continue() : - * Compress 'src' content using data from previously compressed blocks, for better compression ratio. - * 'dst' buffer must be already allocated. - * If dstCapacity >= LZ4_compressBound(srcSize), compression is guaranteed to succeed, and runs faster. - * - * @return : size of compressed block - * or 0 if there is an error (typically, cannot fit into 'dst'). - * - * Note 1 : Each invocation to LZ4_compress_fast_continue() generates a new block. - * Each block has precise boundaries. - * Each block must be decompressed separately, calling LZ4_decompress_*() with relevant metadata. - * It's not possible to append blocks together and expect a single invocation of LZ4_decompress_*() to decompress them together. - * - * Note 2 : The previous 64KB of source data is __assumed__ to remain present, unmodified, at same address in memory ! - * - * Note 3 : When input is structured as a double-buffer, each buffer can have any size, including < 64 KB. - * Make sure that buffers are separated, by at least one byte. - * This construction ensures that each block only depends on previous block. - * - * Note 4 : If input buffer is a ring-buffer, it can have any size, including < 64 KB. - * - * Note 5 : After an error, the stream status is undefined (invalid), it can only be reset or freed. - */ -LZ4LIB_API int LZ4_compress_fast_continue (LZ4_stream_t* streamPtr, const char* src, char* dst, int srcSize, int dstCapacity, int acceleration); - -/*! LZ4_saveDict() : - * If last 64KB data cannot be guaranteed to remain available at its current memory location, - * save it into a safer place (char* safeBuffer). - * This is schematically equivalent to a memcpy() followed by LZ4_loadDict(), - * but is much faster, because LZ4_saveDict() doesn't need to rebuild tables. - * @return : saved dictionary size in bytes (necessarily <= maxDictSize), or 0 if error. - */ -LZ4LIB_API int LZ4_saveDict (LZ4_stream_t* streamPtr, char* safeBuffer, int maxDictSize); - - -/*-********************************************** -* Streaming Decompression Functions -* Bufferless synchronous API -************************************************/ -typedef union LZ4_streamDecode_u LZ4_streamDecode_t; /* tracking context */ - -/*! LZ4_createStreamDecode() and LZ4_freeStreamDecode() : - * creation / destruction of streaming decompression tracking context. - * A tracking context can be re-used multiple times. - */ -#if !defined(RC_INVOKED) /* https://docs.microsoft.com/en-us/windows/win32/menurc/predefined-macros */ -#if !defined(LZ4_STATIC_LINKING_ONLY_DISABLE_MEMORY_ALLOCATION) -LZ4LIB_API LZ4_streamDecode_t* LZ4_createStreamDecode(void); -LZ4LIB_API int LZ4_freeStreamDecode (LZ4_streamDecode_t* LZ4_stream); -#endif /* !defined(LZ4_STATIC_LINKING_ONLY_DISABLE_MEMORY_ALLOCATION) */ -#endif - -/*! LZ4_setStreamDecode() : - * An LZ4_streamDecode_t context can be allocated once and re-used multiple times. - * Use this function to start decompression of a new stream of blocks. - * A dictionary can optionally be set. Use NULL or size 0 for a reset order. - * Dictionary is presumed stable : it must remain accessible and unmodified during next decompression. - * @return : 1 if OK, 0 if error - */ -LZ4LIB_API int LZ4_setStreamDecode (LZ4_streamDecode_t* LZ4_streamDecode, const char* dictionary, int dictSize); - -/*! LZ4_decoderRingBufferSize() : v1.8.2+ - * Note : in a ring buffer scenario (optional), - * blocks are presumed decompressed next to each other - * up to the moment there is not enough remaining space for next block (remainingSize < maxBlockSize), - * at which stage it resumes from beginning of ring buffer. - * When setting such a ring buffer for streaming decompression, - * provides the minimum size of this ring buffer - * to be compatible with any source respecting maxBlockSize condition. - * @return : minimum ring buffer size, - * or 0 if there is an error (invalid maxBlockSize). - */ -LZ4LIB_API int LZ4_decoderRingBufferSize(int maxBlockSize); -#define LZ4_DECODER_RING_BUFFER_SIZE(maxBlockSize) (65536 + 14 + (maxBlockSize)) /* for static allocation; maxBlockSize presumed valid */ - -/*! LZ4_decompress_safe_continue() : - * This decoding function allows decompression of consecutive blocks in "streaming" mode. - * The difference with the usual independent blocks is that - * new blocks are allowed to find references into former blocks. - * A block is an unsplittable entity, and must be presented entirely to the decompression function. - * LZ4_decompress_safe_continue() only accepts one block at a time. - * It's modeled after `LZ4_decompress_safe()` and behaves similarly. - * - * @LZ4_streamDecode : decompression state, tracking the position in memory of past data - * @compressedSize : exact complete size of one compressed block. - * @dstCapacity : size of destination buffer (which must be already allocated), - * must be an upper bound of decompressed size. - * @return : number of bytes decompressed into destination buffer (necessarily <= dstCapacity) - * If destination buffer is not large enough, decoding will stop and output an error code (negative value). - * If the source stream is detected malformed, the function will stop decoding and return a negative result. - * - * The last 64KB of previously decoded data *must* remain available and unmodified - * at the memory position where they were previously decoded. - * If less than 64KB of data has been decoded, all the data must be present. - * - * Special : if decompression side sets a ring buffer, it must respect one of the following conditions : - * - Decompression buffer size is _at least_ LZ4_decoderRingBufferSize(maxBlockSize). - * maxBlockSize is the maximum size of any single block. It can have any value > 16 bytes. - * In which case, encoding and decoding buffers do not need to be synchronized. - * Actually, data can be produced by any source compliant with LZ4 format specification, and respecting maxBlockSize. - * - Synchronized mode : - * Decompression buffer size is _exactly_ the same as compression buffer size, - * and follows exactly same update rule (block boundaries at same positions), - * and decoding function is provided with exact decompressed size of each block (exception for last block of the stream), - * _then_ decoding & encoding ring buffer can have any size, including small ones ( < 64 KB). - * - Decompression buffer is larger than encoding buffer, by a minimum of maxBlockSize more bytes. - * In which case, encoding and decoding buffers do not need to be synchronized, - * and encoding ring buffer can have any size, including small ones ( < 64 KB). - * - * Whenever these conditions are not possible, - * save the last 64KB of decoded data into a safe buffer where it can't be modified during decompression, - * then indicate where this data is saved using LZ4_setStreamDecode(), before decompressing next block. -*/ -LZ4LIB_API int -LZ4_decompress_safe_continue (LZ4_streamDecode_t* LZ4_streamDecode, - const char* src, char* dst, - int srcSize, int dstCapacity); - - -/*! LZ4_decompress_safe_usingDict() : - * Works the same as - * a combination of LZ4_setStreamDecode() followed by LZ4_decompress_safe_continue() - * However, it's stateless: it doesn't need any LZ4_streamDecode_t state. - * Dictionary is presumed stable : it must remain accessible and unmodified during decompression. - * Performance tip : Decompression speed can be substantially increased - * when dst == dictStart + dictSize. - */ -LZ4LIB_API int -LZ4_decompress_safe_usingDict(const char* src, char* dst, - int srcSize, int dstCapacity, - const char* dictStart, int dictSize); - -/*! LZ4_decompress_safe_partial_usingDict() : - * Behaves the same as LZ4_decompress_safe_partial() - * with the added ability to specify a memory segment for past data. - * Performance tip : Decompression speed can be substantially increased - * when dst == dictStart + dictSize. - */ -LZ4LIB_API int -LZ4_decompress_safe_partial_usingDict(const char* src, char* dst, - int compressedSize, - int targetOutputSize, int maxOutputSize, - const char* dictStart, int dictSize); - -#endif /* LZ4_H_2983827168210 */ - - -/*^************************************* - * !!!!!! STATIC LINKING ONLY !!!!!! - ***************************************/ - -/*-**************************************************************************** - * Experimental section - * - * Symbols declared in this section must be considered unstable. Their - * signatures or semantics may change, or they may be removed altogether in the - * future. They are therefore only safe to depend on when the caller is - * statically linked against the library. - * - * To protect against unsafe usage, not only are the declarations guarded, - * the definitions are hidden by default - * when building LZ4 as a shared/dynamic library. - * - * In order to access these declarations, - * define LZ4_STATIC_LINKING_ONLY in your application - * before including LZ4's headers. - * - * In order to make their implementations accessible dynamically, you must - * define LZ4_PUBLISH_STATIC_FUNCTIONS when building the LZ4 library. - ******************************************************************************/ - -#ifdef LZ4_STATIC_LINKING_ONLY - -#ifndef LZ4_STATIC_3504398509 -#define LZ4_STATIC_3504398509 - -#ifdef LZ4_PUBLISH_STATIC_FUNCTIONS -#define LZ4LIB_STATIC_API LZ4LIB_API -#else -#define LZ4LIB_STATIC_API -#endif - - -/*! LZ4_compress_fast_extState_fastReset() : - * A variant of LZ4_compress_fast_extState(). - * - * Using this variant avoids an expensive initialization step. - * It is only safe to call if the state buffer is known to be correctly initialized already - * (see above comment on LZ4_resetStream_fast() for a definition of "correctly initialized"). - * From a high level, the difference is that - * this function initializes the provided state with a call to something like LZ4_resetStream_fast() - * while LZ4_compress_fast_extState() starts with a call to LZ4_resetStream(). - */ -LZ4LIB_STATIC_API int LZ4_compress_fast_extState_fastReset (void* state, const char* src, char* dst, int srcSize, int dstCapacity, int acceleration); - -/*! LZ4_attach_dictionary() : - * This is an experimental API that allows - * efficient use of a static dictionary many times. - * - * Rather than re-loading the dictionary buffer into a working context before - * each compression, or copying a pre-loaded dictionary's LZ4_stream_t into a - * working LZ4_stream_t, this function introduces a no-copy setup mechanism, - * in which the working stream references the dictionary stream in-place. - * - * Several assumptions are made about the state of the dictionary stream. - * Currently, only streams which have been prepared by LZ4_loadDict() should - * be expected to work. - * - * Alternatively, the provided dictionaryStream may be NULL, - * in which case any existing dictionary stream is unset. - * - * If a dictionary is provided, it replaces any pre-existing stream history. - * The dictionary contents are the only history that can be referenced and - * logically immediately precede the data compressed in the first subsequent - * compression call. - * - * The dictionary will only remain attached to the working stream through the - * first compression call, at the end of which it is cleared. The dictionary - * stream (and source buffer) must remain in-place / accessible / unchanged - * through the completion of the first compression call on the stream. - */ -LZ4LIB_STATIC_API void -LZ4_attach_dictionary(LZ4_stream_t* workingStream, - const LZ4_stream_t* dictionaryStream); - - -/*! In-place compression and decompression - * - * It's possible to have input and output sharing the same buffer, - * for highly constrained memory environments. - * In both cases, it requires input to lay at the end of the buffer, - * and decompression to start at beginning of the buffer. - * Buffer size must feature some margin, hence be larger than final size. - * - * |<------------------------buffer--------------------------------->| - * |<-----------compressed data--------->| - * |<-----------decompressed size------------------>| - * |<----margin---->| - * - * This technique is more useful for decompression, - * since decompressed size is typically larger, - * and margin is short. - * - * In-place decompression will work inside any buffer - * which size is >= LZ4_DECOMPRESS_INPLACE_BUFFER_SIZE(decompressedSize). - * This presumes that decompressedSize > compressedSize. - * Otherwise, it means compression actually expanded data, - * and it would be more efficient to store such data with a flag indicating it's not compressed. - * This can happen when data is not compressible (already compressed, or encrypted). - * - * For in-place compression, margin is larger, as it must be able to cope with both - * history preservation, requiring input data to remain unmodified up to LZ4_DISTANCE_MAX, - * and data expansion, which can happen when input is not compressible. - * As a consequence, buffer size requirements are much higher, - * and memory savings offered by in-place compression are more limited. - * - * There are ways to limit this cost for compression : - * - Reduce history size, by modifying LZ4_DISTANCE_MAX. - * Note that it is a compile-time constant, so all compressions will apply this limit. - * Lower values will reduce compression ratio, except when input_size < LZ4_DISTANCE_MAX, - * so it's a reasonable trick when inputs are known to be small. - * - Require the compressor to deliver a "maximum compressed size". - * This is the `dstCapacity` parameter in `LZ4_compress*()`. - * When this size is < LZ4_COMPRESSBOUND(inputSize), then compression can fail, - * in which case, the return code will be 0 (zero). - * The caller must be ready for these cases to happen, - * and typically design a backup scheme to send data uncompressed. - * The combination of both techniques can significantly reduce - * the amount of margin required for in-place compression. - * - * In-place compression can work in any buffer - * which size is >= (maxCompressedSize) - * with maxCompressedSize == LZ4_COMPRESSBOUND(srcSize) for guaranteed compression success. - * LZ4_COMPRESS_INPLACE_BUFFER_SIZE() depends on both maxCompressedSize and LZ4_DISTANCE_MAX, - * so it's possible to reduce memory requirements by playing with them. - */ - -#define LZ4_DECOMPRESS_INPLACE_MARGIN(compressedSize) (((compressedSize) >> 8) + 32) -#define LZ4_DECOMPRESS_INPLACE_BUFFER_SIZE(decompressedSize) ((decompressedSize) + LZ4_DECOMPRESS_INPLACE_MARGIN(decompressedSize)) /**< note: presumes that compressedSize < decompressedSize. note2: margin is overestimated a bit, since it could use compressedSize instead */ - -#ifndef LZ4_DISTANCE_MAX /* history window size; can be user-defined at compile time */ -# define LZ4_DISTANCE_MAX 65535 /* set to maximum value by default */ -#endif - -#define LZ4_COMPRESS_INPLACE_MARGIN (LZ4_DISTANCE_MAX + 32) /* LZ4_DISTANCE_MAX can be safely replaced by srcSize when it's smaller */ -#define LZ4_COMPRESS_INPLACE_BUFFER_SIZE(maxCompressedSize) ((maxCompressedSize) + LZ4_COMPRESS_INPLACE_MARGIN) /**< maxCompressedSize is generally LZ4_COMPRESSBOUND(inputSize), but can be set to any lower value, with the risk that compression can fail (return code 0(zero)) */ - -#endif /* LZ4_STATIC_3504398509 */ -#endif /* LZ4_STATIC_LINKING_ONLY */ - - - -#ifndef LZ4_H_98237428734687 -#define LZ4_H_98237428734687 - -/*-************************************************************ - * Private Definitions - ************************************************************** - * Do not use these definitions directly. - * They are only exposed to allow static allocation of `LZ4_stream_t` and `LZ4_streamDecode_t`. - * Accessing members will expose user code to API and/or ABI break in future versions of the library. - **************************************************************/ -#define LZ4_HASHLOG (LZ4_MEMORY_USAGE-2) -#define LZ4_HASHTABLESIZE (1 << LZ4_MEMORY_USAGE) -#define LZ4_HASH_SIZE_U32 (1 << LZ4_HASHLOG) /* required as macro for static allocation */ - -#if defined(__cplusplus) || (defined (__STDC_VERSION__) && (__STDC_VERSION__ >= 199901L) /* C99 */) -# include - typedef int8_t LZ4_i8; - typedef uint8_t LZ4_byte; - typedef uint16_t LZ4_u16; - typedef uint32_t LZ4_u32; -#else - typedef signed char LZ4_i8; - typedef unsigned char LZ4_byte; - typedef unsigned short LZ4_u16; - typedef unsigned int LZ4_u32; -#endif - -/*! LZ4_stream_t : - * Never ever use below internal definitions directly ! - * These definitions are not API/ABI safe, and may change in future versions. - * If you need static allocation, declare or allocate an LZ4_stream_t object. -**/ - -typedef struct LZ4_stream_t_internal LZ4_stream_t_internal; -struct LZ4_stream_t_internal { - LZ4_u32 hashTable[LZ4_HASH_SIZE_U32]; - const LZ4_byte* dictionary; - const LZ4_stream_t_internal* dictCtx; - LZ4_u32 currentOffset; - LZ4_u32 tableType; - LZ4_u32 dictSize; - /* Implicit padding to ensure structure is aligned */ -}; - -#define LZ4_STREAM_MINSIZE ((1UL << LZ4_MEMORY_USAGE) + 32) /* static size, for inter-version compatibility */ -union LZ4_stream_u { - char minStateSize[LZ4_STREAM_MINSIZE]; - LZ4_stream_t_internal internal_donotuse; -}; /* previously typedef'd to LZ4_stream_t */ - - -/*! LZ4_initStream() : v1.9.0+ - * An LZ4_stream_t structure must be initialized at least once. - * This is automatically done when invoking LZ4_createStream(), - * but it's not when the structure is simply declared on stack (for example). - * - * Use LZ4_initStream() to properly initialize a newly declared LZ4_stream_t. - * It can also initialize any arbitrary buffer of sufficient size, - * and will @return a pointer of proper type upon initialization. - * - * Note : initialization fails if size and alignment conditions are not respected. - * In which case, the function will @return NULL. - * Note2: An LZ4_stream_t structure guarantees correct alignment and size. - * Note3: Before v1.9.0, use LZ4_resetStream() instead -**/ -LZ4LIB_API LZ4_stream_t* LZ4_initStream (void* buffer, size_t size); - - -/*! LZ4_streamDecode_t : - * Never ever use below internal definitions directly ! - * These definitions are not API/ABI safe, and may change in future versions. - * If you need static allocation, declare or allocate an LZ4_streamDecode_t object. -**/ -typedef struct { - const LZ4_byte* externalDict; - const LZ4_byte* prefixEnd; - size_t extDictSize; - size_t prefixSize; -} LZ4_streamDecode_t_internal; - -#define LZ4_STREAMDECODE_MINSIZE 32 -union LZ4_streamDecode_u { - char minStateSize[LZ4_STREAMDECODE_MINSIZE]; - LZ4_streamDecode_t_internal internal_donotuse; -} ; /* previously typedef'd to LZ4_streamDecode_t */ - - - -/*-************************************ -* Obsolete Functions -**************************************/ - -/*! Deprecation warnings - * - * Deprecated functions make the compiler generate a warning when invoked. - * This is meant to invite users to update their source code. - * Should deprecation warnings be a problem, it is generally possible to disable them, - * typically with -Wno-deprecated-declarations for gcc - * or _CRT_SECURE_NO_WARNINGS in Visual. - * - * Another method is to define LZ4_DISABLE_DEPRECATE_WARNINGS - * before including the header file. - */ -#ifdef LZ4_DISABLE_DEPRECATE_WARNINGS -# define LZ4_DEPRECATED(message) /* disable deprecation warnings */ -#else -# if defined (__cplusplus) && (__cplusplus >= 201402) /* C++14 or greater */ -# define LZ4_DEPRECATED(message) [[deprecated(message)]] -# elif defined(_MSC_VER) -# define LZ4_DEPRECATED(message) __declspec(deprecated(message)) -# elif defined(__clang__) || (defined(__GNUC__) && (__GNUC__ * 10 + __GNUC_MINOR__ >= 45)) -# define LZ4_DEPRECATED(message) __attribute__((deprecated(message))) -# elif defined(__GNUC__) && (__GNUC__ * 10 + __GNUC_MINOR__ >= 31) -# define LZ4_DEPRECATED(message) __attribute__((deprecated)) -# else -# pragma message("WARNING: LZ4_DEPRECATED needs custom implementation for this compiler") -# define LZ4_DEPRECATED(message) /* disabled */ -# endif -#endif /* LZ4_DISABLE_DEPRECATE_WARNINGS */ - -/*! Obsolete compression functions (since v1.7.3) */ -LZ4_DEPRECATED("use LZ4_compress_default() instead") LZ4LIB_API int LZ4_compress (const char* src, char* dest, int srcSize); -LZ4_DEPRECATED("use LZ4_compress_default() instead") LZ4LIB_API int LZ4_compress_limitedOutput (const char* src, char* dest, int srcSize, int maxOutputSize); -LZ4_DEPRECATED("use LZ4_compress_fast_extState() instead") LZ4LIB_API int LZ4_compress_withState (void* state, const char* source, char* dest, int inputSize); -LZ4_DEPRECATED("use LZ4_compress_fast_extState() instead") LZ4LIB_API int LZ4_compress_limitedOutput_withState (void* state, const char* source, char* dest, int inputSize, int maxOutputSize); -LZ4_DEPRECATED("use LZ4_compress_fast_continue() instead") LZ4LIB_API int LZ4_compress_continue (LZ4_stream_t* LZ4_streamPtr, const char* source, char* dest, int inputSize); -LZ4_DEPRECATED("use LZ4_compress_fast_continue() instead") LZ4LIB_API int LZ4_compress_limitedOutput_continue (LZ4_stream_t* LZ4_streamPtr, const char* source, char* dest, int inputSize, int maxOutputSize); - -/*! Obsolete decompression functions (since v1.8.0) */ -LZ4_DEPRECATED("use LZ4_decompress_fast() instead") LZ4LIB_API int LZ4_uncompress (const char* source, char* dest, int outputSize); -LZ4_DEPRECATED("use LZ4_decompress_safe() instead") LZ4LIB_API int LZ4_uncompress_unknownOutputSize (const char* source, char* dest, int isize, int maxOutputSize); - -/* Obsolete streaming functions (since v1.7.0) - * degraded functionality; do not use! - * - * In order to perform streaming compression, these functions depended on data - * that is no longer tracked in the state. They have been preserved as well as - * possible: using them will still produce a correct output. However, they don't - * actually retain any history between compression calls. The compression ratio - * achieved will therefore be no better than compressing each chunk - * independently. - */ -LZ4_DEPRECATED("Use LZ4_createStream() instead") LZ4LIB_API void* LZ4_create (char* inputBuffer); -LZ4_DEPRECATED("Use LZ4_createStream() instead") LZ4LIB_API int LZ4_sizeofStreamState(void); -LZ4_DEPRECATED("Use LZ4_resetStream() instead") LZ4LIB_API int LZ4_resetStreamState(void* state, char* inputBuffer); -LZ4_DEPRECATED("Use LZ4_saveDict() instead") LZ4LIB_API char* LZ4_slideInputBuffer (void* state); - -/*! Obsolete streaming decoding functions (since v1.7.0) */ -LZ4_DEPRECATED("use LZ4_decompress_safe_usingDict() instead") LZ4LIB_API int LZ4_decompress_safe_withPrefix64k (const char* src, char* dst, int compressedSize, int maxDstSize); -LZ4_DEPRECATED("use LZ4_decompress_fast_usingDict() instead") LZ4LIB_API int LZ4_decompress_fast_withPrefix64k (const char* src, char* dst, int originalSize); - -/*! Obsolete LZ4_decompress_fast variants (since v1.9.0) : - * These functions used to be faster than LZ4_decompress_safe(), - * but this is no longer the case. They are now slower. - * This is because LZ4_decompress_fast() doesn't know the input size, - * and therefore must progress more cautiously into the input buffer to not read beyond the end of block. - * On top of that `LZ4_decompress_fast()` is not protected vs malformed or malicious inputs, making it a security liability. - * As a consequence, LZ4_decompress_fast() is strongly discouraged, and deprecated. - * - * The last remaining LZ4_decompress_fast() specificity is that - * it can decompress a block without knowing its compressed size. - * Such functionality can be achieved in a more secure manner - * by employing LZ4_decompress_safe_partial(). - * - * Parameters: - * originalSize : is the uncompressed size to regenerate. - * `dst` must be already allocated, its size must be >= 'originalSize' bytes. - * @return : number of bytes read from source buffer (== compressed size). - * The function expects to finish at block's end exactly. - * If the source stream is detected malformed, the function stops decoding and returns a negative result. - * note : LZ4_decompress_fast*() requires originalSize. Thanks to this information, it never writes past the output buffer. - * However, since it doesn't know its 'src' size, it may read an unknown amount of input, past input buffer bounds. - * Also, since match offsets are not validated, match reads from 'src' may underflow too. - * These issues never happen if input (compressed) data is correct. - * But they may happen if input data is invalid (error or intentional tampering). - * As a consequence, use these functions in trusted environments with trusted data **only**. - */ -LZ4_DEPRECATED("This function is deprecated and unsafe. Consider using LZ4_decompress_safe() instead") -LZ4LIB_API int LZ4_decompress_fast (const char* src, char* dst, int originalSize); -LZ4_DEPRECATED("This function is deprecated and unsafe. Consider using LZ4_decompress_safe_continue() instead") -LZ4LIB_API int LZ4_decompress_fast_continue (LZ4_streamDecode_t* LZ4_streamDecode, const char* src, char* dst, int originalSize); -LZ4_DEPRECATED("This function is deprecated and unsafe. Consider using LZ4_decompress_safe_usingDict() instead") -LZ4LIB_API int LZ4_decompress_fast_usingDict (const char* src, char* dst, int originalSize, const char* dictStart, int dictSize); - -/*! LZ4_resetStream() : - * An LZ4_stream_t structure must be initialized at least once. - * This is done with LZ4_initStream(), or LZ4_resetStream(). - * Consider switching to LZ4_initStream(), - * invoking LZ4_resetStream() will trigger deprecation warnings in the future. - */ -LZ4LIB_API void LZ4_resetStream (LZ4_stream_t* streamPtr); - - -#endif /* LZ4_H_98237428734687 */ - - -#if defined (__cplusplus) -} -#endif diff --git a/CompressSave/LZ4WrapC/lz4/lz4frame.c b/CompressSave/LZ4WrapC/lz4/lz4frame.c deleted file mode 100644 index 77857a5..0000000 --- a/CompressSave/LZ4WrapC/lz4/lz4frame.c +++ /dev/null @@ -1,2076 +0,0 @@ -/* - * LZ4 auto-framing library - * Copyright (C) 2011-2016, Yann Collet. - * - * BSD 2-Clause License (http://www.opensource.org/licenses/bsd-license.php) - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are - * met: - * - * - Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * - Redistributions in binary form must reproduce the above - * copyright notice, this list of conditions and the following disclaimer - * in the documentation and/or other materials provided with the - * distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - * "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 COPYRIGHT - * OWNER OR CONTRIBUTORS 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. - * - * You can contact the author at : - * - LZ4 homepage : http://www.lz4.org - * - LZ4 source repository : https://github.com/lz4/lz4 - */ - -/* LZ4F is a stand-alone API to create LZ4-compressed Frames - * in full conformance with specification v1.6.1 . - * This library rely upon memory management capabilities (malloc, free) - * provided either by , - * or redirected towards another library of user's choice - * (see Memory Routines below). - */ - - -/*-************************************ -* Compiler Options -**************************************/ -#ifdef _MSC_VER /* Visual Studio */ -# pragma warning(disable : 4127) /* disable: C4127: conditional expression is constant */ -#endif - - -/*-************************************ -* Tuning parameters -**************************************/ -/* - * LZ4F_HEAPMODE : - * Control how LZ4F_compressFrame allocates the Compression State, - * either on stack (0:default, fastest), or in memory heap (1:requires malloc()). - */ -#ifndef LZ4F_HEAPMODE -# define LZ4F_HEAPMODE 0 -#endif - - -/*-************************************ -* Library declarations -**************************************/ -#define LZ4F_STATIC_LINKING_ONLY -#include "lz4frame.h" -#define LZ4_STATIC_LINKING_ONLY -#include "lz4.h" -#define LZ4_HC_STATIC_LINKING_ONLY -#include "lz4hc.h" -#define XXH_STATIC_LINKING_ONLY -#include "xxhash.h" - - -/*-************************************ -* Memory routines -**************************************/ -/* - * User may redirect invocations of - * malloc(), calloc() and free() - * towards another library or solution of their choice - * by modifying below section. -**/ - -#include /* memset, memcpy, memmove */ -#ifndef LZ4_SRC_INCLUDED /* avoid redefinition when sources are coalesced */ -# define MEM_INIT(p,v,s) memset((p),(v),(s)) -#endif - -#ifndef LZ4_SRC_INCLUDED /* avoid redefinition when sources are coalesced */ -# include /* malloc, calloc, free */ -# define ALLOC(s) malloc(s) -# define ALLOC_AND_ZERO(s) calloc(1,(s)) -# define FREEMEM(p) free(p) -#endif - -static void* LZ4F_calloc(size_t s, LZ4F_CustomMem cmem) -{ - /* custom calloc defined : use it */ - if (cmem.customCalloc != NULL) { - return cmem.customCalloc(cmem.opaqueState, s); - } - /* nothing defined : use default 's calloc() */ - if (cmem.customAlloc == NULL) { - return ALLOC_AND_ZERO(s); - } - /* only custom alloc defined : use it, and combine it with memset() */ - { void* const p = cmem.customAlloc(cmem.opaqueState, s); - if (p != NULL) MEM_INIT(p, 0, s); - return p; -} } - -static void* LZ4F_malloc(size_t s, LZ4F_CustomMem cmem) -{ - /* custom malloc defined : use it */ - if (cmem.customAlloc != NULL) { - return cmem.customAlloc(cmem.opaqueState, s); - } - /* nothing defined : use default 's malloc() */ - return ALLOC(s); -} - -static void LZ4F_free(void* p, LZ4F_CustomMem cmem) -{ - /* custom malloc defined : use it */ - if (cmem.customFree != NULL) { - cmem.customFree(cmem.opaqueState, p); - return; - } - /* nothing defined : use default 's free() */ - FREEMEM(p); -} - - -/*-************************************ -* Debug -**************************************/ -#if defined(LZ4_DEBUG) && (LZ4_DEBUG>=1) -# include -#else -# ifndef assert -# define assert(condition) ((void)0) -# endif -#endif - -#define LZ4F_STATIC_ASSERT(c) { enum { LZ4F_static_assert = 1/(int)(!!(c)) }; } /* use only *after* variable declarations */ - -#if defined(LZ4_DEBUG) && (LZ4_DEBUG>=2) && !defined(DEBUGLOG) -# include -static int g_debuglog_enable = 1; -# define DEBUGLOG(l, ...) { \ - if ((g_debuglog_enable) && (l<=LZ4_DEBUG)) { \ - fprintf(stderr, __FILE__ ": "); \ - fprintf(stderr, __VA_ARGS__); \ - fprintf(stderr, " \n"); \ - } } -#else -# define DEBUGLOG(l, ...) {} /* disabled */ -#endif - - -/*-************************************ -* Basic Types -**************************************/ -#if !defined (__VMS) && (defined (__cplusplus) || (defined (__STDC_VERSION__) && (__STDC_VERSION__ >= 199901L) /* C99 */) ) -# include - typedef uint8_t BYTE; - typedef uint16_t U16; - typedef uint32_t U32; - typedef int32_t S32; - typedef uint64_t U64; -#else - typedef unsigned char BYTE; - typedef unsigned short U16; - typedef unsigned int U32; - typedef signed int S32; - typedef unsigned long long U64; -#endif - - -/* unoptimized version; solves endianness & alignment issues */ -static U32 LZ4F_readLE32 (const void* src) -{ - const BYTE* const srcPtr = (const BYTE*)src; - U32 value32 = srcPtr[0]; - value32 += ((U32)srcPtr[1])<< 8; - value32 += ((U32)srcPtr[2])<<16; - value32 += ((U32)srcPtr[3])<<24; - return value32; -} - -static void LZ4F_writeLE32 (void* dst, U32 value32) -{ - BYTE* const dstPtr = (BYTE*)dst; - dstPtr[0] = (BYTE)value32; - dstPtr[1] = (BYTE)(value32 >> 8); - dstPtr[2] = (BYTE)(value32 >> 16); - dstPtr[3] = (BYTE)(value32 >> 24); -} - -static U64 LZ4F_readLE64 (const void* src) -{ - const BYTE* const srcPtr = (const BYTE*)src; - U64 value64 = srcPtr[0]; - value64 += ((U64)srcPtr[1]<<8); - value64 += ((U64)srcPtr[2]<<16); - value64 += ((U64)srcPtr[3]<<24); - value64 += ((U64)srcPtr[4]<<32); - value64 += ((U64)srcPtr[5]<<40); - value64 += ((U64)srcPtr[6]<<48); - value64 += ((U64)srcPtr[7]<<56); - return value64; -} - -static void LZ4F_writeLE64 (void* dst, U64 value64) -{ - BYTE* const dstPtr = (BYTE*)dst; - dstPtr[0] = (BYTE)value64; - dstPtr[1] = (BYTE)(value64 >> 8); - dstPtr[2] = (BYTE)(value64 >> 16); - dstPtr[3] = (BYTE)(value64 >> 24); - dstPtr[4] = (BYTE)(value64 >> 32); - dstPtr[5] = (BYTE)(value64 >> 40); - dstPtr[6] = (BYTE)(value64 >> 48); - dstPtr[7] = (BYTE)(value64 >> 56); -} - - -/*-************************************ -* Constants -**************************************/ -#ifndef LZ4_SRC_INCLUDED /* avoid double definition */ -# define KB *(1<<10) -# define MB *(1<<20) -# define GB *(1<<30) -#endif - -#define _1BIT 0x01 -#define _2BITS 0x03 -#define _3BITS 0x07 -#define _4BITS 0x0F -#define _8BITS 0xFF - -#define LZ4F_BLOCKUNCOMPRESSED_FLAG 0x80000000U -#define LZ4F_BLOCKSIZEID_DEFAULT LZ4F_max64KB - -static const size_t minFHSize = LZ4F_HEADER_SIZE_MIN; /* 7 */ -static const size_t maxFHSize = LZ4F_HEADER_SIZE_MAX; /* 19 */ -static const size_t BHSize = LZ4F_BLOCK_HEADER_SIZE; /* block header : size, and compress flag */ -static const size_t BFSize = LZ4F_BLOCK_CHECKSUM_SIZE; /* block footer : checksum (optional) */ - - -/*-************************************ -* Structures and local types -**************************************/ - -typedef enum { LZ4B_COMPRESSED, LZ4B_UNCOMPRESSED} LZ4F_blockCompression_t; - -typedef struct LZ4F_cctx_s -{ - LZ4F_CustomMem cmem; - LZ4F_preferences_t prefs; - U32 version; - U32 cStage; /* 0 : compression uninitialized ; 1 : initialized, can compress */ - const LZ4F_CDict* cdict; - size_t maxBlockSize; - size_t maxBufferSize; - BYTE* tmpBuff; /* internal buffer, for streaming */ - BYTE* tmpIn; /* starting position of data compress within internal buffer (>= tmpBuff) */ - size_t tmpInSize; /* amount of data to compress after tmpIn */ - U64 totalInSize; - XXH32_state_t xxh; - void* lz4CtxPtr; - U16 lz4CtxAlloc; /* sized for: 0 = none, 1 = lz4 ctx, 2 = lz4hc ctx */ - U16 lz4CtxState; /* in use as: 0 = none, 1 = lz4 ctx, 2 = lz4hc ctx */ - LZ4F_blockCompression_t blockCompression; -} LZ4F_cctx_t; - - -/*-************************************ -* Error management -**************************************/ -#define LZ4F_GENERATE_STRING(STRING) #STRING, -static const char* LZ4F_errorStrings[] = { LZ4F_LIST_ERRORS(LZ4F_GENERATE_STRING) }; - - -unsigned LZ4F_isError(LZ4F_errorCode_t code) -{ - return (code > (LZ4F_errorCode_t)(-LZ4F_ERROR_maxCode)); -} - -const char* LZ4F_getErrorName(LZ4F_errorCode_t code) -{ - static const char* codeError = "Unspecified error code"; - if (LZ4F_isError(code)) return LZ4F_errorStrings[-(int)(code)]; - return codeError; -} - -LZ4F_errorCodes LZ4F_getErrorCode(size_t functionResult) -{ - if (!LZ4F_isError(functionResult)) return LZ4F_OK_NoError; - return (LZ4F_errorCodes)(-(ptrdiff_t)functionResult); -} - -static LZ4F_errorCode_t LZ4F_returnErrorCode(LZ4F_errorCodes code) -{ - /* A compilation error here means sizeof(ptrdiff_t) is not large enough */ - LZ4F_STATIC_ASSERT(sizeof(ptrdiff_t) >= sizeof(size_t)); - return (LZ4F_errorCode_t)-(ptrdiff_t)code; -} - -#define RETURN_ERROR(e) return LZ4F_returnErrorCode(LZ4F_ERROR_ ## e) - -#define RETURN_ERROR_IF(c,e) do { if (c) RETURN_ERROR(e); } while (0) - -#define FORWARD_IF_ERROR(r) do { if (LZ4F_isError(r)) return (r); } while (0) - -unsigned LZ4F_getVersion(void) { return LZ4F_VERSION; } - -int LZ4F_compressionLevel_max(void) { return LZ4HC_CLEVEL_MAX; } - -size_t LZ4F_getBlockSize(LZ4F_blockSizeID_t blockSizeID) -{ - static const size_t blockSizes[4] = { 64 KB, 256 KB, 1 MB, 4 MB }; - - if (blockSizeID == 0) blockSizeID = LZ4F_BLOCKSIZEID_DEFAULT; - if (blockSizeID < LZ4F_max64KB || blockSizeID > LZ4F_max4MB) - RETURN_ERROR(maxBlockSize_invalid); - { int const blockSizeIdx = (int)blockSizeID - (int)LZ4F_max64KB; - return blockSizes[blockSizeIdx]; -} } - -/*-************************************ -* Private functions -**************************************/ -#define MIN(a,b) ( (a) < (b) ? (a) : (b) ) - -static BYTE LZ4F_headerChecksum (const void* header, size_t length) -{ - U32 const xxh = XXH32(header, length, 0); - return (BYTE)(xxh >> 8); -} - - -/*-************************************ -* Simple-pass compression functions -**************************************/ -static LZ4F_blockSizeID_t LZ4F_optimalBSID(const LZ4F_blockSizeID_t requestedBSID, - const size_t srcSize) -{ - LZ4F_blockSizeID_t proposedBSID = LZ4F_max64KB; - size_t maxBlockSize = 64 KB; - while (requestedBSID > proposedBSID) { - if (srcSize <= maxBlockSize) - return proposedBSID; - proposedBSID = (LZ4F_blockSizeID_t)((int)proposedBSID + 1); - maxBlockSize <<= 2; - } - return requestedBSID; -} - -/*! LZ4F_compressBound_internal() : - * Provides dstCapacity given a srcSize to guarantee operation success in worst case situations. - * prefsPtr is optional : if NULL is provided, preferences will be set to cover worst case scenario. - * @return is always the same for a srcSize and prefsPtr, so it can be relied upon to size reusable buffers. - * When srcSize==0, LZ4F_compressBound() provides an upper bound for LZ4F_flush() and LZ4F_compressEnd() operations. - */ -static size_t LZ4F_compressBound_internal(size_t srcSize, - const LZ4F_preferences_t* preferencesPtr, - size_t alreadyBuffered) -{ - LZ4F_preferences_t prefsNull = LZ4F_INIT_PREFERENCES; - prefsNull.frameInfo.contentChecksumFlag = LZ4F_contentChecksumEnabled; /* worst case */ - prefsNull.frameInfo.blockChecksumFlag = LZ4F_blockChecksumEnabled; /* worst case */ - { const LZ4F_preferences_t* const prefsPtr = (preferencesPtr==NULL) ? &prefsNull : preferencesPtr; - U32 const flush = prefsPtr->autoFlush | (srcSize==0); - LZ4F_blockSizeID_t const blockID = prefsPtr->frameInfo.blockSizeID; - size_t const blockSize = LZ4F_getBlockSize(blockID); - size_t const maxBuffered = blockSize - 1; - size_t const bufferedSize = MIN(alreadyBuffered, maxBuffered); - size_t const maxSrcSize = srcSize + bufferedSize; - unsigned const nbFullBlocks = (unsigned)(maxSrcSize / blockSize); - size_t const partialBlockSize = maxSrcSize & (blockSize-1); - size_t const lastBlockSize = flush ? partialBlockSize : 0; - unsigned const nbBlocks = nbFullBlocks + (lastBlockSize>0); - - size_t const blockCRCSize = BFSize * prefsPtr->frameInfo.blockChecksumFlag; - size_t const frameEnd = BHSize + (prefsPtr->frameInfo.contentChecksumFlag*BFSize); - - return ((BHSize + blockCRCSize) * nbBlocks) + - (blockSize * nbFullBlocks) + lastBlockSize + frameEnd; - } -} - -size_t LZ4F_compressFrameBound(size_t srcSize, const LZ4F_preferences_t* preferencesPtr) -{ - LZ4F_preferences_t prefs; - size_t const headerSize = maxFHSize; /* max header size, including optional fields */ - - if (preferencesPtr!=NULL) prefs = *preferencesPtr; - else MEM_INIT(&prefs, 0, sizeof(prefs)); - prefs.autoFlush = 1; - - return headerSize + LZ4F_compressBound_internal(srcSize, &prefs, 0);; -} - - -/*! LZ4F_compressFrame_usingCDict() : - * Compress srcBuffer using a dictionary, in a single step. - * cdict can be NULL, in which case, no dictionary is used. - * dstBuffer MUST be >= LZ4F_compressFrameBound(srcSize, preferencesPtr). - * The LZ4F_preferences_t structure is optional : you may provide NULL as argument, - * however, it's the only way to provide a dictID, so it's not recommended. - * @return : number of bytes written into dstBuffer, - * or an error code if it fails (can be tested using LZ4F_isError()) - */ -size_t LZ4F_compressFrame_usingCDict(LZ4F_cctx* cctx, - void* dstBuffer, size_t dstCapacity, - const void* srcBuffer, size_t srcSize, - const LZ4F_CDict* cdict, - const LZ4F_preferences_t* preferencesPtr) -{ - LZ4F_preferences_t prefs; - LZ4F_compressOptions_t options; - BYTE* const dstStart = (BYTE*) dstBuffer; - BYTE* dstPtr = dstStart; - BYTE* const dstEnd = dstStart + dstCapacity; - - if (preferencesPtr!=NULL) - prefs = *preferencesPtr; - else - MEM_INIT(&prefs, 0, sizeof(prefs)); - if (prefs.frameInfo.contentSize != 0) - prefs.frameInfo.contentSize = (U64)srcSize; /* auto-correct content size if selected (!=0) */ - - prefs.frameInfo.blockSizeID = LZ4F_optimalBSID(prefs.frameInfo.blockSizeID, srcSize); - prefs.autoFlush = 1; - if (srcSize <= LZ4F_getBlockSize(prefs.frameInfo.blockSizeID)) - prefs.frameInfo.blockMode = LZ4F_blockIndependent; /* only one block => no need for inter-block link */ - - MEM_INIT(&options, 0, sizeof(options)); - options.stableSrc = 1; - - RETURN_ERROR_IF(dstCapacity < LZ4F_compressFrameBound(srcSize, &prefs), dstMaxSize_tooSmall); - - { size_t const headerSize = LZ4F_compressBegin_usingCDict(cctx, dstBuffer, dstCapacity, cdict, &prefs); /* write header */ - FORWARD_IF_ERROR(headerSize); - dstPtr += headerSize; /* header size */ } - - assert(dstEnd >= dstPtr); - { size_t const cSize = LZ4F_compressUpdate(cctx, dstPtr, (size_t)(dstEnd-dstPtr), srcBuffer, srcSize, &options); - FORWARD_IF_ERROR(cSize); - dstPtr += cSize; } - - assert(dstEnd >= dstPtr); - { size_t const tailSize = LZ4F_compressEnd(cctx, dstPtr, (size_t)(dstEnd-dstPtr), &options); /* flush last block, and generate suffix */ - FORWARD_IF_ERROR(tailSize); - dstPtr += tailSize; } - - assert(dstEnd >= dstStart); - return (size_t)(dstPtr - dstStart); -} - - -/*! LZ4F_compressFrame() : - * Compress an entire srcBuffer into a valid LZ4 frame, in a single step. - * dstBuffer MUST be >= LZ4F_compressFrameBound(srcSize, preferencesPtr). - * The LZ4F_preferences_t structure is optional : you can provide NULL as argument. All preferences will be set to default. - * @return : number of bytes written into dstBuffer. - * or an error code if it fails (can be tested using LZ4F_isError()) - */ -size_t LZ4F_compressFrame(void* dstBuffer, size_t dstCapacity, - const void* srcBuffer, size_t srcSize, - const LZ4F_preferences_t* preferencesPtr) -{ - size_t result; -#if (LZ4F_HEAPMODE) - LZ4F_cctx_t* cctxPtr; - result = LZ4F_createCompressionContext(&cctxPtr, LZ4F_VERSION); - FORWARD_IF_ERROR(result); -#else - LZ4F_cctx_t cctx; - LZ4_stream_t lz4ctx; - LZ4F_cctx_t* const cctxPtr = &cctx; - - MEM_INIT(&cctx, 0, sizeof(cctx)); - cctx.version = LZ4F_VERSION; - cctx.maxBufferSize = 5 MB; /* mess with real buffer size to prevent dynamic allocation; works only because autoflush==1 & stableSrc==1 */ - if ( preferencesPtr == NULL - || preferencesPtr->compressionLevel < LZ4HC_CLEVEL_MIN ) { - LZ4_initStream(&lz4ctx, sizeof(lz4ctx)); - cctxPtr->lz4CtxPtr = &lz4ctx; - cctxPtr->lz4CtxAlloc = 1; - cctxPtr->lz4CtxState = 1; - } -#endif - DEBUGLOG(4, "LZ4F_compressFrame"); - - result = LZ4F_compressFrame_usingCDict(cctxPtr, dstBuffer, dstCapacity, - srcBuffer, srcSize, - NULL, preferencesPtr); - -#if (LZ4F_HEAPMODE) - LZ4F_freeCompressionContext(cctxPtr); -#else - if ( preferencesPtr != NULL - && preferencesPtr->compressionLevel >= LZ4HC_CLEVEL_MIN ) { - LZ4F_free(cctxPtr->lz4CtxPtr, cctxPtr->cmem); - } -#endif - return result; -} - - -/*-*************************************************** -* Dictionary compression -*****************************************************/ - -struct LZ4F_CDict_s { - LZ4F_CustomMem cmem; - void* dictContent; - LZ4_stream_t* fastCtx; - LZ4_streamHC_t* HCCtx; -}; /* typedef'd to LZ4F_CDict within lz4frame_static.h */ - -LZ4F_CDict* -LZ4F_createCDict_advanced(LZ4F_CustomMem cmem, const void* dictBuffer, size_t dictSize) -{ - const char* dictStart = (const char*)dictBuffer; - LZ4F_CDict* const cdict = (LZ4F_CDict*)LZ4F_malloc(sizeof(*cdict), cmem); - DEBUGLOG(4, "LZ4F_createCDict_advanced"); - if (!cdict) return NULL; - cdict->cmem = cmem; - if (dictSize > 64 KB) { - dictStart += dictSize - 64 KB; - dictSize = 64 KB; - } - cdict->dictContent = LZ4F_malloc(dictSize, cmem); - cdict->fastCtx = (LZ4_stream_t*)LZ4F_malloc(sizeof(LZ4_stream_t), cmem); - if (cdict->fastCtx) - LZ4_initStream(cdict->fastCtx, sizeof(LZ4_stream_t)); - cdict->HCCtx = (LZ4_streamHC_t*)LZ4F_malloc(sizeof(LZ4_streamHC_t), cmem); - if (cdict->HCCtx) - LZ4_initStream(cdict->HCCtx, sizeof(LZ4_streamHC_t)); - if (!cdict->dictContent || !cdict->fastCtx || !cdict->HCCtx) { - LZ4F_freeCDict(cdict); - return NULL; - } - memcpy(cdict->dictContent, dictStart, dictSize); - LZ4_loadDict (cdict->fastCtx, (const char*)cdict->dictContent, (int)dictSize); - LZ4_setCompressionLevel(cdict->HCCtx, LZ4HC_CLEVEL_DEFAULT); - LZ4_loadDictHC(cdict->HCCtx, (const char*)cdict->dictContent, (int)dictSize); - return cdict; -} - -/*! LZ4F_createCDict() : - * When compressing multiple messages / blocks with the same dictionary, it's recommended to load it just once. - * LZ4F_createCDict() will create a digested dictionary, ready to start future compression operations without startup delay. - * LZ4F_CDict can be created once and shared by multiple threads concurrently, since its usage is read-only. - * @dictBuffer can be released after LZ4F_CDict creation, since its content is copied within CDict - * @return : digested dictionary for compression, or NULL if failed */ -LZ4F_CDict* LZ4F_createCDict(const void* dictBuffer, size_t dictSize) -{ - DEBUGLOG(4, "LZ4F_createCDict"); - return LZ4F_createCDict_advanced(LZ4F_defaultCMem, dictBuffer, dictSize); -} - -void LZ4F_freeCDict(LZ4F_CDict* cdict) -{ - if (cdict==NULL) return; /* support free on NULL */ - LZ4F_free(cdict->dictContent, cdict->cmem); - LZ4F_free(cdict->fastCtx, cdict->cmem); - LZ4F_free(cdict->HCCtx, cdict->cmem); - LZ4F_free(cdict, cdict->cmem); -} - - -/*-********************************* -* Advanced compression functions -***********************************/ - -LZ4F_cctx* -LZ4F_createCompressionContext_advanced(LZ4F_CustomMem customMem, unsigned version) -{ - LZ4F_cctx* const cctxPtr = - (LZ4F_cctx*)LZ4F_calloc(sizeof(LZ4F_cctx), customMem); - if (cctxPtr==NULL) return NULL; - - cctxPtr->cmem = customMem; - cctxPtr->version = version; - cctxPtr->cStage = 0; /* Uninitialized. Next stage : init cctx */ - - return cctxPtr; -} - -/*! LZ4F_createCompressionContext() : - * The first thing to do is to create a compressionContext object, which will be used in all compression operations. - * This is achieved using LZ4F_createCompressionContext(), which takes as argument a version and an LZ4F_preferences_t structure. - * The version provided MUST be LZ4F_VERSION. It is intended to track potential incompatible differences between different binaries. - * The function will provide a pointer to an allocated LZ4F_compressionContext_t object. - * If the result LZ4F_errorCode_t is not OK_NoError, there was an error during context creation. - * Object can release its memory using LZ4F_freeCompressionContext(); -**/ -LZ4F_errorCode_t -LZ4F_createCompressionContext(LZ4F_cctx** LZ4F_compressionContextPtr, unsigned version) -{ - assert(LZ4F_compressionContextPtr != NULL); /* considered a violation of narrow contract */ - /* in case it nonetheless happen in production */ - RETURN_ERROR_IF(LZ4F_compressionContextPtr == NULL, parameter_null); - - *LZ4F_compressionContextPtr = LZ4F_createCompressionContext_advanced(LZ4F_defaultCMem, version); - RETURN_ERROR_IF(*LZ4F_compressionContextPtr==NULL, allocation_failed); - return LZ4F_OK_NoError; -} - - -LZ4F_errorCode_t LZ4F_freeCompressionContext(LZ4F_cctx* cctxPtr) -{ - if (cctxPtr != NULL) { /* support free on NULL */ - LZ4F_free(cctxPtr->lz4CtxPtr, cctxPtr->cmem); /* note: LZ4_streamHC_t and LZ4_stream_t are simple POD types */ - LZ4F_free(cctxPtr->tmpBuff, cctxPtr->cmem); - LZ4F_free(cctxPtr, cctxPtr->cmem); - } - return LZ4F_OK_NoError; -} - - -/** - * This function prepares the internal LZ4(HC) stream for a new compression, - * resetting the context and attaching the dictionary, if there is one. - * - * It needs to be called at the beginning of each independent compression - * stream (i.e., at the beginning of a frame in blockLinked mode, or at the - * beginning of each block in blockIndependent mode). - */ -static void LZ4F_initStream(void* ctx, - const LZ4F_CDict* cdict, - int level, - LZ4F_blockMode_t blockMode) { - if (level < LZ4HC_CLEVEL_MIN) { - if (cdict != NULL || blockMode == LZ4F_blockLinked) { - /* In these cases, we will call LZ4_compress_fast_continue(), - * which needs an already reset context. Otherwise, we'll call a - * one-shot API. The non-continued APIs internally perform their own - * resets at the beginning of their calls, where they know what - * tableType they need the context to be in. So in that case this - * would be misguided / wasted work. */ - LZ4_resetStream_fast((LZ4_stream_t*)ctx); - } - LZ4_attach_dictionary((LZ4_stream_t *)ctx, cdict ? cdict->fastCtx : NULL); - } else { - LZ4_resetStreamHC_fast((LZ4_streamHC_t*)ctx, level); - LZ4_attach_HC_dictionary((LZ4_streamHC_t *)ctx, cdict ? cdict->HCCtx : NULL); - } -} - -static int ctxTypeID_to_size(int ctxTypeID) { - switch(ctxTypeID) { - case 1: - return LZ4_sizeofState(); - case 2: - return LZ4_sizeofStateHC(); - default: - return 0; - } -} - -/*! LZ4F_compressBegin_usingCDict() : - * init streaming compression AND writes frame header into @dstBuffer. - * @dstCapacity must be >= LZ4F_HEADER_SIZE_MAX bytes. - * @return : number of bytes written into @dstBuffer for the header - * or an error code (can be tested using LZ4F_isError()) - */ -size_t LZ4F_compressBegin_usingCDict(LZ4F_cctx* cctxPtr, - void* dstBuffer, size_t dstCapacity, - const LZ4F_CDict* cdict, - const LZ4F_preferences_t* preferencesPtr) -{ - LZ4F_preferences_t const prefNull = LZ4F_INIT_PREFERENCES; - BYTE* const dstStart = (BYTE*)dstBuffer; - BYTE* dstPtr = dstStart; - - RETURN_ERROR_IF(dstCapacity < maxFHSize, dstMaxSize_tooSmall); - if (preferencesPtr == NULL) preferencesPtr = &prefNull; - cctxPtr->prefs = *preferencesPtr; - - /* cctx Management */ - { U16 const ctxTypeID = (cctxPtr->prefs.compressionLevel < LZ4HC_CLEVEL_MIN) ? 1 : 2; - int requiredSize = ctxTypeID_to_size(ctxTypeID); - int allocatedSize = ctxTypeID_to_size(cctxPtr->lz4CtxAlloc); - if (allocatedSize < requiredSize) { - /* not enough space allocated */ - LZ4F_free(cctxPtr->lz4CtxPtr, cctxPtr->cmem); - if (cctxPtr->prefs.compressionLevel < LZ4HC_CLEVEL_MIN) { - /* must take ownership of memory allocation, - * in order to respect custom allocator contract */ - cctxPtr->lz4CtxPtr = LZ4F_malloc(sizeof(LZ4_stream_t), cctxPtr->cmem); - if (cctxPtr->lz4CtxPtr) - LZ4_initStream(cctxPtr->lz4CtxPtr, sizeof(LZ4_stream_t)); - } else { - cctxPtr->lz4CtxPtr = LZ4F_malloc(sizeof(LZ4_streamHC_t), cctxPtr->cmem); - if (cctxPtr->lz4CtxPtr) - LZ4_initStreamHC(cctxPtr->lz4CtxPtr, sizeof(LZ4_streamHC_t)); - } - RETURN_ERROR_IF(cctxPtr->lz4CtxPtr == NULL, allocation_failed); - cctxPtr->lz4CtxAlloc = ctxTypeID; - cctxPtr->lz4CtxState = ctxTypeID; - } else if (cctxPtr->lz4CtxState != ctxTypeID) { - /* otherwise, a sufficient buffer is already allocated, - * but we need to reset it to the correct context type */ - if (cctxPtr->prefs.compressionLevel < LZ4HC_CLEVEL_MIN) { - LZ4_initStream((LZ4_stream_t*)cctxPtr->lz4CtxPtr, sizeof(LZ4_stream_t)); - } else { - LZ4_initStreamHC((LZ4_streamHC_t*)cctxPtr->lz4CtxPtr, sizeof(LZ4_streamHC_t)); - LZ4_setCompressionLevel((LZ4_streamHC_t*)cctxPtr->lz4CtxPtr, cctxPtr->prefs.compressionLevel); - } - cctxPtr->lz4CtxState = ctxTypeID; - } } - - /* Buffer Management */ - if (cctxPtr->prefs.frameInfo.blockSizeID == 0) - cctxPtr->prefs.frameInfo.blockSizeID = LZ4F_BLOCKSIZEID_DEFAULT; - cctxPtr->maxBlockSize = LZ4F_getBlockSize(cctxPtr->prefs.frameInfo.blockSizeID); - - { size_t const requiredBuffSize = preferencesPtr->autoFlush ? - ((cctxPtr->prefs.frameInfo.blockMode == LZ4F_blockLinked) ? 64 KB : 0) : /* only needs past data up to window size */ - cctxPtr->maxBlockSize + ((cctxPtr->prefs.frameInfo.blockMode == LZ4F_blockLinked) ? 128 KB : 0); - - if (cctxPtr->maxBufferSize < requiredBuffSize) { - cctxPtr->maxBufferSize = 0; - LZ4F_free(cctxPtr->tmpBuff, cctxPtr->cmem); - cctxPtr->tmpBuff = (BYTE*)LZ4F_malloc(requiredBuffSize, cctxPtr->cmem); - RETURN_ERROR_IF(cctxPtr->tmpBuff == NULL, allocation_failed); - cctxPtr->maxBufferSize = requiredBuffSize; - } } - cctxPtr->tmpIn = cctxPtr->tmpBuff; - cctxPtr->tmpInSize = 0; - (void)XXH32_reset(&(cctxPtr->xxh), 0); - - /* context init */ - cctxPtr->cdict = cdict; - if (cctxPtr->prefs.frameInfo.blockMode == LZ4F_blockLinked) { - /* frame init only for blockLinked : blockIndependent will be init at each block */ - LZ4F_initStream(cctxPtr->lz4CtxPtr, cdict, cctxPtr->prefs.compressionLevel, LZ4F_blockLinked); - } - if (preferencesPtr->compressionLevel >= LZ4HC_CLEVEL_MIN) { - LZ4_favorDecompressionSpeed((LZ4_streamHC_t*)cctxPtr->lz4CtxPtr, (int)preferencesPtr->favorDecSpeed); - } - - /* Magic Number */ - LZ4F_writeLE32(dstPtr, LZ4F_MAGICNUMBER); - dstPtr += 4; - { BYTE* const headerStart = dstPtr; - - /* FLG Byte */ - *dstPtr++ = (BYTE)(((1 & _2BITS) << 6) /* Version('01') */ - + ((cctxPtr->prefs.frameInfo.blockMode & _1BIT ) << 5) - + ((cctxPtr->prefs.frameInfo.blockChecksumFlag & _1BIT ) << 4) - + ((unsigned)(cctxPtr->prefs.frameInfo.contentSize > 0) << 3) - + ((cctxPtr->prefs.frameInfo.contentChecksumFlag & _1BIT ) << 2) - + (cctxPtr->prefs.frameInfo.dictID > 0) ); - /* BD Byte */ - *dstPtr++ = (BYTE)((cctxPtr->prefs.frameInfo.blockSizeID & _3BITS) << 4); - /* Optional Frame content size field */ - if (cctxPtr->prefs.frameInfo.contentSize) { - LZ4F_writeLE64(dstPtr, cctxPtr->prefs.frameInfo.contentSize); - dstPtr += 8; - cctxPtr->totalInSize = 0; - } - /* Optional dictionary ID field */ - if (cctxPtr->prefs.frameInfo.dictID) { - LZ4F_writeLE32(dstPtr, cctxPtr->prefs.frameInfo.dictID); - dstPtr += 4; - } - /* Header CRC Byte */ - *dstPtr = LZ4F_headerChecksum(headerStart, (size_t)(dstPtr - headerStart)); - dstPtr++; - } - - cctxPtr->cStage = 1; /* header written, now request input data block */ - return (size_t)(dstPtr - dstStart); -} - - -/*! LZ4F_compressBegin() : - * init streaming compression AND writes frame header into @dstBuffer. - * @dstCapacity must be >= LZ4F_HEADER_SIZE_MAX bytes. - * @preferencesPtr can be NULL, in which case default parameters are selected. - * @return : number of bytes written into dstBuffer for the header - * or an error code (can be tested using LZ4F_isError()) - */ -size_t LZ4F_compressBegin(LZ4F_cctx* cctxPtr, - void* dstBuffer, size_t dstCapacity, - const LZ4F_preferences_t* preferencesPtr) -{ - return LZ4F_compressBegin_usingCDict(cctxPtr, dstBuffer, dstCapacity, - NULL, preferencesPtr); -} - - -/* LZ4F_compressBound() : - * @return minimum capacity of dstBuffer for a given srcSize to handle worst case scenario. - * LZ4F_preferences_t structure is optional : if NULL, preferences will be set to cover worst case scenario. - * This function cannot fail. - */ -size_t LZ4F_compressBound(size_t srcSize, const LZ4F_preferences_t* preferencesPtr) -{ - if (preferencesPtr && preferencesPtr->autoFlush) { - return LZ4F_compressBound_internal(srcSize, preferencesPtr, 0); - } - return LZ4F_compressBound_internal(srcSize, preferencesPtr, (size_t)-1); -} - - -typedef int (*compressFunc_t)(void* ctx, const char* src, char* dst, int srcSize, int dstSize, int level, const LZ4F_CDict* cdict); - - -/*! LZ4F_makeBlock(): - * compress a single block, add header and optional checksum. - * assumption : dst buffer capacity is >= BHSize + srcSize + crcSize - */ -static size_t LZ4F_makeBlock(void* dst, - const void* src, size_t srcSize, - compressFunc_t compress, void* lz4ctx, int level, - const LZ4F_CDict* cdict, - LZ4F_blockChecksum_t crcFlag) -{ - BYTE* const cSizePtr = (BYTE*)dst; - U32 cSize; - assert(compress != NULL); - cSize = (U32)compress(lz4ctx, (const char*)src, (char*)(cSizePtr+BHSize), - (int)(srcSize), (int)(srcSize-1), - level, cdict); - - if (cSize == 0 || cSize >= srcSize) { - cSize = (U32)srcSize; - LZ4F_writeLE32(cSizePtr, cSize | LZ4F_BLOCKUNCOMPRESSED_FLAG); - memcpy(cSizePtr+BHSize, src, srcSize); - } else { - LZ4F_writeLE32(cSizePtr, cSize); - } - if (crcFlag) { - U32 const crc32 = XXH32(cSizePtr+BHSize, cSize, 0); /* checksum of compressed data */ - LZ4F_writeLE32(cSizePtr+BHSize+cSize, crc32); - } - return BHSize + cSize + ((U32)crcFlag)*BFSize; -} - - -static int LZ4F_compressBlock(void* ctx, const char* src, char* dst, int srcSize, int dstCapacity, int level, const LZ4F_CDict* cdict) -{ - int const acceleration = (level < 0) ? -level + 1 : 1; - DEBUGLOG(5, "LZ4F_compressBlock (srcSize=%i)", srcSize); - LZ4F_initStream(ctx, cdict, level, LZ4F_blockIndependent); - if (cdict) { - return LZ4_compress_fast_continue((LZ4_stream_t*)ctx, src, dst, srcSize, dstCapacity, acceleration); - } else { - return LZ4_compress_fast_extState_fastReset(ctx, src, dst, srcSize, dstCapacity, acceleration); - } -} - -static int LZ4F_compressBlock_continue(void* ctx, const char* src, char* dst, int srcSize, int dstCapacity, int level, const LZ4F_CDict* cdict) -{ - int const acceleration = (level < 0) ? -level + 1 : 1; - (void)cdict; /* init once at beginning of frame */ - DEBUGLOG(5, "LZ4F_compressBlock_continue (srcSize=%i)", srcSize); - return LZ4_compress_fast_continue((LZ4_stream_t*)ctx, src, dst, srcSize, dstCapacity, acceleration); -} - -static int LZ4F_compressBlockHC(void* ctx, const char* src, char* dst, int srcSize, int dstCapacity, int level, const LZ4F_CDict* cdict) -{ - LZ4F_initStream(ctx, cdict, level, LZ4F_blockIndependent); - if (cdict) { - return LZ4_compress_HC_continue((LZ4_streamHC_t*)ctx, src, dst, srcSize, dstCapacity); - } - return LZ4_compress_HC_extStateHC_fastReset(ctx, src, dst, srcSize, dstCapacity, level); -} - -static int LZ4F_compressBlockHC_continue(void* ctx, const char* src, char* dst, int srcSize, int dstCapacity, int level, const LZ4F_CDict* cdict) -{ - (void)level; (void)cdict; /* init once at beginning of frame */ - return LZ4_compress_HC_continue((LZ4_streamHC_t*)ctx, src, dst, srcSize, dstCapacity); -} - -static int LZ4F_doNotCompressBlock(void* ctx, const char* src, char* dst, int srcSize, int dstCapacity, int level, const LZ4F_CDict* cdict) -{ - (void)ctx; (void)src; (void)dst; (void)srcSize; (void)dstCapacity; (void)level; (void)cdict; - return 0; -} - -static compressFunc_t LZ4F_selectCompression(LZ4F_blockMode_t blockMode, int level, LZ4F_blockCompression_t compressMode) -{ - if (compressMode == LZ4B_UNCOMPRESSED) return LZ4F_doNotCompressBlock; - if (level < LZ4HC_CLEVEL_MIN) { - if (blockMode == LZ4F_blockIndependent) return LZ4F_compressBlock; - return LZ4F_compressBlock_continue; - } - if (blockMode == LZ4F_blockIndependent) return LZ4F_compressBlockHC; - return LZ4F_compressBlockHC_continue; -} - -/* Save history (up to 64KB) into @tmpBuff */ -static int LZ4F_localSaveDict(LZ4F_cctx_t* cctxPtr) -{ - if (cctxPtr->prefs.compressionLevel < LZ4HC_CLEVEL_MIN) - return LZ4_saveDict ((LZ4_stream_t*)(cctxPtr->lz4CtxPtr), (char*)(cctxPtr->tmpBuff), 64 KB); - return LZ4_saveDictHC ((LZ4_streamHC_t*)(cctxPtr->lz4CtxPtr), (char*)(cctxPtr->tmpBuff), 64 KB); -} - -typedef enum { notDone, fromTmpBuffer, fromSrcBuffer } LZ4F_lastBlockStatus; - -static const LZ4F_compressOptions_t k_cOptionsNull = { 0, { 0, 0, 0 } }; - - - /*! LZ4F_compressUpdateImpl() : - * LZ4F_compressUpdate() can be called repetitively to compress as much data as necessary. - * When successful, the function always entirely consumes @srcBuffer. - * src data is either buffered or compressed into @dstBuffer. - * If the block compression does not match the compression of the previous block, the old data is flushed - * and operations continue with the new compression mode. - * @dstCapacity MUST be >= LZ4F_compressBound(srcSize, preferencesPtr) when block compression is turned on. - * @compressOptionsPtr is optional : provide NULL to mean "default". - * @return : the number of bytes written into dstBuffer. It can be zero, meaning input data was just buffered. - * or an error code if it fails (which can be tested using LZ4F_isError()) - * After an error, the state is left in a UB state, and must be re-initialized. - */ -static size_t LZ4F_compressUpdateImpl(LZ4F_cctx* cctxPtr, - void* dstBuffer, size_t dstCapacity, - const void* srcBuffer, size_t srcSize, - const LZ4F_compressOptions_t* compressOptionsPtr, - LZ4F_blockCompression_t blockCompression) - { - size_t const blockSize = cctxPtr->maxBlockSize; - const BYTE* srcPtr = (const BYTE*)srcBuffer; - const BYTE* const srcEnd = srcPtr + srcSize; - BYTE* const dstStart = (BYTE*)dstBuffer; - BYTE* dstPtr = dstStart; - LZ4F_lastBlockStatus lastBlockCompressed = notDone; - compressFunc_t const compress = LZ4F_selectCompression(cctxPtr->prefs.frameInfo.blockMode, cctxPtr->prefs.compressionLevel, blockCompression); - size_t bytesWritten; - DEBUGLOG(4, "LZ4F_compressUpdate (srcSize=%zu)", srcSize); - - RETURN_ERROR_IF(cctxPtr->cStage != 1, compressionState_uninitialized); /* state must be initialized and waiting for next block */ - if (dstCapacity < LZ4F_compressBound_internal(srcSize, &(cctxPtr->prefs), cctxPtr->tmpInSize)) - RETURN_ERROR(dstMaxSize_tooSmall); - - if (blockCompression == LZ4B_UNCOMPRESSED && dstCapacity < srcSize) - RETURN_ERROR(dstMaxSize_tooSmall); - - /* flush currently written block, to continue with new block compression */ - if (cctxPtr->blockCompression != blockCompression) { - bytesWritten = LZ4F_flush(cctxPtr, dstBuffer, dstCapacity, compressOptionsPtr); - dstPtr += bytesWritten; - cctxPtr->blockCompression = blockCompression; - } - - if (compressOptionsPtr == NULL) compressOptionsPtr = &k_cOptionsNull; - - /* complete tmp buffer */ - if (cctxPtr->tmpInSize > 0) { /* some data already within tmp buffer */ - size_t const sizeToCopy = blockSize - cctxPtr->tmpInSize; - assert(blockSize > cctxPtr->tmpInSize); - if (sizeToCopy > srcSize) { - /* add src to tmpIn buffer */ - memcpy(cctxPtr->tmpIn + cctxPtr->tmpInSize, srcBuffer, srcSize); - srcPtr = srcEnd; - cctxPtr->tmpInSize += srcSize; - /* still needs some CRC */ - } else { - /* complete tmpIn block and then compress it */ - lastBlockCompressed = fromTmpBuffer; - memcpy(cctxPtr->tmpIn + cctxPtr->tmpInSize, srcBuffer, sizeToCopy); - srcPtr += sizeToCopy; - - dstPtr += LZ4F_makeBlock(dstPtr, - cctxPtr->tmpIn, blockSize, - compress, cctxPtr->lz4CtxPtr, cctxPtr->prefs.compressionLevel, - cctxPtr->cdict, - cctxPtr->prefs.frameInfo.blockChecksumFlag); - if (cctxPtr->prefs.frameInfo.blockMode==LZ4F_blockLinked) cctxPtr->tmpIn += blockSize; - cctxPtr->tmpInSize = 0; - } } - - while ((size_t)(srcEnd - srcPtr) >= blockSize) { - /* compress full blocks */ - lastBlockCompressed = fromSrcBuffer; - dstPtr += LZ4F_makeBlock(dstPtr, - srcPtr, blockSize, - compress, cctxPtr->lz4CtxPtr, cctxPtr->prefs.compressionLevel, - cctxPtr->cdict, - cctxPtr->prefs.frameInfo.blockChecksumFlag); - srcPtr += blockSize; - } - - if ((cctxPtr->prefs.autoFlush) && (srcPtr < srcEnd)) { - /* autoFlush : remaining input (< blockSize) is compressed */ - lastBlockCompressed = fromSrcBuffer; - dstPtr += LZ4F_makeBlock(dstPtr, - srcPtr, (size_t)(srcEnd - srcPtr), - compress, cctxPtr->lz4CtxPtr, cctxPtr->prefs.compressionLevel, - cctxPtr->cdict, - cctxPtr->prefs.frameInfo.blockChecksumFlag); - srcPtr = srcEnd; - } - - /* preserve dictionary within @tmpBuff whenever necessary */ - if ((cctxPtr->prefs.frameInfo.blockMode==LZ4F_blockLinked) && (lastBlockCompressed==fromSrcBuffer)) { - /* linked blocks are only supported in compressed mode, see LZ4F_uncompressedUpdate */ - assert(blockCompression == LZ4B_COMPRESSED); - if (compressOptionsPtr->stableSrc) { - cctxPtr->tmpIn = cctxPtr->tmpBuff; /* src is stable : dictionary remains in src across invocations */ - } else { - int const realDictSize = LZ4F_localSaveDict(cctxPtr); - assert(0 <= realDictSize && realDictSize <= 64 KB); - cctxPtr->tmpIn = cctxPtr->tmpBuff + realDictSize; - } - } - - /* keep tmpIn within limits */ - if (!(cctxPtr->prefs.autoFlush) /* no autoflush : there may be some data left within internal buffer */ - && (cctxPtr->tmpIn + blockSize) > (cctxPtr->tmpBuff + cctxPtr->maxBufferSize) ) /* not enough room to store next block */ - { - /* only preserve 64KB within internal buffer. Ensures there is enough room for next block. - * note: this situation necessarily implies lastBlockCompressed==fromTmpBuffer */ - int const realDictSize = LZ4F_localSaveDict(cctxPtr); - cctxPtr->tmpIn = cctxPtr->tmpBuff + realDictSize; - assert((cctxPtr->tmpIn + blockSize) <= (cctxPtr->tmpBuff + cctxPtr->maxBufferSize)); - } - - /* some input data left, necessarily < blockSize */ - if (srcPtr < srcEnd) { - /* fill tmp buffer */ - size_t const sizeToCopy = (size_t)(srcEnd - srcPtr); - memcpy(cctxPtr->tmpIn, srcPtr, sizeToCopy); - cctxPtr->tmpInSize = sizeToCopy; - } - - if (cctxPtr->prefs.frameInfo.contentChecksumFlag == LZ4F_contentChecksumEnabled) - (void)XXH32_update(&(cctxPtr->xxh), srcBuffer, srcSize); - - cctxPtr->totalInSize += srcSize; - return (size_t)(dstPtr - dstStart); -} - -/*! LZ4F_compressUpdate() : - * LZ4F_compressUpdate() can be called repetitively to compress as much data as necessary. - * When successful, the function always entirely consumes @srcBuffer. - * src data is either buffered or compressed into @dstBuffer. - * If previously an uncompressed block was written, buffered data is flushed - * before appending compressed data is continued. - * @dstCapacity MUST be >= LZ4F_compressBound(srcSize, preferencesPtr). - * @compressOptionsPtr is optional : provide NULL to mean "default". - * @return : the number of bytes written into dstBuffer. It can be zero, meaning input data was just buffered. - * or an error code if it fails (which can be tested using LZ4F_isError()) - * After an error, the state is left in a UB state, and must be re-initialized. - */ -size_t LZ4F_compressUpdate(LZ4F_cctx* cctxPtr, - void* dstBuffer, size_t dstCapacity, - const void* srcBuffer, size_t srcSize, - const LZ4F_compressOptions_t* compressOptionsPtr) -{ - return LZ4F_compressUpdateImpl(cctxPtr, - dstBuffer, dstCapacity, - srcBuffer, srcSize, - compressOptionsPtr, LZ4B_COMPRESSED); -} - -/*! LZ4F_compressUpdate() : - * LZ4F_compressUpdate() can be called repetitively to compress as much data as necessary. - * When successful, the function always entirely consumes @srcBuffer. - * src data is either buffered or compressed into @dstBuffer. - * If previously an uncompressed block was written, buffered data is flushed - * before appending compressed data is continued. - * This is only supported when LZ4F_blockIndependent is used - * @dstCapacity MUST be >= LZ4F_compressBound(srcSize, preferencesPtr). - * @compressOptionsPtr is optional : provide NULL to mean "default". - * @return : the number of bytes written into dstBuffer. It can be zero, meaning input data was just buffered. - * or an error code if it fails (which can be tested using LZ4F_isError()) - * After an error, the state is left in a UB state, and must be re-initialized. - */ -size_t LZ4F_uncompressedUpdate(LZ4F_cctx* cctxPtr, - void* dstBuffer, size_t dstCapacity, - const void* srcBuffer, size_t srcSize, - const LZ4F_compressOptions_t* compressOptionsPtr) { - return LZ4F_compressUpdateImpl(cctxPtr, - dstBuffer, dstCapacity, - srcBuffer, srcSize, - compressOptionsPtr, LZ4B_UNCOMPRESSED); -} - - -/*! LZ4F_flush() : - * When compressed data must be sent immediately, without waiting for a block to be filled, - * invoke LZ4_flush(), which will immediately compress any remaining data stored within LZ4F_cctx. - * The result of the function is the number of bytes written into dstBuffer. - * It can be zero, this means there was no data left within LZ4F_cctx. - * The function outputs an error code if it fails (can be tested using LZ4F_isError()) - * LZ4F_compressOptions_t* is optional. NULL is a valid argument. - */ -size_t LZ4F_flush(LZ4F_cctx* cctxPtr, - void* dstBuffer, size_t dstCapacity, - const LZ4F_compressOptions_t* compressOptionsPtr) -{ - BYTE* const dstStart = (BYTE*)dstBuffer; - BYTE* dstPtr = dstStart; - compressFunc_t compress; - - if (cctxPtr->tmpInSize == 0) return 0; /* nothing to flush */ - RETURN_ERROR_IF(cctxPtr->cStage != 1, compressionState_uninitialized); - RETURN_ERROR_IF(dstCapacity < (cctxPtr->tmpInSize + BHSize + BFSize), dstMaxSize_tooSmall); - (void)compressOptionsPtr; /* not useful (yet) */ - - /* select compression function */ - compress = LZ4F_selectCompression(cctxPtr->prefs.frameInfo.blockMode, cctxPtr->prefs.compressionLevel, cctxPtr->blockCompression); - - /* compress tmp buffer */ - dstPtr += LZ4F_makeBlock(dstPtr, - cctxPtr->tmpIn, cctxPtr->tmpInSize, - compress, cctxPtr->lz4CtxPtr, cctxPtr->prefs.compressionLevel, - cctxPtr->cdict, - cctxPtr->prefs.frameInfo.blockChecksumFlag); - assert(((void)"flush overflows dstBuffer!", (size_t)(dstPtr - dstStart) <= dstCapacity)); - - if (cctxPtr->prefs.frameInfo.blockMode == LZ4F_blockLinked) - cctxPtr->tmpIn += cctxPtr->tmpInSize; - cctxPtr->tmpInSize = 0; - - /* keep tmpIn within limits */ - if ((cctxPtr->tmpIn + cctxPtr->maxBlockSize) > (cctxPtr->tmpBuff + cctxPtr->maxBufferSize)) { /* necessarily LZ4F_blockLinked */ - int const realDictSize = LZ4F_localSaveDict(cctxPtr); - cctxPtr->tmpIn = cctxPtr->tmpBuff + realDictSize; - } - - return (size_t)(dstPtr - dstStart); -} - - -/*! LZ4F_compressEnd() : - * When you want to properly finish the compressed frame, just call LZ4F_compressEnd(). - * It will flush whatever data remained within compressionContext (like LZ4_flush()) - * but also properly finalize the frame, with an endMark and an (optional) checksum. - * LZ4F_compressOptions_t structure is optional : you can provide NULL as argument. - * @return: the number of bytes written into dstBuffer (necessarily >= 4 (endMark size)) - * or an error code if it fails (can be tested using LZ4F_isError()) - * The context can then be used again to compress a new frame, starting with LZ4F_compressBegin(). - */ -size_t LZ4F_compressEnd(LZ4F_cctx* cctxPtr, - void* dstBuffer, size_t dstCapacity, - const LZ4F_compressOptions_t* compressOptionsPtr) -{ - BYTE* const dstStart = (BYTE*)dstBuffer; - BYTE* dstPtr = dstStart; - - size_t const flushSize = LZ4F_flush(cctxPtr, dstBuffer, dstCapacity, compressOptionsPtr); - DEBUGLOG(5,"LZ4F_compressEnd: dstCapacity=%u", (unsigned)dstCapacity); - FORWARD_IF_ERROR(flushSize); - dstPtr += flushSize; - - assert(flushSize <= dstCapacity); - dstCapacity -= flushSize; - - RETURN_ERROR_IF(dstCapacity < 4, dstMaxSize_tooSmall); - LZ4F_writeLE32(dstPtr, 0); - dstPtr += 4; /* endMark */ - - if (cctxPtr->prefs.frameInfo.contentChecksumFlag == LZ4F_contentChecksumEnabled) { - U32 const xxh = XXH32_digest(&(cctxPtr->xxh)); - RETURN_ERROR_IF(dstCapacity < 8, dstMaxSize_tooSmall); - DEBUGLOG(5,"Writing 32-bit content checksum"); - LZ4F_writeLE32(dstPtr, xxh); - dstPtr+=4; /* content Checksum */ - } - - cctxPtr->cStage = 0; /* state is now re-usable (with identical preferences) */ - - if (cctxPtr->prefs.frameInfo.contentSize) { - if (cctxPtr->prefs.frameInfo.contentSize != cctxPtr->totalInSize) - RETURN_ERROR(frameSize_wrong); - } - - return (size_t)(dstPtr - dstStart); -} - - -/*-*************************************************** -* Frame Decompression -*****************************************************/ - -typedef enum { - dstage_getFrameHeader=0, dstage_storeFrameHeader, - dstage_init, - dstage_getBlockHeader, dstage_storeBlockHeader, - dstage_copyDirect, dstage_getBlockChecksum, - dstage_getCBlock, dstage_storeCBlock, - dstage_flushOut, - dstage_getSuffix, dstage_storeSuffix, - dstage_getSFrameSize, dstage_storeSFrameSize, - dstage_skipSkippable -} dStage_t; - -struct LZ4F_dctx_s { - LZ4F_CustomMem cmem; - LZ4F_frameInfo_t frameInfo; - U32 version; - dStage_t dStage; - U64 frameRemainingSize; - size_t maxBlockSize; - size_t maxBufferSize; - BYTE* tmpIn; - size_t tmpInSize; - size_t tmpInTarget; - BYTE* tmpOutBuffer; - const BYTE* dict; - size_t dictSize; - BYTE* tmpOut; - size_t tmpOutSize; - size_t tmpOutStart; - XXH32_state_t xxh; - XXH32_state_t blockChecksum; - int skipChecksum; - BYTE header[LZ4F_HEADER_SIZE_MAX]; -}; /* typedef'd to LZ4F_dctx in lz4frame.h */ - - -LZ4F_dctx* LZ4F_createDecompressionContext_advanced(LZ4F_CustomMem customMem, unsigned version) -{ - LZ4F_dctx* const dctx = (LZ4F_dctx*)LZ4F_calloc(sizeof(LZ4F_dctx), customMem); - if (dctx == NULL) return NULL; - - dctx->cmem = customMem; - dctx->version = version; - return dctx; -} - -/*! LZ4F_createDecompressionContext() : - * Create a decompressionContext object, which will track all decompression operations. - * Provides a pointer to a fully allocated and initialized LZ4F_decompressionContext object. - * Object can later be released using LZ4F_freeDecompressionContext(). - * @return : if != 0, there was an error during context creation. - */ -LZ4F_errorCode_t -LZ4F_createDecompressionContext(LZ4F_dctx** LZ4F_decompressionContextPtr, unsigned versionNumber) -{ - assert(LZ4F_decompressionContextPtr != NULL); /* violation of narrow contract */ - RETURN_ERROR_IF(LZ4F_decompressionContextPtr == NULL, parameter_null); /* in case it nonetheless happen in production */ - - *LZ4F_decompressionContextPtr = LZ4F_createDecompressionContext_advanced(LZ4F_defaultCMem, versionNumber); - if (*LZ4F_decompressionContextPtr == NULL) { /* failed allocation */ - RETURN_ERROR(allocation_failed); - } - return LZ4F_OK_NoError; -} - -LZ4F_errorCode_t LZ4F_freeDecompressionContext(LZ4F_dctx* dctx) -{ - LZ4F_errorCode_t result = LZ4F_OK_NoError; - if (dctx != NULL) { /* can accept NULL input, like free() */ - result = (LZ4F_errorCode_t)dctx->dStage; - LZ4F_free(dctx->tmpIn, dctx->cmem); - LZ4F_free(dctx->tmpOutBuffer, dctx->cmem); - LZ4F_free(dctx, dctx->cmem); - } - return result; -} - - -/*==--- Streaming Decompression operations ---==*/ - -void LZ4F_resetDecompressionContext(LZ4F_dctx* dctx) -{ - dctx->dStage = dstage_getFrameHeader; - dctx->dict = NULL; - dctx->dictSize = 0; - dctx->skipChecksum = 0; -} - - -/*! LZ4F_decodeHeader() : - * input : `src` points at the **beginning of the frame** - * output : set internal values of dctx, such as - * dctx->frameInfo and dctx->dStage. - * Also allocates internal buffers. - * @return : nb Bytes read from src (necessarily <= srcSize) - * or an error code (testable with LZ4F_isError()) - */ -static size_t LZ4F_decodeHeader(LZ4F_dctx* dctx, const void* src, size_t srcSize) -{ - unsigned blockMode, blockChecksumFlag, contentSizeFlag, contentChecksumFlag, dictIDFlag, blockSizeID; - size_t frameHeaderSize; - const BYTE* srcPtr = (const BYTE*)src; - - DEBUGLOG(5, "LZ4F_decodeHeader"); - /* need to decode header to get frameInfo */ - RETURN_ERROR_IF(srcSize < minFHSize, frameHeader_incomplete); /* minimal frame header size */ - MEM_INIT(&(dctx->frameInfo), 0, sizeof(dctx->frameInfo)); - - /* special case : skippable frames */ - if ((LZ4F_readLE32(srcPtr) & 0xFFFFFFF0U) == LZ4F_MAGIC_SKIPPABLE_START) { - dctx->frameInfo.frameType = LZ4F_skippableFrame; - if (src == (void*)(dctx->header)) { - dctx->tmpInSize = srcSize; - dctx->tmpInTarget = 8; - dctx->dStage = dstage_storeSFrameSize; - return srcSize; - } else { - dctx->dStage = dstage_getSFrameSize; - return 4; - } } - - /* control magic number */ -#ifndef FUZZING_BUILD_MODE_UNSAFE_FOR_PRODUCTION - if (LZ4F_readLE32(srcPtr) != LZ4F_MAGICNUMBER) { - DEBUGLOG(4, "frame header error : unknown magic number"); - RETURN_ERROR(frameType_unknown); - } -#endif - dctx->frameInfo.frameType = LZ4F_frame; - - /* Flags */ - { U32 const FLG = srcPtr[4]; - U32 const version = (FLG>>6) & _2BITS; - blockChecksumFlag = (FLG>>4) & _1BIT; - blockMode = (FLG>>5) & _1BIT; - contentSizeFlag = (FLG>>3) & _1BIT; - contentChecksumFlag = (FLG>>2) & _1BIT; - dictIDFlag = FLG & _1BIT; - /* validate */ - if (((FLG>>1)&_1BIT) != 0) RETURN_ERROR(reservedFlag_set); /* Reserved bit */ - if (version != 1) RETURN_ERROR(headerVersion_wrong); /* Version Number, only supported value */ - } - - /* Frame Header Size */ - frameHeaderSize = minFHSize + (contentSizeFlag?8:0) + (dictIDFlag?4:0); - - if (srcSize < frameHeaderSize) { - /* not enough input to fully decode frame header */ - if (srcPtr != dctx->header) - memcpy(dctx->header, srcPtr, srcSize); - dctx->tmpInSize = srcSize; - dctx->tmpInTarget = frameHeaderSize; - dctx->dStage = dstage_storeFrameHeader; - return srcSize; - } - - { U32 const BD = srcPtr[5]; - blockSizeID = (BD>>4) & _3BITS; - /* validate */ - if (((BD>>7)&_1BIT) != 0) RETURN_ERROR(reservedFlag_set); /* Reserved bit */ - if (blockSizeID < 4) RETURN_ERROR(maxBlockSize_invalid); /* 4-7 only supported values for the time being */ - if (((BD>>0)&_4BITS) != 0) RETURN_ERROR(reservedFlag_set); /* Reserved bits */ - } - - /* check header */ - assert(frameHeaderSize > 5); -#ifndef FUZZING_BUILD_MODE_UNSAFE_FOR_PRODUCTION - { BYTE const HC = LZ4F_headerChecksum(srcPtr+4, frameHeaderSize-5); - RETURN_ERROR_IF(HC != srcPtr[frameHeaderSize-1], headerChecksum_invalid); - } -#endif - - /* save */ - dctx->frameInfo.blockMode = (LZ4F_blockMode_t)blockMode; - dctx->frameInfo.blockChecksumFlag = (LZ4F_blockChecksum_t)blockChecksumFlag; - dctx->frameInfo.contentChecksumFlag = (LZ4F_contentChecksum_t)contentChecksumFlag; - dctx->frameInfo.blockSizeID = (LZ4F_blockSizeID_t)blockSizeID; - dctx->maxBlockSize = LZ4F_getBlockSize((LZ4F_blockSizeID_t)blockSizeID); - if (contentSizeFlag) - dctx->frameRemainingSize = dctx->frameInfo.contentSize = LZ4F_readLE64(srcPtr+6); - if (dictIDFlag) - dctx->frameInfo.dictID = LZ4F_readLE32(srcPtr + frameHeaderSize - 5); - - dctx->dStage = dstage_init; - - return frameHeaderSize; -} - - -/*! LZ4F_headerSize() : - * @return : size of frame header - * or an error code, which can be tested using LZ4F_isError() - */ -size_t LZ4F_headerSize(const void* src, size_t srcSize) -{ - RETURN_ERROR_IF(src == NULL, srcPtr_wrong); - - /* minimal srcSize to determine header size */ - if (srcSize < LZ4F_MIN_SIZE_TO_KNOW_HEADER_LENGTH) - RETURN_ERROR(frameHeader_incomplete); - - /* special case : skippable frames */ - if ((LZ4F_readLE32(src) & 0xFFFFFFF0U) == LZ4F_MAGIC_SKIPPABLE_START) - return 8; - - /* control magic number */ -#ifndef FUZZING_BUILD_MODE_UNSAFE_FOR_PRODUCTION - if (LZ4F_readLE32(src) != LZ4F_MAGICNUMBER) - RETURN_ERROR(frameType_unknown); -#endif - - /* Frame Header Size */ - { BYTE const FLG = ((const BYTE*)src)[4]; - U32 const contentSizeFlag = (FLG>>3) & _1BIT; - U32 const dictIDFlag = FLG & _1BIT; - return minFHSize + (contentSizeFlag?8:0) + (dictIDFlag?4:0); - } -} - -/*! LZ4F_getFrameInfo() : - * This function extracts frame parameters (max blockSize, frame checksum, etc.). - * Usage is optional. Objective is to provide relevant information for allocation purposes. - * This function works in 2 situations : - * - At the beginning of a new frame, in which case it will decode this information from `srcBuffer`, and start the decoding process. - * Amount of input data provided must be large enough to successfully decode the frame header. - * A header size is variable, but is guaranteed to be <= LZ4F_HEADER_SIZE_MAX bytes. It's possible to provide more input data than this minimum. - * - After decoding has been started. In which case, no input is read, frame parameters are extracted from dctx. - * The number of bytes consumed from srcBuffer will be updated within *srcSizePtr (necessarily <= original value). - * Decompression must resume from (srcBuffer + *srcSizePtr). - * @return : an hint about how many srcSize bytes LZ4F_decompress() expects for next call, - * or an error code which can be tested using LZ4F_isError() - * note 1 : in case of error, dctx is not modified. Decoding operations can resume from where they stopped. - * note 2 : frame parameters are *copied into* an already allocated LZ4F_frameInfo_t structure. - */ -LZ4F_errorCode_t LZ4F_getFrameInfo(LZ4F_dctx* dctx, - LZ4F_frameInfo_t* frameInfoPtr, - const void* srcBuffer, size_t* srcSizePtr) -{ - LZ4F_STATIC_ASSERT(dstage_getFrameHeader < dstage_storeFrameHeader); - if (dctx->dStage > dstage_storeFrameHeader) { - /* frameInfo already decoded */ - size_t o=0, i=0; - *srcSizePtr = 0; - *frameInfoPtr = dctx->frameInfo; - /* returns : recommended nb of bytes for LZ4F_decompress() */ - return LZ4F_decompress(dctx, NULL, &o, NULL, &i, NULL); - } else { - if (dctx->dStage == dstage_storeFrameHeader) { - /* frame decoding already started, in the middle of header => automatic fail */ - *srcSizePtr = 0; - RETURN_ERROR(frameDecoding_alreadyStarted); - } else { - size_t const hSize = LZ4F_headerSize(srcBuffer, *srcSizePtr); - if (LZ4F_isError(hSize)) { *srcSizePtr=0; return hSize; } - if (*srcSizePtr < hSize) { - *srcSizePtr=0; - RETURN_ERROR(frameHeader_incomplete); - } - - { size_t decodeResult = LZ4F_decodeHeader(dctx, srcBuffer, hSize); - if (LZ4F_isError(decodeResult)) { - *srcSizePtr = 0; - } else { - *srcSizePtr = decodeResult; - decodeResult = BHSize; /* block header size */ - } - *frameInfoPtr = dctx->frameInfo; - return decodeResult; - } } } -} - - -/* LZ4F_updateDict() : - * only used for LZ4F_blockLinked mode - * Condition : @dstPtr != NULL - */ -static void LZ4F_updateDict(LZ4F_dctx* dctx, - const BYTE* dstPtr, size_t dstSize, const BYTE* dstBufferStart, - unsigned withinTmp) -{ - assert(dstPtr != NULL); - if (dctx->dictSize==0) dctx->dict = (const BYTE*)dstPtr; /* will lead to prefix mode */ - assert(dctx->dict != NULL); - - if (dctx->dict + dctx->dictSize == dstPtr) { /* prefix mode, everything within dstBuffer */ - dctx->dictSize += dstSize; - return; - } - - assert(dstPtr >= dstBufferStart); - if ((size_t)(dstPtr - dstBufferStart) + dstSize >= 64 KB) { /* history in dstBuffer becomes large enough to become dictionary */ - dctx->dict = (const BYTE*)dstBufferStart; - dctx->dictSize = (size_t)(dstPtr - dstBufferStart) + dstSize; - return; - } - - assert(dstSize < 64 KB); /* if dstSize >= 64 KB, dictionary would be set into dstBuffer directly */ - - /* dstBuffer does not contain whole useful history (64 KB), so it must be saved within tmpOutBuffer */ - assert(dctx->tmpOutBuffer != NULL); - - if (withinTmp && (dctx->dict == dctx->tmpOutBuffer)) { /* continue history within tmpOutBuffer */ - /* withinTmp expectation : content of [dstPtr,dstSize] is same as [dict+dictSize,dstSize], so we just extend it */ - assert(dctx->dict + dctx->dictSize == dctx->tmpOut + dctx->tmpOutStart); - dctx->dictSize += dstSize; - return; - } - - if (withinTmp) { /* copy relevant dict portion in front of tmpOut within tmpOutBuffer */ - size_t const preserveSize = (size_t)(dctx->tmpOut - dctx->tmpOutBuffer); - size_t copySize = 64 KB - dctx->tmpOutSize; - const BYTE* const oldDictEnd = dctx->dict + dctx->dictSize - dctx->tmpOutStart; - if (dctx->tmpOutSize > 64 KB) copySize = 0; - if (copySize > preserveSize) copySize = preserveSize; - - memcpy(dctx->tmpOutBuffer + preserveSize - copySize, oldDictEnd - copySize, copySize); - - dctx->dict = dctx->tmpOutBuffer; - dctx->dictSize = preserveSize + dctx->tmpOutStart + dstSize; - return; - } - - if (dctx->dict == dctx->tmpOutBuffer) { /* copy dst into tmp to complete dict */ - if (dctx->dictSize + dstSize > dctx->maxBufferSize) { /* tmp buffer not large enough */ - size_t const preserveSize = 64 KB - dstSize; - memcpy(dctx->tmpOutBuffer, dctx->dict + dctx->dictSize - preserveSize, preserveSize); - dctx->dictSize = preserveSize; - } - memcpy(dctx->tmpOutBuffer + dctx->dictSize, dstPtr, dstSize); - dctx->dictSize += dstSize; - return; - } - - /* join dict & dest into tmp */ - { size_t preserveSize = 64 KB - dstSize; - if (preserveSize > dctx->dictSize) preserveSize = dctx->dictSize; - memcpy(dctx->tmpOutBuffer, dctx->dict + dctx->dictSize - preserveSize, preserveSize); - memcpy(dctx->tmpOutBuffer + preserveSize, dstPtr, dstSize); - dctx->dict = dctx->tmpOutBuffer; - dctx->dictSize = preserveSize + dstSize; - } -} - - -/*! LZ4F_decompress() : - * Call this function repetitively to regenerate compressed data in srcBuffer. - * The function will attempt to decode up to *srcSizePtr bytes from srcBuffer - * into dstBuffer of capacity *dstSizePtr. - * - * The number of bytes regenerated into dstBuffer will be provided within *dstSizePtr (necessarily <= original value). - * - * The number of bytes effectively read from srcBuffer will be provided within *srcSizePtr (necessarily <= original value). - * If number of bytes read is < number of bytes provided, then decompression operation is not complete. - * Remaining data will have to be presented again in a subsequent invocation. - * - * The function result is an hint of the better srcSize to use for next call to LZ4F_decompress. - * Schematically, it's the size of the current (or remaining) compressed block + header of next block. - * Respecting the hint provides a small boost to performance, since it allows less buffer shuffling. - * Note that this is just a hint, and it's always possible to any srcSize value. - * When a frame is fully decoded, @return will be 0. - * If decompression failed, @return is an error code which can be tested using LZ4F_isError(). - */ -size_t LZ4F_decompress(LZ4F_dctx* dctx, - void* dstBuffer, size_t* dstSizePtr, - const void* srcBuffer, size_t* srcSizePtr, - const LZ4F_decompressOptions_t* decompressOptionsPtr) -{ - LZ4F_decompressOptions_t optionsNull; - const BYTE* const srcStart = (const BYTE*)srcBuffer; - const BYTE* const srcEnd = srcStart + *srcSizePtr; - const BYTE* srcPtr = srcStart; - BYTE* const dstStart = (BYTE*)dstBuffer; - BYTE* const dstEnd = dstStart ? dstStart + *dstSizePtr : NULL; - BYTE* dstPtr = dstStart; - const BYTE* selectedIn = NULL; - unsigned doAnotherStage = 1; - size_t nextSrcSizeHint = 1; - - - DEBUGLOG(5, "LZ4F_decompress : %p,%u => %p,%u", - srcBuffer, (unsigned)*srcSizePtr, dstBuffer, (unsigned)*dstSizePtr); - if (dstBuffer == NULL) assert(*dstSizePtr == 0); - MEM_INIT(&optionsNull, 0, sizeof(optionsNull)); - if (decompressOptionsPtr==NULL) decompressOptionsPtr = &optionsNull; - *srcSizePtr = 0; - *dstSizePtr = 0; - assert(dctx != NULL); - dctx->skipChecksum |= (decompressOptionsPtr->skipChecksums != 0); /* once set, disable for the remainder of the frame */ - - /* behaves as a state machine */ - - while (doAnotherStage) { - - switch(dctx->dStage) - { - - case dstage_getFrameHeader: - DEBUGLOG(6, "dstage_getFrameHeader"); - if ((size_t)(srcEnd-srcPtr) >= maxFHSize) { /* enough to decode - shortcut */ - size_t const hSize = LZ4F_decodeHeader(dctx, srcPtr, (size_t)(srcEnd-srcPtr)); /* will update dStage appropriately */ - FORWARD_IF_ERROR(hSize); - srcPtr += hSize; - break; - } - dctx->tmpInSize = 0; - if (srcEnd-srcPtr == 0) return minFHSize; /* 0-size input */ - dctx->tmpInTarget = minFHSize; /* minimum size to decode header */ - dctx->dStage = dstage_storeFrameHeader; - /* fall-through */ - - case dstage_storeFrameHeader: - DEBUGLOG(6, "dstage_storeFrameHeader"); - { size_t const sizeToCopy = MIN(dctx->tmpInTarget - dctx->tmpInSize, (size_t)(srcEnd - srcPtr)); - memcpy(dctx->header + dctx->tmpInSize, srcPtr, sizeToCopy); - dctx->tmpInSize += sizeToCopy; - srcPtr += sizeToCopy; - } - if (dctx->tmpInSize < dctx->tmpInTarget) { - nextSrcSizeHint = (dctx->tmpInTarget - dctx->tmpInSize) + BHSize; /* rest of header + nextBlockHeader */ - doAnotherStage = 0; /* not enough src data, ask for some more */ - break; - } - FORWARD_IF_ERROR( LZ4F_decodeHeader(dctx, dctx->header, dctx->tmpInTarget) ); /* will update dStage appropriately */ - break; - - case dstage_init: - DEBUGLOG(6, "dstage_init"); - if (dctx->frameInfo.contentChecksumFlag) (void)XXH32_reset(&(dctx->xxh), 0); - /* internal buffers allocation */ - { size_t const bufferNeeded = dctx->maxBlockSize - + ((dctx->frameInfo.blockMode==LZ4F_blockLinked) ? 128 KB : 0); - if (bufferNeeded > dctx->maxBufferSize) { /* tmp buffers too small */ - dctx->maxBufferSize = 0; /* ensure allocation will be re-attempted on next entry*/ - LZ4F_free(dctx->tmpIn, dctx->cmem); - dctx->tmpIn = (BYTE*)LZ4F_malloc(dctx->maxBlockSize + BFSize /* block checksum */, dctx->cmem); - RETURN_ERROR_IF(dctx->tmpIn == NULL, allocation_failed); - LZ4F_free(dctx->tmpOutBuffer, dctx->cmem); - dctx->tmpOutBuffer= (BYTE*)LZ4F_malloc(bufferNeeded, dctx->cmem); - RETURN_ERROR_IF(dctx->tmpOutBuffer== NULL, allocation_failed); - dctx->maxBufferSize = bufferNeeded; - } } - dctx->tmpInSize = 0; - dctx->tmpInTarget = 0; - dctx->tmpOut = dctx->tmpOutBuffer; - dctx->tmpOutStart = 0; - dctx->tmpOutSize = 0; - - dctx->dStage = dstage_getBlockHeader; - /* fall-through */ - - case dstage_getBlockHeader: - if ((size_t)(srcEnd - srcPtr) >= BHSize) { - selectedIn = srcPtr; - srcPtr += BHSize; - } else { - /* not enough input to read cBlockSize field */ - dctx->tmpInSize = 0; - dctx->dStage = dstage_storeBlockHeader; - } - - if (dctx->dStage == dstage_storeBlockHeader) /* can be skipped */ - case dstage_storeBlockHeader: - { size_t const remainingInput = (size_t)(srcEnd - srcPtr); - size_t const wantedData = BHSize - dctx->tmpInSize; - size_t const sizeToCopy = MIN(wantedData, remainingInput); - memcpy(dctx->tmpIn + dctx->tmpInSize, srcPtr, sizeToCopy); - srcPtr += sizeToCopy; - dctx->tmpInSize += sizeToCopy; - - if (dctx->tmpInSize < BHSize) { /* not enough input for cBlockSize */ - nextSrcSizeHint = BHSize - dctx->tmpInSize; - doAnotherStage = 0; - break; - } - selectedIn = dctx->tmpIn; - } /* if (dctx->dStage == dstage_storeBlockHeader) */ - - /* decode block header */ - { U32 const blockHeader = LZ4F_readLE32(selectedIn); - size_t const nextCBlockSize = blockHeader & 0x7FFFFFFFU; - size_t const crcSize = dctx->frameInfo.blockChecksumFlag * BFSize; - if (blockHeader==0) { /* frameEnd signal, no more block */ - DEBUGLOG(5, "end of frame"); - dctx->dStage = dstage_getSuffix; - break; - } - if (nextCBlockSize > dctx->maxBlockSize) { - RETURN_ERROR(maxBlockSize_invalid); - } - if (blockHeader & LZ4F_BLOCKUNCOMPRESSED_FLAG) { - /* next block is uncompressed */ - dctx->tmpInTarget = nextCBlockSize; - DEBUGLOG(5, "next block is uncompressed (size %u)", (U32)nextCBlockSize); - if (dctx->frameInfo.blockChecksumFlag) { - (void)XXH32_reset(&dctx->blockChecksum, 0); - } - dctx->dStage = dstage_copyDirect; - break; - } - /* next block is a compressed block */ - dctx->tmpInTarget = nextCBlockSize + crcSize; - dctx->dStage = dstage_getCBlock; - if (dstPtr==dstEnd || srcPtr==srcEnd) { - nextSrcSizeHint = BHSize + nextCBlockSize + crcSize; - doAnotherStage = 0; - } - break; - } - - case dstage_copyDirect: /* uncompressed block */ - DEBUGLOG(6, "dstage_copyDirect"); - { size_t sizeToCopy; - if (dstPtr == NULL) { - sizeToCopy = 0; - } else { - size_t const minBuffSize = MIN((size_t)(srcEnd-srcPtr), (size_t)(dstEnd-dstPtr)); - sizeToCopy = MIN(dctx->tmpInTarget, minBuffSize); - memcpy(dstPtr, srcPtr, sizeToCopy); - if (!dctx->skipChecksum) { - if (dctx->frameInfo.blockChecksumFlag) { - (void)XXH32_update(&dctx->blockChecksum, srcPtr, sizeToCopy); - } - if (dctx->frameInfo.contentChecksumFlag) - (void)XXH32_update(&dctx->xxh, srcPtr, sizeToCopy); - } - if (dctx->frameInfo.contentSize) - dctx->frameRemainingSize -= sizeToCopy; - - /* history management (linked blocks only)*/ - if (dctx->frameInfo.blockMode == LZ4F_blockLinked) { - LZ4F_updateDict(dctx, dstPtr, sizeToCopy, dstStart, 0); - } - srcPtr += sizeToCopy; - dstPtr += sizeToCopy; - } - if (sizeToCopy == dctx->tmpInTarget) { /* all done */ - if (dctx->frameInfo.blockChecksumFlag) { - dctx->tmpInSize = 0; - dctx->dStage = dstage_getBlockChecksum; - } else - dctx->dStage = dstage_getBlockHeader; /* new block */ - break; - } - dctx->tmpInTarget -= sizeToCopy; /* need to copy more */ - } - nextSrcSizeHint = dctx->tmpInTarget + - +(dctx->frameInfo.blockChecksumFlag ? BFSize : 0) - + BHSize /* next header size */; - doAnotherStage = 0; - break; - - /* check block checksum for recently transferred uncompressed block */ - case dstage_getBlockChecksum: - DEBUGLOG(6, "dstage_getBlockChecksum"); - { const void* crcSrc; - if ((srcEnd-srcPtr >= 4) && (dctx->tmpInSize==0)) { - crcSrc = srcPtr; - srcPtr += 4; - } else { - size_t const stillToCopy = 4 - dctx->tmpInSize; - size_t const sizeToCopy = MIN(stillToCopy, (size_t)(srcEnd-srcPtr)); - memcpy(dctx->header + dctx->tmpInSize, srcPtr, sizeToCopy); - dctx->tmpInSize += sizeToCopy; - srcPtr += sizeToCopy; - if (dctx->tmpInSize < 4) { /* all input consumed */ - doAnotherStage = 0; - break; - } - crcSrc = dctx->header; - } - if (!dctx->skipChecksum) { - U32 const readCRC = LZ4F_readLE32(crcSrc); - U32 const calcCRC = XXH32_digest(&dctx->blockChecksum); -#ifndef FUZZING_BUILD_MODE_UNSAFE_FOR_PRODUCTION - DEBUGLOG(6, "compare block checksum"); - if (readCRC != calcCRC) { - DEBUGLOG(4, "incorrect block checksum: %08X != %08X", - readCRC, calcCRC); - RETURN_ERROR(blockChecksum_invalid); - } -#else - (void)readCRC; - (void)calcCRC; -#endif - } } - dctx->dStage = dstage_getBlockHeader; /* new block */ - break; - - case dstage_getCBlock: - DEBUGLOG(6, "dstage_getCBlock"); - if ((size_t)(srcEnd-srcPtr) < dctx->tmpInTarget) { - dctx->tmpInSize = 0; - dctx->dStage = dstage_storeCBlock; - break; - } - /* input large enough to read full block directly */ - selectedIn = srcPtr; - srcPtr += dctx->tmpInTarget; - - if (0) /* always jump over next block */ - case dstage_storeCBlock: - { size_t const wantedData = dctx->tmpInTarget - dctx->tmpInSize; - size_t const inputLeft = (size_t)(srcEnd-srcPtr); - size_t const sizeToCopy = MIN(wantedData, inputLeft); - memcpy(dctx->tmpIn + dctx->tmpInSize, srcPtr, sizeToCopy); - dctx->tmpInSize += sizeToCopy; - srcPtr += sizeToCopy; - if (dctx->tmpInSize < dctx->tmpInTarget) { /* need more input */ - nextSrcSizeHint = (dctx->tmpInTarget - dctx->tmpInSize) - + (dctx->frameInfo.blockChecksumFlag ? BFSize : 0) - + BHSize /* next header size */; - doAnotherStage = 0; - break; - } - selectedIn = dctx->tmpIn; - } - - /* At this stage, input is large enough to decode a block */ - - /* First, decode and control block checksum if it exists */ - if (dctx->frameInfo.blockChecksumFlag) { - assert(dctx->tmpInTarget >= 4); - dctx->tmpInTarget -= 4; - assert(selectedIn != NULL); /* selectedIn is defined at this stage (either srcPtr, or dctx->tmpIn) */ - { U32 const readBlockCrc = LZ4F_readLE32(selectedIn + dctx->tmpInTarget); - U32 const calcBlockCrc = XXH32(selectedIn, dctx->tmpInTarget, 0); -#ifndef FUZZING_BUILD_MODE_UNSAFE_FOR_PRODUCTION - RETURN_ERROR_IF(readBlockCrc != calcBlockCrc, blockChecksum_invalid); -#else - (void)readBlockCrc; - (void)calcBlockCrc; -#endif - } } - - /* decode directly into destination buffer if there is enough room */ - if ( ((size_t)(dstEnd-dstPtr) >= dctx->maxBlockSize) - /* unless the dictionary is stored in tmpOut: - * in which case it's faster to decode within tmpOut - * to benefit from prefix speedup */ - && !(dctx->dict!= NULL && (const BYTE*)dctx->dict + dctx->dictSize == dctx->tmpOut) ) - { - const char* dict = (const char*)dctx->dict; - size_t dictSize = dctx->dictSize; - int decodedSize; - assert(dstPtr != NULL); - if (dict && dictSize > 1 GB) { - /* overflow control : dctx->dictSize is an int, avoid truncation / sign issues */ - dict += dictSize - 64 KB; - dictSize = 64 KB; - } - decodedSize = LZ4_decompress_safe_usingDict( - (const char*)selectedIn, (char*)dstPtr, - (int)dctx->tmpInTarget, (int)dctx->maxBlockSize, - dict, (int)dictSize); - RETURN_ERROR_IF(decodedSize < 0, decompressionFailed); - if ((dctx->frameInfo.contentChecksumFlag) && (!dctx->skipChecksum)) - XXH32_update(&(dctx->xxh), dstPtr, (size_t)decodedSize); - if (dctx->frameInfo.contentSize) - dctx->frameRemainingSize -= (size_t)decodedSize; - - /* dictionary management */ - if (dctx->frameInfo.blockMode==LZ4F_blockLinked) { - LZ4F_updateDict(dctx, dstPtr, (size_t)decodedSize, dstStart, 0); - } - - dstPtr += decodedSize; - dctx->dStage = dstage_getBlockHeader; /* end of block, let's get another one */ - break; - } - - /* not enough place into dst : decode into tmpOut */ - - /* manage dictionary */ - if (dctx->frameInfo.blockMode == LZ4F_blockLinked) { - if (dctx->dict == dctx->tmpOutBuffer) { - /* truncate dictionary to 64 KB if too big */ - if (dctx->dictSize > 128 KB) { - memcpy(dctx->tmpOutBuffer, dctx->dict + dctx->dictSize - 64 KB, 64 KB); - dctx->dictSize = 64 KB; - } - dctx->tmpOut = dctx->tmpOutBuffer + dctx->dictSize; - } else { /* dict not within tmpOut */ - size_t const reservedDictSpace = MIN(dctx->dictSize, 64 KB); - dctx->tmpOut = dctx->tmpOutBuffer + reservedDictSpace; - } } - - /* Decode block into tmpOut */ - { const char* dict = (const char*)dctx->dict; - size_t dictSize = dctx->dictSize; - int decodedSize; - if (dict && dictSize > 1 GB) { - /* the dictSize param is an int, avoid truncation / sign issues */ - dict += dictSize - 64 KB; - dictSize = 64 KB; - } - decodedSize = LZ4_decompress_safe_usingDict( - (const char*)selectedIn, (char*)dctx->tmpOut, - (int)dctx->tmpInTarget, (int)dctx->maxBlockSize, - dict, (int)dictSize); - RETURN_ERROR_IF(decodedSize < 0, decompressionFailed); - if (dctx->frameInfo.contentChecksumFlag && !dctx->skipChecksum) - XXH32_update(&(dctx->xxh), dctx->tmpOut, (size_t)decodedSize); - if (dctx->frameInfo.contentSize) - dctx->frameRemainingSize -= (size_t)decodedSize; - dctx->tmpOutSize = (size_t)decodedSize; - dctx->tmpOutStart = 0; - dctx->dStage = dstage_flushOut; - } - /* fall-through */ - - case dstage_flushOut: /* flush decoded data from tmpOut to dstBuffer */ - DEBUGLOG(6, "dstage_flushOut"); - if (dstPtr != NULL) { - size_t const sizeToCopy = MIN(dctx->tmpOutSize - dctx->tmpOutStart, (size_t)(dstEnd-dstPtr)); - memcpy(dstPtr, dctx->tmpOut + dctx->tmpOutStart, sizeToCopy); - - /* dictionary management */ - if (dctx->frameInfo.blockMode == LZ4F_blockLinked) - LZ4F_updateDict(dctx, dstPtr, sizeToCopy, dstStart, 1 /*withinTmp*/); - - dctx->tmpOutStart += sizeToCopy; - dstPtr += sizeToCopy; - } - if (dctx->tmpOutStart == dctx->tmpOutSize) { /* all flushed */ - dctx->dStage = dstage_getBlockHeader; /* get next block */ - break; - } - /* could not flush everything : stop there, just request a block header */ - doAnotherStage = 0; - nextSrcSizeHint = BHSize; - break; - - case dstage_getSuffix: - RETURN_ERROR_IF(dctx->frameRemainingSize, frameSize_wrong); /* incorrect frame size decoded */ - if (!dctx->frameInfo.contentChecksumFlag) { /* no checksum, frame is completed */ - nextSrcSizeHint = 0; - LZ4F_resetDecompressionContext(dctx); - doAnotherStage = 0; - break; - } - if ((srcEnd - srcPtr) < 4) { /* not enough size for entire CRC */ - dctx->tmpInSize = 0; - dctx->dStage = dstage_storeSuffix; - } else { - selectedIn = srcPtr; - srcPtr += 4; - } - - if (dctx->dStage == dstage_storeSuffix) /* can be skipped */ - case dstage_storeSuffix: - { size_t const remainingInput = (size_t)(srcEnd - srcPtr); - size_t const wantedData = 4 - dctx->tmpInSize; - size_t const sizeToCopy = MIN(wantedData, remainingInput); - memcpy(dctx->tmpIn + dctx->tmpInSize, srcPtr, sizeToCopy); - srcPtr += sizeToCopy; - dctx->tmpInSize += sizeToCopy; - if (dctx->tmpInSize < 4) { /* not enough input to read complete suffix */ - nextSrcSizeHint = 4 - dctx->tmpInSize; - doAnotherStage=0; - break; - } - selectedIn = dctx->tmpIn; - } /* if (dctx->dStage == dstage_storeSuffix) */ - - /* case dstage_checkSuffix: */ /* no direct entry, avoid initialization risks */ - if (!dctx->skipChecksum) { - U32 const readCRC = LZ4F_readLE32(selectedIn); - U32 const resultCRC = XXH32_digest(&(dctx->xxh)); -#ifndef FUZZING_BUILD_MODE_UNSAFE_FOR_PRODUCTION - RETURN_ERROR_IF(readCRC != resultCRC, contentChecksum_invalid); -#else - (void)readCRC; - (void)resultCRC; -#endif - } - nextSrcSizeHint = 0; - LZ4F_resetDecompressionContext(dctx); - doAnotherStage = 0; - break; - - case dstage_getSFrameSize: - if ((srcEnd - srcPtr) >= 4) { - selectedIn = srcPtr; - srcPtr += 4; - } else { - /* not enough input to read cBlockSize field */ - dctx->tmpInSize = 4; - dctx->tmpInTarget = 8; - dctx->dStage = dstage_storeSFrameSize; - } - - if (dctx->dStage == dstage_storeSFrameSize) - case dstage_storeSFrameSize: - { size_t const sizeToCopy = MIN(dctx->tmpInTarget - dctx->tmpInSize, - (size_t)(srcEnd - srcPtr) ); - memcpy(dctx->header + dctx->tmpInSize, srcPtr, sizeToCopy); - srcPtr += sizeToCopy; - dctx->tmpInSize += sizeToCopy; - if (dctx->tmpInSize < dctx->tmpInTarget) { - /* not enough input to get full sBlockSize; wait for more */ - nextSrcSizeHint = dctx->tmpInTarget - dctx->tmpInSize; - doAnotherStage = 0; - break; - } - selectedIn = dctx->header + 4; - } /* if (dctx->dStage == dstage_storeSFrameSize) */ - - /* case dstage_decodeSFrameSize: */ /* no direct entry */ - { size_t const SFrameSize = LZ4F_readLE32(selectedIn); - dctx->frameInfo.contentSize = SFrameSize; - dctx->tmpInTarget = SFrameSize; - dctx->dStage = dstage_skipSkippable; - break; - } - - case dstage_skipSkippable: - { size_t const skipSize = MIN(dctx->tmpInTarget, (size_t)(srcEnd-srcPtr)); - srcPtr += skipSize; - dctx->tmpInTarget -= skipSize; - doAnotherStage = 0; - nextSrcSizeHint = dctx->tmpInTarget; - if (nextSrcSizeHint) break; /* still more to skip */ - /* frame fully skipped : prepare context for a new frame */ - LZ4F_resetDecompressionContext(dctx); - break; - } - } /* switch (dctx->dStage) */ - } /* while (doAnotherStage) */ - - /* preserve history within tmpOut whenever necessary */ - LZ4F_STATIC_ASSERT((unsigned)dstage_init == 2); - if ( (dctx->frameInfo.blockMode==LZ4F_blockLinked) /* next block will use up to 64KB from previous ones */ - && (dctx->dict != dctx->tmpOutBuffer) /* dictionary is not already within tmp */ - && (dctx->dict != NULL) /* dictionary exists */ - && (!decompressOptionsPtr->stableDst) /* cannot rely on dst data to remain there for next call */ - && ((unsigned)(dctx->dStage)-2 < (unsigned)(dstage_getSuffix)-2) ) /* valid stages : [init ... getSuffix[ */ - { - if (dctx->dStage == dstage_flushOut) { - size_t const preserveSize = (size_t)(dctx->tmpOut - dctx->tmpOutBuffer); - size_t copySize = 64 KB - dctx->tmpOutSize; - const BYTE* oldDictEnd = dctx->dict + dctx->dictSize - dctx->tmpOutStart; - if (dctx->tmpOutSize > 64 KB) copySize = 0; - if (copySize > preserveSize) copySize = preserveSize; - assert(dctx->tmpOutBuffer != NULL); - - memcpy(dctx->tmpOutBuffer + preserveSize - copySize, oldDictEnd - copySize, copySize); - - dctx->dict = dctx->tmpOutBuffer; - dctx->dictSize = preserveSize + dctx->tmpOutStart; - } else { - const BYTE* const oldDictEnd = dctx->dict + dctx->dictSize; - size_t const newDictSize = MIN(dctx->dictSize, 64 KB); - - memcpy(dctx->tmpOutBuffer, oldDictEnd - newDictSize, newDictSize); - - dctx->dict = dctx->tmpOutBuffer; - dctx->dictSize = newDictSize; - dctx->tmpOut = dctx->tmpOutBuffer + newDictSize; - } - } - - *srcSizePtr = (size_t)(srcPtr - srcStart); - *dstSizePtr = (size_t)(dstPtr - dstStart); - return nextSrcSizeHint; -} - -/*! LZ4F_decompress_usingDict() : - * Same as LZ4F_decompress(), using a predefined dictionary. - * Dictionary is used "in place", without any preprocessing. - * It must remain accessible throughout the entire frame decoding. - */ -size_t LZ4F_decompress_usingDict(LZ4F_dctx* dctx, - void* dstBuffer, size_t* dstSizePtr, - const void* srcBuffer, size_t* srcSizePtr, - const void* dict, size_t dictSize, - const LZ4F_decompressOptions_t* decompressOptionsPtr) -{ - if (dctx->dStage <= dstage_init) { - dctx->dict = (const BYTE*)dict; - dctx->dictSize = dictSize; - } - return LZ4F_decompress(dctx, dstBuffer, dstSizePtr, - srcBuffer, srcSizePtr, - decompressOptionsPtr); -} diff --git a/CompressSave/LZ4WrapC/lz4/lz4frame.h b/CompressSave/LZ4WrapC/lz4/lz4frame.h deleted file mode 100644 index e8ce66d..0000000 --- a/CompressSave/LZ4WrapC/lz4/lz4frame.h +++ /dev/null @@ -1,707 +0,0 @@ -/* - LZ4F - LZ4-Frame library - Header File - Copyright (C) 2011-2020, Yann Collet. - BSD 2-Clause License (http://www.opensource.org/licenses/bsd-license.php) - - Redistribution and use in source and binary forms, with or without - modification, are permitted provided that the following conditions are - met: - - * Redistributions of source code must retain the above copyright - notice, this list of conditions and the following disclaimer. - * Redistributions in binary form must reproduce the above - copyright notice, this list of conditions and the following disclaimer - in the documentation and/or other materials provided with the - distribution. - - THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - "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 COPYRIGHT - OWNER OR CONTRIBUTORS 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. - - You can contact the author at : - - LZ4 source repository : https://github.com/lz4/lz4 - - LZ4 public forum : https://groups.google.com/forum/#!forum/lz4c -*/ - -/* LZ4F is a stand-alone API able to create and decode LZ4 frames - * conformant with specification v1.6.1 in doc/lz4_Frame_format.md . - * Generated frames are compatible with `lz4` CLI. - * - * LZ4F also offers streaming capabilities. - * - * lz4.h is not required when using lz4frame.h, - * except to extract common constants such as LZ4_VERSION_NUMBER. - * */ - -#ifndef LZ4F_H_09782039843 -#define LZ4F_H_09782039843 - -#if defined (__cplusplus) -extern "C" { -#endif - -/* --- Dependency --- */ -#include /* size_t */ - - -/** - * Introduction - * - * lz4frame.h implements LZ4 frame specification: see doc/lz4_Frame_format.md . - * LZ4 Frames are compatible with `lz4` CLI, - * and designed to be interoperable with any system. -**/ - -/*-*************************************************************** - * Compiler specifics - *****************************************************************/ -/* LZ4_DLL_EXPORT : - * Enable exporting of functions when building a Windows DLL - * LZ4FLIB_VISIBILITY : - * Control library symbols visibility. - */ -#ifndef LZ4FLIB_VISIBILITY -# if defined(__GNUC__) && (__GNUC__ >= 4) -# define LZ4FLIB_VISIBILITY __attribute__ ((visibility ("default"))) -# else -# define LZ4FLIB_VISIBILITY -# endif -#endif -#if defined(LZ4_DLL_EXPORT) && (LZ4_DLL_EXPORT==1) -# define LZ4FLIB_API __declspec(dllexport) LZ4FLIB_VISIBILITY -#elif defined(LZ4_DLL_IMPORT) && (LZ4_DLL_IMPORT==1) -# define LZ4FLIB_API __declspec(dllimport) LZ4FLIB_VISIBILITY -#else -# define LZ4FLIB_API LZ4FLIB_VISIBILITY -#endif - -#ifdef LZ4F_DISABLE_DEPRECATE_WARNINGS -# define LZ4F_DEPRECATE(x) x -#else -# if defined(_MSC_VER) -# define LZ4F_DEPRECATE(x) x /* __declspec(deprecated) x - only works with C++ */ -# elif defined(__clang__) || (defined(__GNUC__) && (__GNUC__ >= 6)) -# define LZ4F_DEPRECATE(x) x __attribute__((deprecated)) -# else -# define LZ4F_DEPRECATE(x) x /* no deprecation warning for this compiler */ -# endif -#endif - - -/*-************************************ - * Error management - **************************************/ -typedef size_t LZ4F_errorCode_t; - -LZ4FLIB_API unsigned LZ4F_isError(LZ4F_errorCode_t code); /**< tells when a function result is an error code */ -LZ4FLIB_API const char* LZ4F_getErrorName(LZ4F_errorCode_t code); /**< return error code string; for debugging */ - - -/*-************************************ - * Frame compression types - ************************************* */ -/* #define LZ4F_ENABLE_OBSOLETE_ENUMS // uncomment to enable obsolete enums */ -#ifdef LZ4F_ENABLE_OBSOLETE_ENUMS -# define LZ4F_OBSOLETE_ENUM(x) , LZ4F_DEPRECATE(x) = LZ4F_##x -#else -# define LZ4F_OBSOLETE_ENUM(x) -#endif - -/* The larger the block size, the (slightly) better the compression ratio, - * though there are diminishing returns. - * Larger blocks also increase memory usage on both compression and decompression sides. - */ -typedef enum { - LZ4F_default=0, - LZ4F_max64KB=4, - LZ4F_max256KB=5, - LZ4F_max1MB=6, - LZ4F_max4MB=7 - LZ4F_OBSOLETE_ENUM(max64KB) - LZ4F_OBSOLETE_ENUM(max256KB) - LZ4F_OBSOLETE_ENUM(max1MB) - LZ4F_OBSOLETE_ENUM(max4MB) -} LZ4F_blockSizeID_t; - -/* Linked blocks sharply reduce inefficiencies when using small blocks, - * they compress better. - * However, some LZ4 decoders are only compatible with independent blocks */ -typedef enum { - LZ4F_blockLinked=0, - LZ4F_blockIndependent - LZ4F_OBSOLETE_ENUM(blockLinked) - LZ4F_OBSOLETE_ENUM(blockIndependent) -} LZ4F_blockMode_t; - -typedef enum { - LZ4F_noContentChecksum=0, - LZ4F_contentChecksumEnabled - LZ4F_OBSOLETE_ENUM(noContentChecksum) - LZ4F_OBSOLETE_ENUM(contentChecksumEnabled) -} LZ4F_contentChecksum_t; - -typedef enum { - LZ4F_noBlockChecksum=0, - LZ4F_blockChecksumEnabled -} LZ4F_blockChecksum_t; - -typedef enum { - LZ4F_frame=0, - LZ4F_skippableFrame - LZ4F_OBSOLETE_ENUM(skippableFrame) -} LZ4F_frameType_t; - -#ifdef LZ4F_ENABLE_OBSOLETE_ENUMS -typedef LZ4F_blockSizeID_t blockSizeID_t; -typedef LZ4F_blockMode_t blockMode_t; -typedef LZ4F_frameType_t frameType_t; -typedef LZ4F_contentChecksum_t contentChecksum_t; -#endif - -/*! LZ4F_frameInfo_t : - * makes it possible to set or read frame parameters. - * Structure must be first init to 0, using memset() or LZ4F_INIT_FRAMEINFO, - * setting all parameters to default. - * It's then possible to update selectively some parameters */ -typedef struct { - LZ4F_blockSizeID_t blockSizeID; /* max64KB, max256KB, max1MB, max4MB; 0 == default */ - LZ4F_blockMode_t blockMode; /* LZ4F_blockLinked, LZ4F_blockIndependent; 0 == default */ - LZ4F_contentChecksum_t contentChecksumFlag; /* 1: frame terminated with 32-bit checksum of decompressed data; 0: disabled (default) */ - LZ4F_frameType_t frameType; /* read-only field : LZ4F_frame or LZ4F_skippableFrame */ - unsigned long long contentSize; /* Size of uncompressed content ; 0 == unknown */ - unsigned dictID; /* Dictionary ID, sent by compressor to help decoder select correct dictionary; 0 == no dictID provided */ - LZ4F_blockChecksum_t blockChecksumFlag; /* 1: each block followed by a checksum of block's compressed data; 0: disabled (default) */ -} LZ4F_frameInfo_t; - -#define LZ4F_INIT_FRAMEINFO { LZ4F_default, LZ4F_blockLinked, LZ4F_noContentChecksum, LZ4F_frame, 0ULL, 0U, LZ4F_noBlockChecksum } /* v1.8.3+ */ - -/*! LZ4F_preferences_t : - * makes it possible to supply advanced compression instructions to streaming interface. - * Structure must be first init to 0, using memset() or LZ4F_INIT_PREFERENCES, - * setting all parameters to default. - * All reserved fields must be set to zero. */ -typedef struct { - LZ4F_frameInfo_t frameInfo; - int compressionLevel; /* 0: default (fast mode); values > LZ4HC_CLEVEL_MAX count as LZ4HC_CLEVEL_MAX; values < 0 trigger "fast acceleration" */ - unsigned autoFlush; /* 1: always flush; reduces usage of internal buffers */ - unsigned favorDecSpeed; /* 1: parser favors decompression speed vs compression ratio. Only works for high compression modes (>= LZ4HC_CLEVEL_OPT_MIN) */ /* v1.8.2+ */ - unsigned reserved[3]; /* must be zero for forward compatibility */ -} LZ4F_preferences_t; - -#define LZ4F_INIT_PREFERENCES { LZ4F_INIT_FRAMEINFO, 0, 0u, 0u, { 0u, 0u, 0u } } /* v1.8.3+ */ - - -/*-********************************* -* Simple compression function -***********************************/ - -LZ4FLIB_API int LZ4F_compressionLevel_max(void); /* v1.8.0+ */ - -/*! LZ4F_compressFrameBound() : - * Returns the maximum possible compressed size with LZ4F_compressFrame() given srcSize and preferences. - * `preferencesPtr` is optional. It can be replaced by NULL, in which case, the function will assume default preferences. - * Note : this result is only usable with LZ4F_compressFrame(). - * It may also be relevant to LZ4F_compressUpdate() _only if_ no flush() operation is ever performed. - */ -LZ4FLIB_API size_t LZ4F_compressFrameBound(size_t srcSize, const LZ4F_preferences_t* preferencesPtr); - -/*! LZ4F_compressFrame() : - * Compress srcBuffer content into an LZ4-compressed frame. - * It's a one shot operation, all input content is consumed, and all output is generated. - * - * Note : it's a stateless operation (no LZ4F_cctx state needed). - * In order to reduce load on the allocator, LZ4F_compressFrame(), by default, - * uses the stack to allocate space for the compression state and some table. - * If this usage of the stack is too much for your application, - * consider compiling `lz4frame.c` with compile-time macro LZ4F_HEAPMODE set to 1 instead. - * All state allocations will use the Heap. - * It also means each invocation of LZ4F_compressFrame() will trigger several internal alloc/free invocations. - * - * @dstCapacity MUST be >= LZ4F_compressFrameBound(srcSize, preferencesPtr). - * @preferencesPtr is optional : one can provide NULL, in which case all preferences are set to default. - * @return : number of bytes written into dstBuffer. - * or an error code if it fails (can be tested using LZ4F_isError()) - */ -LZ4FLIB_API size_t LZ4F_compressFrame(void* dstBuffer, size_t dstCapacity, - const void* srcBuffer, size_t srcSize, - const LZ4F_preferences_t* preferencesPtr); - - -/*-*********************************** -* Advanced compression functions -*************************************/ -typedef struct LZ4F_cctx_s LZ4F_cctx; /* incomplete type */ -typedef LZ4F_cctx* LZ4F_compressionContext_t; /* for compatibility with older APIs, prefer using LZ4F_cctx */ - -typedef struct { - unsigned stableSrc; /* 1 == src content will remain present on future calls to LZ4F_compress(); skip copying src content within tmp buffer */ - unsigned reserved[3]; -} LZ4F_compressOptions_t; - -/*--- Resource Management ---*/ - -#define LZ4F_VERSION 100 /* This number can be used to check for an incompatible API breaking change */ -LZ4FLIB_API unsigned LZ4F_getVersion(void); - -/*! LZ4F_createCompressionContext() : - * The first thing to do is to create a compressionContext object, - * which will keep track of operation state during streaming compression. - * This is achieved using LZ4F_createCompressionContext(), which takes as argument a version, - * and a pointer to LZ4F_cctx*, to write the resulting pointer into. - * @version provided MUST be LZ4F_VERSION. It is intended to track potential version mismatch, notably when using DLL. - * The function provides a pointer to a fully allocated LZ4F_cctx object. - * @cctxPtr MUST be != NULL. - * If @return != zero, context creation failed. - * A created compression context can be employed multiple times for consecutive streaming operations. - * Once all streaming compression jobs are completed, - * the state object can be released using LZ4F_freeCompressionContext(). - * Note1 : LZ4F_freeCompressionContext() is always successful. Its return value can be ignored. - * Note2 : LZ4F_freeCompressionContext() works fine with NULL input pointers (do nothing). -**/ -LZ4FLIB_API LZ4F_errorCode_t LZ4F_createCompressionContext(LZ4F_cctx** cctxPtr, unsigned version); -LZ4FLIB_API LZ4F_errorCode_t LZ4F_freeCompressionContext(LZ4F_cctx* cctx); - - -/*---- Compression ----*/ - -#define LZ4F_HEADER_SIZE_MIN 7 /* LZ4 Frame header size can vary, depending on selected parameters */ -#define LZ4F_HEADER_SIZE_MAX 19 - -/* Size in bytes of a block header in little-endian format. Highest bit indicates if block data is uncompressed */ -#define LZ4F_BLOCK_HEADER_SIZE 4 - -/* Size in bytes of a block checksum footer in little-endian format. */ -#define LZ4F_BLOCK_CHECKSUM_SIZE 4 - -/* Size in bytes of the content checksum. */ -#define LZ4F_CONTENT_CHECKSUM_SIZE 4 - -/*! LZ4F_compressBegin() : - * will write the frame header into dstBuffer. - * dstCapacity must be >= LZ4F_HEADER_SIZE_MAX bytes. - * `prefsPtr` is optional : NULL can be provided to set all preferences to default. - * @return : number of bytes written into dstBuffer for the header - * or an error code (which can be tested using LZ4F_isError()) - */ -LZ4FLIB_API size_t LZ4F_compressBegin(LZ4F_cctx* cctx, - void* dstBuffer, size_t dstCapacity, - const LZ4F_preferences_t* prefsPtr); - -/*! LZ4F_compressBound() : - * Provides minimum dstCapacity required to guarantee success of - * LZ4F_compressUpdate(), given a srcSize and preferences, for a worst case scenario. - * When srcSize==0, LZ4F_compressBound() provides an upper bound for LZ4F_flush() and LZ4F_compressEnd() instead. - * Note that the result is only valid for a single invocation of LZ4F_compressUpdate(). - * When invoking LZ4F_compressUpdate() multiple times, - * if the output buffer is gradually filled up instead of emptied and re-used from its start, - * one must check if there is enough remaining capacity before each invocation, using LZ4F_compressBound(). - * @return is always the same for a srcSize and prefsPtr. - * prefsPtr is optional : when NULL is provided, preferences will be set to cover worst case scenario. - * tech details : - * @return if automatic flushing is not enabled, includes the possibility that internal buffer might already be filled by up to (blockSize-1) bytes. - * It also includes frame footer (ending + checksum), since it might be generated by LZ4F_compressEnd(). - * @return doesn't include frame header, as it was already generated by LZ4F_compressBegin(). - */ -LZ4FLIB_API size_t LZ4F_compressBound(size_t srcSize, const LZ4F_preferences_t* prefsPtr); - -/*! LZ4F_compressUpdate() : - * LZ4F_compressUpdate() can be called repetitively to compress as much data as necessary. - * Important rule: dstCapacity MUST be large enough to ensure operation success even in worst case situations. - * This value is provided by LZ4F_compressBound(). - * If this condition is not respected, LZ4F_compress() will fail (result is an errorCode). - * After an error, the state is left in a UB state, and must be re-initialized or freed. - * If previously an uncompressed block was written, buffered data is flushed - * before appending compressed data is continued. - * `cOptPtr` is optional : NULL can be provided, in which case all options are set to default. - * @return : number of bytes written into `dstBuffer` (it can be zero, meaning input data was just buffered). - * or an error code if it fails (which can be tested using LZ4F_isError()) - */ -LZ4FLIB_API size_t LZ4F_compressUpdate(LZ4F_cctx* cctx, - void* dstBuffer, size_t dstCapacity, - const void* srcBuffer, size_t srcSize, - const LZ4F_compressOptions_t* cOptPtr); - -/*! LZ4F_flush() : - * When data must be generated and sent immediately, without waiting for a block to be completely filled, - * it's possible to call LZ4_flush(). It will immediately compress any data buffered within cctx. - * `dstCapacity` must be large enough to ensure the operation will be successful. - * `cOptPtr` is optional : it's possible to provide NULL, all options will be set to default. - * @return : nb of bytes written into dstBuffer (can be zero, when there is no data stored within cctx) - * or an error code if it fails (which can be tested using LZ4F_isError()) - * Note : LZ4F_flush() is guaranteed to be successful when dstCapacity >= LZ4F_compressBound(0, prefsPtr). - */ -LZ4FLIB_API size_t LZ4F_flush(LZ4F_cctx* cctx, - void* dstBuffer, size_t dstCapacity, - const LZ4F_compressOptions_t* cOptPtr); - -/*! LZ4F_compressEnd() : - * To properly finish an LZ4 frame, invoke LZ4F_compressEnd(). - * It will flush whatever data remained within `cctx` (like LZ4_flush()) - * and properly finalize the frame, with an endMark and a checksum. - * `cOptPtr` is optional : NULL can be provided, in which case all options will be set to default. - * @return : nb of bytes written into dstBuffer, necessarily >= 4 (endMark), - * or an error code if it fails (which can be tested using LZ4F_isError()) - * Note : LZ4F_compressEnd() is guaranteed to be successful when dstCapacity >= LZ4F_compressBound(0, prefsPtr). - * A successful call to LZ4F_compressEnd() makes `cctx` available again for another compression task. - */ -LZ4FLIB_API size_t LZ4F_compressEnd(LZ4F_cctx* cctx, - void* dstBuffer, size_t dstCapacity, - const LZ4F_compressOptions_t* cOptPtr); - - -/*-********************************* -* Decompression functions -***********************************/ -typedef struct LZ4F_dctx_s LZ4F_dctx; /* incomplete type */ -typedef LZ4F_dctx* LZ4F_decompressionContext_t; /* compatibility with previous API versions */ - -typedef struct { - unsigned stableDst; /* pledges that last 64KB decompressed data will remain available unmodified between invocations. - * This optimization skips storage operations in tmp buffers. */ - unsigned skipChecksums; /* disable checksum calculation and verification, even when one is present in frame, to save CPU time. - * Setting this option to 1 once disables all checksums for the rest of the frame. */ - unsigned reserved1; /* must be set to zero for forward compatibility */ - unsigned reserved0; /* idem */ -} LZ4F_decompressOptions_t; - - -/* Resource management */ - -/*! LZ4F_createDecompressionContext() : - * Create an LZ4F_dctx object, to track all decompression operations. - * @version provided MUST be LZ4F_VERSION. - * @dctxPtr MUST be valid. - * The function fills @dctxPtr with the value of a pointer to an allocated and initialized LZ4F_dctx object. - * The @return is an errorCode, which can be tested using LZ4F_isError(). - * dctx memory can be released using LZ4F_freeDecompressionContext(); - * Result of LZ4F_freeDecompressionContext() indicates current state of decompressionContext when being released. - * That is, it should be == 0 if decompression has been completed fully and correctly. - */ -LZ4FLIB_API LZ4F_errorCode_t LZ4F_createDecompressionContext(LZ4F_dctx** dctxPtr, unsigned version); -LZ4FLIB_API LZ4F_errorCode_t LZ4F_freeDecompressionContext(LZ4F_dctx* dctx); - - -/*-*********************************** -* Streaming decompression functions -*************************************/ - -#define LZ4F_MAGICNUMBER 0x184D2204U -#define LZ4F_MAGIC_SKIPPABLE_START 0x184D2A50U -#define LZ4F_MIN_SIZE_TO_KNOW_HEADER_LENGTH 5 - -/*! LZ4F_headerSize() : v1.9.0+ - * Provide the header size of a frame starting at `src`. - * `srcSize` must be >= LZ4F_MIN_SIZE_TO_KNOW_HEADER_LENGTH, - * which is enough to decode the header length. - * @return : size of frame header - * or an error code, which can be tested using LZ4F_isError() - * note : Frame header size is variable, but is guaranteed to be - * >= LZ4F_HEADER_SIZE_MIN bytes, and <= LZ4F_HEADER_SIZE_MAX bytes. - */ -LZ4FLIB_API size_t LZ4F_headerSize(const void* src, size_t srcSize); - -/*! LZ4F_getFrameInfo() : - * This function extracts frame parameters (max blockSize, dictID, etc.). - * Its usage is optional: user can also invoke LZ4F_decompress() directly. - * - * Extracted information will fill an existing LZ4F_frameInfo_t structure. - * This can be useful for allocation and dictionary identification purposes. - * - * LZ4F_getFrameInfo() can work in the following situations : - * - * 1) At the beginning of a new frame, before any invocation of LZ4F_decompress(). - * It will decode header from `srcBuffer`, - * consuming the header and starting the decoding process. - * - * Input size must be large enough to contain the full frame header. - * Frame header size can be known beforehand by LZ4F_headerSize(). - * Frame header size is variable, but is guaranteed to be >= LZ4F_HEADER_SIZE_MIN bytes, - * and not more than <= LZ4F_HEADER_SIZE_MAX bytes. - * Hence, blindly providing LZ4F_HEADER_SIZE_MAX bytes or more will always work. - * It's allowed to provide more input data than the header size, - * LZ4F_getFrameInfo() will only consume the header. - * - * If input size is not large enough, - * aka if it's smaller than header size, - * function will fail and return an error code. - * - * 2) After decoding has been started, - * it's possible to invoke LZ4F_getFrameInfo() anytime - * to extract already decoded frame parameters stored within dctx. - * - * Note that, if decoding has barely started, - * and not yet read enough information to decode the header, - * LZ4F_getFrameInfo() will fail. - * - * The number of bytes consumed from srcBuffer will be updated in *srcSizePtr (necessarily <= original value). - * LZ4F_getFrameInfo() only consumes bytes when decoding has not yet started, - * and when decoding the header has been successful. - * Decompression must then resume from (srcBuffer + *srcSizePtr). - * - * @return : a hint about how many srcSize bytes LZ4F_decompress() expects for next call, - * or an error code which can be tested using LZ4F_isError(). - * note 1 : in case of error, dctx is not modified. Decoding operation can resume from beginning safely. - * note 2 : frame parameters are *copied into* an already allocated LZ4F_frameInfo_t structure. - */ -LZ4FLIB_API size_t -LZ4F_getFrameInfo(LZ4F_dctx* dctx, - LZ4F_frameInfo_t* frameInfoPtr, - const void* srcBuffer, size_t* srcSizePtr); - -/*! LZ4F_decompress() : - * Call this function repetitively to regenerate data compressed in `srcBuffer`. - * - * The function requires a valid dctx state. - * It will read up to *srcSizePtr bytes from srcBuffer, - * and decompress data into dstBuffer, of capacity *dstSizePtr. - * - * The nb of bytes consumed from srcBuffer will be written into *srcSizePtr (necessarily <= original value). - * The nb of bytes decompressed into dstBuffer will be written into *dstSizePtr (necessarily <= original value). - * - * The function does not necessarily read all input bytes, so always check value in *srcSizePtr. - * Unconsumed source data must be presented again in subsequent invocations. - * - * `dstBuffer` can freely change between each consecutive function invocation. - * `dstBuffer` content will be overwritten. - * - * Note: if `LZ4F_getFrameInfo()` is called before `LZ4F_decompress()`, srcBuffer must be updated to reflect - * the number of bytes consumed after reading the frame header. Failure to update srcBuffer before calling - * `LZ4F_decompress()` will cause decompression failure or, even worse, successful but incorrect decompression. - * See the `LZ4F_getFrameInfo()` docs for details. - * - * @return : an hint of how many `srcSize` bytes LZ4F_decompress() expects for next call. - * Schematically, it's the size of the current (or remaining) compressed block + header of next block. - * Respecting the hint provides some small speed benefit, because it skips intermediate buffers. - * This is just a hint though, it's always possible to provide any srcSize. - * - * When a frame is fully decoded, @return will be 0 (no more data expected). - * When provided with more bytes than necessary to decode a frame, - * LZ4F_decompress() will stop reading exactly at end of current frame, and @return 0. - * - * If decompression failed, @return is an error code, which can be tested using LZ4F_isError(). - * After a decompression error, the `dctx` context is not resumable. - * Use LZ4F_resetDecompressionContext() to return to clean state. - * - * After a frame is fully decoded, dctx can be used again to decompress another frame. - */ -LZ4FLIB_API size_t -LZ4F_decompress(LZ4F_dctx* dctx, - void* dstBuffer, size_t* dstSizePtr, - const void* srcBuffer, size_t* srcSizePtr, - const LZ4F_decompressOptions_t* dOptPtr); - - -/*! LZ4F_resetDecompressionContext() : added in v1.8.0 - * In case of an error, the context is left in "undefined" state. - * In which case, it's necessary to reset it, before re-using it. - * This method can also be used to abruptly stop any unfinished decompression, - * and start a new one using same context resources. */ -LZ4FLIB_API void LZ4F_resetDecompressionContext(LZ4F_dctx* dctx); /* always successful */ - - - -#if defined (__cplusplus) -} -#endif - -#endif /* LZ4F_H_09782039843 */ - -#if defined(LZ4F_STATIC_LINKING_ONLY) && !defined(LZ4F_H_STATIC_09782039843) -#define LZ4F_H_STATIC_09782039843 - -#if defined (__cplusplus) -extern "C" { -#endif - -/* These declarations are not stable and may change in the future. - * They are therefore only safe to depend on - * when the caller is statically linked against the library. - * To access their declarations, define LZ4F_STATIC_LINKING_ONLY. - * - * By default, these symbols aren't published into shared/dynamic libraries. - * You can override this behavior and force them to be published - * by defining LZ4F_PUBLISH_STATIC_FUNCTIONS. - * Use at your own risk. - */ -#ifdef LZ4F_PUBLISH_STATIC_FUNCTIONS -# define LZ4FLIB_STATIC_API LZ4FLIB_API -#else -# define LZ4FLIB_STATIC_API -#endif - - -/* --- Error List --- */ -#define LZ4F_LIST_ERRORS(ITEM) \ - ITEM(OK_NoError) \ - ITEM(ERROR_GENERIC) \ - ITEM(ERROR_maxBlockSize_invalid) \ - ITEM(ERROR_blockMode_invalid) \ - ITEM(ERROR_contentChecksumFlag_invalid) \ - ITEM(ERROR_compressionLevel_invalid) \ - ITEM(ERROR_headerVersion_wrong) \ - ITEM(ERROR_blockChecksum_invalid) \ - ITEM(ERROR_reservedFlag_set) \ - ITEM(ERROR_allocation_failed) \ - ITEM(ERROR_srcSize_tooLarge) \ - ITEM(ERROR_dstMaxSize_tooSmall) \ - ITEM(ERROR_frameHeader_incomplete) \ - ITEM(ERROR_frameType_unknown) \ - ITEM(ERROR_frameSize_wrong) \ - ITEM(ERROR_srcPtr_wrong) \ - ITEM(ERROR_decompressionFailed) \ - ITEM(ERROR_headerChecksum_invalid) \ - ITEM(ERROR_contentChecksum_invalid) \ - ITEM(ERROR_frameDecoding_alreadyStarted) \ - ITEM(ERROR_compressionState_uninitialized) \ - ITEM(ERROR_parameter_null) \ - ITEM(ERROR_maxCode) - -#define LZ4F_GENERATE_ENUM(ENUM) LZ4F_##ENUM, - -/* enum list is exposed, to handle specific errors */ -typedef enum { LZ4F_LIST_ERRORS(LZ4F_GENERATE_ENUM) - _LZ4F_dummy_error_enum_for_c89_never_used } LZ4F_errorCodes; - -LZ4FLIB_STATIC_API LZ4F_errorCodes LZ4F_getErrorCode(size_t functionResult); - - -/*! LZ4F_getBlockSize() : - * Return, in scalar format (size_t), - * the maximum block size associated with blockSizeID. -**/ -LZ4FLIB_STATIC_API size_t LZ4F_getBlockSize(LZ4F_blockSizeID_t blockSizeID); - -/*! LZ4F_uncompressedUpdate() : - * LZ4F_uncompressedUpdate() can be called repetitively to add as much data uncompressed data as necessary. - * Important rule: dstCapacity MUST be large enough to store the entire source buffer as - * no compression is done for this operation - * If this condition is not respected, LZ4F_uncompressedUpdate() will fail (result is an errorCode). - * After an error, the state is left in a UB state, and must be re-initialized or freed. - * If previously a compressed block was written, buffered data is flushed - * before appending uncompressed data is continued. - * This is only supported when LZ4F_blockIndependent is used - * `cOptPtr` is optional : NULL can be provided, in which case all options are set to default. - * @return : number of bytes written into `dstBuffer` (it can be zero, meaning input data was just buffered). - * or an error code if it fails (which can be tested using LZ4F_isError()) - */ -LZ4FLIB_STATIC_API size_t -LZ4F_uncompressedUpdate(LZ4F_cctx* cctx, - void* dstBuffer, size_t dstCapacity, - const void* srcBuffer, size_t srcSize, - const LZ4F_compressOptions_t* cOptPtr); - -/********************************** - * Bulk processing dictionary API - *********************************/ - -/* A Dictionary is useful for the compression of small messages (KB range). - * It dramatically improves compression efficiency. - * - * LZ4 can ingest any input as dictionary, though only the last 64 KB are useful. - * Best results are generally achieved by using Zstandard's Dictionary Builder - * to generate a high-quality dictionary from a set of samples. - * - * Loading a dictionary has a cost, since it involves construction of tables. - * The Bulk processing dictionary API makes it possible to share this cost - * over an arbitrary number of compression jobs, even concurrently, - * markedly improving compression latency for these cases. - * - * The same dictionary will have to be used on the decompression side - * for decoding to be successful. - * To help identify the correct dictionary at decoding stage, - * the frame header allows optional embedding of a dictID field. - */ -typedef struct LZ4F_CDict_s LZ4F_CDict; - -/*! LZ4_createCDict() : - * When compressing multiple messages / blocks using the same dictionary, it's recommended to load it just once. - * LZ4_createCDict() will create a digested dictionary, ready to start future compression operations without startup delay. - * LZ4_CDict can be created once and shared by multiple threads concurrently, since its usage is read-only. - * `dictBuffer` can be released after LZ4_CDict creation, since its content is copied within CDict */ -LZ4FLIB_STATIC_API LZ4F_CDict* LZ4F_createCDict(const void* dictBuffer, size_t dictSize); -LZ4FLIB_STATIC_API void LZ4F_freeCDict(LZ4F_CDict* CDict); - - -/*! LZ4_compressFrame_usingCDict() : - * Compress an entire srcBuffer into a valid LZ4 frame using a digested Dictionary. - * cctx must point to a context created by LZ4F_createCompressionContext(). - * If cdict==NULL, compress without a dictionary. - * dstBuffer MUST be >= LZ4F_compressFrameBound(srcSize, preferencesPtr). - * If this condition is not respected, function will fail (@return an errorCode). - * The LZ4F_preferences_t structure is optional : you may provide NULL as argument, - * but it's not recommended, as it's the only way to provide dictID in the frame header. - * @return : number of bytes written into dstBuffer. - * or an error code if it fails (can be tested using LZ4F_isError()) */ -LZ4FLIB_STATIC_API size_t -LZ4F_compressFrame_usingCDict(LZ4F_cctx* cctx, - void* dst, size_t dstCapacity, - const void* src, size_t srcSize, - const LZ4F_CDict* cdict, - const LZ4F_preferences_t* preferencesPtr); - - -/*! LZ4F_compressBegin_usingCDict() : - * Inits streaming dictionary compression, and writes the frame header into dstBuffer. - * dstCapacity must be >= LZ4F_HEADER_SIZE_MAX bytes. - * `prefsPtr` is optional : you may provide NULL as argument, - * however, it's the only way to provide dictID in the frame header. - * @return : number of bytes written into dstBuffer for the header, - * or an error code (which can be tested using LZ4F_isError()) */ -LZ4FLIB_STATIC_API size_t -LZ4F_compressBegin_usingCDict(LZ4F_cctx* cctx, - void* dstBuffer, size_t dstCapacity, - const LZ4F_CDict* cdict, - const LZ4F_preferences_t* prefsPtr); - - -/*! LZ4F_decompress_usingDict() : - * Same as LZ4F_decompress(), using a predefined dictionary. - * Dictionary is used "in place", without any preprocessing. -** It must remain accessible throughout the entire frame decoding. */ -LZ4FLIB_STATIC_API size_t -LZ4F_decompress_usingDict(LZ4F_dctx* dctxPtr, - void* dstBuffer, size_t* dstSizePtr, - const void* srcBuffer, size_t* srcSizePtr, - const void* dict, size_t dictSize, - const LZ4F_decompressOptions_t* decompressOptionsPtr); - - -/*! Custom memory allocation : v1.9.4+ - * These prototypes make it possible to pass custom allocation/free functions. - * LZ4F_customMem is provided at state creation time, using LZ4F_create*_advanced() listed below. - * All allocation/free operations will be completed using these custom variants instead of regular ones. - */ -typedef void* (*LZ4F_AllocFunction) (void* opaqueState, size_t size); -typedef void* (*LZ4F_CallocFunction) (void* opaqueState, size_t size); -typedef void (*LZ4F_FreeFunction) (void* opaqueState, void* address); -typedef struct { - LZ4F_AllocFunction customAlloc; - LZ4F_CallocFunction customCalloc; /* optional; when not defined, uses customAlloc + memset */ - LZ4F_FreeFunction customFree; - void* opaqueState; -} LZ4F_CustomMem; -static -#ifdef __GNUC__ -__attribute__((__unused__)) -#endif -LZ4F_CustomMem const LZ4F_defaultCMem = { NULL, NULL, NULL, NULL }; /**< this constant defers to stdlib's functions */ - -LZ4FLIB_STATIC_API LZ4F_cctx* LZ4F_createCompressionContext_advanced(LZ4F_CustomMem customMem, unsigned version); -LZ4FLIB_STATIC_API LZ4F_dctx* LZ4F_createDecompressionContext_advanced(LZ4F_CustomMem customMem, unsigned version); -LZ4FLIB_STATIC_API LZ4F_CDict* LZ4F_createCDict_advanced(LZ4F_CustomMem customMem, const void* dictBuffer, size_t dictSize); - - -#if defined (__cplusplus) -} -#endif - -#endif /* defined(LZ4F_STATIC_LINKING_ONLY) && !defined(LZ4F_H_STATIC_09782039843) */ diff --git a/CompressSave/LZ4WrapC/lz4/lz4frame_static.h b/CompressSave/LZ4WrapC/lz4/lz4frame_static.h deleted file mode 100644 index 2b44a63..0000000 --- a/CompressSave/LZ4WrapC/lz4/lz4frame_static.h +++ /dev/null @@ -1,47 +0,0 @@ -/* - LZ4 auto-framing library - Header File for static linking only - Copyright (C) 2011-2020, Yann Collet. - - BSD 2-Clause License (http://www.opensource.org/licenses/bsd-license.php) - - Redistribution and use in source and binary forms, with or without - modification, are permitted provided that the following conditions are - met: - - * Redistributions of source code must retain the above copyright - notice, this list of conditions and the following disclaimer. - * Redistributions in binary form must reproduce the above - copyright notice, this list of conditions and the following disclaimer - in the documentation and/or other materials provided with the - distribution. - - THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - "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 COPYRIGHT - OWNER OR CONTRIBUTORS 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. - - You can contact the author at : - - LZ4 source repository : https://github.com/lz4/lz4 - - LZ4 public forum : https://groups.google.com/forum/#!forum/lz4c -*/ - -#ifndef LZ4FRAME_STATIC_H_0398209384 -#define LZ4FRAME_STATIC_H_0398209384 - -/* The declarations that formerly were made here have been merged into - * lz4frame.h, protected by the LZ4F_STATIC_LINKING_ONLY macro. Going forward, - * it is recommended to simply include that header directly. - */ - -#define LZ4F_STATIC_LINKING_ONLY -#include "lz4frame.h" - -#endif /* LZ4FRAME_STATIC_H_0398209384 */ diff --git a/CompressSave/LZ4WrapC/lz4/lz4hc.c b/CompressSave/LZ4WrapC/lz4/lz4hc.c deleted file mode 100644 index 651f190..0000000 --- a/CompressSave/LZ4WrapC/lz4/lz4hc.c +++ /dev/null @@ -1,1637 +0,0 @@ -/* - LZ4 HC - High Compression Mode of LZ4 - Copyright (C) 2011-2020, Yann Collet. - - BSD 2-Clause License (http://www.opensource.org/licenses/bsd-license.php) - - Redistribution and use in source and binary forms, with or without - modification, are permitted provided that the following conditions are - met: - - * Redistributions of source code must retain the above copyright - notice, this list of conditions and the following disclaimer. - * Redistributions in binary form must reproduce the above - copyright notice, this list of conditions and the following disclaimer - in the documentation and/or other materials provided with the - distribution. - - THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - "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 COPYRIGHT - OWNER OR CONTRIBUTORS 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. - - You can contact the author at : - - LZ4 source repository : https://github.com/lz4/lz4 - - LZ4 public forum : https://groups.google.com/forum/#!forum/lz4c -*/ -/* note : lz4hc is not an independent module, it requires lz4.h/lz4.c for proper compilation */ - - -/* ************************************* -* Tuning Parameter -***************************************/ - -/*! HEAPMODE : - * Select how stateless HC compression functions like `LZ4_compress_HC()` - * allocate memory for their workspace: - * in stack (0:fastest), or in heap (1:default, requires malloc()). - * Since workspace is rather large, heap mode is recommended. -**/ -#ifndef LZ4HC_HEAPMODE -# define LZ4HC_HEAPMODE 1 -#endif - - -/*=== Dependency ===*/ -#define LZ4_HC_STATIC_LINKING_ONLY -#include "lz4hc.h" - - -/*=== Common definitions ===*/ -#if defined(__GNUC__) -# pragma GCC diagnostic ignored "-Wunused-function" -#endif -#if defined (__clang__) -# pragma clang diagnostic ignored "-Wunused-function" -#endif - -#define LZ4_COMMONDEFS_ONLY -#ifndef LZ4_SRC_INCLUDED -#include "lz4.c" /* LZ4_count, constants, mem */ -#endif - - -/*=== Enums ===*/ -typedef enum { noDictCtx, usingDictCtxHc } dictCtx_directive; - - -/*=== Constants ===*/ -#define OPTIMAL_ML (int)((ML_MASK-1)+MINMATCH) -#define LZ4_OPT_NUM (1<<12) - - -/*=== Macros ===*/ -#define MIN(a,b) ( (a) < (b) ? (a) : (b) ) -#define MAX(a,b) ( (a) > (b) ? (a) : (b) ) -#define HASH_FUNCTION(i) (((i) * 2654435761U) >> ((MINMATCH*8)-LZ4HC_HASH_LOG)) -#define DELTANEXTMAXD(p) chainTable[(p) & LZ4HC_MAXD_MASK] /* flexible, LZ4HC_MAXD dependent */ -#define DELTANEXTU16(table, pos) table[(U16)(pos)] /* faster */ -/* Make fields passed to, and updated by LZ4HC_encodeSequence explicit */ -#define UPDATABLE(ip, op, anchor) &ip, &op, &anchor - -#define LZ4HC_HASHSIZE 4 -static U32 LZ4HC_hashPtr(const void* ptr) { return HASH_FUNCTION(LZ4_read32(ptr)); } - - -/************************************** -* HC Compression -**************************************/ -static void LZ4HC_clearTables (LZ4HC_CCtx_internal* hc4) -{ - MEM_INIT(hc4->hashTable, 0, sizeof(hc4->hashTable)); - MEM_INIT(hc4->chainTable, 0xFF, sizeof(hc4->chainTable)); -} - -static void LZ4HC_init_internal (LZ4HC_CCtx_internal* hc4, const BYTE* start) -{ - size_t const bufferSize = (size_t)(hc4->end - hc4->prefixStart); - size_t newStartingOffset = bufferSize + hc4->dictLimit; - DEBUGLOG(5, "LZ4HC_init_internal"); - assert(newStartingOffset >= bufferSize); /* check overflow */ - if (newStartingOffset > 1 GB) { - LZ4HC_clearTables(hc4); - newStartingOffset = 0; - } - newStartingOffset += 64 KB; - hc4->nextToUpdate = (U32)newStartingOffset; - hc4->prefixStart = start; - hc4->end = start; - hc4->dictStart = start; - hc4->dictLimit = (U32)newStartingOffset; - hc4->lowLimit = (U32)newStartingOffset; -} - - -/* Update chains up to ip (excluded) */ -LZ4_FORCE_INLINE void LZ4HC_Insert (LZ4HC_CCtx_internal* hc4, const BYTE* ip) -{ - U16* const chainTable = hc4->chainTable; - U32* const hashTable = hc4->hashTable; - const BYTE* const prefixPtr = hc4->prefixStart; - U32 const prefixIdx = hc4->dictLimit; - U32 const target = (U32)(ip - prefixPtr) + prefixIdx; - U32 idx = hc4->nextToUpdate; - assert(ip >= prefixPtr); - assert(target >= prefixIdx); - - while (idx < target) { - U32 const h = LZ4HC_hashPtr(prefixPtr+idx-prefixIdx); - size_t delta = idx - hashTable[h]; - if (delta>LZ4_DISTANCE_MAX) delta = LZ4_DISTANCE_MAX; - DELTANEXTU16(chainTable, idx) = (U16)delta; - hashTable[h] = idx; - idx++; - } - - hc4->nextToUpdate = target; -} - -/** LZ4HC_countBack() : - * @return : negative value, nb of common bytes before ip/match */ -LZ4_FORCE_INLINE -int LZ4HC_countBack(const BYTE* const ip, const BYTE* const match, - const BYTE* const iMin, const BYTE* const mMin) -{ - int back = 0; - int const min = (int)MAX(iMin - ip, mMin - match); - assert(min <= 0); - assert(ip >= iMin); assert((size_t)(ip-iMin) < (1U<<31)); - assert(match >= mMin); assert((size_t)(match - mMin) < (1U<<31)); - while ( (back > min) - && (ip[back-1] == match[back-1]) ) - back--; - return back; -} - -#if defined(_MSC_VER) -# define LZ4HC_rotl32(x,r) _rotl(x,r) -#else -# define LZ4HC_rotl32(x,r) ((x << r) | (x >> (32 - r))) -#endif - - -static U32 LZ4HC_rotatePattern(size_t const rotate, U32 const pattern) -{ - size_t const bitsToRotate = (rotate & (sizeof(pattern) - 1)) << 3; - if (bitsToRotate == 0) return pattern; - return LZ4HC_rotl32(pattern, (int)bitsToRotate); -} - -/* LZ4HC_countPattern() : - * pattern32 must be a sample of repetitive pattern of length 1, 2 or 4 (but not 3!) */ -static unsigned -LZ4HC_countPattern(const BYTE* ip, const BYTE* const iEnd, U32 const pattern32) -{ - const BYTE* const iStart = ip; - reg_t const pattern = (sizeof(pattern)==8) ? - (reg_t)pattern32 + (((reg_t)pattern32) << (sizeof(pattern)*4)) : pattern32; - - while (likely(ip < iEnd-(sizeof(pattern)-1))) { - reg_t const diff = LZ4_read_ARCH(ip) ^ pattern; - if (!diff) { ip+=sizeof(pattern); continue; } - ip += LZ4_NbCommonBytes(diff); - return (unsigned)(ip - iStart); - } - - if (LZ4_isLittleEndian()) { - reg_t patternByte = pattern; - while ((ip>= 8; - } - } else { /* big endian */ - U32 bitOffset = (sizeof(pattern)*8) - 8; - while (ip < iEnd) { - BYTE const byte = (BYTE)(pattern >> bitOffset); - if (*ip != byte) break; - ip ++; bitOffset -= 8; - } } - - return (unsigned)(ip - iStart); -} - -/* LZ4HC_reverseCountPattern() : - * pattern must be a sample of repetitive pattern of length 1, 2 or 4 (but not 3!) - * read using natural platform endianness */ -static unsigned -LZ4HC_reverseCountPattern(const BYTE* ip, const BYTE* const iLow, U32 pattern) -{ - const BYTE* const iStart = ip; - - while (likely(ip >= iLow+4)) { - if (LZ4_read32(ip-4) != pattern) break; - ip -= 4; - } - { const BYTE* bytePtr = (const BYTE*)(&pattern) + 3; /* works for any endianness */ - while (likely(ip>iLow)) { - if (ip[-1] != *bytePtr) break; - ip--; bytePtr--; - } } - return (unsigned)(iStart - ip); -} - -/* LZ4HC_protectDictEnd() : - * Checks if the match is in the last 3 bytes of the dictionary, so reading the - * 4 byte MINMATCH would overflow. - * @returns true if the match index is okay. - */ -static int LZ4HC_protectDictEnd(U32 const dictLimit, U32 const matchIndex) -{ - return ((U32)((dictLimit - 1) - matchIndex) >= 3); -} - -typedef enum { rep_untested, rep_not, rep_confirmed } repeat_state_e; -typedef enum { favorCompressionRatio=0, favorDecompressionSpeed } HCfavor_e; - -typedef struct { - int off; - int len; -} LZ4HC_match_t; - -LZ4_FORCE_INLINE LZ4HC_match_t -LZ4HC_InsertAndGetWiderMatch ( - LZ4HC_CCtx_internal* const hc4, - const BYTE* const ip, - const BYTE* const iLowLimit, const BYTE* const iHighLimit, - int longest, - const BYTE** startpos, - const int maxNbAttempts, - const int patternAnalysis, const int chainSwap, - const dictCtx_directive dict, - const HCfavor_e favorDecSpeed) -{ - U16* const chainTable = hc4->chainTable; - U32* const hashTable = hc4->hashTable; - const LZ4HC_CCtx_internal * const dictCtx = hc4->dictCtx; - const BYTE* const prefixPtr = hc4->prefixStart; - const U32 prefixIdx = hc4->dictLimit; - const U32 ipIndex = (U32)(ip - prefixPtr) + prefixIdx; - const int withinStartDistance = (hc4->lowLimit + (LZ4_DISTANCE_MAX + 1) > ipIndex); - const U32 lowestMatchIndex = (withinStartDistance) ? hc4->lowLimit : ipIndex - LZ4_DISTANCE_MAX; - const BYTE* const dictStart = hc4->dictStart; - const U32 dictIdx = hc4->lowLimit; - const BYTE* const dictEnd = dictStart + prefixIdx - dictIdx; - int const lookBackLength = (int)(ip-iLowLimit); - int nbAttempts = maxNbAttempts; - U32 matchChainPos = 0; - U32 const pattern = LZ4_read32(ip); - U32 matchIndex; - repeat_state_e repeat = rep_untested; - size_t srcPatternLength = 0; - int offset = 0; - - DEBUGLOG(7, "LZ4HC_InsertAndGetWiderMatch"); - assert(startpos != NULL); - *startpos = ip; /* in case there is no solution */ - /* First Match */ - LZ4HC_Insert(hc4, ip); /* insert all prior positions up to ip (excluded) */ - matchIndex = hashTable[LZ4HC_hashPtr(ip)]; - DEBUGLOG(7, "First candidate match for pos %u found at index %u / %u (lowestMatchIndex)", - ipIndex, matchIndex, lowestMatchIndex); - - while ((matchIndex>=lowestMatchIndex) && (nbAttempts>0)) { - int matchLength=0; - nbAttempts--; - assert(matchIndex < ipIndex); - if (favorDecSpeed && (ipIndex - matchIndex < 8)) { - /* do nothing: - * favorDecSpeed intentionally skips matches with offset < 8 */ - } else if (matchIndex >= prefixIdx) { /* within current Prefix */ - const BYTE* const matchPtr = prefixPtr + (matchIndex - prefixIdx); - assert(matchPtr < ip); - assert(longest >= 1); - if (LZ4_read16(iLowLimit + longest - 1) == LZ4_read16(matchPtr - lookBackLength + longest - 1)) { - if (LZ4_read32(matchPtr) == pattern) { - int const back = lookBackLength ? LZ4HC_countBack(ip, matchPtr, iLowLimit, prefixPtr) : 0; - matchLength = MINMATCH + (int)LZ4_count(ip+MINMATCH, matchPtr+MINMATCH, iHighLimit); - matchLength -= back; - if (matchLength > longest) { - longest = matchLength; - offset = (int)(ipIndex - matchIndex); - *startpos = ip + back; - DEBUGLOG(7, "Found match of len=%i within prefix, offset=%i, back=%i", longest, offset, -back); - } } } - } else { /* lowestMatchIndex <= matchIndex < dictLimit : within Ext Dict */ - const BYTE* const matchPtr = dictStart + (matchIndex - dictIdx); - assert(matchIndex >= dictIdx); - if ( likely(matchIndex <= prefixIdx - 4) - && (LZ4_read32(matchPtr) == pattern) ) { - int back = 0; - const BYTE* vLimit = ip + (prefixIdx - matchIndex); - if (vLimit > iHighLimit) vLimit = iHighLimit; - matchLength = (int)LZ4_count(ip+MINMATCH, matchPtr+MINMATCH, vLimit) + MINMATCH; - if ((ip+matchLength == vLimit) && (vLimit < iHighLimit)) - matchLength += LZ4_count(ip+matchLength, prefixPtr, iHighLimit); - back = lookBackLength ? LZ4HC_countBack(ip, matchPtr, iLowLimit, dictStart) : 0; - matchLength -= back; - if (matchLength > longest) { - longest = matchLength; - offset = (int)(ipIndex - matchIndex); - *startpos = ip + back; - DEBUGLOG(7, "Found match of len=%i within dict, offset=%i, back=%i", longest, offset, -back); - } } } - - if (chainSwap && matchLength==longest) { /* better match => select a better chain */ - assert(lookBackLength==0); /* search forward only */ - if (matchIndex + (U32)longest <= ipIndex) { - int const kTrigger = 4; - U32 distanceToNextMatch = 1; - int const end = longest - MINMATCH + 1; - int step = 1; - int accel = 1 << kTrigger; - int pos; - for (pos = 0; pos < end; pos += step) { - U32 const candidateDist = DELTANEXTU16(chainTable, matchIndex + (U32)pos); - step = (accel++ >> kTrigger); - if (candidateDist > distanceToNextMatch) { - distanceToNextMatch = candidateDist; - matchChainPos = (U32)pos; - accel = 1 << kTrigger; - } } - if (distanceToNextMatch > 1) { - if (distanceToNextMatch > matchIndex) break; /* avoid overflow */ - matchIndex -= distanceToNextMatch; - continue; - } } } - - { U32 const distNextMatch = DELTANEXTU16(chainTable, matchIndex); - if (patternAnalysis && distNextMatch==1 && matchChainPos==0) { - U32 const matchCandidateIdx = matchIndex-1; - /* may be a repeated pattern */ - if (repeat == rep_untested) { - if ( ((pattern & 0xFFFF) == (pattern >> 16)) - & ((pattern & 0xFF) == (pattern >> 24)) ) { - DEBUGLOG(7, "Repeat pattern detected, char %02X", pattern >> 24); - repeat = rep_confirmed; - srcPatternLength = LZ4HC_countPattern(ip+sizeof(pattern), iHighLimit, pattern) + sizeof(pattern); - } else { - repeat = rep_not; - } } - if ( (repeat == rep_confirmed) && (matchCandidateIdx >= lowestMatchIndex) - && LZ4HC_protectDictEnd(prefixIdx, matchCandidateIdx) ) { - const int extDict = matchCandidateIdx < prefixIdx; - const BYTE* const matchPtr = extDict ? dictStart + (matchCandidateIdx - dictIdx) : prefixPtr + (matchCandidateIdx - prefixIdx); - if (LZ4_read32(matchPtr) == pattern) { /* good candidate */ - const BYTE* const iLimit = extDict ? dictEnd : iHighLimit; - size_t forwardPatternLength = LZ4HC_countPattern(matchPtr+sizeof(pattern), iLimit, pattern) + sizeof(pattern); - if (extDict && matchPtr + forwardPatternLength == iLimit) { - U32 const rotatedPattern = LZ4HC_rotatePattern(forwardPatternLength, pattern); - forwardPatternLength += LZ4HC_countPattern(prefixPtr, iHighLimit, rotatedPattern); - } - { const BYTE* const lowestMatchPtr = extDict ? dictStart : prefixPtr; - size_t backLength = LZ4HC_reverseCountPattern(matchPtr, lowestMatchPtr, pattern); - size_t currentSegmentLength; - if (!extDict - && matchPtr - backLength == prefixPtr - && dictIdx < prefixIdx) { - U32 const rotatedPattern = LZ4HC_rotatePattern((U32)(-(int)backLength), pattern); - backLength += LZ4HC_reverseCountPattern(dictEnd, dictStart, rotatedPattern); - } - /* Limit backLength not go further than lowestMatchIndex */ - backLength = matchCandidateIdx - MAX(matchCandidateIdx - (U32)backLength, lowestMatchIndex); - assert(matchCandidateIdx - backLength >= lowestMatchIndex); - currentSegmentLength = backLength + forwardPatternLength; - /* Adjust to end of pattern if the source pattern fits, otherwise the beginning of the pattern */ - if ( (currentSegmentLength >= srcPatternLength) /* current pattern segment large enough to contain full srcPatternLength */ - && (forwardPatternLength <= srcPatternLength) ) { /* haven't reached this position yet */ - U32 const newMatchIndex = matchCandidateIdx + (U32)forwardPatternLength - (U32)srcPatternLength; /* best position, full pattern, might be followed by more match */ - if (LZ4HC_protectDictEnd(prefixIdx, newMatchIndex)) - matchIndex = newMatchIndex; - else { - /* Can only happen if started in the prefix */ - assert(newMatchIndex >= prefixIdx - 3 && newMatchIndex < prefixIdx && !extDict); - matchIndex = prefixIdx; - } - } else { - U32 const newMatchIndex = matchCandidateIdx - (U32)backLength; /* farthest position in current segment, will find a match of length currentSegmentLength + maybe some back */ - if (!LZ4HC_protectDictEnd(prefixIdx, newMatchIndex)) { - assert(newMatchIndex >= prefixIdx - 3 && newMatchIndex < prefixIdx && !extDict); - matchIndex = prefixIdx; - } else { - matchIndex = newMatchIndex; - if (lookBackLength==0) { /* no back possible */ - size_t const maxML = MIN(currentSegmentLength, srcPatternLength); - if ((size_t)longest < maxML) { - assert(prefixPtr - prefixIdx + matchIndex != ip); - if ((size_t)(ip - prefixPtr) + prefixIdx - matchIndex > LZ4_DISTANCE_MAX) break; - assert(maxML < 2 GB); - longest = (int)maxML; - offset = (int)(ipIndex - matchIndex); - *startpos = ip; - DEBUGLOG(7, "Found repeat pattern match of len=%i, offset=%i", longest, offset); - } - { U32 const distToNextPattern = DELTANEXTU16(chainTable, matchIndex); - if (distToNextPattern > matchIndex) break; /* avoid overflow */ - matchIndex -= distToNextPattern; - } } } } } - continue; - } } - } } /* PA optimization */ - - /* follow current chain */ - matchIndex -= DELTANEXTU16(chainTable, matchIndex + matchChainPos); - - } /* while ((matchIndex>=lowestMatchIndex) && (nbAttempts)) */ - - if ( dict == usingDictCtxHc - && nbAttempts > 0 - && ipIndex - lowestMatchIndex < LZ4_DISTANCE_MAX) { - size_t const dictEndOffset = (size_t)(dictCtx->end - dictCtx->prefixStart) + dictCtx->dictLimit; - U32 dictMatchIndex = dictCtx->hashTable[LZ4HC_hashPtr(ip)]; - assert(dictEndOffset <= 1 GB); - matchIndex = dictMatchIndex + lowestMatchIndex - (U32)dictEndOffset; - if (dictMatchIndex>0) DEBUGLOG(7, "dictEndOffset = %zu, dictMatchIndex = %u => relative matchIndex = %i", dictEndOffset, dictMatchIndex, (int)dictMatchIndex - (int)dictEndOffset); - while (ipIndex - matchIndex <= LZ4_DISTANCE_MAX && nbAttempts--) { - const BYTE* const matchPtr = dictCtx->prefixStart - dictCtx->dictLimit + dictMatchIndex; - - if (LZ4_read32(matchPtr) == pattern) { - int mlt; - int back = 0; - const BYTE* vLimit = ip + (dictEndOffset - dictMatchIndex); - if (vLimit > iHighLimit) vLimit = iHighLimit; - mlt = (int)LZ4_count(ip+MINMATCH, matchPtr+MINMATCH, vLimit) + MINMATCH; - back = lookBackLength ? LZ4HC_countBack(ip, matchPtr, iLowLimit, dictCtx->prefixStart) : 0; - mlt -= back; - if (mlt > longest) { - longest = mlt; - offset = (int)(ipIndex - matchIndex); - *startpos = ip + back; - DEBUGLOG(7, "found match of length %i within extDictCtx", longest); - } } - - { U32 const nextOffset = DELTANEXTU16(dictCtx->chainTable, dictMatchIndex); - dictMatchIndex -= nextOffset; - matchIndex -= nextOffset; - } } } - - { LZ4HC_match_t md; - assert(longest >= 0); - md.len = longest; - md.off = offset; - return md; - } -} - -LZ4_FORCE_INLINE LZ4HC_match_t -LZ4HC_InsertAndFindBestMatch(LZ4HC_CCtx_internal* const hc4, /* Index table will be updated */ - const BYTE* const ip, const BYTE* const iLimit, - const int maxNbAttempts, - const int patternAnalysis, - const dictCtx_directive dict) -{ - const BYTE* uselessPtr = ip; - DEBUGLOG(7, "LZ4HC_InsertAndFindBestMatch"); - /* note : LZ4HC_InsertAndGetWiderMatch() is able to modify the starting position of a match (*startpos), - * but this won't be the case here, as we define iLowLimit==ip, - * so LZ4HC_InsertAndGetWiderMatch() won't be allowed to search past ip */ - return LZ4HC_InsertAndGetWiderMatch(hc4, ip, ip, iLimit, MINMATCH-1, &uselessPtr, maxNbAttempts, patternAnalysis, 0 /*chainSwap*/, dict, favorCompressionRatio); -} - -/* LZ4HC_encodeSequence() : - * @return : 0 if ok, - * 1 if buffer issue detected */ -LZ4_FORCE_INLINE int LZ4HC_encodeSequence ( - const BYTE** _ip, - BYTE** _op, - const BYTE** _anchor, - int matchLength, - int offset, - limitedOutput_directive limit, - BYTE* oend) -{ -#define ip (*_ip) -#define op (*_op) -#define anchor (*_anchor) - - size_t length; - BYTE* const token = op++; - -#if defined(LZ4_DEBUG) && (LZ4_DEBUG >= 6) - static const BYTE* start = NULL; - static U32 totalCost = 0; - U32 const pos = (start==NULL) ? 0 : (U32)(anchor - start); - U32 const ll = (U32)(ip - anchor); - U32 const llAdd = (ll>=15) ? ((ll-15) / 255) + 1 : 0; - U32 const mlAdd = (matchLength>=19) ? ((matchLength-19) / 255) + 1 : 0; - U32 const cost = 1 + llAdd + ll + 2 + mlAdd; - if (start==NULL) start = anchor; /* only works for single segment */ - /* g_debuglog_enable = (pos >= 2228) & (pos <= 2262); */ - DEBUGLOG(6, "pos:%7u -- literals:%4u, match:%4i, offset:%5i, cost:%4u + %5u", - pos, - (U32)(ip - anchor), matchLength, offset, - cost, totalCost); - totalCost += cost; -#endif - - /* Encode Literal length */ - length = (size_t)(ip - anchor); - LZ4_STATIC_ASSERT(notLimited == 0); - /* Check output limit */ - if (limit && ((op + (length / 255) + length + (2 + 1 + LASTLITERALS)) > oend)) { - DEBUGLOG(6, "Not enough room to write %i literals (%i bytes remaining)", - (int)length, (int)(oend - op)); - return 1; - } - if (length >= RUN_MASK) { - size_t len = length - RUN_MASK; - *token = (RUN_MASK << ML_BITS); - for(; len >= 255 ; len -= 255) *op++ = 255; - *op++ = (BYTE)len; - } else { - *token = (BYTE)(length << ML_BITS); - } - - /* Copy Literals */ - LZ4_wildCopy8(op, anchor, op + length); - op += length; - - /* Encode Offset */ - assert(offset <= LZ4_DISTANCE_MAX ); - assert(offset > 0); - LZ4_writeLE16(op, (U16)(offset)); op += 2; - - /* Encode MatchLength */ - assert(matchLength >= MINMATCH); - length = (size_t)matchLength - MINMATCH; - if (limit && (op + (length / 255) + (1 + LASTLITERALS) > oend)) { - DEBUGLOG(6, "Not enough room to write match length"); - return 1; /* Check output limit */ - } - if (length >= ML_MASK) { - *token += ML_MASK; - length -= ML_MASK; - for(; length >= 510 ; length -= 510) { *op++ = 255; *op++ = 255; } - if (length >= 255) { length -= 255; *op++ = 255; } - *op++ = (BYTE)length; - } else { - *token += (BYTE)(length); - } - - /* Prepare next loop */ - ip += matchLength; - anchor = ip; - - return 0; -} -#undef ip -#undef op -#undef anchor - -LZ4_FORCE_INLINE int LZ4HC_compress_hashChain ( - LZ4HC_CCtx_internal* const ctx, - const char* const source, - char* const dest, - int* srcSizePtr, - int const maxOutputSize, - int maxNbAttempts, - const limitedOutput_directive limit, - const dictCtx_directive dict - ) -{ - const int inputSize = *srcSizePtr; - const int patternAnalysis = (maxNbAttempts > 128); /* levels 9+ */ - - const BYTE* ip = (const BYTE*) source; - const BYTE* anchor = ip; - const BYTE* const iend = ip + inputSize; - const BYTE* const mflimit = iend - MFLIMIT; - const BYTE* const matchlimit = (iend - LASTLITERALS); - - BYTE* optr = (BYTE*) dest; - BYTE* op = (BYTE*) dest; - BYTE* oend = op + maxOutputSize; - - const BYTE* start0; - const BYTE* start2 = NULL; - const BYTE* start3 = NULL; - LZ4HC_match_t m0, m1, m2, m3; - const LZ4HC_match_t nomatch = {0, 0}; - - /* init */ - DEBUGLOG(5, "LZ4HC_compress_hashChain (dict?=>%i)", dict); - *srcSizePtr = 0; - if (limit == fillOutput) oend -= LASTLITERALS; /* Hack for support LZ4 format restriction */ - if (inputSize < LZ4_minLength) goto _last_literals; /* Input too small, no compression (all literals) */ - - /* Main Loop */ - while (ip <= mflimit) { - m1 = LZ4HC_InsertAndFindBestMatch(ctx, ip, matchlimit, maxNbAttempts, patternAnalysis, dict); - if (m1.len encode ML1 immediately */ - optr = op; - if (LZ4HC_encodeSequence(UPDATABLE(ip, op, anchor), m1.len, m1.off, limit, oend)) goto _dest_overflow; - continue; - } - - if (start0 < ip) { /* first match was skipped at least once */ - if (start2 < ip + m0.len) { /* squeezing ML1 between ML0(original ML1) and ML2 */ - ip = start0; m1 = m0; /* restore initial Match1 */ - } } - - /* Here, start0==ip */ - if ((start2 - ip) < 3) { /* First Match too small : removed */ - ip = start2; - m1 = m2; - goto _Search2; - } - -_Search3: - if ((start2 - ip) < OPTIMAL_ML) { - int correction; - int new_ml = m1.len; - if (new_ml > OPTIMAL_ML) new_ml = OPTIMAL_ML; - if (ip+new_ml > start2 + m2.len - MINMATCH) - new_ml = (int)(start2 - ip) + m2.len - MINMATCH; - correction = new_ml - (int)(start2 - ip); - if (correction > 0) { - start2 += correction; - m2.len -= correction; - } - } - - if (start2 + m2.len <= mflimit) { - m3 = LZ4HC_InsertAndGetWiderMatch(ctx, - start2 + m2.len - 3, start2, matchlimit, m2.len, &start3, - maxNbAttempts, patternAnalysis, 0, dict, favorCompressionRatio); - } else { - m3 = nomatch; /* do not search further */ - } - - if (m3.len <= m2.len) { /* No better match => encode ML1 and ML2 */ - /* ip & ref are known; Now for ml */ - if (start2 < ip+m1.len) m1.len = (int)(start2 - ip); - /* Now, encode 2 sequences */ - optr = op; - if (LZ4HC_encodeSequence(UPDATABLE(ip, op, anchor), m1.len, m1.off, limit, oend)) - goto _dest_overflow; - ip = start2; - optr = op; - if (LZ4HC_encodeSequence(UPDATABLE(ip, op, anchor), m2.len, m2.off, limit, oend)) { - m1 = m2; - goto _dest_overflow; - } - continue; - } - - if (start3 < ip+m1.len+3) { /* Not enough space for match 2 : remove it */ - if (start3 >= (ip+m1.len)) { /* can write Seq1 immediately ==> Seq2 is removed, so Seq3 becomes Seq1 */ - if (start2 < ip+m1.len) { - int correction = (int)(ip+m1.len - start2); - start2 += correction; - m2.len -= correction; - if (m2.len < MINMATCH) { - start2 = start3; - m2 = m3; - } - } - - optr = op; - if (LZ4HC_encodeSequence(UPDATABLE(ip, op, anchor), m1.len, m1.off, limit, oend)) goto _dest_overflow; - ip = start3; - m1 = m3; - - start0 = start2; - m0 = m2; - goto _Search2; - } - - start2 = start3; - m2 = m3; - goto _Search3; - } - - /* - * OK, now we have 3 ascending matches; - * let's write the first one ML1. - * ip & ref are known; Now decide ml. - */ - if (start2 < ip+m1.len) { - if ((start2 - ip) < OPTIMAL_ML) { - int correction; - if (m1.len > OPTIMAL_ML) m1.len = OPTIMAL_ML; - if (ip + m1.len > start2 + m2.len - MINMATCH) - m1.len = (int)(start2 - ip) + m2.len - MINMATCH; - correction = m1.len - (int)(start2 - ip); - if (correction > 0) { - start2 += correction; - m2.len -= correction; - } - } else { - m1.len = (int)(start2 - ip); - } - } - optr = op; - if (LZ4HC_encodeSequence(UPDATABLE(ip, op, anchor), m1.len, m1.off, limit, oend)) goto _dest_overflow; - - /* ML2 becomes ML1 */ - ip = start2; m1 = m2; - - /* ML3 becomes ML2 */ - start2 = start3; m2 = m3; - - /* let's find a new ML3 */ - goto _Search3; - } - -_last_literals: - /* Encode Last Literals */ - { size_t lastRunSize = (size_t)(iend - anchor); /* literals */ - size_t llAdd = (lastRunSize + 255 - RUN_MASK) / 255; - size_t const totalSize = 1 + llAdd + lastRunSize; - if (limit == fillOutput) oend += LASTLITERALS; /* restore correct value */ - if (limit && (op + totalSize > oend)) { - if (limit == limitedOutput) return 0; - /* adapt lastRunSize to fill 'dest' */ - lastRunSize = (size_t)(oend - op) - 1 /*token*/; - llAdd = (lastRunSize + 256 - RUN_MASK) / 256; - lastRunSize -= llAdd; - } - DEBUGLOG(6, "Final literal run : %i literals", (int)lastRunSize); - ip = anchor + lastRunSize; /* can be != iend if limit==fillOutput */ - - if (lastRunSize >= RUN_MASK) { - size_t accumulator = lastRunSize - RUN_MASK; - *op++ = (RUN_MASK << ML_BITS); - for(; accumulator >= 255 ; accumulator -= 255) *op++ = 255; - *op++ = (BYTE) accumulator; - } else { - *op++ = (BYTE)(lastRunSize << ML_BITS); - } - LZ4_memcpy(op, anchor, lastRunSize); - op += lastRunSize; - } - - /* End */ - *srcSizePtr = (int) (((const char*)ip) - source); - return (int) (((char*)op)-dest); - -_dest_overflow: - if (limit == fillOutput) { - /* Assumption : ip, anchor, ml and ref must be set correctly */ - size_t const ll = (size_t)(ip - anchor); - size_t const ll_addbytes = (ll + 240) / 255; - size_t const ll_totalCost = 1 + ll_addbytes + ll; - BYTE* const maxLitPos = oend - 3; /* 2 for offset, 1 for token */ - DEBUGLOG(6, "Last sequence overflowing"); - op = optr; /* restore correct out pointer */ - if (op + ll_totalCost <= maxLitPos) { - /* ll validated; now adjust match length */ - size_t const bytesLeftForMl = (size_t)(maxLitPos - (op+ll_totalCost)); - size_t const maxMlSize = MINMATCH + (ML_MASK-1) + (bytesLeftForMl * 255); - assert(maxMlSize < INT_MAX); assert(m1.len >= 0); - if ((size_t)m1.len > maxMlSize) m1.len = (int)maxMlSize; - if ((oend + LASTLITERALS) - (op + ll_totalCost + 2) - 1 + m1.len >= MFLIMIT) { - LZ4HC_encodeSequence(UPDATABLE(ip, op, anchor), m1.len, m1.off, notLimited, oend); - } } - goto _last_literals; - } - /* compression failed */ - return 0; -} - - -static int LZ4HC_compress_optimal( LZ4HC_CCtx_internal* ctx, - const char* const source, char* dst, - int* srcSizePtr, int dstCapacity, - int const nbSearches, size_t sufficient_len, - const limitedOutput_directive limit, int const fullUpdate, - const dictCtx_directive dict, - const HCfavor_e favorDecSpeed); - - -LZ4_FORCE_INLINE int -LZ4HC_compress_generic_internal ( - LZ4HC_CCtx_internal* const ctx, - const char* const src, - char* const dst, - int* const srcSizePtr, - int const dstCapacity, - int cLevel, - const limitedOutput_directive limit, - const dictCtx_directive dict - ) -{ - typedef enum { lz4hc, lz4opt } lz4hc_strat_e; - typedef struct { - lz4hc_strat_e strat; - int nbSearches; - U32 targetLength; - } cParams_t; - static const cParams_t clTable[LZ4HC_CLEVEL_MAX+1] = { - { lz4hc, 2, 16 }, /* 0, unused */ - { lz4hc, 2, 16 }, /* 1, unused */ - { lz4hc, 2, 16 }, /* 2, unused */ - { lz4hc, 4, 16 }, /* 3 */ - { lz4hc, 8, 16 }, /* 4 */ - { lz4hc, 16, 16 }, /* 5 */ - { lz4hc, 32, 16 }, /* 6 */ - { lz4hc, 64, 16 }, /* 7 */ - { lz4hc, 128, 16 }, /* 8 */ - { lz4hc, 256, 16 }, /* 9 */ - { lz4opt, 96, 64 }, /*10==LZ4HC_CLEVEL_OPT_MIN*/ - { lz4opt, 512,128 }, /*11 */ - { lz4opt,16384,LZ4_OPT_NUM }, /* 12==LZ4HC_CLEVEL_MAX */ - }; - - DEBUGLOG(5, "LZ4HC_compress_generic_internal(src=%p, srcSize=%d)", - src, *srcSizePtr); - - if (limit == fillOutput && dstCapacity < 1) return 0; /* Impossible to store anything */ - if ((U32)*srcSizePtr > (U32)LZ4_MAX_INPUT_SIZE) return 0; /* Unsupported input size (too large or negative) */ - - ctx->end += *srcSizePtr; - if (cLevel < 1) cLevel = LZ4HC_CLEVEL_DEFAULT; /* note : convention is different from lz4frame, maybe something to review */ - cLevel = MIN(LZ4HC_CLEVEL_MAX, cLevel); - { cParams_t const cParam = clTable[cLevel]; - HCfavor_e const favor = ctx->favorDecSpeed ? favorDecompressionSpeed : favorCompressionRatio; - int result; - - if (cParam.strat == lz4hc) { - result = LZ4HC_compress_hashChain(ctx, - src, dst, srcSizePtr, dstCapacity, - cParam.nbSearches, limit, dict); - } else { - assert(cParam.strat == lz4opt); - result = LZ4HC_compress_optimal(ctx, - src, dst, srcSizePtr, dstCapacity, - cParam.nbSearches, cParam.targetLength, limit, - cLevel == LZ4HC_CLEVEL_MAX, /* ultra mode */ - dict, favor); - } - if (result <= 0) ctx->dirty = 1; - return result; - } -} - -static void LZ4HC_setExternalDict(LZ4HC_CCtx_internal* ctxPtr, const BYTE* newBlock); - -static int -LZ4HC_compress_generic_noDictCtx ( - LZ4HC_CCtx_internal* const ctx, - const char* const src, - char* const dst, - int* const srcSizePtr, - int const dstCapacity, - int cLevel, - limitedOutput_directive limit - ) -{ - assert(ctx->dictCtx == NULL); - return LZ4HC_compress_generic_internal(ctx, src, dst, srcSizePtr, dstCapacity, cLevel, limit, noDictCtx); -} - -static int -LZ4HC_compress_generic_dictCtx ( - LZ4HC_CCtx_internal* const ctx, - const char* const src, - char* const dst, - int* const srcSizePtr, - int const dstCapacity, - int cLevel, - limitedOutput_directive limit - ) -{ - const size_t position = (size_t)(ctx->end - ctx->prefixStart) + (ctx->dictLimit - ctx->lowLimit); - assert(ctx->dictCtx != NULL); - if (position >= 64 KB) { - ctx->dictCtx = NULL; - return LZ4HC_compress_generic_noDictCtx(ctx, src, dst, srcSizePtr, dstCapacity, cLevel, limit); - } else if (position == 0 && *srcSizePtr > 4 KB) { - LZ4_memcpy(ctx, ctx->dictCtx, sizeof(LZ4HC_CCtx_internal)); - LZ4HC_setExternalDict(ctx, (const BYTE *)src); - ctx->compressionLevel = (short)cLevel; - return LZ4HC_compress_generic_noDictCtx(ctx, src, dst, srcSizePtr, dstCapacity, cLevel, limit); - } else { - return LZ4HC_compress_generic_internal(ctx, src, dst, srcSizePtr, dstCapacity, cLevel, limit, usingDictCtxHc); - } -} - -static int -LZ4HC_compress_generic ( - LZ4HC_CCtx_internal* const ctx, - const char* const src, - char* const dst, - int* const srcSizePtr, - int const dstCapacity, - int cLevel, - limitedOutput_directive limit - ) -{ - if (ctx->dictCtx == NULL) { - return LZ4HC_compress_generic_noDictCtx(ctx, src, dst, srcSizePtr, dstCapacity, cLevel, limit); - } else { - return LZ4HC_compress_generic_dictCtx(ctx, src, dst, srcSizePtr, dstCapacity, cLevel, limit); - } -} - - -int LZ4_sizeofStateHC(void) { return (int)sizeof(LZ4_streamHC_t); } - -static size_t LZ4_streamHC_t_alignment(void) -{ -#if LZ4_ALIGN_TEST - typedef struct { char c; LZ4_streamHC_t t; } t_a; - return sizeof(t_a) - sizeof(LZ4_streamHC_t); -#else - return 1; /* effectively disabled */ -#endif -} - -/* state is presumed correctly initialized, - * in which case its size and alignment have already been validate */ -int LZ4_compress_HC_extStateHC_fastReset (void* state, const char* src, char* dst, int srcSize, int dstCapacity, int compressionLevel) -{ - LZ4HC_CCtx_internal* const ctx = &((LZ4_streamHC_t*)state)->internal_donotuse; - if (!LZ4_isAligned(state, LZ4_streamHC_t_alignment())) return 0; - LZ4_resetStreamHC_fast((LZ4_streamHC_t*)state, compressionLevel); - LZ4HC_init_internal (ctx, (const BYTE*)src); - if (dstCapacity < LZ4_compressBound(srcSize)) - return LZ4HC_compress_generic (ctx, src, dst, &srcSize, dstCapacity, compressionLevel, limitedOutput); - else - return LZ4HC_compress_generic (ctx, src, dst, &srcSize, dstCapacity, compressionLevel, notLimited); -} - -int LZ4_compress_HC_extStateHC (void* state, const char* src, char* dst, int srcSize, int dstCapacity, int compressionLevel) -{ - LZ4_streamHC_t* const ctx = LZ4_initStreamHC(state, sizeof(*ctx)); - if (ctx==NULL) return 0; /* init failure */ - return LZ4_compress_HC_extStateHC_fastReset(state, src, dst, srcSize, dstCapacity, compressionLevel); -} - -int LZ4_compress_HC(const char* src, char* dst, int srcSize, int dstCapacity, int compressionLevel) -{ - int cSize; -#if defined(LZ4HC_HEAPMODE) && LZ4HC_HEAPMODE==1 - LZ4_streamHC_t* const statePtr = (LZ4_streamHC_t*)ALLOC(sizeof(LZ4_streamHC_t)); - if (statePtr==NULL) return 0; -#else - LZ4_streamHC_t state; - LZ4_streamHC_t* const statePtr = &state; -#endif - DEBUGLOG(5, "LZ4_compress_HC") - cSize = LZ4_compress_HC_extStateHC(statePtr, src, dst, srcSize, dstCapacity, compressionLevel); -#if defined(LZ4HC_HEAPMODE) && LZ4HC_HEAPMODE==1 - FREEMEM(statePtr); -#endif - return cSize; -} - -/* state is presumed sized correctly (>= sizeof(LZ4_streamHC_t)) */ -int LZ4_compress_HC_destSize(void* state, const char* source, char* dest, int* sourceSizePtr, int targetDestSize, int cLevel) -{ - LZ4_streamHC_t* const ctx = LZ4_initStreamHC(state, sizeof(*ctx)); - if (ctx==NULL) return 0; /* init failure */ - LZ4HC_init_internal(&ctx->internal_donotuse, (const BYTE*) source); - LZ4_setCompressionLevel(ctx, cLevel); - return LZ4HC_compress_generic(&ctx->internal_donotuse, source, dest, sourceSizePtr, targetDestSize, cLevel, fillOutput); -} - - - -/************************************** -* Streaming Functions -**************************************/ -/* allocation */ -#if !defined(LZ4_STATIC_LINKING_ONLY_DISABLE_MEMORY_ALLOCATION) -LZ4_streamHC_t* LZ4_createStreamHC(void) -{ - LZ4_streamHC_t* const state = - (LZ4_streamHC_t*)ALLOC_AND_ZERO(sizeof(LZ4_streamHC_t)); - if (state == NULL) return NULL; - LZ4_setCompressionLevel(state, LZ4HC_CLEVEL_DEFAULT); - return state; -} - -int LZ4_freeStreamHC (LZ4_streamHC_t* LZ4_streamHCPtr) -{ - DEBUGLOG(4, "LZ4_freeStreamHC(%p)", LZ4_streamHCPtr); - if (!LZ4_streamHCPtr) return 0; /* support free on NULL */ - FREEMEM(LZ4_streamHCPtr); - return 0; -} -#endif - - -LZ4_streamHC_t* LZ4_initStreamHC (void* buffer, size_t size) -{ - LZ4_streamHC_t* const LZ4_streamHCPtr = (LZ4_streamHC_t*)buffer; - DEBUGLOG(4, "LZ4_initStreamHC(%p, %u)", buffer, (unsigned)size); - /* check conditions */ - if (buffer == NULL) return NULL; - if (size < sizeof(LZ4_streamHC_t)) return NULL; - if (!LZ4_isAligned(buffer, LZ4_streamHC_t_alignment())) return NULL; - /* init */ - { LZ4HC_CCtx_internal* const hcstate = &(LZ4_streamHCPtr->internal_donotuse); - MEM_INIT(hcstate, 0, sizeof(*hcstate)); } - LZ4_setCompressionLevel(LZ4_streamHCPtr, LZ4HC_CLEVEL_DEFAULT); - return LZ4_streamHCPtr; -} - -/* just a stub */ -void LZ4_resetStreamHC (LZ4_streamHC_t* LZ4_streamHCPtr, int compressionLevel) -{ - LZ4_initStreamHC(LZ4_streamHCPtr, sizeof(*LZ4_streamHCPtr)); - LZ4_setCompressionLevel(LZ4_streamHCPtr, compressionLevel); -} - -void LZ4_resetStreamHC_fast (LZ4_streamHC_t* LZ4_streamHCPtr, int compressionLevel) -{ - LZ4HC_CCtx_internal* const s = &LZ4_streamHCPtr->internal_donotuse; - DEBUGLOG(5, "LZ4_resetStreamHC_fast(%p, %d)", LZ4_streamHCPtr, compressionLevel); - if (s->dirty) { - LZ4_initStreamHC(LZ4_streamHCPtr, sizeof(*LZ4_streamHCPtr)); - } else { - assert(s->end >= s->prefixStart); - s->dictLimit += (U32)(s->end - s->prefixStart); - s->prefixStart = NULL; - s->end = NULL; - s->dictCtx = NULL; - } - LZ4_setCompressionLevel(LZ4_streamHCPtr, compressionLevel); -} - -void LZ4_setCompressionLevel(LZ4_streamHC_t* LZ4_streamHCPtr, int compressionLevel) -{ - DEBUGLOG(5, "LZ4_setCompressionLevel(%p, %d)", LZ4_streamHCPtr, compressionLevel); - if (compressionLevel < 1) compressionLevel = LZ4HC_CLEVEL_DEFAULT; - if (compressionLevel > LZ4HC_CLEVEL_MAX) compressionLevel = LZ4HC_CLEVEL_MAX; - LZ4_streamHCPtr->internal_donotuse.compressionLevel = (short)compressionLevel; -} - -void LZ4_favorDecompressionSpeed(LZ4_streamHC_t* LZ4_streamHCPtr, int favor) -{ - LZ4_streamHCPtr->internal_donotuse.favorDecSpeed = (favor!=0); -} - -/* LZ4_loadDictHC() : - * LZ4_streamHCPtr is presumed properly initialized */ -int LZ4_loadDictHC (LZ4_streamHC_t* LZ4_streamHCPtr, - const char* dictionary, int dictSize) -{ - LZ4HC_CCtx_internal* const ctxPtr = &LZ4_streamHCPtr->internal_donotuse; - DEBUGLOG(4, "LZ4_loadDictHC(ctx:%p, dict:%p, dictSize:%d)", LZ4_streamHCPtr, dictionary, dictSize); - assert(LZ4_streamHCPtr != NULL); - if (dictSize > 64 KB) { - dictionary += (size_t)dictSize - 64 KB; - dictSize = 64 KB; - } - /* need a full initialization, there are bad side-effects when using resetFast() */ - { int const cLevel = ctxPtr->compressionLevel; - LZ4_initStreamHC(LZ4_streamHCPtr, sizeof(*LZ4_streamHCPtr)); - LZ4_setCompressionLevel(LZ4_streamHCPtr, cLevel); - } - LZ4HC_init_internal (ctxPtr, (const BYTE*)dictionary); - ctxPtr->end = (const BYTE*)dictionary + dictSize; - if (dictSize >= LZ4HC_HASHSIZE) LZ4HC_Insert (ctxPtr, ctxPtr->end-3); - return dictSize; -} - -void LZ4_attach_HC_dictionary(LZ4_streamHC_t *working_stream, const LZ4_streamHC_t *dictionary_stream) { - working_stream->internal_donotuse.dictCtx = dictionary_stream != NULL ? &(dictionary_stream->internal_donotuse) : NULL; -} - -/* compression */ - -static void LZ4HC_setExternalDict(LZ4HC_CCtx_internal* ctxPtr, const BYTE* newBlock) -{ - DEBUGLOG(4, "LZ4HC_setExternalDict(%p, %p)", ctxPtr, newBlock); - if (ctxPtr->end >= ctxPtr->prefixStart + 4) - LZ4HC_Insert (ctxPtr, ctxPtr->end-3); /* Referencing remaining dictionary content */ - - /* Only one memory segment for extDict, so any previous extDict is lost at this stage */ - ctxPtr->lowLimit = ctxPtr->dictLimit; - ctxPtr->dictStart = ctxPtr->prefixStart; - ctxPtr->dictLimit += (U32)(ctxPtr->end - ctxPtr->prefixStart); - ctxPtr->prefixStart = newBlock; - ctxPtr->end = newBlock; - ctxPtr->nextToUpdate = ctxPtr->dictLimit; /* match referencing will resume from there */ - - /* cannot reference an extDict and a dictCtx at the same time */ - ctxPtr->dictCtx = NULL; -} - -static int -LZ4_compressHC_continue_generic (LZ4_streamHC_t* LZ4_streamHCPtr, - const char* src, char* dst, - int* srcSizePtr, int dstCapacity, - limitedOutput_directive limit) -{ - LZ4HC_CCtx_internal* const ctxPtr = &LZ4_streamHCPtr->internal_donotuse; - DEBUGLOG(5, "LZ4_compressHC_continue_generic(ctx=%p, src=%p, srcSize=%d, limit=%d)", - LZ4_streamHCPtr, src, *srcSizePtr, limit); - assert(ctxPtr != NULL); - /* auto-init if forgotten */ - if (ctxPtr->prefixStart == NULL) LZ4HC_init_internal (ctxPtr, (const BYTE*) src); - - /* Check overflow */ - if ((size_t)(ctxPtr->end - ctxPtr->prefixStart) + ctxPtr->dictLimit > 2 GB) { - size_t dictSize = (size_t)(ctxPtr->end - ctxPtr->prefixStart); - if (dictSize > 64 KB) dictSize = 64 KB; - LZ4_loadDictHC(LZ4_streamHCPtr, (const char*)(ctxPtr->end) - dictSize, (int)dictSize); - } - - /* Check if blocks follow each other */ - if ((const BYTE*)src != ctxPtr->end) - LZ4HC_setExternalDict(ctxPtr, (const BYTE*)src); - - /* Check overlapping input/dictionary space */ - { const BYTE* sourceEnd = (const BYTE*) src + *srcSizePtr; - const BYTE* const dictBegin = ctxPtr->dictStart; - const BYTE* const dictEnd = ctxPtr->dictStart + (ctxPtr->dictLimit - ctxPtr->lowLimit); - if ((sourceEnd > dictBegin) && ((const BYTE*)src < dictEnd)) { - if (sourceEnd > dictEnd) sourceEnd = dictEnd; - ctxPtr->lowLimit += (U32)(sourceEnd - ctxPtr->dictStart); - ctxPtr->dictStart += (U32)(sourceEnd - ctxPtr->dictStart); - /* invalidate dictionary is it's too small */ - if (ctxPtr->dictLimit - ctxPtr->lowLimit < LZ4HC_HASHSIZE) { - ctxPtr->lowLimit = ctxPtr->dictLimit; - ctxPtr->dictStart = ctxPtr->prefixStart; - } } } - - return LZ4HC_compress_generic (ctxPtr, src, dst, srcSizePtr, dstCapacity, ctxPtr->compressionLevel, limit); -} - -int LZ4_compress_HC_continue (LZ4_streamHC_t* LZ4_streamHCPtr, const char* src, char* dst, int srcSize, int dstCapacity) -{ - DEBUGLOG(5, "LZ4_compress_HC_continue"); - if (dstCapacity < LZ4_compressBound(srcSize)) - return LZ4_compressHC_continue_generic (LZ4_streamHCPtr, src, dst, &srcSize, dstCapacity, limitedOutput); - else - return LZ4_compressHC_continue_generic (LZ4_streamHCPtr, src, dst, &srcSize, dstCapacity, notLimited); -} - -int LZ4_compress_HC_continue_destSize (LZ4_streamHC_t* LZ4_streamHCPtr, const char* src, char* dst, int* srcSizePtr, int targetDestSize) -{ - return LZ4_compressHC_continue_generic(LZ4_streamHCPtr, src, dst, srcSizePtr, targetDestSize, fillOutput); -} - - - -/* LZ4_saveDictHC : - * save history content - * into a user-provided buffer - * which is then used to continue compression - */ -int LZ4_saveDictHC (LZ4_streamHC_t* LZ4_streamHCPtr, char* safeBuffer, int dictSize) -{ - LZ4HC_CCtx_internal* const streamPtr = &LZ4_streamHCPtr->internal_donotuse; - int const prefixSize = (int)(streamPtr->end - streamPtr->prefixStart); - DEBUGLOG(5, "LZ4_saveDictHC(%p, %p, %d)", LZ4_streamHCPtr, safeBuffer, dictSize); - assert(prefixSize >= 0); - if (dictSize > 64 KB) dictSize = 64 KB; - if (dictSize < 4) dictSize = 0; - if (dictSize > prefixSize) dictSize = prefixSize; - if (safeBuffer == NULL) assert(dictSize == 0); - if (dictSize > 0) - LZ4_memmove(safeBuffer, streamPtr->end - dictSize, (size_t)dictSize); - { U32 const endIndex = (U32)(streamPtr->end - streamPtr->prefixStart) + streamPtr->dictLimit; - streamPtr->end = (safeBuffer == NULL) ? NULL : (const BYTE*)safeBuffer + dictSize; - streamPtr->prefixStart = (const BYTE*)safeBuffer; - streamPtr->dictLimit = endIndex - (U32)dictSize; - streamPtr->lowLimit = endIndex - (U32)dictSize; - streamPtr->dictStart = streamPtr->prefixStart; - if (streamPtr->nextToUpdate < streamPtr->dictLimit) - streamPtr->nextToUpdate = streamPtr->dictLimit; - } - return dictSize; -} - - -/*************************************************** -* Deprecated Functions -***************************************************/ - -/* These functions currently generate deprecation warnings */ - -/* Wrappers for deprecated compression functions */ -int LZ4_compressHC(const char* src, char* dst, int srcSize) { return LZ4_compress_HC (src, dst, srcSize, LZ4_compressBound(srcSize), 0); } -int LZ4_compressHC_limitedOutput(const char* src, char* dst, int srcSize, int maxDstSize) { return LZ4_compress_HC(src, dst, srcSize, maxDstSize, 0); } -int LZ4_compressHC2(const char* src, char* dst, int srcSize, int cLevel) { return LZ4_compress_HC (src, dst, srcSize, LZ4_compressBound(srcSize), cLevel); } -int LZ4_compressHC2_limitedOutput(const char* src, char* dst, int srcSize, int maxDstSize, int cLevel) { return LZ4_compress_HC(src, dst, srcSize, maxDstSize, cLevel); } -int LZ4_compressHC_withStateHC (void* state, const char* src, char* dst, int srcSize) { return LZ4_compress_HC_extStateHC (state, src, dst, srcSize, LZ4_compressBound(srcSize), 0); } -int LZ4_compressHC_limitedOutput_withStateHC (void* state, const char* src, char* dst, int srcSize, int maxDstSize) { return LZ4_compress_HC_extStateHC (state, src, dst, srcSize, maxDstSize, 0); } -int LZ4_compressHC2_withStateHC (void* state, const char* src, char* dst, int srcSize, int cLevel) { return LZ4_compress_HC_extStateHC(state, src, dst, srcSize, LZ4_compressBound(srcSize), cLevel); } -int LZ4_compressHC2_limitedOutput_withStateHC (void* state, const char* src, char* dst, int srcSize, int maxDstSize, int cLevel) { return LZ4_compress_HC_extStateHC(state, src, dst, srcSize, maxDstSize, cLevel); } -int LZ4_compressHC_continue (LZ4_streamHC_t* ctx, const char* src, char* dst, int srcSize) { return LZ4_compress_HC_continue (ctx, src, dst, srcSize, LZ4_compressBound(srcSize)); } -int LZ4_compressHC_limitedOutput_continue (LZ4_streamHC_t* ctx, const char* src, char* dst, int srcSize, int maxDstSize) { return LZ4_compress_HC_continue (ctx, src, dst, srcSize, maxDstSize); } - - -/* Deprecated streaming functions */ -int LZ4_sizeofStreamStateHC(void) { return sizeof(LZ4_streamHC_t); } - -/* state is presumed correctly sized, aka >= sizeof(LZ4_streamHC_t) - * @return : 0 on success, !=0 if error */ -int LZ4_resetStreamStateHC(void* state, char* inputBuffer) -{ - LZ4_streamHC_t* const hc4 = LZ4_initStreamHC(state, sizeof(*hc4)); - if (hc4 == NULL) return 1; /* init failed */ - LZ4HC_init_internal (&hc4->internal_donotuse, (const BYTE*)inputBuffer); - return 0; -} - -#if !defined(LZ4_STATIC_LINKING_ONLY_DISABLE_MEMORY_ALLOCATION) -void* LZ4_createHC (const char* inputBuffer) -{ - LZ4_streamHC_t* const hc4 = LZ4_createStreamHC(); - if (hc4 == NULL) return NULL; /* not enough memory */ - LZ4HC_init_internal (&hc4->internal_donotuse, (const BYTE*)inputBuffer); - return hc4; -} - -int LZ4_freeHC (void* LZ4HC_Data) -{ - if (!LZ4HC_Data) return 0; /* support free on NULL */ - FREEMEM(LZ4HC_Data); - return 0; -} -#endif - -int LZ4_compressHC2_continue (void* LZ4HC_Data, const char* src, char* dst, int srcSize, int cLevel) -{ - return LZ4HC_compress_generic (&((LZ4_streamHC_t*)LZ4HC_Data)->internal_donotuse, src, dst, &srcSize, 0, cLevel, notLimited); -} - -int LZ4_compressHC2_limitedOutput_continue (void* LZ4HC_Data, const char* src, char* dst, int srcSize, int dstCapacity, int cLevel) -{ - return LZ4HC_compress_generic (&((LZ4_streamHC_t*)LZ4HC_Data)->internal_donotuse, src, dst, &srcSize, dstCapacity, cLevel, limitedOutput); -} - -char* LZ4_slideInputBufferHC(void* LZ4HC_Data) -{ - LZ4HC_CCtx_internal* const s = &((LZ4_streamHC_t*)LZ4HC_Data)->internal_donotuse; - const BYTE* const bufferStart = s->prefixStart - s->dictLimit + s->lowLimit; - LZ4_resetStreamHC_fast((LZ4_streamHC_t*)LZ4HC_Data, s->compressionLevel); - /* ugly conversion trick, required to evade (const char*) -> (char*) cast-qual warning :( */ - return (char*)(uptrval)bufferStart; -} - - -/* ================================================ - * LZ4 Optimal parser (levels [LZ4HC_CLEVEL_OPT_MIN - LZ4HC_CLEVEL_MAX]) - * ===============================================*/ -typedef struct { - int price; - int off; - int mlen; - int litlen; -} LZ4HC_optimal_t; - -/* price in bytes */ -LZ4_FORCE_INLINE int LZ4HC_literalsPrice(int const litlen) -{ - int price = litlen; - assert(litlen >= 0); - if (litlen >= (int)RUN_MASK) - price += 1 + ((litlen-(int)RUN_MASK) / 255); - return price; -} - - -/* requires mlen >= MINMATCH */ -LZ4_FORCE_INLINE int LZ4HC_sequencePrice(int litlen, int mlen) -{ - int price = 1 + 2 ; /* token + 16-bit offset */ - assert(litlen >= 0); - assert(mlen >= MINMATCH); - - price += LZ4HC_literalsPrice(litlen); - - if (mlen >= (int)(ML_MASK+MINMATCH)) - price += 1 + ((mlen-(int)(ML_MASK+MINMATCH)) / 255); - - return price; -} - - - -LZ4_FORCE_INLINE LZ4HC_match_t -LZ4HC_FindLongerMatch(LZ4HC_CCtx_internal* const ctx, - const BYTE* ip, const BYTE* const iHighLimit, - int minLen, int nbSearches, - const dictCtx_directive dict, - const HCfavor_e favorDecSpeed) -{ - LZ4HC_match_t const match0 = { 0 , 0 }; - /* note : LZ4HC_InsertAndGetWiderMatch() is able to modify the starting position of a match (*startpos), - * but this won't be the case here, as we define iLowLimit==ip, - ** so LZ4HC_InsertAndGetWiderMatch() won't be allowed to search past ip */ - LZ4HC_match_t md = LZ4HC_InsertAndGetWiderMatch(ctx, ip, ip, iHighLimit, minLen, &ip, nbSearches, 1 /*patternAnalysis*/, 1 /*chainSwap*/, dict, favorDecSpeed); - if (md.len <= minLen) return match0; - if (favorDecSpeed) { - if ((md.len>18) & (md.len<=36)) md.len=18; /* favor shortcut */ - } - return md; -} - - -static int LZ4HC_compress_optimal ( LZ4HC_CCtx_internal* ctx, - const char* const source, - char* dst, - int* srcSizePtr, - int dstCapacity, - int const nbSearches, - size_t sufficient_len, - const limitedOutput_directive limit, - int const fullUpdate, - const dictCtx_directive dict, - const HCfavor_e favorDecSpeed) -{ - int retval = 0; -#define TRAILING_LITERALS 3 -#if defined(LZ4HC_HEAPMODE) && LZ4HC_HEAPMODE==1 - LZ4HC_optimal_t* const opt = (LZ4HC_optimal_t*)ALLOC(sizeof(LZ4HC_optimal_t) * (LZ4_OPT_NUM + TRAILING_LITERALS)); -#else - LZ4HC_optimal_t opt[LZ4_OPT_NUM + TRAILING_LITERALS]; /* ~64 KB, which is a bit large for stack... */ -#endif - - const BYTE* ip = (const BYTE*) source; - const BYTE* anchor = ip; - const BYTE* const iend = ip + *srcSizePtr; - const BYTE* const mflimit = iend - MFLIMIT; - const BYTE* const matchlimit = iend - LASTLITERALS; - BYTE* op = (BYTE*) dst; - BYTE* opSaved = (BYTE*) dst; - BYTE* oend = op + dstCapacity; - int ovml = MINMATCH; /* overflow - last sequence */ - int ovoff = 0; - - /* init */ -#if defined(LZ4HC_HEAPMODE) && LZ4HC_HEAPMODE==1 - if (opt == NULL) goto _return_label; -#endif - DEBUGLOG(5, "LZ4HC_compress_optimal(dst=%p, dstCapa=%u)", dst, (unsigned)dstCapacity); - *srcSizePtr = 0; - if (limit == fillOutput) oend -= LASTLITERALS; /* Hack for support LZ4 format restriction */ - if (sufficient_len >= LZ4_OPT_NUM) sufficient_len = LZ4_OPT_NUM-1; - - /* Main Loop */ - while (ip <= mflimit) { - int const llen = (int)(ip - anchor); - int best_mlen, best_off; - int cur, last_match_pos = 0; - - LZ4HC_match_t const firstMatch = LZ4HC_FindLongerMatch(ctx, ip, matchlimit, MINMATCH-1, nbSearches, dict, favorDecSpeed); - if (firstMatch.len==0) { ip++; continue; } - - if ((size_t)firstMatch.len > sufficient_len) { - /* good enough solution : immediate encoding */ - int const firstML = firstMatch.len; - opSaved = op; - if ( LZ4HC_encodeSequence(UPDATABLE(ip, op, anchor), firstML, firstMatch.off, limit, oend) ) { /* updates ip, op and anchor */ - ovml = firstML; - ovoff = firstMatch.off; - goto _dest_overflow; - } - continue; - } - - /* set prices for first positions (literals) */ - { int rPos; - for (rPos = 0 ; rPos < MINMATCH ; rPos++) { - int const cost = LZ4HC_literalsPrice(llen + rPos); - opt[rPos].mlen = 1; - opt[rPos].off = 0; - opt[rPos].litlen = llen + rPos; - opt[rPos].price = cost; - DEBUGLOG(7, "rPos:%3i => price:%3i (litlen=%i) -- initial setup", - rPos, cost, opt[rPos].litlen); - } } - /* set prices using initial match */ - { int mlen = MINMATCH; - int const matchML = firstMatch.len; /* necessarily < sufficient_len < LZ4_OPT_NUM */ - int const offset = firstMatch.off; - assert(matchML < LZ4_OPT_NUM); - for ( ; mlen <= matchML ; mlen++) { - int const cost = LZ4HC_sequencePrice(llen, mlen); - opt[mlen].mlen = mlen; - opt[mlen].off = offset; - opt[mlen].litlen = llen; - opt[mlen].price = cost; - DEBUGLOG(7, "rPos:%3i => price:%3i (matchlen=%i) -- initial setup", - mlen, cost, mlen); - } } - last_match_pos = firstMatch.len; - { int addLit; - for (addLit = 1; addLit <= TRAILING_LITERALS; addLit ++) { - opt[last_match_pos+addLit].mlen = 1; /* literal */ - opt[last_match_pos+addLit].off = 0; - opt[last_match_pos+addLit].litlen = addLit; - opt[last_match_pos+addLit].price = opt[last_match_pos].price + LZ4HC_literalsPrice(addLit); - DEBUGLOG(7, "rPos:%3i => price:%3i (litlen=%i) -- initial setup", - last_match_pos+addLit, opt[last_match_pos+addLit].price, addLit); - } } - - /* check further positions */ - for (cur = 1; cur < last_match_pos; cur++) { - const BYTE* const curPtr = ip + cur; - LZ4HC_match_t newMatch; - - if (curPtr > mflimit) break; - DEBUGLOG(7, "rPos:%u[%u] vs [%u]%u", - cur, opt[cur].price, opt[cur+1].price, cur+1); - if (fullUpdate) { - /* not useful to search here if next position has same (or lower) cost */ - if ( (opt[cur+1].price <= opt[cur].price) - /* in some cases, next position has same cost, but cost rises sharply after, so a small match would still be beneficial */ - && (opt[cur+MINMATCH].price < opt[cur].price + 3/*min seq price*/) ) - continue; - } else { - /* not useful to search here if next position has same (or lower) cost */ - if (opt[cur+1].price <= opt[cur].price) continue; - } - - DEBUGLOG(7, "search at rPos:%u", cur); - if (fullUpdate) - newMatch = LZ4HC_FindLongerMatch(ctx, curPtr, matchlimit, MINMATCH-1, nbSearches, dict, favorDecSpeed); - else - /* only test matches of minimum length; slightly faster, but misses a few bytes */ - newMatch = LZ4HC_FindLongerMatch(ctx, curPtr, matchlimit, last_match_pos - cur, nbSearches, dict, favorDecSpeed); - if (!newMatch.len) continue; - - if ( ((size_t)newMatch.len > sufficient_len) - || (newMatch.len + cur >= LZ4_OPT_NUM) ) { - /* immediate encoding */ - best_mlen = newMatch.len; - best_off = newMatch.off; - last_match_pos = cur + 1; - goto encode; - } - - /* before match : set price with literals at beginning */ - { int const baseLitlen = opt[cur].litlen; - int litlen; - for (litlen = 1; litlen < MINMATCH; litlen++) { - int const price = opt[cur].price - LZ4HC_literalsPrice(baseLitlen) + LZ4HC_literalsPrice(baseLitlen+litlen); - int const pos = cur + litlen; - if (price < opt[pos].price) { - opt[pos].mlen = 1; /* literal */ - opt[pos].off = 0; - opt[pos].litlen = baseLitlen+litlen; - opt[pos].price = price; - DEBUGLOG(7, "rPos:%3i => price:%3i (litlen=%i)", - pos, price, opt[pos].litlen); - } } } - - /* set prices using match at position = cur */ - { int const matchML = newMatch.len; - int ml = MINMATCH; - - assert(cur + newMatch.len < LZ4_OPT_NUM); - for ( ; ml <= matchML ; ml++) { - int const pos = cur + ml; - int const offset = newMatch.off; - int price; - int ll; - DEBUGLOG(7, "testing price rPos %i (last_match_pos=%i)", - pos, last_match_pos); - if (opt[cur].mlen == 1) { - ll = opt[cur].litlen; - price = ((cur > ll) ? opt[cur - ll].price : 0) - + LZ4HC_sequencePrice(ll, ml); - } else { - ll = 0; - price = opt[cur].price + LZ4HC_sequencePrice(0, ml); - } - - assert((U32)favorDecSpeed <= 1); - if (pos > last_match_pos+TRAILING_LITERALS - || price <= opt[pos].price - (int)favorDecSpeed) { - DEBUGLOG(7, "rPos:%3i => price:%3i (matchlen=%i)", - pos, price, ml); - assert(pos < LZ4_OPT_NUM); - if ( (ml == matchML) /* last pos of last match */ - && (last_match_pos < pos) ) - last_match_pos = pos; - opt[pos].mlen = ml; - opt[pos].off = offset; - opt[pos].litlen = ll; - opt[pos].price = price; - } } } - /* complete following positions with literals */ - { int addLit; - for (addLit = 1; addLit <= TRAILING_LITERALS; addLit ++) { - opt[last_match_pos+addLit].mlen = 1; /* literal */ - opt[last_match_pos+addLit].off = 0; - opt[last_match_pos+addLit].litlen = addLit; - opt[last_match_pos+addLit].price = opt[last_match_pos].price + LZ4HC_literalsPrice(addLit); - DEBUGLOG(7, "rPos:%3i => price:%3i (litlen=%i)", last_match_pos+addLit, opt[last_match_pos+addLit].price, addLit); - } } - } /* for (cur = 1; cur <= last_match_pos; cur++) */ - - assert(last_match_pos < LZ4_OPT_NUM + TRAILING_LITERALS); - best_mlen = opt[last_match_pos].mlen; - best_off = opt[last_match_pos].off; - cur = last_match_pos - best_mlen; - -encode: /* cur, last_match_pos, best_mlen, best_off must be set */ - assert(cur < LZ4_OPT_NUM); - assert(last_match_pos >= 1); /* == 1 when only one candidate */ - DEBUGLOG(6, "reverse traversal, looking for shortest path (last_match_pos=%i)", last_match_pos); - { int candidate_pos = cur; - int selected_matchLength = best_mlen; - int selected_offset = best_off; - while (1) { /* from end to beginning */ - int const next_matchLength = opt[candidate_pos].mlen; /* can be 1, means literal */ - int const next_offset = opt[candidate_pos].off; - DEBUGLOG(7, "pos %i: sequence length %i", candidate_pos, selected_matchLength); - opt[candidate_pos].mlen = selected_matchLength; - opt[candidate_pos].off = selected_offset; - selected_matchLength = next_matchLength; - selected_offset = next_offset; - if (next_matchLength > candidate_pos) break; /* last match elected, first match to encode */ - assert(next_matchLength > 0); /* can be 1, means literal */ - candidate_pos -= next_matchLength; - } } - - /* encode all recorded sequences in order */ - { int rPos = 0; /* relative position (to ip) */ - while (rPos < last_match_pos) { - int const ml = opt[rPos].mlen; - int const offset = opt[rPos].off; - if (ml == 1) { ip++; rPos++; continue; } /* literal; note: can end up with several literals, in which case, skip them */ - rPos += ml; - assert(ml >= MINMATCH); - assert((offset >= 1) && (offset <= LZ4_DISTANCE_MAX)); - opSaved = op; - if ( LZ4HC_encodeSequence(UPDATABLE(ip, op, anchor), ml, offset, limit, oend) ) { /* updates ip, op and anchor */ - ovml = ml; - ovoff = offset; - goto _dest_overflow; - } } } - } /* while (ip <= mflimit) */ - -_last_literals: - /* Encode Last Literals */ - { size_t lastRunSize = (size_t)(iend - anchor); /* literals */ - size_t llAdd = (lastRunSize + 255 - RUN_MASK) / 255; - size_t const totalSize = 1 + llAdd + lastRunSize; - if (limit == fillOutput) oend += LASTLITERALS; /* restore correct value */ - if (limit && (op + totalSize > oend)) { - if (limit == limitedOutput) { /* Check output limit */ - retval = 0; - goto _return_label; - } - /* adapt lastRunSize to fill 'dst' */ - lastRunSize = (size_t)(oend - op) - 1 /*token*/; - llAdd = (lastRunSize + 256 - RUN_MASK) / 256; - lastRunSize -= llAdd; - } - DEBUGLOG(6, "Final literal run : %i literals", (int)lastRunSize); - ip = anchor + lastRunSize; /* can be != iend if limit==fillOutput */ - - if (lastRunSize >= RUN_MASK) { - size_t accumulator = lastRunSize - RUN_MASK; - *op++ = (RUN_MASK << ML_BITS); - for(; accumulator >= 255 ; accumulator -= 255) *op++ = 255; - *op++ = (BYTE) accumulator; - } else { - *op++ = (BYTE)(lastRunSize << ML_BITS); - } - LZ4_memcpy(op, anchor, lastRunSize); - op += lastRunSize; - } - - /* End */ - *srcSizePtr = (int) (((const char*)ip) - source); - retval = (int) ((char*)op-dst); - goto _return_label; - -_dest_overflow: -if (limit == fillOutput) { - /* Assumption : ip, anchor, ovml and ovref must be set correctly */ - size_t const ll = (size_t)(ip - anchor); - size_t const ll_addbytes = (ll + 240) / 255; - size_t const ll_totalCost = 1 + ll_addbytes + ll; - BYTE* const maxLitPos = oend - 3; /* 2 for offset, 1 for token */ - DEBUGLOG(6, "Last sequence overflowing (only %i bytes remaining)", (int)(oend-1-opSaved)); - op = opSaved; /* restore correct out pointer */ - if (op + ll_totalCost <= maxLitPos) { - /* ll validated; now adjust match length */ - size_t const bytesLeftForMl = (size_t)(maxLitPos - (op+ll_totalCost)); - size_t const maxMlSize = MINMATCH + (ML_MASK-1) + (bytesLeftForMl * 255); - assert(maxMlSize < INT_MAX); assert(ovml >= 0); - if ((size_t)ovml > maxMlSize) ovml = (int)maxMlSize; - if ((oend + LASTLITERALS) - (op + ll_totalCost + 2) - 1 + ovml >= MFLIMIT) { - DEBUGLOG(6, "Space to end : %i + ml (%i)", (int)((oend + LASTLITERALS) - (op + ll_totalCost + 2) - 1), ovml); - DEBUGLOG(6, "Before : ip = %p, anchor = %p", ip, anchor); - LZ4HC_encodeSequence(UPDATABLE(ip, op, anchor), ovml, ovoff, notLimited, oend); - DEBUGLOG(6, "After : ip = %p, anchor = %p", ip, anchor); - } } - goto _last_literals; -} -_return_label: -#if defined(LZ4HC_HEAPMODE) && LZ4HC_HEAPMODE==1 - FREEMEM(opt); -#endif - return retval; -} diff --git a/CompressSave/LZ4WrapC/lz4/lz4hc.h b/CompressSave/LZ4WrapC/lz4/lz4hc.h deleted file mode 100644 index e937acf..0000000 --- a/CompressSave/LZ4WrapC/lz4/lz4hc.h +++ /dev/null @@ -1,413 +0,0 @@ -/* - LZ4 HC - High Compression Mode of LZ4 - Header File - Copyright (C) 2011-2020, Yann Collet. - BSD 2-Clause License (http://www.opensource.org/licenses/bsd-license.php) - - Redistribution and use in source and binary forms, with or without - modification, are permitted provided that the following conditions are - met: - - * Redistributions of source code must retain the above copyright - notice, this list of conditions and the following disclaimer. - * Redistributions in binary form must reproduce the above - copyright notice, this list of conditions and the following disclaimer - in the documentation and/or other materials provided with the - distribution. - - THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - "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 COPYRIGHT - OWNER OR CONTRIBUTORS 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. - - You can contact the author at : - - LZ4 source repository : https://github.com/lz4/lz4 - - LZ4 public forum : https://groups.google.com/forum/#!forum/lz4c -*/ -#ifndef LZ4_HC_H_19834876238432 -#define LZ4_HC_H_19834876238432 - -#if defined (__cplusplus) -extern "C" { -#endif - -/* --- Dependency --- */ -/* note : lz4hc requires lz4.h/lz4.c for compilation */ -#include "lz4.h" /* stddef, LZ4LIB_API, LZ4_DEPRECATED */ - - -/* --- Useful constants --- */ -#define LZ4HC_CLEVEL_MIN 3 -#define LZ4HC_CLEVEL_DEFAULT 9 -#define LZ4HC_CLEVEL_OPT_MIN 10 -#define LZ4HC_CLEVEL_MAX 12 - - -/*-************************************ - * Block Compression - **************************************/ -/*! LZ4_compress_HC() : - * Compress data from `src` into `dst`, using the powerful but slower "HC" algorithm. - * `dst` must be already allocated. - * Compression is guaranteed to succeed if `dstCapacity >= LZ4_compressBound(srcSize)` (see "lz4.h") - * Max supported `srcSize` value is LZ4_MAX_INPUT_SIZE (see "lz4.h") - * `compressionLevel` : any value between 1 and LZ4HC_CLEVEL_MAX will work. - * Values > LZ4HC_CLEVEL_MAX behave the same as LZ4HC_CLEVEL_MAX. - * @return : the number of bytes written into 'dst' - * or 0 if compression fails. - */ -LZ4LIB_API int LZ4_compress_HC (const char* src, char* dst, int srcSize, int dstCapacity, int compressionLevel); - - -/* Note : - * Decompression functions are provided within "lz4.h" (BSD license) - */ - - -/*! LZ4_compress_HC_extStateHC() : - * Same as LZ4_compress_HC(), but using an externally allocated memory segment for `state`. - * `state` size is provided by LZ4_sizeofStateHC(). - * Memory segment must be aligned on 8-bytes boundaries (which a normal malloc() should do properly). - */ -LZ4LIB_API int LZ4_sizeofStateHC(void); -LZ4LIB_API int LZ4_compress_HC_extStateHC(void* stateHC, const char* src, char* dst, int srcSize, int maxDstSize, int compressionLevel); - - -/*! LZ4_compress_HC_destSize() : v1.9.0+ - * Will compress as much data as possible from `src` - * to fit into `targetDstSize` budget. - * Result is provided in 2 parts : - * @return : the number of bytes written into 'dst' (necessarily <= targetDstSize) - * or 0 if compression fails. - * `srcSizePtr` : on success, *srcSizePtr is updated to indicate how much bytes were read from `src` - */ -LZ4LIB_API int LZ4_compress_HC_destSize(void* stateHC, - const char* src, char* dst, - int* srcSizePtr, int targetDstSize, - int compressionLevel); - - -/*-************************************ - * Streaming Compression - * Bufferless synchronous API - **************************************/ - typedef union LZ4_streamHC_u LZ4_streamHC_t; /* incomplete type (defined later) */ - -/*! LZ4_createStreamHC() and LZ4_freeStreamHC() : - * These functions create and release memory for LZ4 HC streaming state. - * Newly created states are automatically initialized. - * A same state can be used multiple times consecutively, - * starting with LZ4_resetStreamHC_fast() to start a new stream of blocks. - */ -LZ4LIB_API LZ4_streamHC_t* LZ4_createStreamHC(void); -LZ4LIB_API int LZ4_freeStreamHC (LZ4_streamHC_t* streamHCPtr); - -/* - These functions compress data in successive blocks of any size, - using previous blocks as dictionary, to improve compression ratio. - One key assumption is that previous blocks (up to 64 KB) remain read-accessible while compressing next blocks. - There is an exception for ring buffers, which can be smaller than 64 KB. - Ring-buffer scenario is automatically detected and handled within LZ4_compress_HC_continue(). - - Before starting compression, state must be allocated and properly initialized. - LZ4_createStreamHC() does both, though compression level is set to LZ4HC_CLEVEL_DEFAULT. - - Selecting the compression level can be done with LZ4_resetStreamHC_fast() (starts a new stream) - or LZ4_setCompressionLevel() (anytime, between blocks in the same stream) (experimental). - LZ4_resetStreamHC_fast() only works on states which have been properly initialized at least once, - which is automatically the case when state is created using LZ4_createStreamHC(). - - After reset, a first "fictional block" can be designated as initial dictionary, - using LZ4_loadDictHC() (Optional). - - Invoke LZ4_compress_HC_continue() to compress each successive block. - The number of blocks is unlimited. - Previous input blocks, including initial dictionary when present, - must remain accessible and unmodified during compression. - - It's allowed to update compression level anytime between blocks, - using LZ4_setCompressionLevel() (experimental). - - 'dst' buffer should be sized to handle worst case scenarios - (see LZ4_compressBound(), it ensures compression success). - In case of failure, the API does not guarantee recovery, - so the state _must_ be reset. - To ensure compression success - whenever `dst` buffer size cannot be made >= LZ4_compressBound(), - consider using LZ4_compress_HC_continue_destSize(). - - Whenever previous input blocks can't be preserved unmodified in-place during compression of next blocks, - it's possible to copy the last blocks into a more stable memory space, using LZ4_saveDictHC(). - Return value of LZ4_saveDictHC() is the size of dictionary effectively saved into 'safeBuffer' (<= 64 KB) - - After completing a streaming compression, - it's possible to start a new stream of blocks, using the same LZ4_streamHC_t state, - just by resetting it, using LZ4_resetStreamHC_fast(). -*/ - -LZ4LIB_API void LZ4_resetStreamHC_fast(LZ4_streamHC_t* streamHCPtr, int compressionLevel); /* v1.9.0+ */ -LZ4LIB_API int LZ4_loadDictHC (LZ4_streamHC_t* streamHCPtr, const char* dictionary, int dictSize); - -LZ4LIB_API int LZ4_compress_HC_continue (LZ4_streamHC_t* streamHCPtr, - const char* src, char* dst, - int srcSize, int maxDstSize); - -/*! LZ4_compress_HC_continue_destSize() : v1.9.0+ - * Similar to LZ4_compress_HC_continue(), - * but will read as much data as possible from `src` - * to fit into `targetDstSize` budget. - * Result is provided into 2 parts : - * @return : the number of bytes written into 'dst' (necessarily <= targetDstSize) - * or 0 if compression fails. - * `srcSizePtr` : on success, *srcSizePtr will be updated to indicate how much bytes were read from `src`. - * Note that this function may not consume the entire input. - */ -LZ4LIB_API int LZ4_compress_HC_continue_destSize(LZ4_streamHC_t* LZ4_streamHCPtr, - const char* src, char* dst, - int* srcSizePtr, int targetDstSize); - -LZ4LIB_API int LZ4_saveDictHC (LZ4_streamHC_t* streamHCPtr, char* safeBuffer, int maxDictSize); - - - -/*^********************************************** - * !!!!!! STATIC LINKING ONLY !!!!!! - ***********************************************/ - -/*-****************************************************************** - * PRIVATE DEFINITIONS : - * Do not use these definitions directly. - * They are merely exposed to allow static allocation of `LZ4_streamHC_t`. - * Declare an `LZ4_streamHC_t` directly, rather than any type below. - * Even then, only do so in the context of static linking, as definitions may change between versions. - ********************************************************************/ - -#define LZ4HC_DICTIONARY_LOGSIZE 16 -#define LZ4HC_MAXD (1<= LZ4HC_CLEVEL_OPT_MIN. - */ -LZ4LIB_STATIC_API void LZ4_favorDecompressionSpeed( - LZ4_streamHC_t* LZ4_streamHCPtr, int favor); - -/*! LZ4_resetStreamHC_fast() : v1.9.0+ - * When an LZ4_streamHC_t is known to be in a internally coherent state, - * it can often be prepared for a new compression with almost no work, only - * sometimes falling back to the full, expensive reset that is always required - * when the stream is in an indeterminate state (i.e., the reset performed by - * LZ4_resetStreamHC()). - * - * LZ4_streamHCs are guaranteed to be in a valid state when: - * - returned from LZ4_createStreamHC() - * - reset by LZ4_resetStreamHC() - * - memset(stream, 0, sizeof(LZ4_streamHC_t)) - * - the stream was in a valid state and was reset by LZ4_resetStreamHC_fast() - * - the stream was in a valid state and was then used in any compression call - * that returned success - * - the stream was in an indeterminate state and was used in a compression - * call that fully reset the state (LZ4_compress_HC_extStateHC()) and that - * returned success - * - * Note: - * A stream that was last used in a compression call that returned an error - * may be passed to this function. However, it will be fully reset, which will - * clear any existing history and settings from the context. - */ -LZ4LIB_STATIC_API void LZ4_resetStreamHC_fast( - LZ4_streamHC_t* LZ4_streamHCPtr, int compressionLevel); - -/*! LZ4_compress_HC_extStateHC_fastReset() : - * A variant of LZ4_compress_HC_extStateHC(). - * - * Using this variant avoids an expensive initialization step. It is only safe - * to call if the state buffer is known to be correctly initialized already - * (see above comment on LZ4_resetStreamHC_fast() for a definition of - * "correctly initialized"). From a high level, the difference is that this - * function initializes the provided state with a call to - * LZ4_resetStreamHC_fast() while LZ4_compress_HC_extStateHC() starts with a - * call to LZ4_resetStreamHC(). - */ -LZ4LIB_STATIC_API int LZ4_compress_HC_extStateHC_fastReset ( - void* state, - const char* src, char* dst, - int srcSize, int dstCapacity, - int compressionLevel); - -/*! LZ4_attach_HC_dictionary() : - * This is an experimental API that allows for the efficient use of a - * static dictionary many times. - * - * Rather than re-loading the dictionary buffer into a working context before - * each compression, or copying a pre-loaded dictionary's LZ4_streamHC_t into a - * working LZ4_streamHC_t, this function introduces a no-copy setup mechanism, - * in which the working stream references the dictionary stream in-place. - * - * Several assumptions are made about the state of the dictionary stream. - * Currently, only streams which have been prepared by LZ4_loadDictHC() should - * be expected to work. - * - * Alternatively, the provided dictionary stream pointer may be NULL, in which - * case any existing dictionary stream is unset. - * - * A dictionary should only be attached to a stream without any history (i.e., - * a stream that has just been reset). - * - * The dictionary will remain attached to the working stream only for the - * current stream session. Calls to LZ4_resetStreamHC(_fast) will remove the - * dictionary context association from the working stream. The dictionary - * stream (and source buffer) must remain in-place / accessible / unchanged - * through the lifetime of the stream session. - */ -LZ4LIB_STATIC_API void LZ4_attach_HC_dictionary( - LZ4_streamHC_t *working_stream, - const LZ4_streamHC_t *dictionary_stream); - -#if defined (__cplusplus) -} -#endif - -#endif /* LZ4_HC_SLO_098092834 */ -#endif /* LZ4_HC_STATIC_LINKING_ONLY */ diff --git a/CompressSave/LZ4WrapC/lz4/xxhash.c b/CompressSave/LZ4WrapC/lz4/xxhash.c deleted file mode 100644 index ff28749..0000000 --- a/CompressSave/LZ4WrapC/lz4/xxhash.c +++ /dev/null @@ -1,1030 +0,0 @@ -/* -* xxHash - Fast Hash algorithm -* Copyright (C) 2012-2016, Yann Collet -* -* BSD 2-Clause License (http://www.opensource.org/licenses/bsd-license.php) -* -* Redistribution and use in source and binary forms, with or without -* modification, are permitted provided that the following conditions are -* met: -* -* * Redistributions of source code must retain the above copyright -* notice, this list of conditions and the following disclaimer. -* * Redistributions in binary form must reproduce the above -* copyright notice, this list of conditions and the following disclaimer -* in the documentation and/or other materials provided with the -* distribution. -* -* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -* "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 COPYRIGHT -* OWNER OR CONTRIBUTORS 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. -* -* You can contact the author at : -* - xxHash homepage: http://www.xxhash.com -* - xxHash source repository : https://github.com/Cyan4973/xxHash -*/ - - -/* ************************************* -* Tuning parameters -***************************************/ -/*!XXH_FORCE_MEMORY_ACCESS : - * By default, access to unaligned memory is controlled by `memcpy()`, which is safe and portable. - * Unfortunately, on some target/compiler combinations, the generated assembly is sub-optimal. - * The below switch allow to select different access method for improved performance. - * Method 0 (default) : use `memcpy()`. Safe and portable. - * Method 1 : `__packed` statement. It depends on compiler extension (ie, not portable). - * This method is safe if your compiler supports it, and *generally* as fast or faster than `memcpy`. - * Method 2 : direct access. This method doesn't depend on compiler but violate C standard. - * It can generate buggy code on targets which do not support unaligned memory accesses. - * But in some circumstances, it's the only known way to get the most performance (ie GCC + ARMv6) - * See http://stackoverflow.com/a/32095106/646947 for details. - * Prefer these methods in priority order (0 > 1 > 2) - */ -#ifndef XXH_FORCE_MEMORY_ACCESS /* can be defined externally, on command line for example */ -# if defined(__GNUC__) && ( defined(__ARM_ARCH_6__) || defined(__ARM_ARCH_6J__) \ - || defined(__ARM_ARCH_6K__) || defined(__ARM_ARCH_6Z__) \ - || defined(__ARM_ARCH_6ZK__) || defined(__ARM_ARCH_6T2__) ) -# define XXH_FORCE_MEMORY_ACCESS 2 -# elif (defined(__INTEL_COMPILER) && !defined(_WIN32)) || \ - (defined(__GNUC__) && ( defined(__ARM_ARCH_7__) || defined(__ARM_ARCH_7A__) \ - || defined(__ARM_ARCH_7R__) || defined(__ARM_ARCH_7M__) \ - || defined(__ARM_ARCH_7S__) )) -# define XXH_FORCE_MEMORY_ACCESS 1 -# endif -#endif - -/*!XXH_ACCEPT_NULL_INPUT_POINTER : - * If input pointer is NULL, xxHash default behavior is to dereference it, triggering a segfault. - * When this macro is enabled, xxHash actively checks input for null pointer. - * It it is, result for null input pointers is the same as a null-length input. - */ -#ifndef XXH_ACCEPT_NULL_INPUT_POINTER /* can be defined externally */ -# define XXH_ACCEPT_NULL_INPUT_POINTER 0 -#endif - -/*!XXH_FORCE_NATIVE_FORMAT : - * By default, xxHash library provides endian-independent Hash values, based on little-endian convention. - * Results are therefore identical for little-endian and big-endian CPU. - * This comes at a performance cost for big-endian CPU, since some swapping is required to emulate little-endian format. - * Should endian-independence be of no importance for your application, you may set the #define below to 1, - * to improve speed for Big-endian CPU. - * This option has no impact on Little_Endian CPU. - */ -#ifndef XXH_FORCE_NATIVE_FORMAT /* can be defined externally */ -# define XXH_FORCE_NATIVE_FORMAT 0 -#endif - -/*!XXH_FORCE_ALIGN_CHECK : - * This is a minor performance trick, only useful with lots of very small keys. - * It means : check for aligned/unaligned input. - * The check costs one initial branch per hash; - * set it to 0 when the input is guaranteed to be aligned, - * or when alignment doesn't matter for performance. - */ -#ifndef XXH_FORCE_ALIGN_CHECK /* can be defined externally */ -# if defined(__i386) || defined(_M_IX86) || defined(__x86_64__) || defined(_M_X64) -# define XXH_FORCE_ALIGN_CHECK 0 -# else -# define XXH_FORCE_ALIGN_CHECK 1 -# endif -#endif - - -/* ************************************* -* Includes & Memory related functions -***************************************/ -/*! Modify the local functions below should you wish to use some other memory routines -* for malloc(), free() */ -#include -static void* XXH_malloc(size_t s) { return malloc(s); } -static void XXH_free (void* p) { free(p); } -/*! and for memcpy() */ -#include -static void* XXH_memcpy(void* dest, const void* src, size_t size) { return memcpy(dest,src,size); } - -#include /* assert */ - -#define XXH_STATIC_LINKING_ONLY -#include "xxhash.h" - - -/* ************************************* -* Compiler Specific Options -***************************************/ -#ifdef _MSC_VER /* Visual Studio */ -# pragma warning(disable : 4127) /* disable: C4127: conditional expression is constant */ -# define FORCE_INLINE static __forceinline -#else -# if defined (__cplusplus) || defined (__STDC_VERSION__) && __STDC_VERSION__ >= 199901L /* C99 */ -# ifdef __GNUC__ -# define FORCE_INLINE static inline __attribute__((always_inline)) -# else -# define FORCE_INLINE static inline -# endif -# else -# define FORCE_INLINE static -# endif /* __STDC_VERSION__ */ -#endif - - -/* ************************************* -* Basic Types -***************************************/ -#ifndef MEM_MODULE -# if !defined (__VMS) \ - && (defined (__cplusplus) \ - || (defined (__STDC_VERSION__) && (__STDC_VERSION__ >= 199901L) /* C99 */) ) -# include - typedef uint8_t BYTE; - typedef uint16_t U16; - typedef uint32_t U32; -# else - typedef unsigned char BYTE; - typedef unsigned short U16; - typedef unsigned int U32; -# endif -#endif - -#if (defined(XXH_FORCE_MEMORY_ACCESS) && (XXH_FORCE_MEMORY_ACCESS==2)) - -/* Force direct memory access. Only works on CPU which support unaligned memory access in hardware */ -static U32 XXH_read32(const void* memPtr) { return *(const U32*) memPtr; } - -#elif (defined(XXH_FORCE_MEMORY_ACCESS) && (XXH_FORCE_MEMORY_ACCESS==1)) - -/* __pack instructions are safer, but compiler specific, hence potentially problematic for some compilers */ -/* currently only defined for gcc and icc */ -typedef union { U32 u32; } __attribute__((packed)) unalign; -static U32 XXH_read32(const void* ptr) { return ((const unalign*)ptr)->u32; } - -#else - -/* portable and safe solution. Generally efficient. - * see : http://stackoverflow.com/a/32095106/646947 - */ -static U32 XXH_read32(const void* memPtr) -{ - U32 val; - memcpy(&val, memPtr, sizeof(val)); - return val; -} - -#endif /* XXH_FORCE_DIRECT_MEMORY_ACCESS */ - - -/* **************************************** -* Compiler-specific Functions and Macros -******************************************/ -#define XXH_GCC_VERSION (__GNUC__ * 100 + __GNUC_MINOR__) - -/* Note : although _rotl exists for minGW (GCC under windows), performance seems poor */ -#if defined(_MSC_VER) -# define XXH_rotl32(x,r) _rotl(x,r) -# define XXH_rotl64(x,r) _rotl64(x,r) -#else -# define XXH_rotl32(x,r) ((x << r) | (x >> (32 - r))) -# define XXH_rotl64(x,r) ((x << r) | (x >> (64 - r))) -#endif - -#if defined(_MSC_VER) /* Visual Studio */ -# define XXH_swap32 _byteswap_ulong -#elif XXH_GCC_VERSION >= 403 -# define XXH_swap32 __builtin_bswap32 -#else -static U32 XXH_swap32 (U32 x) -{ - return ((x << 24) & 0xff000000 ) | - ((x << 8) & 0x00ff0000 ) | - ((x >> 8) & 0x0000ff00 ) | - ((x >> 24) & 0x000000ff ); -} -#endif - - -/* ************************************* -* Architecture Macros -***************************************/ -typedef enum { XXH_bigEndian=0, XXH_littleEndian=1 } XXH_endianess; - -/* XXH_CPU_LITTLE_ENDIAN can be defined externally, for example on the compiler command line */ -#ifndef XXH_CPU_LITTLE_ENDIAN -static int XXH_isLittleEndian(void) -{ - const union { U32 u; BYTE c[4]; } one = { 1 }; /* don't use static : performance detrimental */ - return one.c[0]; -} -# define XXH_CPU_LITTLE_ENDIAN XXH_isLittleEndian() -#endif - - -/* *************************** -* Memory reads -*****************************/ -typedef enum { XXH_aligned, XXH_unaligned } XXH_alignment; - -FORCE_INLINE U32 XXH_readLE32_align(const void* ptr, XXH_endianess endian, XXH_alignment align) -{ - if (align==XXH_unaligned) - return endian==XXH_littleEndian ? XXH_read32(ptr) : XXH_swap32(XXH_read32(ptr)); - else - return endian==XXH_littleEndian ? *(const U32*)ptr : XXH_swap32(*(const U32*)ptr); -} - -FORCE_INLINE U32 XXH_readLE32(const void* ptr, XXH_endianess endian) -{ - return XXH_readLE32_align(ptr, endian, XXH_unaligned); -} - -static U32 XXH_readBE32(const void* ptr) -{ - return XXH_CPU_LITTLE_ENDIAN ? XXH_swap32(XXH_read32(ptr)) : XXH_read32(ptr); -} - - -/* ************************************* -* Macros -***************************************/ -#define XXH_STATIC_ASSERT(c) { enum { XXH_sa = 1/(int)(!!(c)) }; } /* use after variable declarations */ -XXH_PUBLIC_API unsigned XXH_versionNumber (void) { return XXH_VERSION_NUMBER; } - - -/* ******************************************************************* -* 32-bit hash functions -*********************************************************************/ -static const U32 PRIME32_1 = 2654435761U; -static const U32 PRIME32_2 = 2246822519U; -static const U32 PRIME32_3 = 3266489917U; -static const U32 PRIME32_4 = 668265263U; -static const U32 PRIME32_5 = 374761393U; - -static U32 XXH32_round(U32 seed, U32 input) -{ - seed += input * PRIME32_2; - seed = XXH_rotl32(seed, 13); - seed *= PRIME32_1; - return seed; -} - -/* mix all bits */ -static U32 XXH32_avalanche(U32 h32) -{ - h32 ^= h32 >> 15; - h32 *= PRIME32_2; - h32 ^= h32 >> 13; - h32 *= PRIME32_3; - h32 ^= h32 >> 16; - return(h32); -} - -#define XXH_get32bits(p) XXH_readLE32_align(p, endian, align) - -static U32 -XXH32_finalize(U32 h32, const void* ptr, size_t len, - XXH_endianess endian, XXH_alignment align) - -{ - const BYTE* p = (const BYTE*)ptr; - -#define PROCESS1 \ - h32 += (*p++) * PRIME32_5; \ - h32 = XXH_rotl32(h32, 11) * PRIME32_1 ; - -#define PROCESS4 \ - h32 += XXH_get32bits(p) * PRIME32_3; \ - p+=4; \ - h32 = XXH_rotl32(h32, 17) * PRIME32_4 ; - - switch(len&15) /* or switch(bEnd - p) */ - { - case 12: PROCESS4; - /* fallthrough */ - case 8: PROCESS4; - /* fallthrough */ - case 4: PROCESS4; - return XXH32_avalanche(h32); - - case 13: PROCESS4; - /* fallthrough */ - case 9: PROCESS4; - /* fallthrough */ - case 5: PROCESS4; - PROCESS1; - return XXH32_avalanche(h32); - - case 14: PROCESS4; - /* fallthrough */ - case 10: PROCESS4; - /* fallthrough */ - case 6: PROCESS4; - PROCESS1; - PROCESS1; - return XXH32_avalanche(h32); - - case 15: PROCESS4; - /* fallthrough */ - case 11: PROCESS4; - /* fallthrough */ - case 7: PROCESS4; - /* fallthrough */ - case 3: PROCESS1; - /* fallthrough */ - case 2: PROCESS1; - /* fallthrough */ - case 1: PROCESS1; - /* fallthrough */ - case 0: return XXH32_avalanche(h32); - } - assert(0); - return h32; /* reaching this point is deemed impossible */ -} - - -FORCE_INLINE U32 -XXH32_endian_align(const void* input, size_t len, U32 seed, - XXH_endianess endian, XXH_alignment align) -{ - const BYTE* p = (const BYTE*)input; - const BYTE* bEnd = p + len; - U32 h32; - -#if defined(XXH_ACCEPT_NULL_INPUT_POINTER) && (XXH_ACCEPT_NULL_INPUT_POINTER>=1) - if (p==NULL) { - len=0; - bEnd=p=(const BYTE*)(size_t)16; - } -#endif - - if (len>=16) { - const BYTE* const limit = bEnd - 15; - U32 v1 = seed + PRIME32_1 + PRIME32_2; - U32 v2 = seed + PRIME32_2; - U32 v3 = seed + 0; - U32 v4 = seed - PRIME32_1; - - do { - v1 = XXH32_round(v1, XXH_get32bits(p)); p+=4; - v2 = XXH32_round(v2, XXH_get32bits(p)); p+=4; - v3 = XXH32_round(v3, XXH_get32bits(p)); p+=4; - v4 = XXH32_round(v4, XXH_get32bits(p)); p+=4; - } while (p < limit); - - h32 = XXH_rotl32(v1, 1) + XXH_rotl32(v2, 7) - + XXH_rotl32(v3, 12) + XXH_rotl32(v4, 18); - } else { - h32 = seed + PRIME32_5; - } - - h32 += (U32)len; - - return XXH32_finalize(h32, p, len&15, endian, align); -} - - -XXH_PUBLIC_API unsigned int XXH32 (const void* input, size_t len, unsigned int seed) -{ -#if 0 - /* Simple version, good for code maintenance, but unfortunately slow for small inputs */ - XXH32_state_t state; - XXH32_reset(&state, seed); - XXH32_update(&state, input, len); - return XXH32_digest(&state); -#else - XXH_endianess endian_detected = (XXH_endianess)XXH_CPU_LITTLE_ENDIAN; - - if (XXH_FORCE_ALIGN_CHECK) { - if ((((size_t)input) & 3) == 0) { /* Input is 4-bytes aligned, leverage the speed benefit */ - if ((endian_detected==XXH_littleEndian) || XXH_FORCE_NATIVE_FORMAT) - return XXH32_endian_align(input, len, seed, XXH_littleEndian, XXH_aligned); - else - return XXH32_endian_align(input, len, seed, XXH_bigEndian, XXH_aligned); - } } - - if ((endian_detected==XXH_littleEndian) || XXH_FORCE_NATIVE_FORMAT) - return XXH32_endian_align(input, len, seed, XXH_littleEndian, XXH_unaligned); - else - return XXH32_endian_align(input, len, seed, XXH_bigEndian, XXH_unaligned); -#endif -} - - - -/*====== Hash streaming ======*/ - -XXH_PUBLIC_API XXH32_state_t* XXH32_createState(void) -{ - return (XXH32_state_t*)XXH_malloc(sizeof(XXH32_state_t)); -} -XXH_PUBLIC_API XXH_errorcode XXH32_freeState(XXH32_state_t* statePtr) -{ - XXH_free(statePtr); - return XXH_OK; -} - -XXH_PUBLIC_API void XXH32_copyState(XXH32_state_t* dstState, const XXH32_state_t* srcState) -{ - memcpy(dstState, srcState, sizeof(*dstState)); -} - -XXH_PUBLIC_API XXH_errorcode XXH32_reset(XXH32_state_t* statePtr, unsigned int seed) -{ - XXH32_state_t state; /* using a local state to memcpy() in order to avoid strict-aliasing warnings */ - memset(&state, 0, sizeof(state)); - state.v1 = seed + PRIME32_1 + PRIME32_2; - state.v2 = seed + PRIME32_2; - state.v3 = seed + 0; - state.v4 = seed - PRIME32_1; - /* do not write into reserved, planned to be removed in a future version */ - memcpy(statePtr, &state, sizeof(state) - sizeof(state.reserved)); - return XXH_OK; -} - - -FORCE_INLINE XXH_errorcode -XXH32_update_endian(XXH32_state_t* state, const void* input, size_t len, XXH_endianess endian) -{ - if (input==NULL) -#if defined(XXH_ACCEPT_NULL_INPUT_POINTER) && (XXH_ACCEPT_NULL_INPUT_POINTER>=1) - return XXH_OK; -#else - return XXH_ERROR; -#endif - - { const BYTE* p = (const BYTE*)input; - const BYTE* const bEnd = p + len; - - state->total_len_32 += (unsigned)len; - state->large_len |= (len>=16) | (state->total_len_32>=16); - - if (state->memsize + len < 16) { /* fill in tmp buffer */ - XXH_memcpy((BYTE*)(state->mem32) + state->memsize, input, len); - state->memsize += (unsigned)len; - return XXH_OK; - } - - if (state->memsize) { /* some data left from previous update */ - XXH_memcpy((BYTE*)(state->mem32) + state->memsize, input, 16-state->memsize); - { const U32* p32 = state->mem32; - state->v1 = XXH32_round(state->v1, XXH_readLE32(p32, endian)); p32++; - state->v2 = XXH32_round(state->v2, XXH_readLE32(p32, endian)); p32++; - state->v3 = XXH32_round(state->v3, XXH_readLE32(p32, endian)); p32++; - state->v4 = XXH32_round(state->v4, XXH_readLE32(p32, endian)); - } - p += 16-state->memsize; - state->memsize = 0; - } - - if (p <= bEnd-16) { - const BYTE* const limit = bEnd - 16; - U32 v1 = state->v1; - U32 v2 = state->v2; - U32 v3 = state->v3; - U32 v4 = state->v4; - - do { - v1 = XXH32_round(v1, XXH_readLE32(p, endian)); p+=4; - v2 = XXH32_round(v2, XXH_readLE32(p, endian)); p+=4; - v3 = XXH32_round(v3, XXH_readLE32(p, endian)); p+=4; - v4 = XXH32_round(v4, XXH_readLE32(p, endian)); p+=4; - } while (p<=limit); - - state->v1 = v1; - state->v2 = v2; - state->v3 = v3; - state->v4 = v4; - } - - if (p < bEnd) { - XXH_memcpy(state->mem32, p, (size_t)(bEnd-p)); - state->memsize = (unsigned)(bEnd-p); - } - } - - return XXH_OK; -} - - -XXH_PUBLIC_API XXH_errorcode XXH32_update (XXH32_state_t* state_in, const void* input, size_t len) -{ - XXH_endianess endian_detected = (XXH_endianess)XXH_CPU_LITTLE_ENDIAN; - - if ((endian_detected==XXH_littleEndian) || XXH_FORCE_NATIVE_FORMAT) - return XXH32_update_endian(state_in, input, len, XXH_littleEndian); - else - return XXH32_update_endian(state_in, input, len, XXH_bigEndian); -} - - -FORCE_INLINE U32 -XXH32_digest_endian (const XXH32_state_t* state, XXH_endianess endian) -{ - U32 h32; - - if (state->large_len) { - h32 = XXH_rotl32(state->v1, 1) - + XXH_rotl32(state->v2, 7) - + XXH_rotl32(state->v3, 12) - + XXH_rotl32(state->v4, 18); - } else { - h32 = state->v3 /* == seed */ + PRIME32_5; - } - - h32 += state->total_len_32; - - return XXH32_finalize(h32, state->mem32, state->memsize, endian, XXH_aligned); -} - - -XXH_PUBLIC_API unsigned int XXH32_digest (const XXH32_state_t* state_in) -{ - XXH_endianess endian_detected = (XXH_endianess)XXH_CPU_LITTLE_ENDIAN; - - if ((endian_detected==XXH_littleEndian) || XXH_FORCE_NATIVE_FORMAT) - return XXH32_digest_endian(state_in, XXH_littleEndian); - else - return XXH32_digest_endian(state_in, XXH_bigEndian); -} - - -/*====== Canonical representation ======*/ - -/*! Default XXH result types are basic unsigned 32 and 64 bits. -* The canonical representation follows human-readable write convention, aka big-endian (large digits first). -* These functions allow transformation of hash result into and from its canonical format. -* This way, hash values can be written into a file or buffer, remaining comparable across different systems. -*/ - -XXH_PUBLIC_API void XXH32_canonicalFromHash(XXH32_canonical_t* dst, XXH32_hash_t hash) -{ - XXH_STATIC_ASSERT(sizeof(XXH32_canonical_t) == sizeof(XXH32_hash_t)); - if (XXH_CPU_LITTLE_ENDIAN) hash = XXH_swap32(hash); - memcpy(dst, &hash, sizeof(*dst)); -} - -XXH_PUBLIC_API XXH32_hash_t XXH32_hashFromCanonical(const XXH32_canonical_t* src) -{ - return XXH_readBE32(src); -} - - -#ifndef XXH_NO_LONG_LONG - -/* ******************************************************************* -* 64-bit hash functions -*********************************************************************/ - -/*====== Memory access ======*/ - -#ifndef MEM_MODULE -# define MEM_MODULE -# if !defined (__VMS) \ - && (defined (__cplusplus) \ - || (defined (__STDC_VERSION__) && (__STDC_VERSION__ >= 199901L) /* C99 */) ) -# include - typedef uint64_t U64; -# else - /* if compiler doesn't support unsigned long long, replace by another 64-bit type */ - typedef unsigned long long U64; -# endif -#endif - - -#if (defined(XXH_FORCE_MEMORY_ACCESS) && (XXH_FORCE_MEMORY_ACCESS==2)) - -/* Force direct memory access. Only works on CPU which support unaligned memory access in hardware */ -static U64 XXH_read64(const void* memPtr) { return *(const U64*) memPtr; } - -#elif (defined(XXH_FORCE_MEMORY_ACCESS) && (XXH_FORCE_MEMORY_ACCESS==1)) - -/* __pack instructions are safer, but compiler specific, hence potentially problematic for some compilers */ -/* currently only defined for gcc and icc */ -typedef union { U32 u32; U64 u64; } __attribute__((packed)) unalign64; -static U64 XXH_read64(const void* ptr) { return ((const unalign64*)ptr)->u64; } - -#else - -/* portable and safe solution. Generally efficient. - * see : http://stackoverflow.com/a/32095106/646947 - */ - -static U64 XXH_read64(const void* memPtr) -{ - U64 val; - memcpy(&val, memPtr, sizeof(val)); - return val; -} - -#endif /* XXH_FORCE_DIRECT_MEMORY_ACCESS */ - -#if defined(_MSC_VER) /* Visual Studio */ -# define XXH_swap64 _byteswap_uint64 -#elif XXH_GCC_VERSION >= 403 -# define XXH_swap64 __builtin_bswap64 -#else -static U64 XXH_swap64 (U64 x) -{ - return ((x << 56) & 0xff00000000000000ULL) | - ((x << 40) & 0x00ff000000000000ULL) | - ((x << 24) & 0x0000ff0000000000ULL) | - ((x << 8) & 0x000000ff00000000ULL) | - ((x >> 8) & 0x00000000ff000000ULL) | - ((x >> 24) & 0x0000000000ff0000ULL) | - ((x >> 40) & 0x000000000000ff00ULL) | - ((x >> 56) & 0x00000000000000ffULL); -} -#endif - -FORCE_INLINE U64 XXH_readLE64_align(const void* ptr, XXH_endianess endian, XXH_alignment align) -{ - if (align==XXH_unaligned) - return endian==XXH_littleEndian ? XXH_read64(ptr) : XXH_swap64(XXH_read64(ptr)); - else - return endian==XXH_littleEndian ? *(const U64*)ptr : XXH_swap64(*(const U64*)ptr); -} - -FORCE_INLINE U64 XXH_readLE64(const void* ptr, XXH_endianess endian) -{ - return XXH_readLE64_align(ptr, endian, XXH_unaligned); -} - -static U64 XXH_readBE64(const void* ptr) -{ - return XXH_CPU_LITTLE_ENDIAN ? XXH_swap64(XXH_read64(ptr)) : XXH_read64(ptr); -} - - -/*====== xxh64 ======*/ - -static const U64 PRIME64_1 = 11400714785074694791ULL; -static const U64 PRIME64_2 = 14029467366897019727ULL; -static const U64 PRIME64_3 = 1609587929392839161ULL; -static const U64 PRIME64_4 = 9650029242287828579ULL; -static const U64 PRIME64_5 = 2870177450012600261ULL; - -static U64 XXH64_round(U64 acc, U64 input) -{ - acc += input * PRIME64_2; - acc = XXH_rotl64(acc, 31); - acc *= PRIME64_1; - return acc; -} - -static U64 XXH64_mergeRound(U64 acc, U64 val) -{ - val = XXH64_round(0, val); - acc ^= val; - acc = acc * PRIME64_1 + PRIME64_4; - return acc; -} - -static U64 XXH64_avalanche(U64 h64) -{ - h64 ^= h64 >> 33; - h64 *= PRIME64_2; - h64 ^= h64 >> 29; - h64 *= PRIME64_3; - h64 ^= h64 >> 32; - return h64; -} - - -#define XXH_get64bits(p) XXH_readLE64_align(p, endian, align) - -static U64 -XXH64_finalize(U64 h64, const void* ptr, size_t len, - XXH_endianess endian, XXH_alignment align) -{ - const BYTE* p = (const BYTE*)ptr; - -#define PROCESS1_64 \ - h64 ^= (*p++) * PRIME64_5; \ - h64 = XXH_rotl64(h64, 11) * PRIME64_1; - -#define PROCESS4_64 \ - h64 ^= (U64)(XXH_get32bits(p)) * PRIME64_1; \ - p+=4; \ - h64 = XXH_rotl64(h64, 23) * PRIME64_2 + PRIME64_3; - -#define PROCESS8_64 { \ - U64 const k1 = XXH64_round(0, XXH_get64bits(p)); \ - p+=8; \ - h64 ^= k1; \ - h64 = XXH_rotl64(h64,27) * PRIME64_1 + PRIME64_4; \ -} - - switch(len&31) { - case 24: PROCESS8_64; - /* fallthrough */ - case 16: PROCESS8_64; - /* fallthrough */ - case 8: PROCESS8_64; - return XXH64_avalanche(h64); - - case 28: PROCESS8_64; - /* fallthrough */ - case 20: PROCESS8_64; - /* fallthrough */ - case 12: PROCESS8_64; - /* fallthrough */ - case 4: PROCESS4_64; - return XXH64_avalanche(h64); - - case 25: PROCESS8_64; - /* fallthrough */ - case 17: PROCESS8_64; - /* fallthrough */ - case 9: PROCESS8_64; - PROCESS1_64; - return XXH64_avalanche(h64); - - case 29: PROCESS8_64; - /* fallthrough */ - case 21: PROCESS8_64; - /* fallthrough */ - case 13: PROCESS8_64; - /* fallthrough */ - case 5: PROCESS4_64; - PROCESS1_64; - return XXH64_avalanche(h64); - - case 26: PROCESS8_64; - /* fallthrough */ - case 18: PROCESS8_64; - /* fallthrough */ - case 10: PROCESS8_64; - PROCESS1_64; - PROCESS1_64; - return XXH64_avalanche(h64); - - case 30: PROCESS8_64; - /* fallthrough */ - case 22: PROCESS8_64; - /* fallthrough */ - case 14: PROCESS8_64; - /* fallthrough */ - case 6: PROCESS4_64; - PROCESS1_64; - PROCESS1_64; - return XXH64_avalanche(h64); - - case 27: PROCESS8_64; - /* fallthrough */ - case 19: PROCESS8_64; - /* fallthrough */ - case 11: PROCESS8_64; - PROCESS1_64; - PROCESS1_64; - PROCESS1_64; - return XXH64_avalanche(h64); - - case 31: PROCESS8_64; - /* fallthrough */ - case 23: PROCESS8_64; - /* fallthrough */ - case 15: PROCESS8_64; - /* fallthrough */ - case 7: PROCESS4_64; - /* fallthrough */ - case 3: PROCESS1_64; - /* fallthrough */ - case 2: PROCESS1_64; - /* fallthrough */ - case 1: PROCESS1_64; - /* fallthrough */ - case 0: return XXH64_avalanche(h64); - } - - /* impossible to reach */ - assert(0); - return 0; /* unreachable, but some compilers complain without it */ -} - -FORCE_INLINE U64 -XXH64_endian_align(const void* input, size_t len, U64 seed, - XXH_endianess endian, XXH_alignment align) -{ - const BYTE* p = (const BYTE*)input; - const BYTE* bEnd = p + len; - U64 h64; - -#if defined(XXH_ACCEPT_NULL_INPUT_POINTER) && (XXH_ACCEPT_NULL_INPUT_POINTER>=1) - if (p==NULL) { - len=0; - bEnd=p=(const BYTE*)(size_t)32; - } -#endif - - if (len>=32) { - const BYTE* const limit = bEnd - 32; - U64 v1 = seed + PRIME64_1 + PRIME64_2; - U64 v2 = seed + PRIME64_2; - U64 v3 = seed + 0; - U64 v4 = seed - PRIME64_1; - - do { - v1 = XXH64_round(v1, XXH_get64bits(p)); p+=8; - v2 = XXH64_round(v2, XXH_get64bits(p)); p+=8; - v3 = XXH64_round(v3, XXH_get64bits(p)); p+=8; - v4 = XXH64_round(v4, XXH_get64bits(p)); p+=8; - } while (p<=limit); - - h64 = XXH_rotl64(v1, 1) + XXH_rotl64(v2, 7) + XXH_rotl64(v3, 12) + XXH_rotl64(v4, 18); - h64 = XXH64_mergeRound(h64, v1); - h64 = XXH64_mergeRound(h64, v2); - h64 = XXH64_mergeRound(h64, v3); - h64 = XXH64_mergeRound(h64, v4); - - } else { - h64 = seed + PRIME64_5; - } - - h64 += (U64) len; - - return XXH64_finalize(h64, p, len, endian, align); -} - - -XXH_PUBLIC_API unsigned long long XXH64 (const void* input, size_t len, unsigned long long seed) -{ -#if 0 - /* Simple version, good for code maintenance, but unfortunately slow for small inputs */ - XXH64_state_t state; - XXH64_reset(&state, seed); - XXH64_update(&state, input, len); - return XXH64_digest(&state); -#else - XXH_endianess endian_detected = (XXH_endianess)XXH_CPU_LITTLE_ENDIAN; - - if (XXH_FORCE_ALIGN_CHECK) { - if ((((size_t)input) & 7)==0) { /* Input is aligned, let's leverage the speed advantage */ - if ((endian_detected==XXH_littleEndian) || XXH_FORCE_NATIVE_FORMAT) - return XXH64_endian_align(input, len, seed, XXH_littleEndian, XXH_aligned); - else - return XXH64_endian_align(input, len, seed, XXH_bigEndian, XXH_aligned); - } } - - if ((endian_detected==XXH_littleEndian) || XXH_FORCE_NATIVE_FORMAT) - return XXH64_endian_align(input, len, seed, XXH_littleEndian, XXH_unaligned); - else - return XXH64_endian_align(input, len, seed, XXH_bigEndian, XXH_unaligned); -#endif -} - -/*====== Hash Streaming ======*/ - -XXH_PUBLIC_API XXH64_state_t* XXH64_createState(void) -{ - return (XXH64_state_t*)XXH_malloc(sizeof(XXH64_state_t)); -} -XXH_PUBLIC_API XXH_errorcode XXH64_freeState(XXH64_state_t* statePtr) -{ - XXH_free(statePtr); - return XXH_OK; -} - -XXH_PUBLIC_API void XXH64_copyState(XXH64_state_t* dstState, const XXH64_state_t* srcState) -{ - memcpy(dstState, srcState, sizeof(*dstState)); -} - -XXH_PUBLIC_API XXH_errorcode XXH64_reset(XXH64_state_t* statePtr, unsigned long long seed) -{ - XXH64_state_t state; /* using a local state to memcpy() in order to avoid strict-aliasing warnings */ - memset(&state, 0, sizeof(state)); - state.v1 = seed + PRIME64_1 + PRIME64_2; - state.v2 = seed + PRIME64_2; - state.v3 = seed + 0; - state.v4 = seed - PRIME64_1; - /* do not write into reserved, planned to be removed in a future version */ - memcpy(statePtr, &state, sizeof(state) - sizeof(state.reserved)); - return XXH_OK; -} - -FORCE_INLINE XXH_errorcode -XXH64_update_endian (XXH64_state_t* state, const void* input, size_t len, XXH_endianess endian) -{ - if (input==NULL) -#if defined(XXH_ACCEPT_NULL_INPUT_POINTER) && (XXH_ACCEPT_NULL_INPUT_POINTER>=1) - return XXH_OK; -#else - return XXH_ERROR; -#endif - - { const BYTE* p = (const BYTE*)input; - const BYTE* const bEnd = p + len; - - state->total_len += len; - - if (state->memsize + len < 32) { /* fill in tmp buffer */ - XXH_memcpy(((BYTE*)state->mem64) + state->memsize, input, len); - state->memsize += (U32)len; - return XXH_OK; - } - - if (state->memsize) { /* tmp buffer is full */ - XXH_memcpy(((BYTE*)state->mem64) + state->memsize, input, 32-state->memsize); - state->v1 = XXH64_round(state->v1, XXH_readLE64(state->mem64+0, endian)); - state->v2 = XXH64_round(state->v2, XXH_readLE64(state->mem64+1, endian)); - state->v3 = XXH64_round(state->v3, XXH_readLE64(state->mem64+2, endian)); - state->v4 = XXH64_round(state->v4, XXH_readLE64(state->mem64+3, endian)); - p += 32-state->memsize; - state->memsize = 0; - } - - if (p+32 <= bEnd) { - const BYTE* const limit = bEnd - 32; - U64 v1 = state->v1; - U64 v2 = state->v2; - U64 v3 = state->v3; - U64 v4 = state->v4; - - do { - v1 = XXH64_round(v1, XXH_readLE64(p, endian)); p+=8; - v2 = XXH64_round(v2, XXH_readLE64(p, endian)); p+=8; - v3 = XXH64_round(v3, XXH_readLE64(p, endian)); p+=8; - v4 = XXH64_round(v4, XXH_readLE64(p, endian)); p+=8; - } while (p<=limit); - - state->v1 = v1; - state->v2 = v2; - state->v3 = v3; - state->v4 = v4; - } - - if (p < bEnd) { - XXH_memcpy(state->mem64, p, (size_t)(bEnd-p)); - state->memsize = (unsigned)(bEnd-p); - } - } - - return XXH_OK; -} - -XXH_PUBLIC_API XXH_errorcode XXH64_update (XXH64_state_t* state_in, const void* input, size_t len) -{ - XXH_endianess endian_detected = (XXH_endianess)XXH_CPU_LITTLE_ENDIAN; - - if ((endian_detected==XXH_littleEndian) || XXH_FORCE_NATIVE_FORMAT) - return XXH64_update_endian(state_in, input, len, XXH_littleEndian); - else - return XXH64_update_endian(state_in, input, len, XXH_bigEndian); -} - -FORCE_INLINE U64 XXH64_digest_endian (const XXH64_state_t* state, XXH_endianess endian) -{ - U64 h64; - - if (state->total_len >= 32) { - U64 const v1 = state->v1; - U64 const v2 = state->v2; - U64 const v3 = state->v3; - U64 const v4 = state->v4; - - h64 = XXH_rotl64(v1, 1) + XXH_rotl64(v2, 7) + XXH_rotl64(v3, 12) + XXH_rotl64(v4, 18); - h64 = XXH64_mergeRound(h64, v1); - h64 = XXH64_mergeRound(h64, v2); - h64 = XXH64_mergeRound(h64, v3); - h64 = XXH64_mergeRound(h64, v4); - } else { - h64 = state->v3 /*seed*/ + PRIME64_5; - } - - h64 += (U64) state->total_len; - - return XXH64_finalize(h64, state->mem64, (size_t)state->total_len, endian, XXH_aligned); -} - -XXH_PUBLIC_API unsigned long long XXH64_digest (const XXH64_state_t* state_in) -{ - XXH_endianess endian_detected = (XXH_endianess)XXH_CPU_LITTLE_ENDIAN; - - if ((endian_detected==XXH_littleEndian) || XXH_FORCE_NATIVE_FORMAT) - return XXH64_digest_endian(state_in, XXH_littleEndian); - else - return XXH64_digest_endian(state_in, XXH_bigEndian); -} - - -/*====== Canonical representation ======*/ - -XXH_PUBLIC_API void XXH64_canonicalFromHash(XXH64_canonical_t* dst, XXH64_hash_t hash) -{ - XXH_STATIC_ASSERT(sizeof(XXH64_canonical_t) == sizeof(XXH64_hash_t)); - if (XXH_CPU_LITTLE_ENDIAN) hash = XXH_swap64(hash); - memcpy(dst, &hash, sizeof(*dst)); -} - -XXH_PUBLIC_API XXH64_hash_t XXH64_hashFromCanonical(const XXH64_canonical_t* src) -{ - return XXH_readBE64(src); -} - -#endif /* XXH_NO_LONG_LONG */ diff --git a/CompressSave/LZ4WrapC/lz4/xxhash.h b/CompressSave/LZ4WrapC/lz4/xxhash.h deleted file mode 100644 index d6bad94..0000000 --- a/CompressSave/LZ4WrapC/lz4/xxhash.h +++ /dev/null @@ -1,328 +0,0 @@ -/* - xxHash - Extremely Fast Hash algorithm - Header File - Copyright (C) 2012-2016, Yann Collet. - - BSD 2-Clause License (http://www.opensource.org/licenses/bsd-license.php) - - Redistribution and use in source and binary forms, with or without - modification, are permitted provided that the following conditions are - met: - - * Redistributions of source code must retain the above copyright - notice, this list of conditions and the following disclaimer. - * Redistributions in binary form must reproduce the above - copyright notice, this list of conditions and the following disclaimer - in the documentation and/or other materials provided with the - distribution. - - THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - "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 COPYRIGHT - OWNER OR CONTRIBUTORS 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. - - You can contact the author at : - - xxHash source repository : https://github.com/Cyan4973/xxHash -*/ - -/* Notice extracted from xxHash homepage : - -xxHash is an extremely fast Hash algorithm, running at RAM speed limits. -It also successfully passes all tests from the SMHasher suite. - -Comparison (single thread, Windows Seven 32 bits, using SMHasher on a Core 2 Duo @3GHz) - -Name Speed Q.Score Author -xxHash 5.4 GB/s 10 -CrapWow 3.2 GB/s 2 Andrew -MumurHash 3a 2.7 GB/s 10 Austin Appleby -SpookyHash 2.0 GB/s 10 Bob Jenkins -SBox 1.4 GB/s 9 Bret Mulvey -Lookup3 1.2 GB/s 9 Bob Jenkins -SuperFastHash 1.2 GB/s 1 Paul Hsieh -CityHash64 1.05 GB/s 10 Pike & Alakuijala -FNV 0.55 GB/s 5 Fowler, Noll, Vo -CRC32 0.43 GB/s 9 -MD5-32 0.33 GB/s 10 Ronald L. Rivest -SHA1-32 0.28 GB/s 10 - -Q.Score is a measure of quality of the hash function. -It depends on successfully passing SMHasher test set. -10 is a perfect score. - -A 64-bit version, named XXH64, is available since r35. -It offers much better speed, but for 64-bit applications only. -Name Speed on 64 bits Speed on 32 bits -XXH64 13.8 GB/s 1.9 GB/s -XXH32 6.8 GB/s 6.0 GB/s -*/ - -#ifndef XXHASH_H_5627135585666179 -#define XXHASH_H_5627135585666179 1 - -#if defined (__cplusplus) -extern "C" { -#endif - - -/* **************************** -* Definitions -******************************/ -#include /* size_t */ -typedef enum { XXH_OK=0, XXH_ERROR } XXH_errorcode; - - -/* **************************** - * API modifier - ******************************/ -/** XXH_INLINE_ALL (and XXH_PRIVATE_API) - * This is useful to include xxhash functions in `static` mode - * in order to inline them, and remove their symbol from the public list. - * Inlining can offer dramatic performance improvement on small keys. - * Methodology : - * #define XXH_INLINE_ALL - * #include "xxhash.h" - * `xxhash.c` is automatically included. - * It's not useful to compile and link it as a separate module. - */ -#if defined(XXH_INLINE_ALL) || defined(XXH_PRIVATE_API) -# ifndef XXH_STATIC_LINKING_ONLY -# define XXH_STATIC_LINKING_ONLY -# endif -# if defined(__GNUC__) -# define XXH_PUBLIC_API static __inline __attribute__((unused)) -# elif defined (__cplusplus) || (defined (__STDC_VERSION__) && (__STDC_VERSION__ >= 199901L) /* C99 */) -# define XXH_PUBLIC_API static inline -# elif defined(_MSC_VER) -# define XXH_PUBLIC_API static __inline -# else - /* this version may generate warnings for unused static functions */ -# define XXH_PUBLIC_API static -# endif -#else -# define XXH_PUBLIC_API /* do nothing */ -#endif /* XXH_INLINE_ALL || XXH_PRIVATE_API */ - -/*! XXH_NAMESPACE, aka Namespace Emulation : - * - * If you want to include _and expose_ xxHash functions from within your own library, - * but also want to avoid symbol collisions with other libraries which may also include xxHash, - * - * you can use XXH_NAMESPACE, to automatically prefix any public symbol from xxhash library - * with the value of XXH_NAMESPACE (therefore, avoid NULL and numeric values). - * - * Note that no change is required within the calling program as long as it includes `xxhash.h` : - * regular symbol name will be automatically translated by this header. - */ -#ifdef XXH_NAMESPACE -# define XXH_CAT(A,B) A##B -# define XXH_NAME2(A,B) XXH_CAT(A,B) -# define XXH_versionNumber XXH_NAME2(XXH_NAMESPACE, XXH_versionNumber) -# define XXH32 XXH_NAME2(XXH_NAMESPACE, XXH32) -# define XXH32_createState XXH_NAME2(XXH_NAMESPACE, XXH32_createState) -# define XXH32_freeState XXH_NAME2(XXH_NAMESPACE, XXH32_freeState) -# define XXH32_reset XXH_NAME2(XXH_NAMESPACE, XXH32_reset) -# define XXH32_update XXH_NAME2(XXH_NAMESPACE, XXH32_update) -# define XXH32_digest XXH_NAME2(XXH_NAMESPACE, XXH32_digest) -# define XXH32_copyState XXH_NAME2(XXH_NAMESPACE, XXH32_copyState) -# define XXH32_canonicalFromHash XXH_NAME2(XXH_NAMESPACE, XXH32_canonicalFromHash) -# define XXH32_hashFromCanonical XXH_NAME2(XXH_NAMESPACE, XXH32_hashFromCanonical) -# define XXH64 XXH_NAME2(XXH_NAMESPACE, XXH64) -# define XXH64_createState XXH_NAME2(XXH_NAMESPACE, XXH64_createState) -# define XXH64_freeState XXH_NAME2(XXH_NAMESPACE, XXH64_freeState) -# define XXH64_reset XXH_NAME2(XXH_NAMESPACE, XXH64_reset) -# define XXH64_update XXH_NAME2(XXH_NAMESPACE, XXH64_update) -# define XXH64_digest XXH_NAME2(XXH_NAMESPACE, XXH64_digest) -# define XXH64_copyState XXH_NAME2(XXH_NAMESPACE, XXH64_copyState) -# define XXH64_canonicalFromHash XXH_NAME2(XXH_NAMESPACE, XXH64_canonicalFromHash) -# define XXH64_hashFromCanonical XXH_NAME2(XXH_NAMESPACE, XXH64_hashFromCanonical) -#endif - - -/* ************************************* -* Version -***************************************/ -#define XXH_VERSION_MAJOR 0 -#define XXH_VERSION_MINOR 6 -#define XXH_VERSION_RELEASE 5 -#define XXH_VERSION_NUMBER (XXH_VERSION_MAJOR *100*100 + XXH_VERSION_MINOR *100 + XXH_VERSION_RELEASE) -XXH_PUBLIC_API unsigned XXH_versionNumber (void); - - -/*-********************************************************************** -* 32-bit hash -************************************************************************/ -typedef unsigned int XXH32_hash_t; - -/*! XXH32() : - Calculate the 32-bit hash of sequence "length" bytes stored at memory address "input". - The memory between input & input+length must be valid (allocated and read-accessible). - "seed" can be used to alter the result predictably. - Speed on Core 2 Duo @ 3 GHz (single thread, SMHasher benchmark) : 5.4 GB/s */ -XXH_PUBLIC_API XXH32_hash_t XXH32 (const void* input, size_t length, unsigned int seed); - -/*====== Streaming ======*/ -typedef struct XXH32_state_s XXH32_state_t; /* incomplete type */ -XXH_PUBLIC_API XXH32_state_t* XXH32_createState(void); -XXH_PUBLIC_API XXH_errorcode XXH32_freeState(XXH32_state_t* statePtr); -XXH_PUBLIC_API void XXH32_copyState(XXH32_state_t* dst_state, const XXH32_state_t* src_state); - -XXH_PUBLIC_API XXH_errorcode XXH32_reset (XXH32_state_t* statePtr, unsigned int seed); -XXH_PUBLIC_API XXH_errorcode XXH32_update (XXH32_state_t* statePtr, const void* input, size_t length); -XXH_PUBLIC_API XXH32_hash_t XXH32_digest (const XXH32_state_t* statePtr); - -/* - * Streaming functions generate the xxHash of an input provided in multiple segments. - * Note that, for small input, they are slower than single-call functions, due to state management. - * For small inputs, prefer `XXH32()` and `XXH64()`, which are better optimized. - * - * XXH state must first be allocated, using XXH*_createState() . - * - * Start a new hash by initializing state with a seed, using XXH*_reset(). - * - * Then, feed the hash state by calling XXH*_update() as many times as necessary. - * The function returns an error code, with 0 meaning OK, and any other value meaning there is an error. - * - * Finally, a hash value can be produced anytime, by using XXH*_digest(). - * This function returns the nn-bits hash as an int or long long. - * - * It's still possible to continue inserting input into the hash state after a digest, - * and generate some new hashes later on, by calling again XXH*_digest(). - * - * When done, free XXH state space if it was allocated dynamically. - */ - -/*====== Canonical representation ======*/ - -typedef struct { unsigned char digest[4]; } XXH32_canonical_t; -XXH_PUBLIC_API void XXH32_canonicalFromHash(XXH32_canonical_t* dst, XXH32_hash_t hash); -XXH_PUBLIC_API XXH32_hash_t XXH32_hashFromCanonical(const XXH32_canonical_t* src); - -/* Default result type for XXH functions are primitive unsigned 32 and 64 bits. - * The canonical representation uses human-readable write convention, aka big-endian (large digits first). - * These functions allow transformation of hash result into and from its canonical format. - * This way, hash values can be written into a file / memory, and remain comparable on different systems and programs. - */ - - -#ifndef XXH_NO_LONG_LONG -/*-********************************************************************** -* 64-bit hash -************************************************************************/ -typedef unsigned long long XXH64_hash_t; - -/*! XXH64() : - Calculate the 64-bit hash of sequence of length "len" stored at memory address "input". - "seed" can be used to alter the result predictably. - This function runs faster on 64-bit systems, but slower on 32-bit systems (see benchmark). -*/ -XXH_PUBLIC_API XXH64_hash_t XXH64 (const void* input, size_t length, unsigned long long seed); - -/*====== Streaming ======*/ -typedef struct XXH64_state_s XXH64_state_t; /* incomplete type */ -XXH_PUBLIC_API XXH64_state_t* XXH64_createState(void); -XXH_PUBLIC_API XXH_errorcode XXH64_freeState(XXH64_state_t* statePtr); -XXH_PUBLIC_API void XXH64_copyState(XXH64_state_t* dst_state, const XXH64_state_t* src_state); - -XXH_PUBLIC_API XXH_errorcode XXH64_reset (XXH64_state_t* statePtr, unsigned long long seed); -XXH_PUBLIC_API XXH_errorcode XXH64_update (XXH64_state_t* statePtr, const void* input, size_t length); -XXH_PUBLIC_API XXH64_hash_t XXH64_digest (const XXH64_state_t* statePtr); - -/*====== Canonical representation ======*/ -typedef struct { unsigned char digest[8]; } XXH64_canonical_t; -XXH_PUBLIC_API void XXH64_canonicalFromHash(XXH64_canonical_t* dst, XXH64_hash_t hash); -XXH_PUBLIC_API XXH64_hash_t XXH64_hashFromCanonical(const XXH64_canonical_t* src); -#endif /* XXH_NO_LONG_LONG */ - - - -#ifdef XXH_STATIC_LINKING_ONLY - -/* ================================================================================================ - This section contains declarations which are not guaranteed to remain stable. - They may change in future versions, becoming incompatible with a different version of the library. - These declarations should only be used with static linking. - Never use them in association with dynamic linking ! -=================================================================================================== */ - -/* These definitions are only present to allow - * static allocation of XXH state, on stack or in a struct for example. - * Never **ever** use members directly. */ - -#if !defined (__VMS) \ - && (defined (__cplusplus) \ - || (defined (__STDC_VERSION__) && (__STDC_VERSION__ >= 199901L) /* C99 */) ) -# include - -struct XXH32_state_s { - uint32_t total_len_32; - uint32_t large_len; - uint32_t v1; - uint32_t v2; - uint32_t v3; - uint32_t v4; - uint32_t mem32[4]; - uint32_t memsize; - uint32_t reserved; /* never read nor write, might be removed in a future version */ -}; /* typedef'd to XXH32_state_t */ - -struct XXH64_state_s { - uint64_t total_len; - uint64_t v1; - uint64_t v2; - uint64_t v3; - uint64_t v4; - uint64_t mem64[4]; - uint32_t memsize; - uint32_t reserved[2]; /* never read nor write, might be removed in a future version */ -}; /* typedef'd to XXH64_state_t */ - -# else - -struct XXH32_state_s { - unsigned total_len_32; - unsigned large_len; - unsigned v1; - unsigned v2; - unsigned v3; - unsigned v4; - unsigned mem32[4]; - unsigned memsize; - unsigned reserved; /* never read nor write, might be removed in a future version */ -}; /* typedef'd to XXH32_state_t */ - -# ifndef XXH_NO_LONG_LONG /* remove 64-bit support */ -struct XXH64_state_s { - unsigned long long total_len; - unsigned long long v1; - unsigned long long v2; - unsigned long long v3; - unsigned long long v4; - unsigned long long mem64[4]; - unsigned memsize; - unsigned reserved[2]; /* never read nor write, might be removed in a future version */ -}; /* typedef'd to XXH64_state_t */ -# endif - -# endif - - -#if defined(XXH_INLINE_ALL) || defined(XXH_PRIVATE_API) -# include "xxhash.c" /* include xxhash function bodies as `static`, for inlining */ -#endif - -#endif /* XXH_STATIC_LINKING_ONLY */ - - -#if defined (__cplusplus) -} -#endif - -#endif /* XXHASH_H_5627135585666179 */ diff --git a/CompressSave/NoneWrapC/CMakeLists.txt b/CompressSave/NoneWrapC/CMakeLists.txt deleted file mode 100644 index 5f5fce5..0000000 --- a/CompressSave/NoneWrapC/CMakeLists.txt +++ /dev/null @@ -1,11 +0,0 @@ -cmake_minimum_required(VERSION 3.2) - -project(nonewrap) - -add_library(nonewrap SHARED - dllmain.c nonewrap.c nonewrap.h) - -target_compile_definitions(nonewrap PRIVATE NONEWRAP_EXPORTS) -if(WIN32) - set_target_properties(nonewrap PROPERTIES PREFIX "") -endif() diff --git a/CompressSave/NoneWrapC/dllmain.c b/CompressSave/NoneWrapC/dllmain.c deleted file mode 100644 index 896c9b5..0000000 --- a/CompressSave/NoneWrapC/dllmain.c +++ /dev/null @@ -1,20 +0,0 @@ -// dllmain.cpp : Defines the entry point for the DLL application. -#include - -BOOL APIENTRY DllMain( HMODULE hModule, - DWORD ul_reason_for_call, - LPVOID lpReserved - ) -{ - switch (ul_reason_for_call) - { - case DLL_PROCESS_ATTACH: - DisableThreadLibraryCalls(hModule); - break; - case DLL_THREAD_ATTACH: - case DLL_THREAD_DETACH: - case DLL_PROCESS_DETACH: - break; - } - return TRUE; -} diff --git a/CompressSave/NoneWrapC/nonewrap.c b/CompressSave/NoneWrapC/nonewrap.c deleted file mode 100644 index 85bcc34..0000000 --- a/CompressSave/NoneWrapC/nonewrap.c +++ /dev/null @@ -1,62 +0,0 @@ -#include "nonewrap.h" - -#include -#include -#include -#include - -size_t __stdcall CompressBufferBound(size_t inBufferSize) -{ - return inBufferSize * 4; -} - -size_t __stdcall CompressBegin(Context** pctx, int compressionLevel, void* outBuff, size_t outCapacity, void* dict, size_t dictSize) -{ - Context *ctx = (Context *)malloc(sizeof(Context)); - if (ctx == NULL) return -1; - *pctx = ctx; - return 0; -} - -size_t __stdcall CompressUpdate(Context* ctx,void* dstBuffer, size_t dstCapacity,const void* srcBuffer, size_t srcSize) -{ - memcpy(dstBuffer, srcBuffer, srcSize); - return srcSize; -} - -size_t __stdcall CompressEnd(Context* ctx, void* dstBuffer, size_t dstCapacity) -{ - return 0; -} - -void __stdcall CompressContextFree(Context* ctx) -{ - free(ctx); -} - -size_t __stdcall DecompressBegin(Context **pdctx,void *inBuffer,size_t *inBufferSize, size_t *blockSize, void* dict, size_t dictSize) -{ - Context *ctx = (Context *)malloc(sizeof(Context)); - if (ctx == NULL) return -1; - *pdctx = ctx; - *inBufferSize = 0; - *blockSize = 4 * 512 * 1024; - return 0; -} - -void __stdcall DecompressContextReset(Context* dctx) -{ -} - -size_t __stdcall DecompressUpdate(Context* dctx, void* outBuffer, size_t * outBufferSize, void* inBuffer, size_t * inBufferSize) -{ - memcpy(outBuffer, inBuffer, *inBufferSize); - *outBufferSize = *inBufferSize; - return 1; -} - -size_t __stdcall DecompressEnd(Context* ctx) -{ - free(ctx); - return 0; -} \ No newline at end of file diff --git a/CompressSave/NoneWrapC/nonewrap.h b/CompressSave/NoneWrapC/nonewrap.h deleted file mode 100644 index 9910e8d..0000000 --- a/CompressSave/NoneWrapC/nonewrap.h +++ /dev/null @@ -1,36 +0,0 @@ -#pragma once - -#include - -#if defined(__cplusplus) -#define API_EXTERN_C extern "C" -#else -#define API_EXTERN_C -#endif -#ifdef NONEWRAP_EXPORTS -#define NONEAPI API_EXTERN_C __declspec(dllexport) -#else -#define NONEAPI API_EXTERN_C __declspec(dllimport) -#endif - -typedef struct { - int n; -} Context; - -NONEAPI void __stdcall CompressContextFree(Context* ctx); - -NONEAPI size_t __stdcall CompressBufferBound(size_t inBufferSize); - -NONEAPI size_t __stdcall CompressBegin(Context** ctx, int compressionLevel, void* outBuff, size_t outCapacity, void* dict, size_t dictSize); - -NONEAPI size_t __stdcall CompressUpdate(Context* ctx, void* dstBuffer, size_t dstCapacity, const void* srcBuffer, size_t srcSize); - -NONEAPI size_t __stdcall CompressEnd(Context* ctx, void* dstBuffer, size_t dstCapacity); - -NONEAPI size_t __stdcall DecompressBegin(Context** pdctx, void* inBuffer, size_t* inBufferSize, size_t* blockSize, void* dict, size_t dictSize); - -NONEAPI void __stdcall DecompressContextReset(Context* dctx); - -NONEAPI size_t __stdcall DecompressUpdate(Context* dctx, void* outBuffer, size_t* outBufferSize, void* inBuffer, size_t* inBufferSize); - -NONEAPI size_t __stdcall DecompressEnd(Context* dctx); diff --git a/CompressSave/PatchUILoadGame.cs b/CompressSave/PatchUILoadGame.cs deleted file mode 100644 index 739992e..0000000 --- a/CompressSave/PatchUILoadGame.cs +++ /dev/null @@ -1,83 +0,0 @@ -using System.Linq; -using HarmonyLib; -using UnityEngine; -using UnityEngine.UI; - -namespace CompressSave; - -class PatchUILoadGame -{ - static UIButton _decompressButton; - - [HarmonyPatch(typeof(UILoadGameWindow), "OnSelectedChange"), HarmonyPostfix] - private static void OnSelectedChange(UILoadGameWindow __instance) - { - var selected = __instance.selected; - var compressedType = SaveUtil.SaveGetCompressType(selected == null ? null : selected.saveName); - var prop3Text = __instance.prop3Text; - prop3Text.text = compressedType switch - { - CompressionType.LZ4 => "(LZ4)" + prop3Text.text, - CompressionType.Zstd => "(ZSTD)" + prop3Text.text, - _ => "(N)" + prop3Text.text - }; - if (!_decompressButton) return; - _decompressButton.button.interactable = compressedType != CompressionType.None; - _decompressButton.gameObject.SetActive(compressedType != CompressionType.None); - } - - [HarmonyPatch(typeof(UILoadGameWindow), "_OnOpen"), HarmonyPostfix] - static void _OnOpen(UILoadGameWindow __instance) - { - if (_decompressButton) return; - var loadButton = __instance.loadButton; - - var created = false; - var gameObj = __instance.transform.Find("button-decompress")?.gameObject; - if (gameObj == null) - { - gameObj = Object.Instantiate(loadButton.gameObject, loadButton.transform.parent); - created = true; - } - - _decompressButton = gameObj.GetComponent(); - - if (created) - { - var rtrans = (RectTransform)__instance.loadSandboxGroup.transform; - var anchoredPosition3D = rtrans.anchoredPosition3D; - _decompressButton.gameObject.name = "button-decompress"; - rtrans = (RectTransform)_decompressButton.transform; - var pos = anchoredPosition3D; - anchoredPosition3D = new Vector3(pos.x - 230, pos.y, pos.z); - rtrans.anchoredPosition3D = anchoredPosition3D; - _decompressButton.button.image.color = new Color32(0, 0xf4, 0x92, 0x77); - var textTrans = _decompressButton.transform.Find("button-text"); - var text = textTrans.GetComponent(); - text.text = "Decompress".Translate(); - var localizer = textTrans.GetComponent(); - if (localizer) - { - localizer.stringKey = "Decompress"; - localizer.translation = "Decompress".Translate(); - } - - _decompressButton.onClick += _ => - { - if (!SaveUtil.DecompressSave(__instance.selected.saveName, out var newfileName)) return; - __instance.RefreshList(); - __instance.selected = __instance.entries.First(e => e.saveName == newfileName); - }; - } - - _decompressButton.button.interactable = false; - _decompressButton.gameObject.SetActive(false); - } - - public static void OnDestroy() - { - if (_decompressButton) - Object.Destroy(_decompressButton.gameObject); - _decompressButton = null; - } -} \ No newline at end of file diff --git a/CompressSave/PatchUISaveGame.cs b/CompressSave/PatchUISaveGame.cs deleted file mode 100644 index 284796b..0000000 --- a/CompressSave/PatchUISaveGame.cs +++ /dev/null @@ -1,237 +0,0 @@ -using HarmonyLib; -using UnityEngine; -using UnityEngine.UI; - -namespace CompressSave; - -static class PatchUISaveGame -{ - public static void OnDestroy() - { - if (_context.ButtonCompress) - Object.Destroy(_context.ButtonCompress.gameObject); - if (_context.Window) - { - _context.SaveButton.onClick -= WrapClick; - _context.SaveButton.onClick += _context.Window.OnSaveClick; - } - _OnDestroy(); - } - - [HarmonyPatch(typeof(UISaveGameWindow), "OnSelectedChange"), HarmonyPostfix] - private static void OnSelectedChange(UISaveGameWindow __instance) - { - var selected = __instance.selected; - var compressedType = SaveUtil.SaveGetCompressType(selected == null ? null : selected.saveName); - var prop3Text = __instance.prop3Text; - prop3Text.text = compressedType switch - { - CompressionType.LZ4 => "(LZ4)" + prop3Text.text, - CompressionType.Zstd => "(ZSTD)" + prop3Text.text, - _ => "(N)" + prop3Text.text - }; - } - - [HarmonyPatch(typeof(UISaveGameWindow), "_OnDestroy"), HarmonyPostfix] - private static void _OnDestroy() - { - //Console.WriteLine("OnCreate"); - _context = new UIContext(); - } - - [HarmonyPatch(typeof(UISaveGameWindow), "OnSaveClick"), HarmonyReversePatch] - private static void OSaveGameAs(this UISaveGameWindow ui, int data) { } - - [HarmonyPatch(typeof(UISaveGameWindow), "CheckAndSetSaveButtonEnable"), HarmonyPostfix] - private static void CheckAndSetSaveButtonEnable(UISaveGameWindow __instance) - { - _OnOpen(__instance); - if (_context.SaveButton) - _context.ButtonCompress.button.interactable = _context.SaveButton.button.interactable; - } - - private class UIContext - { - public UIButton ButtonCompress; - public UIButton SaveButton; - public GameObject ManualSaveTypeComboBox; - public GameObject AutoSaveTypeComboBox; - public Text ButtonCompressText; - public Text SaveButtonText; - public UISaveGameWindow Window; - } - - [HarmonyPatch(typeof(UISaveGameWindow), "OnSaveClick"), HarmonyPrefix] - private static void OnSaveClick() - { - PatchSave.UseCompressSave = true; - } - - private static UIContext _context = new UIContext(); - - [HarmonyPatch(typeof(UISaveGameWindow), "_OnOpen"), HarmonyPostfix] - private static void _OnOpen(UISaveGameWindow __instance) - { - if (_context.ButtonCompress) return; - RectTransform rtrans; - Vector3 pos; - _context.SaveButton = __instance.saveButton; - _context.SaveButtonText = __instance.saveButtonText; - _context.Window = __instance; - var gameObj = __instance.transform.Find("button-compress")?.gameObject; - var created = false; - if (gameObj == null) - { - gameObj = Object.Instantiate(__instance.saveButton.gameObject, __instance.saveButton.transform.parent); - created = true; - } - _context.ButtonCompress = gameObj.GetComponent(); - if (created) - { - _context.ButtonCompress.gameObject.name = "button-compress"; - rtrans = (RectTransform)_context.ButtonCompress.transform; - pos = rtrans.anchoredPosition3D; - rtrans.anchoredPosition3D = new Vector3(pos.x - 180, pos.y, pos.z); - _context.ButtonCompress.button.image.color = new Color32(0xfc, 0x6f, 00, 0x77); - var textTrans = _context.ButtonCompress.transform.Find("button-text"); - _context.ButtonCompressText = textTrans.GetComponent(); - _context.ButtonCompress.onClick += __instance.OnSaveClick; - _context.SaveButton.onClick -= __instance.OnSaveClick; - _context.SaveButton.onClick += WrapClick; - _context.ButtonCompressText.text = "Save with Compression".Translate(); - var localizer = textTrans.GetComponent(); - if (localizer) - { - localizer.stringKey = "Save with Compression"; - localizer.translation = "Save with Compression".Translate(); - } - } - - created = false; - gameObj = __instance.transform.Find("manual-save-type-combobox")?.gameObject; - if (gameObj == null) - { - gameObj = Object.Instantiate(UIRoot.instance.optionWindow.resolutionComp.transform.parent.gameObject, __instance.saveButton.transform.parent); - created = true; - } - _context.ManualSaveTypeComboBox = gameObj; - if (created) - { - gameObj.name = "manual-save-type-combobox"; - rtrans = (RectTransform)gameObj.transform; - var rtrans2 = (RectTransform)_context.ButtonCompress.transform; - pos = rtrans2.anchoredPosition3D; - rtrans.anchorMin = rtrans2.anchorMin; - rtrans.anchorMax = rtrans2.anchorMax; - rtrans.pivot = rtrans2.pivot; - rtrans.anchoredPosition3D = new Vector3(pos.x + 100, pos.y + 45, pos.z); - var cbctrl = rtrans.transform.Find("ComboBox"); - var content = cbctrl.Find("Dropdown List ScrollBox")?.Find("Mask")?.Find("Content Panel"); - if (content != null) - { - for (var i = content.childCount - 1; i >= 0; i--) - { - var theTrans = content.GetChild(i); - if (theTrans.name == "Item Button(Clone)") - { - Object.Destroy(theTrans.gameObject); - } - } - } - var cb = cbctrl.GetComponent(); - cb.onSubmit.RemoveAllListeners(); - cb.onItemIndexChange.RemoveAllListeners(); - cb.Items = ["Store".Translate(), "LZ4", "Zstd"]; - cb.itemIndex = (int)PatchSave.CompressionTypeForSaves; - cb.onItemIndexChange.AddListener(()=> - { - PatchSave.CompressionTypeForSaves = (CompressionType)cb.itemIndex; - PatchSave.CompressionTypeForSavesConfig.Value = CompressSave.StringFromCompresstionType(PatchSave.CompressionTypeForSaves); - }); - rtrans = (RectTransform)cb.transform; - pos = rtrans.anchoredPosition3D; - rtrans.anchoredPosition3D = new Vector3(pos.x - 50, pos.y, pos.z); - var size = rtrans.sizeDelta; - rtrans.sizeDelta = new Vector2(150f, size.y); - var txt = gameObj.GetComponent(); - txt.text = "Compression for manual saves".Translate(); - var localizer = gameObj.GetComponent(); - if (localizer != null) - { - localizer.stringKey = "Compression for manual saves"; - localizer.translation = "Compression for manual saves".Translate(); - } - } - - created = false; - gameObj = __instance.transform.Find("auto-save-type-combobox")?.gameObject; - if (gameObj == null) - { - gameObj = Object.Instantiate(UIRoot.instance.optionWindow.resolutionComp.transform.parent.gameObject, __instance.saveButton.transform.parent); - created = true; - } - _context.AutoSaveTypeComboBox = gameObj; - if (created) - { - gameObj.name = "auto-save-type-combobox"; - rtrans = (RectTransform)gameObj.transform; - var rtrans2 = (RectTransform)_context.ButtonCompress.transform; - pos = rtrans2.anchoredPosition3D; - rtrans.anchorMin = rtrans2.anchorMin; - rtrans.anchorMax = rtrans2.anchorMax; - rtrans.pivot = rtrans2.pivot; - rtrans.anchoredPosition3D = new Vector3(pos.x + 510, pos.y + 45, pos.z); - var cbctrl = rtrans.transform.Find("ComboBox"); - var content = cbctrl.Find("Dropdown List ScrollBox")?.Find("Mask")?.Find("Content Panel"); - if (content != null) - { - for (var i = content.childCount - 1; i >= 0; i--) - { - var theTrans = content.GetChild(i); - if (theTrans.name == "Item Button(Clone)") - { - Object.Destroy(theTrans.gameObject); - } - } - } - var cb = cbctrl.GetComponent(); - cb.onSubmit.RemoveAllListeners(); - cb.onItemIndexChange.RemoveAllListeners(); - cb.Items = ["已停用".Translate(), "Store".Translate(), "LZ4", "Zstd"]; - cb.itemIndex = PatchSave.EnableForAutoSaves.Value ? (int)PatchSave.CompressionTypeForAutoSaves + 1 : 0; - cb.onItemIndexChange.AddListener(() => - { - var idx = cb.itemIndex; - if (idx == 0) - { - PatchSave.EnableForAutoSaves.Value = false; - } - else - { - PatchSave.EnableForAutoSaves.Value = true; - PatchSave.CompressionTypeForAutoSaves = (CompressionType)idx - 1; - PatchSave.CompressionTypeForAutoSavesConfig.Value = CompressSave.StringFromCompresstionType(PatchSave.CompressionTypeForAutoSaves); - } - }); - rtrans = (RectTransform)cb.transform; - pos = rtrans.anchoredPosition3D; - rtrans.anchoredPosition3D = new Vector3(pos.x - 50, pos.y, pos.z); - var size = rtrans.sizeDelta; - rtrans.sizeDelta = new Vector2(150f, size.y); - var txt = gameObj.GetComponent(); - txt.text = "Compression for auto saves".Translate(); - var localizer = gameObj.GetComponent(); - if (localizer != null) - { - localizer.stringKey = "Compression for auto saves"; - localizer.translation = "Compression for auto saves".Translate(); - } - } - } - - private static void WrapClick(int data) - { - PatchSave.UseCompressSave = false; - _context.Window.OSaveGameAs(data); - } -} diff --git a/CompressSave/README.md b/CompressSave/README.md index 86f84de..60021ea 100644 --- a/CompressSave/README.md +++ b/CompressSave/README.md @@ -1,198 +1,3 @@ # CompressSave -#### Compress game saves to reduce space use and boost save speed -#### Original by [@bluedoom](https://github.com/bluedoom/DSP_Mod)(till 1.1.11) and [@starfi5h](https://github.com/starfi5h/DSP_CompressSave)(1.1.12), I just update it to support latest game version. -#### 压缩游戏存档以降低空间使用并提升保存速度 -#### 原作者 [@bluedoom](https://github.com/bluedoom/DSP_Mod)(直到1.1.11) 和 [@starfi5h](https://github.com/starfi5h/DSP_CompressSave)(1.1.12),本人继续更新以支持最新游戏版本。 - -## Changelog - -### 1.3.5 -* Fix a crash issue on choosing language other than English and Chinese. - -### 1.3.4 -* Support for game version 0.10.28.20759. - -### 1.3.3 -* Fix a display issue on combobox of compression type. - -### 1.3.2 -* Add config UI on Save Game dialog, to set compression types. -* Change button text to `Save (Compress)` for better understanding. - -### 1.3.1 -* Add config to disable feature for auto saves. -* Fix bug that first save after game start is always compressed in Zstd. - -### 1.3.0 -* Separate config entries for manual save and auto save. -* Now you can still get speed benefit while setting compression type to `None` for auto saves, and for manual saves if using the new `Save` button. - + Adds a `nonewrap.dll` for this function. -* Update `LZ4` and `Zstd` library to latest version. -* `lz4wrap.dll` and `zstdwrap.dll` are compiled using `-O3` instead of `-Os`, expect to be slightly faster but larger. - -### 1.2.2 -* Fix #4, a bug caused by non-ASCII UTF-8 characters. -* Remove use of Harmony.UnpatchAll() to avoid warnings in BepInEx log. - -### 1.2.1 -* Simplified codes to display compression type and `Decompress` button on save/load UI, making CompressSave compatible with other MODs(like GalacticScale) which override `UILoadGameWindow::OnSelectedChange()`. -* Add compression level -5 to -1 for zstd, which makes it working better than lz4(which is actually lz4hc used by lz4frame) now: - * -5 gets faster compression speed than lz4 with still a little better compression ratio. - * -1 has almost the same speed against lz4 with greater compression ratio. - * Due to bug of r2modman UI which does not support negative integer, the config value of compression level is not limited any more. -* move native wrapper DLLs into `x64` folder to avoid warning logs on loading BepInEx plugins. - -### 1.2.0 -* Match game version 0.9.27.15033. -* Add new compression type: zstd (a bit slower but get better compression ratio than lz4). -* Add config to set compression type and level(Don't use high compression levels for zstd as they are very slow). -* Hide decompress button for normal save files. -* Optimize native dlls for other compression library support: - * Unified naming rules for filenames and export functions. - * Add compression level support. - -### 1.1.14 -* Fix Sandbox info on Save/Load Panel. -* Fix DLL version info. - -### 1.1.13 - -* Match game version 0.9.26.13026. -* Move "Sandbox Mode" checkbox on Save Panel to avoid overlap. -* Avoid warning message on "Continue" button of main menu. - -### 1.1.12 - -* Match game version 0.9.25.12007. - -### 1.1.11 - -* Fix 1.1.10 package issue. - -### 1.1.10 - -* Fix 1.1.8 Archive corruption with DIY System, corrupted archives can be fixed by using \[Fix118\] mod - - Fix118: https://github.com/bluedoom/DSP_Mod/blob/master/Fix118 - -### 1.1.9 - -* CompressSave is temporarily disabled due to some error with the DIY system. - -### 1.1.8 - -* Match game version 0.9.24.11029 - -### 1.1.7 - -* Fix incorrect data on statistic panel. -* Improve performance. - -### 1.1.6 - -* fix memory leak - -### 1.1.5 (Game Version 0.8.22) - -* Match game version 0.8.22. -* Thanks [@starfi5h] for - - PatchSave now use transpiler for better robustness. - - Change version check to soft warning. - - Add PeekableReader so other mods can use BinaryReader.PeekChar(). - - Change LZ4DecompressionStream.Position behavior. Position setter i - available now. - -### 1.1.4 (Game Version 0.8.19) - -* Match game version 0.8.19. - -### 1.1.3 (2021/05/29) (Game Version 0.7.18) - -* Match game version 0.7.18. -* Fix memory leak. - -### 1.1.2 (2021/03/24) (Game Version 0.6.17) - -* Handle lz4 library missing Error - -### 1.1.1 (2021/03/17) (Game Version 0.6.17) - -* Fix Load Error - -### 1.1.0 (2021/03/17) (Game Version 0.6.17) - -* Add UI button - -## Introduction - -* Reduce archive size by 30% / save time by 75% (Compressed by LZ4, on HDD + i7-4790K@4.4G + DDR3 2400MHz) - - | Before | After | - | - | - | - | 50MB 0.8s | 30MB 0.2s | - | 220M 3.6s | 147M 0.7s | - | 1010M 19.1s | 690M 3.6s | - -## Usage - -* You can set compression type for manual saves and auto saves individually. -* Manual saves are compressed while using the new `Save` button. -* You can still get speed benefit while setting compression type to `None` for auto saves, and for manual saves if using the new `Save` button. -* You can decompress saves on load panel. -* Remember to backup your save(use original save button) before updating game to avoid loading failure. - -## 更新日志 - -### 1.3.5 -* 修复了选择英文和中文以外的语言时的崩溃问题。 - -### 1.3.4 -* 支持游戏版本 0.10.28.20759。 - -### 1.3.3 -* 修复压缩类型下拉框显示问题。 - -### 1.3.2 -* 在保存面板上增加设置压缩方式的UI。 -* 将按钮文本改为`压缩保存`以区分功能。 - -### 1.3.1 -* 增加在自动存档中禁用压缩的设置项。 -* 修复一个导致游戏开始后第一次保存总是使用Zstd压缩的bug。 - -### 1.3.0 -* 分离手动存档和自动存档的设置项。 -* 现在在自动存档设置压缩类型为`存储`也可以获得速度提升,手动存档也可以在使用新的`保存`按钮后获得速度提升。 - + 为此增加了`nonewrap.dll`。 -* 更新`LZ4`和`Zstd`库到最新版本。 -* `lz4wrap.dll`和`zstdwrap.dll`使用`-O3`编译而不是`-Os`,速度略有提升但体积变大。 - -### 1.2.2 -* 修复 #4,一个导致非ASCII UTF-8字符导致的bug。 -* 移除使用Harmony.UnpatchAll()以避免在BepInEx日志中出现警告。 - -### 1.2.1 -* 简化代码以在存档读取面板上显示压缩类型和`解压`按钮,使得CompressSave与其他MOD(如GalacticScale)兼容,因为它们都覆盖了`UILoadGameWindow::OnSelectedChange()`。 -* 为zstd添加了压缩等级-5到-1,现在它比lz4(实际上是lz4frame)表现更好了: - * -5比lz4更快,但压缩比略有提升。 - * -1和lz4几乎一样快,但压缩比更高。 - * 由于r2modman UI的bug,压缩等级的设置项不再限制范围。 -* 将本地的wrapper DLL移动到`x64` - -## 介绍 - -* 减少存档容量30% / 存档用时75% (LZ4压缩,测试环境:机械硬盘 + i7-4790K@4.4G + DDR3 2400MHz) - - | 原存档 | 压缩后 | - | - | - | - | 50MB 0.8s | 30MB 0.2s | - | 220M 3.6s | 147M 0.7s | - | 1010M 19.1s | 690M 3.6s | - -## 使用说明 - -* 手动和自动存档都可以分开设置压缩方式。 -* 手动存档使用新加的保存按钮即可压缩保存。 -* 即使设置为不压缩,自动存档、以及使用新加的保存按钮手动保存也可以获得速度提升。 -* 可以在读取存档面板解压存档。 -* 如果游戏有版本更新记得先备份存档(使用原保存按钮)以免更新后无法读取存档。 +#### Moved [here](https://github.com/soarqin/DSP_Mods_TO/tree/master/CompressSave) diff --git a/CompressSave/SaveUtil.cs b/CompressSave/SaveUtil.cs deleted file mode 100644 index 14695dd..0000000 --- a/CompressSave/SaveUtil.cs +++ /dev/null @@ -1,108 +0,0 @@ -using System; -using System.IO; -using BepInEx.Logging; -using CompressSave.Wrapper; - -namespace CompressSave; - -public static class SaveUtil -{ - public static ManualLogSource Logger; - - public static readonly Version VerifiedVersion = new() - { - Major = 0, - Minor = 10, - Release = 28, - }; - - private static string UnzipToFile(DecompressionStream lzStream, string fullPath) - { - lzStream.ResetStream(); - var dir = Path.GetDirectoryName(fullPath); - var filename = "[Recovery]-" + Path.GetFileNameWithoutExtension(fullPath); - fullPath = filename + GameSave.saveExt; - if (dir != null) fullPath = Path.Combine(dir, fullPath); - var i = 0; - while(File.Exists(fullPath)) - { - fullPath = $"{filename}[{i++}]{GameSave.saveExt}"; - if (dir != null) fullPath = Path.Combine(dir, fullPath); - } - var buffer = new byte[1024 * 1024]; - using (var fs = new FileStream(fullPath, FileMode.Create)) - using (var br = new BinaryWriter(fs)) - { - for (var read = lzStream.Read(buffer, 0, buffer.Length); read > 0; read = lzStream.Read(buffer, 0, buffer.Length)) - { - fs.Write(buffer, 0, read); - } - fs.Seek(6L, SeekOrigin.Begin); - br.Write(fs.Length); - - } - return Path.GetFileNameWithoutExtension(fullPath); - } - - public static bool DecompressSave(string saveName, out string newSaveName) - { - newSaveName = string.Empty; - var path = GameConfig.gameSaveFolder + saveName + GameSave.saveExt; - try - { - using var fileStream = new FileStream(path, FileMode.Open, FileAccess.Read); - var compressType = SaveGetCompressType(fileStream); - switch (compressType) - { - case CompressionType.LZ4: - case CompressionType.Zstd: - using (var lzstream = new DecompressionStream(compressType == CompressionType.LZ4 ? PatchSave.LZ4Wrapper : PatchSave.ZstdWrapper, fileStream)) - { - newSaveName = UnzipToFile(lzstream, path); - } - return true; - case CompressionType.None: - return false; - default: - throw new ArgumentOutOfRangeException(); - } - } - catch (Exception e) - { - Logger.LogError(e); - return false; - } - } - public static CompressionType SaveGetCompressType(FileStream fs) - { - for (var i = 0; i < 3; i++) - { - if (0xCC != fs.ReadByte()) - return CompressionType.None; - } - - return fs.ReadByte() switch - { - 0xCC => CompressionType.LZ4, - 0xCD => CompressionType.Zstd, - _ => CompressionType.None - }; - } - - internal static CompressionType SaveGetCompressType(string saveName) - { - if (string.IsNullOrEmpty(saveName)) return CompressionType.None; - try - { - using var fileStream = new FileStream(GetFullSavePath(saveName), FileMode.Open); - return SaveGetCompressType(fileStream); - } - catch (Exception e) - { - Logger.LogWarning(e); - return CompressionType.None; - } - } - - private static string GetFullSavePath(string saveName) => GameConfig.gameSaveFolder + saveName + GameSave.saveExt; -} \ No newline at end of file diff --git a/CompressSave/Wrapper/BlackHoleStream.cs b/CompressSave/Wrapper/BlackHoleStream.cs deleted file mode 100644 index cf9cf9d..0000000 --- a/CompressSave/Wrapper/BlackHoleStream.cs +++ /dev/null @@ -1,46 +0,0 @@ -using System; -using System.IO; - -namespace CompressSave.Wrapper; - -class BlackHoleStream : Stream -{ - private long _length; - - public override bool CanRead => true; - - public override bool CanSeek => false; - - public override bool CanWrite => true; - - public override long Length => _length; - - public override long Position { get; set; } - - public override void Flush() - { - - } - - public override int Read(byte[] buffer, int offset, int count) - { - return count; - } - - public override long Seek(long offset, SeekOrigin origin) - { - throw new NotImplementedException(); - } - - public override void SetLength(long value) - { - _length = value; - } - - private readonly byte[] _testBuffer = new byte[1024 * 1024]; - - public override void Write(byte[] buffer, int offset, int count) - { - Array.Copy(buffer, offset, _testBuffer, 0, Math.Min(count, _testBuffer.Length)); - } -} \ No newline at end of file diff --git a/CompressSave/Wrapper/BufferWriter.cs b/CompressSave/Wrapper/BufferWriter.cs deleted file mode 100644 index 7d70fec..0000000 --- a/CompressSave/Wrapper/BufferWriter.cs +++ /dev/null @@ -1,291 +0,0 @@ -using System; -using System.IO; -using System.Text; -using System.Runtime.CompilerServices; - -namespace CompressSave.Wrapper; - -public unsafe class BufferWriter : BinaryWriter -{ - private ByteSpan CurrentBuffer => _doubleBuffer.WriteBuffer; - - private readonly DoubleBuffer _doubleBuffer; - - private readonly Encoding _encoding; - - private readonly int _maxBytesPerChar; - - private byte[] Buffer => CurrentBuffer.Buffer; - - private long SuplusCapacity => _endPos - _curPos; - - private long _swapedBytes; - - public long WriteSum => _swapedBytes + _curPos - _startPos; - - public override Stream BaseStream => _baseStream; - - public override void Write(char[] chars, int index, int count) - { - if (chars == null) - { - throw new ArgumentNullException(nameof(chars)); - } - byte[] bytes = _encoding.GetBytes(chars, index, count); - Write(bytes); - } - - private byte* _curPos; - private byte* _endPos; - private byte* _startPos; - private readonly Stream _baseStream; - - public BufferWriter(DoubleBuffer doubleBuffer, CompressionStream outStream) - : this(doubleBuffer, new UTF8Encoding(encoderShouldEmitUTF8Identifier: false, throwOnInvalidBytes: true), outStream) - { - - } - - private BufferWriter(DoubleBuffer buffer , UTF8Encoding encoding, CompressionStream outStream) : base(Stream.Null, encoding) - { - _baseStream = outStream; - _swapedBytes = 0; - _doubleBuffer = buffer; - RefreshStatus(); - _encoding = encoding; - _maxBytesPerChar = _encoding.GetMaxByteCount(1); - } - - private void SwapBuffer() - { - CurrentBuffer.Position = 0; - - CurrentBuffer.Length = (int)(_curPos - _startPos); - _swapedBytes += CurrentBuffer.Length; - _doubleBuffer.SwapBuffer(); - RefreshStatus(); - } - - private void RefreshStatus() - { - _startPos = (byte*)Unsafe.AsPointer(ref Buffer[0]); - _curPos = _startPos; - _endPos = (byte*)Unsafe.AsPointer(ref Buffer[Buffer.Length - 1]) + 1; - } - - private void CheckCapacityAndSwap(int requiredCapacity) - { - if (SuplusCapacity < requiredCapacity) - { - SwapBuffer(); - } - } - - public override void Write(byte value) - { - CheckCapacityAndSwap(1); - *(_curPos++) = value; - } - - public override void Write(bool value) => Write((byte)(value ? 1 : 0)); - - protected override void Dispose(bool disposing) - { - if (disposing) - { - SwapBuffer(); - } - base.Dispose(disposing); - } - - public override void Close() - { - Dispose(disposing: true); - } - - public override void Flush() - { - SwapBuffer(); - } - - public override long Seek(int offset, SeekOrigin origin) - { - throw new NotImplementedException(); - } - - public override void Write(sbyte value) => Write((byte)value); - - public override void Write(byte[] buffer) => Write(buffer, 0, buffer.Length); - - - public override void Write(byte[] buffer, int index, int count) - { - if (buffer == null) - { - throw new ArgumentNullException(nameof(buffer)); - } - fixed (byte* start = buffer) - { - byte* srcPos = start + index; - while (SuplusCapacity <= count) - { - int dstSuplus = (int)SuplusCapacity; - //Array.Copy(_buffer, index + writed, Buffer, Position, SuplusCapacity); - Unsafe.CopyBlock(_curPos, srcPos, (uint)dstSuplus); - count -= dstSuplus; - srcPos += dstSuplus; - _curPos = _endPos; - SwapBuffer(); - } - Unsafe.CopyBlock(_curPos, srcPos, (uint)count); - _curPos += count; - } - } - - public override void Write(char ch) - { - if (char.IsSurrogate(ch)) - { - throw new ArgumentException("Arg_SurrogatesNotAllowedAsSingleChar"); - } - - CheckCapacityAndSwap(_maxBytesPerChar); - - _curPos += _encoding.GetBytes(&ch, 1, _curPos, (int)SuplusCapacity); - } - - //slow - public override void Write(char[] chars) - { - if (chars == null) - { - throw new ArgumentNullException(nameof(chars)); - } - byte[] bytes = _encoding.GetBytes(chars, 0, chars.Length); - Write(bytes); - } - - public override void Write(double value) - { - CheckCapacityAndSwap(8); - ulong num = (ulong)(*(long*)(&value)); - *(_curPos++) = (byte)num; - *(_curPos++) = (byte)(num >> 8); - *(_curPos++) = (byte)(num >> 16); - *(_curPos++) = (byte)(num >> 24); - *(_curPos++) = (byte)(num >> 32); - *(_curPos++) = (byte)(num >> 40); - *(_curPos++) = (byte)(num >> 48); - *(_curPos++) = (byte)(num >> 56); - } - - //slow - public override void Write(decimal d) - { - CheckCapacityAndSwap(16); - int[] bits = decimal.GetBits(d); - - Write(bits[0]); - Write(bits[1]); - Write(bits[2]); - Write(bits[3]); - } - - - public override void Write(short value) - { - CheckCapacityAndSwap(2); - *(_curPos++) = (byte)value; - *(_curPos++) = (byte)(value >> 8); - } - - public override void Write(ushort value) - { - CheckCapacityAndSwap(2); - *(_curPos++) = (byte)value; - *(_curPos++) = (byte)(value >> 8); - } - - - public override void Write(int value) - { - if (SuplusCapacity < 4) - { - SwapBuffer(); - } - *(_curPos++) = (byte)value; - *(_curPos++) = (byte)(value >> 8); - *(_curPos++) = (byte)(value >> 16); - *(_curPos++) = (byte)(value >> 24); - } - - public override void Write(uint value) - { - CheckCapacityAndSwap(4); - *(_curPos++) = (byte)value; - *(_curPos++) = (byte)(value >> 8); - *(_curPos++) = (byte)(value >> 16); - *(_curPos++) = (byte)(value >> 24); - } - - - public override void Write(long value) - { - CheckCapacityAndSwap(8); - *(_curPos++) = (byte)value; - *(_curPos++) = (byte)(value >> 8); - *(_curPos++) = (byte)(value >> 16); - *(_curPos++) = (byte)(value >> 24); - *(_curPos++) = (byte)(value >> 32); - *(_curPos++) = (byte)(value >> 40); - *(_curPos++) = (byte)(value >> 48); - *(_curPos++) = (byte)(value >> 56); - } - - public override void Write(ulong value) - { - CheckCapacityAndSwap(8); - *(_curPos++) = (byte)value; - *(_curPos++) = (byte)(value >> 8); - *(_curPos++) = (byte)(value >> 16); - *(_curPos++) = (byte)(value >> 24); - *(_curPos++) = (byte)(value >> 32); - *(_curPos++) = (byte)(value >> 40); - *(_curPos++) = (byte)(value >> 48); - *(_curPos++) = (byte)(value >> 56); - } - - public override void Write(float value) - { - CheckCapacityAndSwap(4); - uint num = *(uint*)(&value); - *(_curPos++) = (byte)num; - *(_curPos++) = (byte)(num >> 8); - *(_curPos++) = (byte)(num >> 16); - *(_curPos++) = (byte)(num >> 24); - } - - - // Just use same mechanisum from `Write(char[] chars, int index, int count)` - public override void Write(string value) - { - if (value == null) - { - throw new ArgumentNullException(nameof(value)); - } - byte[] bytes = _encoding.GetBytes(value); - Write7BitEncodedInt(bytes.Length); - Write(bytes); - } - - - private new void Write7BitEncodedInt(int value) - { - uint num; - for (num = (uint)value; num >= 128; num >>= 7) - { - Write((byte)(num | 0x80)); - } - Write((byte)num); - } -} \ No newline at end of file diff --git a/CompressSave/Wrapper/CompressionStream.cs b/CompressSave/Wrapper/CompressionStream.cs deleted file mode 100644 index 98789a9..0000000 --- a/CompressSave/Wrapper/CompressionStream.cs +++ /dev/null @@ -1,223 +0,0 @@ -using System; -using System.IO; -using System.Threading; - -namespace CompressSave.Wrapper; - -public class CompressionStream : Stream -{ - private readonly WrapperDefines _wrapper; - - public const int Mb = 1024 * 1024; - public override bool CanRead => false; - - public override bool CanSeek => false; - - public override bool CanWrite => true; - - public override long Length => _totalWrite; - - // only use for game statistics - public override long Position - { - get => BufferWriter.WriteSum; - set => throw new NotImplementedException(); - } - - public readonly Stream OutStream; - - private long _totalWrite; - private readonly bool _useMultiThread; - private DoubleBuffer _doubleBuffer; - - private byte[] _outBuffer; - - private IntPtr _cctx; - private long _lastError; - private bool _stopWorker = true; - - public bool HasError() - { - return _lastError != 0; - } - - private void HandleError(long errorCode) - { - if (errorCode < 0) - { - _wrapper.CompressContextFree(_cctx); - _cctx = IntPtr.Zero; - _lastError = errorCode; - throw new Exception(errorCode.ToString()); - } - } - - public struct CompressBuffer - { - public byte[] ReadBuffer; - public byte[] WriteBuffer; - public byte[] OutBuffer; - } - - public static CompressBuffer CreateBuffer(int outBufferSize, int exBufferSize = 4 * Mb) - { - try - { - return new CompressBuffer - { - OutBuffer = new byte[outBufferSize], - ReadBuffer = new byte[exBufferSize], - WriteBuffer = new byte[exBufferSize], - }; - } - catch (Exception e) - { - Console.WriteLine(e.ToString()); - } - return new CompressBuffer(); - } - - public BufferWriter BufferWriter { get; private set; } - - public CompressionStream(WrapperDefines wrap, int compressionLevel, Stream outputStream, CompressBuffer compressBuffer, bool multiThread) - { - _wrapper = wrap; - OutStream = outputStream; - InitBuffer(compressBuffer.ReadBuffer, compressBuffer.WriteBuffer, compressBuffer.OutBuffer); - var writeSize = _wrapper.CompressBegin(out _cctx, compressionLevel, _outBuffer, _outBuffer.Length); - HandleError(writeSize); - outputStream.Write(_outBuffer, 0, (int)writeSize); - _useMultiThread = multiThread; - if (!multiThread) return; - _stopWorker = false; - var compressThread = new Thread(CompressAsync); - compressThread.Start(); - } - - private void InitBuffer(byte[] readBuffer, byte[] writeBuffer, byte[] outputBuffer) - { - _doubleBuffer = new DoubleBuffer(readBuffer ?? new byte[4 * Mb], writeBuffer ?? new byte[4 * Mb], Compress); - _outBuffer = outputBuffer ?? new byte[_wrapper.CompressBufferBound(writeBuffer?.Length ?? 4 * Mb)]; - BufferWriter = new BufferWriter(_doubleBuffer,this); - } - - public override void Flush() - { - _doubleBuffer.SwapBuffer(); - if(_useMultiThread) - { - _doubleBuffer.WaitReadEnd(); - } - lock (_outBuffer) - { - OutStream.Flush(); - } - } - - private void Compress() - { - if (!_useMultiThread) - { - Compress_Internal(); - } - } - - private void Compress_Internal() - { - var consumeBuffer = _doubleBuffer.ReadBegin(); - if (consumeBuffer.Length > 0) - { - lock (_outBuffer) - { - long writeSize; - try - { - writeSize = _wrapper.CompressUpdateEx(_cctx, _outBuffer, 0, consumeBuffer.Buffer, 0, consumeBuffer.Length); - HandleError(writeSize); - } - finally - { - _doubleBuffer.ReadEnd(); - } - OutStream.Write(_outBuffer, 0, (int)writeSize); - _totalWrite += writeSize; - } - } - else - { - _doubleBuffer.ReadEnd(); - } - } - - private void CompressAsync() - { - while(!_stopWorker) - { - Compress_Internal(); - } - } - - public override int Read(byte[] buffer, int offset, int count) - { - throw new NotImplementedException(); - } - - public override long Seek(long offset, SeekOrigin origin) - { - throw new NotImplementedException(); - } - - public override void SetLength(long value) - { - throw new NotImplementedException(); - } - - - public override void Write(byte[] buffer, int offset, int count) - { - BufferWriter.Write(buffer, offset, count); - //var writeBuffer = doubleBuffer.writeBuffer; - //int writeSize = writeBuffer.Write(buffer, offset, count); - //while (count - writeSize > 0) - //{ - // SwapBuffer(ref writeBuffer); - // offset += writeSize; - // count -= writeSize; - // writeSize = writeBuffer.Write(buffer, offset, count); - //} - //inputSum += count; - } - - private void FreeContext() - { - _wrapper.CompressContextFree(_cctx); - _cctx = IntPtr.Zero; - } - - private bool _closed; - public override void Close() - { - if (_closed) return; - BufferWriter.Close(); - _closed = true; - //Console.WriteLine($"FLUSH"); - - Flush(); - - // try stop the worker - _stopWorker = true; - _doubleBuffer.SwapBuffer(); - - var size = _wrapper.CompressEnd(_cctx, _outBuffer, _outBuffer.Length); - //Debug.Log($"End"); - OutStream.Write(_outBuffer, 0, (int)size); - base.Close(); - } - - protected override void Dispose(bool disposing) - { - FreeContext(); - base.Dispose(disposing); - } - -} \ No newline at end of file diff --git a/CompressSave/Wrapper/DecompressionStream.cs b/CompressSave/Wrapper/DecompressionStream.cs deleted file mode 100644 index 11afbe1..0000000 --- a/CompressSave/Wrapper/DecompressionStream.cs +++ /dev/null @@ -1,154 +0,0 @@ -using System; -using System.IO; - -namespace CompressSave.Wrapper; - -public class DecompressionStream : Stream -{ - private readonly WrapperDefines _wrapper; - - public override bool CanRead => true; - - public override bool CanSeek => false; - - public override bool CanWrite => false; - - public override long Length => _inStream.Length; - - public override long Position - { - get => _readPos; - set - { - if (value < _readPos) - ResetStream(); - else - value -= _readPos; - var tmpBuffer = new byte[1024]; - while (value > 0) - { - value -= Read(tmpBuffer, 0, (int)(value < 1024 ? value : 1024)); - } - } - } - - private readonly Stream _inStream; - - private IntPtr _dctx = IntPtr.Zero; - - private readonly ByteSpan _srcBuffer; - private readonly ByteSpan _dcmpBuffer; - private bool _decompressFinish; - private readonly long _startPos; - private long _readPos; //sum of readlen - - public DecompressionStream(WrapperDefines wrap, Stream inputStream, int extraBufferSize = 512 * 1024) - { - _wrapper = wrap; - _inStream = inputStream; - _startPos = inputStream.Position; - _srcBuffer = new ByteSpan(new byte[extraBufferSize]); - var len = Fill(); - var expect = _wrapper.DecompressBegin(ref _dctx, _srcBuffer.Buffer, ref len, out var blockSize); - _srcBuffer.Position += len; - if (expect < 0) throw new Exception(expect.ToString()); - _dcmpBuffer = new ByteSpan(new byte[blockSize]); - } - - public void ResetStream() - { - _inStream.Seek(_startPos, SeekOrigin.Begin); - _decompressFinish = false; - _srcBuffer.Clear(); - _dcmpBuffer.Clear(); - _wrapper.DecompressContextReset(_dctx); - _readPos = 0; - } - - private int Fill() - { - var suplus = _srcBuffer.Length - _srcBuffer.Position; - if (_srcBuffer.Length > 0 && _srcBuffer.Position >= suplus) - { - Array.Copy(_srcBuffer, _srcBuffer.Position, _srcBuffer, 0, suplus); - _srcBuffer.Length -= _srcBuffer.Position; - _srcBuffer.Position = 0; - } - - if (_srcBuffer.IdleCapacity > 0) - { - var readlen = _inStream.Read(_srcBuffer, _srcBuffer.Length, _srcBuffer.IdleCapacity); - _srcBuffer.Length += readlen; - } - - return _srcBuffer.Length - _srcBuffer.Position; - } - - public override void Flush() - { - } - - protected override void Dispose(bool disposing) - { - _wrapper.DecompressEnd(_dctx); - _dctx = IntPtr.Zero; - base.Dispose(disposing); - } - - public override int Read(byte[] buffer, int offset, int count) - { - var readlen = 0; - while (count > (readlen += _dcmpBuffer.Read(buffer, offset + readlen, count - readlen)) && !_decompressFinish) - { - var buffSize = Fill(); - if (buffSize <= 0) return readlen; - - var rt = _wrapper.DecompressUpdateEx(_dctx, _dcmpBuffer, 0, _dcmpBuffer.Capacity, _srcBuffer, _srcBuffer.Position, - buffSize); - if (rt.Expect < 0) throw new Exception(rt.Expect.ToString()); - if (rt.Expect == 0) _decompressFinish = true; - - _srcBuffer.Position += (int)rt.ReadLen; - _dcmpBuffer.Position = 0; - _dcmpBuffer.Length = (int)rt.WriteLen; - } - - _readPos += readlen; - return readlen; - } - - public int PeekByte() - { - if (_dcmpBuffer.Length <= _dcmpBuffer.Position) - { - var buffSize = Fill(); - if (buffSize <= 0) return -1; - - var rt = _wrapper.DecompressUpdateEx(_dctx, _dcmpBuffer, 0, _dcmpBuffer.Capacity, _srcBuffer, _srcBuffer.Position, - buffSize); - if (rt.Expect < 0) throw new Exception(rt.Expect.ToString()); - if (rt.Expect == 0) _decompressFinish = true; - - _srcBuffer.Position += (int)rt.ReadLen; - _dcmpBuffer.Position = 0; - _dcmpBuffer.Length = (int)rt.WriteLen; - } - - return _dcmpBuffer.Buffer[_dcmpBuffer.Position]; - } - - public override long Seek(long offset, SeekOrigin origin) - { - throw new NotImplementedException(); - } - - public override void SetLength(long value) - { - throw new NotImplementedException(); - } - - public override void Write(byte[] buffer, int offset, int count) - { - throw new NotImplementedException(); - } -} \ No newline at end of file diff --git a/CompressSave/Wrapper/DoubleBuffer.cs b/CompressSave/Wrapper/DoubleBuffer.cs deleted file mode 100644 index 23514ba..0000000 --- a/CompressSave/Wrapper/DoubleBuffer.cs +++ /dev/null @@ -1,115 +0,0 @@ -using System; -using System.Threading; - -namespace CompressSave.Wrapper; - -public class ByteSpan -{ - public byte[] Buffer { get; } - //public int Start; - public int Length; - public readonly int Capacity; - public int IdleCapacity => Capacity - Length; - public int Position; - - public ByteSpan(byte[] buffer) - { - Buffer = buffer; - Capacity = Buffer.Length; - } - public void Clear() - { - Length = 0; - Position = 0; - } - public int Write(byte[] src, int offset, int count) - { - int writeLen = Math.Min(Capacity - Length, count); - Array.Copy(src, offset, Buffer, Length, writeLen); - Length += writeLen; - return writeLen; - } - - public int Read(byte[] dst, int offset, int count) - { - count = Math.Min(Length - Position, count); - Array.Copy(Buffer, Position, dst, offset, count); - Position += count; - return count; - } - - public static implicit operator byte[](ByteSpan bs) => bs.Buffer; -} - -public struct ReadOnlySpan(byte[] buffer, int length) -{ - private readonly byte[] _buffer = buffer; - private int _position = 0; - - public int Read(byte[] dst, int offset, int count) - { - count = Math.Min(length - _position, count); - Array.Copy(_buffer, _position, dst, offset, count); - _position += count; - return count; - } - - public static implicit operator byte[](ReadOnlySpan s) => s._buffer; -} - -public class DoubleBuffer(byte[] readingBuffer, byte[] writingBuffer, Action onReadBufferReadyAction) -{ - public const int Mb = 1024 * 1024; - - public ByteSpan WriteBuffer = new(writingBuffer); - private ByteSpan _readBuffer; - private ByteSpan _midBuffer = new(readingBuffer); - - private readonly Semaphore _readEnd = new Semaphore(1, 1); - private readonly Semaphore _writeEnd = new Semaphore(0, 1); - - public ByteSpan ReadBegin() - { - _writeEnd.WaitOne(); - return _readBuffer; - } - - public void ReadEnd() - { - _readBuffer.Clear(); - _midBuffer = _readBuffer; - _readBuffer = null; - _readEnd.Release(); - } - /// - /// swap current write buffer to read and wait a new write buffer - /// - /// write buffer - public ByteSpan SwapBuffer(bool triggerEvent = true) - { - var write = SwapBegin(); - SwapEnd(); - onReadBufferReadyAction?.Invoke(); - return write; - } - - public void WaitReadEnd() - { - _readEnd.WaitOne(); - _readEnd.Release(); - } - - private ByteSpan SwapBegin() - { - _readEnd.WaitOne(); - _readBuffer = WriteBuffer; - WriteBuffer = _midBuffer; - _midBuffer = null; - return WriteBuffer; - } - - private void SwapEnd() - { - _writeEnd.Release(); - } -} \ No newline at end of file diff --git a/CompressSave/Wrapper/LZ4Wrapper.cs b/CompressSave/Wrapper/LZ4Wrapper.cs deleted file mode 100644 index 406a974..0000000 --- a/CompressSave/Wrapper/LZ4Wrapper.cs +++ /dev/null @@ -1,69 +0,0 @@ -using System; -using System.Collections.Generic; -using System.IO; -using MonoMod.Utils; - -namespace CompressSave.Wrapper; - -public class LZ4API: WrapperDefines -{ - public static readonly bool Avaliable; - - static LZ4API() - { - Avaliable = true; - var assemblyPath = System.Reflection.Assembly.GetAssembly(typeof(LZ4API)).Location; - var root = string.Empty; - try - { - if (!string.IsNullOrEmpty(assemblyPath)) - { - root = Path.GetDirectoryName(assemblyPath) ?? string.Empty; - } - - var map = new Dictionary> - { - { - "lz4wrap.dll", [ - "lz4wrap.dll", - "x64/lz4wrap.dll", - "plugins/x64/lz4wrap.dll", - "BepInEx/scripts/x64/lz4wrap.dll", - Path.Combine(root, "lz4wrap.dll"), - Path.Combine(root, "x64/lz4wrap.dll"), - Path.Combine(root, "plugins/x64/lz4wrap.dll") - ] - }, - }; - typeof(LZ4API).ResolveDynDllImports(map); - } - catch (Exception e) - { - Avaliable = false; - Console.WriteLine($"Error: {e}"); - } - } - - public LZ4API() - { - CompressBufferBound = CompressBufferBound_; - CompressBegin = CompressBegin_; - CompressEnd = CompressEnd_; - CompressUpdate = CompressUpdate_; - CompressContextFree = CompressContextFree_; - DecompressBegin = DecompressBegin_; - DecompressEnd = DecompressEnd_; - DecompressUpdate = DecompressUpdate_; - DecompressContextReset = DecompressContextReset_; - } - - [DynDllImport(libraryName: "lz4wrap.dll", "CompressBufferBound")] protected static CompressBufferBoundFunc CompressBufferBound_; - [DynDllImport(libraryName: "lz4wrap.dll", "CompressBegin")] protected static CompressBeginFunc CompressBegin_; - [DynDllImport(libraryName: "lz4wrap.dll", "CompressEnd")] protected static CompressEndFunc CompressEnd_; - [DynDllImport(libraryName: "lz4wrap.dll", "CompressUpdate")] protected static CompressUpdateFunc CompressUpdate_; - [DynDllImport(libraryName: "lz4wrap.dll", "CompressContextFree")] protected static CompressContextFreeFunc CompressContextFree_; - [DynDllImport(libraryName: "lz4wrap.dll", "DecompressBegin")] protected static DecompressBeginFunc DecompressBegin_; - [DynDllImport(libraryName: "lz4wrap.dll", "DecompressEnd")] protected static DecompressEndFunc DecompressEnd_; - [DynDllImport(libraryName: "lz4wrap.dll", "DecompressUpdate")] protected static DecompressUpdateFunc DecompressUpdate_; - [DynDllImport(libraryName: "lz4wrap.dll", "DecompressContextReset")] protected static DecompressContextResetFunc DecompressContextReset_; -} diff --git a/CompressSave/Wrapper/NoneWrapper.cs b/CompressSave/Wrapper/NoneWrapper.cs deleted file mode 100644 index 16766fb..0000000 --- a/CompressSave/Wrapper/NoneWrapper.cs +++ /dev/null @@ -1,69 +0,0 @@ -using System; -using System.Collections.Generic; -using System.IO; -using MonoMod.Utils; - -namespace CompressSave.Wrapper; - -public class NoneAPI: WrapperDefines -{ - public static readonly bool Avaliable; - - static NoneAPI() - { - Avaliable = true; - string assemblyPath = System.Reflection.Assembly.GetAssembly(typeof(NoneAPI)).Location; - string root = string.Empty; - try - { - if (!string.IsNullOrEmpty(assemblyPath)) - { - root = Path.GetDirectoryName(assemblyPath) ?? string.Empty; - } - - var map = new Dictionary> - { - { - "nonewrap.dll", [ - "nonewrap.dll", - "x64/nonewrap.dll", - "plugins/x64/nonewrap.dll", - "BepInEx/scripts/x64/nonewrap.dll", - Path.Combine(root, "nonewrap.dll"), - Path.Combine(root, "x64/nonewrap.dll"), - Path.Combine(root, "plugins/x64/nonewrap.dll") - ] - }, - }; - typeof(NoneAPI).ResolveDynDllImports(map); - } - catch (Exception e) - { - Avaliable = false; - Console.WriteLine($"Error: {e}"); - } - } - - public NoneAPI() - { - CompressBufferBound = CompressBufferBound_; - CompressBegin = CompressBegin_; - CompressEnd = CompressEnd_; - CompressUpdate = CompressUpdate_; - CompressContextFree = CompressContextFree_; - DecompressBegin = DecompressBegin_; - DecompressEnd = DecompressEnd_; - DecompressUpdate = DecompressUpdate_; - DecompressContextReset = DecompressContextReset_; - } - - [DynDllImport(libraryName: "nonewrap.dll", "CompressBufferBound")] protected static CompressBufferBoundFunc CompressBufferBound_; - [DynDllImport(libraryName: "nonewrap.dll", "CompressBegin")] protected static CompressBeginFunc CompressBegin_; - [DynDllImport(libraryName: "nonewrap.dll", "CompressEnd")] protected static CompressEndFunc CompressEnd_; - [DynDllImport(libraryName: "nonewrap.dll", "CompressUpdate")] protected static CompressUpdateFunc CompressUpdate_; - [DynDllImport(libraryName: "nonewrap.dll", "CompressContextFree")] protected static CompressContextFreeFunc CompressContextFree_; - [DynDllImport(libraryName: "nonewrap.dll", "DecompressBegin")] protected static DecompressBeginFunc DecompressBegin_; - [DynDllImport(libraryName: "nonewrap.dll", "DecompressEnd")] protected static DecompressEndFunc DecompressEnd_; - [DynDllImport(libraryName: "nonewrap.dll", "DecompressUpdate")] protected static DecompressUpdateFunc DecompressUpdate_; - [DynDllImport(libraryName: "nonewrap.dll", "DecompressContextReset")] protected static DecompressContextResetFunc DecompressContextReset_; -} diff --git a/CompressSave/Wrapper/PeekableReader.cs b/CompressSave/Wrapper/PeekableReader.cs deleted file mode 100644 index 04a2a78..0000000 --- a/CompressSave/Wrapper/PeekableReader.cs +++ /dev/null @@ -1,11 +0,0 @@ -using System.IO; - -namespace CompressSave.Wrapper; - -internal class PeekableReader(DecompressionStream input) : BinaryReader(input) -{ - public override int PeekChar() - { - return input.PeekByte(); - } -} \ No newline at end of file diff --git a/CompressSave/Wrapper/WrapperDefines.cs b/CompressSave/Wrapper/WrapperDefines.cs deleted file mode 100644 index 652064a..0000000 --- a/CompressSave/Wrapper/WrapperDefines.cs +++ /dev/null @@ -1,64 +0,0 @@ -using System; - -namespace CompressSave.Wrapper; - -public struct DecompressStatus -{ - public long WriteLen; - public long ReadLen; - public long Expect; -} - -public class WrapperDefines -{ - public delegate long CompressBufferBoundFunc(long inBufferSize); - public delegate long CompressBeginFunc(out IntPtr ctx, int compressionLevel, byte[] outBuff, long outCapacity, byte[] dictBuffer = null, - long dictSize = 0); - public delegate long CompressEndFunc(IntPtr ctx, byte[] dstBuffer, long dstCapacity); - public delegate void CompressContextFreeFunc(IntPtr ctx); - public delegate long DecompressBeginFunc(ref IntPtr pdctx, byte[] inBuffer, ref int inBufferSize, out int blockSize, byte[] dict = null, long dictSize = 0); - public delegate long DecompressEndFunc(IntPtr dctx); - public delegate void DecompressContextResetFunc(IntPtr dctx); - protected unsafe delegate long CompressUpdateFunc(IntPtr ctx, byte* dstBuffer, long dstCapacity, byte* srcBuffer, - long srcSize); - protected unsafe delegate long DecompressUpdateFunc(IntPtr dctx, byte* dstBuffer, ref long dstCapacity, byte* srcBuffer, - ref long srcSize); - - public CompressBufferBoundFunc CompressBufferBound; - public CompressBeginFunc CompressBegin; - public CompressEndFunc CompressEnd; - public CompressContextFreeFunc CompressContextFree; - public DecompressBeginFunc DecompressBegin; - public DecompressEndFunc DecompressEnd; - public DecompressContextResetFunc DecompressContextReset; - protected CompressUpdateFunc CompressUpdate; - protected DecompressUpdateFunc DecompressUpdate; - - public unsafe long CompressUpdateEx(IntPtr ctx, byte[] dstBuffer, long dstOffset, byte[] srcBuffer, - long srcOffset, long srcLen) - { - fixed (byte* pdst = dstBuffer, psrc = srcBuffer) - { - return CompressUpdate(ctx, pdst + dstOffset, dstBuffer.Length - dstOffset, psrc + srcOffset, - srcLen - srcOffset); - } - } - - public unsafe DecompressStatus DecompressUpdateEx(IntPtr dctx, byte[] dstBuffer, int dstOffset, int dstCount, - byte[] srcBuffer, long srcOffset, long count) - { - long dstLen = Math.Min(dstCount, dstBuffer.Length - dstOffset); - long errCode; - fixed (byte* pdst = dstBuffer, psrc = srcBuffer) - { - errCode = DecompressUpdate(dctx, pdst + dstOffset, ref dstLen, psrc + srcOffset, ref count); - } - - return new DecompressStatus - { - Expect = errCode, - ReadLen = count, - WriteLen = dstLen, - }; - } -} diff --git a/CompressSave/Wrapper/ZstdWrapper.cs b/CompressSave/Wrapper/ZstdWrapper.cs deleted file mode 100644 index 677d7d4..0000000 --- a/CompressSave/Wrapper/ZstdWrapper.cs +++ /dev/null @@ -1,69 +0,0 @@ -using System; -using System.Collections.Generic; -using System.IO; -using MonoMod.Utils; - -namespace CompressSave.Wrapper; - -public class ZstdAPI: WrapperDefines -{ - public static readonly bool Avaliable; - - static ZstdAPI() - { - Avaliable = true; - string assemblyPath = System.Reflection.Assembly.GetAssembly(typeof(ZstdAPI)).Location; - string root = string.Empty; - try - { - if (!string.IsNullOrEmpty(assemblyPath)) - { - root = Path.GetDirectoryName(assemblyPath) ?? string.Empty; - } - - var map = new Dictionary> - { - { - "zstdwrap.dll", [ - "zstdwrap.dll", - "x64/zstdwrap.dll", - "plugins/x64/zstdwrap.dll", - "BepInEx/scripts/x64/zstdwrap.dll", - Path.Combine(root, "zstdwrap.dll"), - Path.Combine(root, "x64/zstdwrap.dll"), - Path.Combine(root, "plugins/x64/zstdwrap.dll") - ] - }, - }; - typeof(ZstdAPI).ResolveDynDllImports(map); - } - catch (Exception e) - { - Avaliable = false; - Console.WriteLine($"Error: {e}"); - } - } - - public ZstdAPI() - { - CompressBufferBound = CompressBufferBound_; - CompressBegin = CompressBegin_; - CompressEnd = CompressEnd_; - CompressUpdate = CompressUpdate_; - CompressContextFree = CompressContextFree_; - DecompressBegin = DecompressBegin_; - DecompressEnd = DecompressEnd_; - DecompressUpdate = DecompressUpdate_; - DecompressContextReset = DecompressContextReset_; - } - - [DynDllImport(libraryName: "zstdwrap.dll", "CompressBufferBound")] protected static CompressBufferBoundFunc CompressBufferBound_; - [DynDllImport(libraryName: "zstdwrap.dll", "CompressBegin")] protected static CompressBeginFunc CompressBegin_; - [DynDllImport(libraryName: "zstdwrap.dll", "CompressEnd")] protected static CompressEndFunc CompressEnd_; - [DynDllImport(libraryName: "zstdwrap.dll", "CompressUpdate")] protected static CompressUpdateFunc CompressUpdate_; - [DynDllImport(libraryName: "zstdwrap.dll", "CompressContextFree")] protected static CompressContextFreeFunc CompressContextFree_; - [DynDllImport(libraryName: "zstdwrap.dll", "DecompressBegin")] protected static DecompressBeginFunc DecompressBegin_; - [DynDllImport(libraryName: "zstdwrap.dll", "DecompressEnd")] protected static DecompressEndFunc DecompressEnd_; - [DynDllImport(libraryName: "zstdwrap.dll", "DecompressUpdate")] protected static DecompressUpdateFunc DecompressUpdate_; - [DynDllImport(libraryName: "zstdwrap.dll", "DecompressContextReset")] protected static DecompressContextResetFunc DecompressContextReset_; -} diff --git a/CompressSave/ZstdWrapC/CMakeLists.txt b/CompressSave/ZstdWrapC/CMakeLists.txt deleted file mode 100644 index 98c364c..0000000 --- a/CompressSave/ZstdWrapC/CMakeLists.txt +++ /dev/null @@ -1,17 +0,0 @@ -cmake_minimum_required(VERSION 3.2) - -project(zstdwrap) - -add_library(zstdwrap SHARED - dllmain.c zstdwrap.c zstdwrap.h) - -target_compile_definitions(zstdwrap PRIVATE ZSTDWRAP_EXPORTS ZSTDLIB_STATIC_API) -if(MSVC) - target_compile_options(zstdwrap PRIVATE /MT) -else() - target_link_options(zstdwrap PRIVATE -static) -endif() -target_link_libraries(zstdwrap PRIVATE zstd) -if(WIN32) - set_target_properties(zstdwrap PROPERTIES PREFIX "") -endif() diff --git a/CompressSave/ZstdWrapC/dllmain.c b/CompressSave/ZstdWrapC/dllmain.c deleted file mode 100644 index 896c9b5..0000000 --- a/CompressSave/ZstdWrapC/dllmain.c +++ /dev/null @@ -1,20 +0,0 @@ -// dllmain.cpp : Defines the entry point for the DLL application. -#include - -BOOL APIENTRY DllMain( HMODULE hModule, - DWORD ul_reason_for_call, - LPVOID lpReserved - ) -{ - switch (ul_reason_for_call) - { - case DLL_PROCESS_ATTACH: - DisableThreadLibraryCalls(hModule); - break; - case DLL_THREAD_ATTACH: - case DLL_THREAD_DETACH: - case DLL_PROCESS_DETACH: - break; - } - return TRUE; -} diff --git a/CompressSave/ZstdWrapC/zstdwrap.c b/CompressSave/ZstdWrapC/zstdwrap.c deleted file mode 100644 index c28c539..0000000 --- a/CompressSave/ZstdWrapC/zstdwrap.c +++ /dev/null @@ -1,84 +0,0 @@ -#include "zstdwrap.h" - -#include -#include -#include -#include - -size_t __stdcall CompressBufferBound(size_t inBufferSize) -{ - return ZSTD_COMPRESSBOUND(inBufferSize); -} - -size_t __stdcall CompressBegin(ZSTD_CStream** pctx, int compressionLevel, void* outBuff, size_t outCapacity, void* dict, size_t dictSize) -{ - ZSTD_CStream *ctx = ZSTD_createCStream(); - if (ctx == NULL) return -1; - ZSTD_CCtx_setParameter(ctx, ZSTD_c_compressionLevel, compressionLevel); - if (dict) - { - ZSTD_CCtx_loadDictionary(ctx, dict, dictSize); - } - *pctx = ctx; - return 0; -} - - -size_t __stdcall CompressUpdate(ZSTD_CStream* ctx,void* dstBuffer, size_t dstCapacity,const void* srcBuffer, size_t srcSize) -{ - ZSTD_outBuffer obuf = {dstBuffer, dstCapacity, 0}; - ZSTD_inBuffer ibuf = {srcBuffer, srcSize, 0}; - do - { - ZSTD_compressStream2(ctx, &obuf, &ibuf, ZSTD_e_continue); - } - while (ibuf.pos < ibuf.size); - return obuf.pos; -} - -size_t __stdcall CompressEnd(ZSTD_CStream* ctx, void* dstBuffer, size_t dstCapacity) -{ - ZSTD_outBuffer obuf = {dstBuffer, dstCapacity, 0}; - ZSTD_inBuffer ibuf = {NULL, 0, 0}; - while (ZSTD_compressStream2(ctx, &obuf, &ibuf, ZSTD_e_end) > 0) {} - return obuf.pos; -} - -void __stdcall CompressContextFree(ZSTD_CStream* ctx) -{ - ZSTD_freeCStream(ctx); -} - -size_t __stdcall DecompressBegin(ZSTD_DStream **pdctx,void *inBuffer,size_t *inBufferSize, size_t *blockSize, void* dict, size_t dictSize) -{ - ZSTD_DStream *ctx = ZSTD_createDStream(); - if (ctx == NULL) return -1; - if (dict) - { - ZSTD_DCtx_loadDictionary(ctx, dict, dictSize); - } - *pdctx = ctx; - *inBufferSize = 0; - *blockSize = ZSTD_DStreamOutSize() << 2; - return 0; -} - -void __stdcall DecompressContextReset(ZSTD_DStream* dctx) -{ - ZSTD_DCtx_reset(dctx, ZSTD_reset_session_only); -} - -size_t __stdcall DecompressUpdate(ZSTD_DStream* dctx, void* outBuffer, size_t * outBufferSize, void* inBuffer, size_t * inBufferSize) -{ - ZSTD_outBuffer obuf = {outBuffer, *outBufferSize, 0}; - ZSTD_inBuffer ibuf = {inBuffer, *inBufferSize, 0}; - size_t r = ZSTD_decompressStream(dctx, &obuf, &ibuf); - *outBufferSize = obuf.pos; - *inBufferSize = ibuf.pos; - return r; -} - -size_t __stdcall DecompressEnd(ZSTD_DStream* ctx) -{ - return ZSTD_freeDStream(ctx); -} \ No newline at end of file diff --git a/CompressSave/ZstdWrapC/zstdwrap.h b/CompressSave/ZstdWrapC/zstdwrap.h deleted file mode 100644 index 2f36b1a..0000000 --- a/CompressSave/ZstdWrapC/zstdwrap.h +++ /dev/null @@ -1,34 +0,0 @@ -#pragma once - -#include - -#include - -#if defined(__cplusplus) -#define API_EXTERN_C extern "C" -#else -#define API_EXTERN_C -#endif -#ifdef ZSTDWRAP_EXPORTS -#define ZSTDAPI API_EXTERN_C __declspec(dllexport) -#else -#define ZSTDAPI API_EXTERN_C __declspec(dllimport) -#endif - -ZSTDAPI void __stdcall CompressContextFree(ZSTD_CStream* ctx); - -ZSTDAPI size_t __stdcall CompressBufferBound(size_t inBufferSize); - -ZSTDAPI size_t __stdcall CompressBegin(ZSTD_CStream** ctx, int compressionLevel, void* outBuff, size_t outCapacity, void* dict, size_t dictSize); - -ZSTDAPI size_t __stdcall CompressUpdate(ZSTD_CStream* ctx, void* dstBuffer, size_t dstCapacity, const void* srcBuffer, size_t srcSize); - -ZSTDAPI size_t __stdcall CompressEnd(ZSTD_CStream* ctx, void* dstBuffer, size_t dstCapacity); - -ZSTDAPI size_t __stdcall DecompressBegin(ZSTD_DStream** pdctx, void* inBuffer, size_t* inBufferSize, size_t* blockSize, void* dict, size_t dictSize); - -ZSTDAPI void __stdcall DecompressContextReset(ZSTD_DStream* dctx); - -ZSTDAPI size_t __stdcall DecompressUpdate(ZSTD_DStream* dctx, void* outBuffer, size_t* outBufferSize, void* inBuffer, size_t* inBufferSize); - -ZSTDAPI size_t __stdcall DecompressEnd(ZSTD_DStream* dctx); diff --git a/CompressSave/package/icon.png b/CompressSave/package/icon.png deleted file mode 100644 index 0fee584ca00625d21d10da89ed5d761f346ad8b7..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 53761 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 KMNUMnLSTX)Go3d8 diff --git a/CompressSave/package/manifest.json b/CompressSave/package/manifest.json deleted file mode 100644 index a7515b3..0000000 --- a/CompressSave/package/manifest.json +++ /dev/null @@ -1,7 +0,0 @@ -{ - "name": "CompressSave", - "version_number": "1.3.5", - "website_url": "https://github.com/soarqin/DSP_Mods/tree/master/CompressSave", - "description": "Compress game saves to reduce space use and boost save speed / 压缩游戏存档以降低空间使用并提升保存速度", - "dependencies": ["xiaoye97-BepInEx-5.4.17"] -} \ No newline at end of file diff --git a/CompressSave/package/plugins/x64/lz4wrap.dll b/CompressSave/package/plugins/x64/lz4wrap.dll deleted file mode 100644 index 28b26b909bff183b6464802807209e259a4bca28..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 225792 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 diff --git a/CompressSave/package/plugins/x64/zstdwrap.dll b/CompressSave/package/plugins/x64/zstdwrap.dll deleted file mode 100644 index 2f1e2fcfcaf36bb502c2e017e80a95005c587c17..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 922112 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 z�=LZZkJ3}YkW#6x9$J}2L~w&7*gdh_Nw($D`Rz3KE;(`0_fCHq8%M;3;46gU;p z@G8RL-LXK!?{wRpEfx9rEEIS=J!Sn1ezywcgMV(VJZ4af==4vK(=n5OM8m}wMh=1$ z;>#tDc%C-Row zUSo^J;pO~y~3+@NHZQh&Og}evodDENLcHwhjz$<+@!6``oA-o&c*zx zLqKvDpUBb)33b~uu!7>79>zLO+@k7``SibKz{9XkD4*8h<@@(f_v+Htri_m0IE)kd za$a}+_>WzGuH@4b#TioX`Gx7E6c3wxfL)GmYj-BgSrJcGR+Ns;-6?FSyP&C(z zcs=Yk4O$yt)Yxi_=ckmqU4J)l2^~fpz8hQUCVyvE(wXtyiY{HITc5rz#L?ji`2H&c z;e?pk!dKy9i`1{9*iBlTB>p~pO~mA9{n5B4J!;i)e)(Er)@IL~CA4?ueld;)t7|$r z>n%Mt&Y=r8X0KST3ztI{E0QKj;VK8P`+1h1ANLaStAzzx z6Jp~~=G@t$K4gt4y9$jRPAvu_`*dpp8mmNerd+D{={fSRQh_Zg*zwQL$eiYx=6}U1S0-_>>9{K^M^~;dm1RcD*HV>PR8C zYY2&zn%nnV(gR-b$F{tM5yr8`p5;p=c0hl?P0S2P89|Ljmy07pZmynUKQWt%D=)w1 zX?*G5pb8QLoLL;Pt>}p=o4E+vk6%8;jkH<^&R63o_1(My)m=R;%hof6*QW z$1ooG$6$hjgNSqIXKCNh8Hc}GdHh}4b%Iw*SV?=zAdk)MOfr1I5re4aj6Vve>HB5A zmGyr$kB{AMaxT_JnI@?Hjw0QM?BSJKRPv!_Z?+6qVR?m*Q{x(>>@jfOyUU^j*Fh?) zRrw&5N_m0OimQZ5es4J`zOCOSw8B_P(&Yjvh$jYU#qr-PU;M$(at=q)Uw=oT1 z{ZZa&XvmCjS~J0!h{$~WEBs!Ec%1lRH?{KjW%PD$@c(lNy>CJme9dZpT)z;ZG&(4X zq_%pgP(&-w^3_d$ru21$$}jQ!s%@Qb^rjUiQ}(P8HfNGRYAQ6Bm$+NmfC7x%w*Q--$wXl^KHN~o$4kRgI_ug{ENXxvbpR4#YTX+ zpp`hhN>(7kHldl~p$xKR(%8J6jhRRkLnzWV`4u2@;Rc79=SCCQK-sxno+EjsGpDWx z6TY!Kp&QX-&$(n5|J3b7786(bg!d^Tu*Z$CmDVD9B+`V>5o87Z-keJ?hHV@;oo*-{ zc!s_tW((o%vt@0RlsnFx%Xa8p9^yTmIk#`+n~!LF@aM8+>oUmG!-g)~3bLj_C20bee0-z-zJt0 zd)sEv;>B=Zhx=Lkoc$c_^TNK?M*leXwwtuUTb!9Dx}MqK7A15T2oKCg*RG!jFm&o# z9C~(%%Smhy13*>lMZy45Xroeq{UIgGgakp+ija$zO2otlTUPJ8PzB7-FSZqKtf&Uk zKuuLxQ&Lm|eV|79t7**bT2up(pyne+shW6E4U~eKSHqfaMKzEMYLTj&^; z`5^SA`vK|8Ss_{IOke(LANm61I_OLHV)}B{LFh~G{nD2UBND)p^gl)P<&==V94Gp6 z+~L!g3-_fj-J`}2L|={z=}Ygu=nGT}Dr4!(3g`)@EZ3n@pSTDza#J%z<|B^$CwaIY zWwMmY*BQQHiK?MN*L)aOUA@8ic@;{KQq5XKn7ooy{%`H_7hC~a28E-!eDL*Nt*PodVI^b;t^9kcY2)ZQQ1n1ul6QRa!~s4g}V zWpeos?}EC)iJg|5(6U8V+QCI$cm3(A;-fYE#nOPNCc5@T=ZqGjQm#{te?_BheXi`u z%VB$v0ktQznXbQF*OC9ta%P?V_MSbL_~nD5!6`tlfc$~OxEJNuvq*Sw6kD)<~@ zQM@z%n8A+_Yy7uhoPE6QVIGHK6cUsj-TJjkq59tpfltxuV8!O|TO zX$diqj8|D(R}=Xts0O+PDOxB!i;$}A&kOOi`p>u6%X6$;N0uH|1RW-90pJppra{MF zv9zpt^SbWBSK)0;?i5yVYx#LUK3iLIIA5fiO4|N;7V1o(tuG~G(l31$KD#dFYXH7mlO+~nkb#K%&YLiS1Cx6+EBo2UFe z*3AesQ_j6D={!1w?OkvA=}2O)DAd&yiXcg*uUjF5H!fEFluWH>4DTB6Rh5M6>XoY4 z)U)7ZZrq#}VWX(iK#bWZoe}IuXH0DBo$Yt)TTP{%%S||3KxEL}n%a!S>^!>3|@c|7K}A|HC+~N(u&MRn&V6 z@;?-wBMu%&G|`#YMl`+Ge5xe z1d=*?I~|b-Y`cs&$dEmBU@b9_P1wH_G$KxEKR5q>G#vE2_5SeQT>N!p=0{O}o}0gZ zlD>4^{A7&UAS(KFQq~{bTk2G5hPVlUyeOM^S3#aC6Dzcj#v>5Ei$(~AmQCyqB?9UE zKWS#M-T4OxX@>u#iDNwTMH8fgnJ7SJ>zn+=EEerLRmYQ>&E9XEeq*}{fvQPuIeCkc zot!9x0zykz`JK~`%ekpuGI?umH&Gse7^V(xZYAiv-N~JU^!TA+j7i1AQvM`l64nI@ zS2yM{4)a}Y`iJ`QPGZ%=)%x=S`$+qTimQ+_^nbXLhje0oI`Kld<6Qsi>!=y4)te|e zZhp{p6@R$(3qQ?Z)%W1FfAh<^e}43&r)9b@#@GPWC$?mr2T%<#cJH}*{1sc@%%xc{TJ;8sj2Zj;%7z9f! zOXW{R<9;kE?`&*yI=QjoQ*52-j691+&XCwDj5T8GYrW&s-tn|ME`fzY$<4j;$>cP+ zhHJS%%0O>IeQZ-EIml@|8|6nT`4VwjAW!&E#W?wSRK^7?Rx;kRMxl-i zdPAd|{H!zcAB-+Yahv_?4G@N5g;eS$0ynnVO%k2`X^aSVW&M#mvdKkGuD2p95G*U3 zA6J@{O?ESTHe0n8t`uwKN1JCZomvivE4Mn2E=~KXO6xnb*!8m)fGu?6G@h?5|EG`{ zVr#qp=+boJopkKEbm9%}3N;-YM`<;n z{^Cay(%!hZH;f=Ydr-iUOBY~^B;#|KJ+s&15iX0<1v4Eyf-cSyG7zyHv^RXo^-z3c z!Qdu2l$_jvQelQ&9Z9r?G0uJ|4|B6bON!-+yI3+D$gYCrDy`aG-S~ks^IcRrgd7G3 zhA4mH3vP^j1uUVHTTP8YnwiV>%hCo+Wbz=Kb_OEVnEQCNS!8fi={gT=%XnME-O)em zz2vsOqq7sAfwxO*^8+79`PXBKKJ*Xy-riX$A_C+T7my&Y2u#j*8rLK3$of|hgrGW3 zd=V$N9F)`d5MKykHnCQRcya}3v%>YS+mT7OIWvC1VUT4ll&|QzkKE)t4dvq$1Osy~oM4Lotm5Q~1|$rX$oOT+& zMZ;+vn+TencsT^hMnGYL0tlJ@Do~Dxeeuc3$;Dpb!*UPng*o5aQ$1|jo+)dB-`e+U zt6o*$qnT2croGoK^xwuUtUVLks@?(rdu&DlWoEndlC1EgdNFJ)vvyHgHbGn?ma0{$ zWXvx5J9g0byt+tu z#iXz1ZID>>({7%&8h?t21iLBm4lyYv4+`3hb|+0g>?3)TY9EC&SKF%~NrV zGxvlErYdf#KnFLuxuK6Urz$n<9Jr79$lzYg#@1#N&0vDo4DU!Jy-x1)8kCqlt=VUT zGkA>rDmv2vC#Ph$X5C8kQb-Th2JfM9viDfV4{dh+uLwuGiLG*KWEZNNF;o`cUaiLS zuKz9OxZRntQ3x!Tb=;1>^-(6dtD#pae||FQG=7r}Oc~wnYB&Z@VtIY?6=%kRxFu12oIb~*yoNM=M?j2y9nv%ssxo$9YyzZdu~?NZhew|1FFGe8 zN(GP6FQ~W5In`;57`*1E#ogp?r}66&a#roGS_&SnnE8S5@SRHglxwb(B~-NYX5I<( z4X$Kx2509_b93(^^aY+LLTm+0gGjk|kvNACz0hg=HoBCk0pxRjK$`!M1wX zh1Jfzi>jSDAF$^DFQ^mrHmFfeE2H9^LUD5nZ3B3RJcXKrS#0ermced*A~NlEr}0$g zo2hEAdIs;dM_ajCPDTFLUKu{;S}Nr;=sg>*>CC}qn}gQ%v2|JhYdh+-MZO`JnY#z- zOG5(LC)wl+4L$QGCQoo0?~~FvENA1rfI4gLi4#GY{yr-IBT zr;ob{8->a1Oxghs9(X_>-%qCuUb077-Wn2|PXvG_1AqJmN z-87hf=CjLNr*c@>12j4|Gica3E1f$ZHCkzVUP_mH=BGF>4Z1e(?CO0v8~j)=teAa~KSGdXcsc*xrWOA=<8s!hJyx8wQ!1V?X{GbKhsCbra z0@d;LwDwW=n@=5`FCTD;S6->}G`Ehh`h?ku&BxE$X&lYF&K&O3eFrv`xc&$%Z{|6< zq$wQ{YpUU-8&P7)K4Z&DnrieOv7>p9{DyozqH9wPK?p{GYm}K-VRJ^rn`+{ebu(oO zNymHLnrgaH*4>mz)IeGHrkd`74I(yO`%N@>#y?UQ{E2@i%&zroO4uoIqTEv4hoiGv z5vO9C>hq;s2B@xvw&CR#_XpRF z*&}8-&7ss!R}u3GP~-IalU^`8Q7$EEzf zXA?AnP%t+`7^}phUJlOd0w@v!XB1q81TCc3^~tB58H&$t5Hah~=hGHdhn`2^FQiNr zMA50Z{fzK^y_TRf#MkQ$zFr5uUJt%*nY^xEx1lZB#1iCu-EZ!jA=r&PnG+~yclUN? zDGwRUo~|<*jKSBTvFfIw^fZsfUekfEZp7wA`1)_M;t7ee!Pny#kLTsn`gp82+pi?>BQd9t)K z8+$=?%zHL?oiELJv-wjp`5~F)Ru0m*sP9(Y9crCNm8E5Bg~)GIkOH(eM#lUg#!}e% z>a5A+;hjiG2J3Vgjfi#9k+lrgsh3zMem~=n61co&!GH2;k$gGVOg`E9@aW7_Dc*up zu?8rvUxdhQG4<~_GsdevBk^#-pUQlzHh{;BO{!nC*Z0i?zn>ou)=S8jYcAoTBzV_6 zEFuTr;&^Zj4WjJ_Ll>6>$Mc|9^lI=+n$pMOje;3!7h&5Z5dM9zAF}y(s0v+g8{x8Y zZ(`#j`YgN~SmpE?c(x1(SoW!JOJ2YnUf<;U!#|6(BH?<&adF{7k$V&J`Ib&@EQ9=M zoD=M+(=z!uuf#vAj3itX3lwybp`a$1`kd}A7s{p{u3x83<>dZN*gU5$)-)0dS_cKC z>>gWIg25JLP*BSL(Ux^>8VLohgMw1_4O&%s)t)=98n*A6FsvAg6$@ZpXIhE{)1z zZ3{QCDj3bjM*c9;(18qez=ec~4*UxTpN`ke1@@`sEulmDU^8yLBb z&dk>(L-5CxGcqW{PA7Mpc_Wd{pJsOMeGqW%T)G+^C`WI!n&`fi3 z!(`aTNoBbI!9jw@!u?)y0Nr8e%Gx{hqBbi(oDzP(os2UAfi*^7rJknMYrMHdW{2i( z)?Uk>6;Z6u>mtg$KVaVP7v^oAa*HaP-+{puqZ#~@cBM~>PyZ6+93a_g+Q518rJe1H zbUmwyRBbizTMpfV^1(I=e#;B+gYpGQKC72|$_uO&x2K&APX4@9GAYoZZV~wWTedSYhO?OKu+!L+j_PIz%CB8{)a7t468aBuiDE(h5&Pb!Erb|KEVGAmnPT~H=?Uqr0YTxvNAZMbUJ zBP*puV}fu+>qa9yOMCHqIye@%lL`ff68{mu&x$~1{1iM(dl=S=4dMS_Iz-KxlVo_+ z!_L>0P&|DAlj~NkH7Ca^L`Xn0u;<7sdyb${St3Sw&UsZ!Q@U?8;~EpZ2K9BTHXelZ zFVq`~uP5UAJrXNe;<_jv+=5O}OCSsmzG`cDZBa=uO*PD!OYpQZQaiE3wmG>Q&HgF6 zvL7!ZbI>b$GtyguF`al>@&fSu%V>pkOP{7Y`oJK~Bk}L{x}Tp#sUd%#;RpEr58TfY zOgtZaT3>s(e<{lAYe5f#+1gpLRyX$!9z0tiqe2%b{WLe@PF;Fns3T#Gif!TA~G6a)!l3R8_7fipAQRWp7AWe!fl%7uIy-n)pC zkV9~DUfzJ)*h#76sZ({tg5HZk@6lYJm+L||_ayM!R)OD(u~FJ(?$9S`O;2S_b-DCj zaTD8uC)>6CE{5zN_L8=TtW-p9fb4Wl#MJe)!(zmr z#Ce;00nr(`?gw8pxY4Y}j3{%)3s{{7#~JFZb4CFj`vUA0Rc{9`z`f|=gphu1MC%M4 zbn;cHWR)d^W;YiTLbh}jQ?}K1ONW#&l!;Wa0h*DCAU0m=Ce{WwTXa>vdrq>Q&Wus8 zEfk?c>$or+LLFBF=$(o6{TZ|Hy|ekRa#LLEG`=7@abUSD%)j9!pANn$?UxQp z|63I%xN;SP$mCDWSAxNbrU;G78eYqIOsc$hE@lV=_W)o|e}7U#YAm!Z#BQ;d`7g+-uiu9h8EX1~Gf*dnJ2E zCKvhC_lii&6pxU?VD*mmh5WL z!yqlu`&3NBu?b-X4Rb^$cc{(SFoj7qXxbbCG>$$@dygGMd{AWBh9|v?4QTm4p|5tV zfIZ_L1`sS$U4dU!oy8~4-^W#dK2YeW7iH!OmlkynZ*+lg^rq~)tUu5o+cY*H!kq<9 z?j@Zf`Q91s(=Nd>8mrBE!hW-ktRX6k!djwjt!+kjNo@C^o(&C423lMROSYby1S1hn zfEk?SjjyWNs+HyhSV_DuxOm%+Kc>=KX&S+r9R=OuV5`BfuNq<`;ePI~1@$~}@30A6 zKIP0z)pASfmK%AFRsIOSmPVuw>$DKw63Oon8&tSxQeDtu3B~FB9a1yad&~0QlZMf1Qe~FBhFa?)pGj=NPd^oV0msR7 z-bH`zNHdOY^hBwt9mg7E7cPNlOYs$@ph%z&f{viC+7ad zJ(2QpDz^&bhpPE0dxWdf$fFVH^RwSWl@umcrJKeM{5zh}kJ!LOX*hy$uKz2EUtz3c z;Fj}!taBv4CXrHCip3N4OPP3S#_**>ONsD?XwhvN%gB7+S+dZs&Lp0y_gXWtE$u@b z-Q&0n#@ss=s(q*5sA{L*ccwEEydKVz-i$7Ou1AO^xihaTm2AiGVB%CNQmp~e0rD=3 zme`ukmw6|Q@cPfnyRn*N`Jk!2rla=3*{X#G;Q!4qJH|#Nwgrr>Hu-Wxc_!b}O_n;1 zE^yaC?Eq_~hRMV>r}Aa0G;vdv_j8nRv@pKhcpfqA1a1QQRg7!AtR+^`Yi%Qj7daRv zJCa6Og>kHpOL<-SGh`+P3$+N5QJT4D+7+$!E@tm6nAXYn)WV6ztHt7gHO7rWnV=9o z3x_HRr;1<~8T487ps0^}kMo1GdKvQA^CZ5%&FCg@zSOQa_sn~Rd zsH=AR^vvWwLd1W$kpMTEPqMLzMhj_0{b_IFzOsI61c>-9du9(rRWyw%5-&qYrD%H~U~tg!-=KzrUM9LnaacZZLt zfzYSy&LlR~dhze3S*`xp9cyHaoE}=n){S2ONbYFGjaV=sZe*SEs5x4aCpt4v0=?zK z)_5#GfaSO}yLsFb>`hSfE&~VT?XCu*_!$1gIFc!u?j%<`x!p!X(1$T0N8r%-<}rK) zFR?$-55YG!cD?S!!ak9j*uNg5m`$zb{IB4W@?gs^9ehL{z`6)ykg1I_%;N!NYANr@U@ISrcCv@p219s=5@KtYheX3jv-(GtZ^l8wTUno2Vm!rW{S2b!o@s;T$`^FIM89gm!Wq(4 z-Xq;q&N(i*@jNRx)?O}b%sbdTQ0F_92~Z!KjjrzZmK!IF;31X~5;UH(J%C6N)FhL9 z(#f3*{?}tjfeIKw1zyKrVGqc&5u}&o>Ut}=k{g)e>GNgv;>JHh09Y?>{KW$>yprd_ z^uq9F6YGOh`8?92Y8-_zh}_fSX-=aO8f%P|j1j2p{kBzAT$RwqESx zv1UH2itnc4-@|9yv`c*CL^I*XgWLHS&|oix6FICyy?-&3eQCon>HG=lskJHq3%*SUt7MXi6sz^-oLtQf;t zVF|wsRq9Cya$AIu><-8218UfM8`adD7mdQ<@SHH#Dx4B&Z%~ms_#j6FM1NeQ2Nty% zCpIfsZhS4PyL9YZQdxl!b{XqY6o$JCg@;bC9tyQO#OZ@TV0*>wRqPh7jw5le4D~PC zx2W)>e?&3T$Lc}Gcj!T)eG4liEqK^Co0VJ6j_%H#o7o3Z@2-D2-1A~L@w^f>??K&D zE)?5m-yYAtMI_t8zHRB)w*^2&`*xX-@nHK_5!SNg+O-J$RT!G~|C8~ri`VN;V7Cw2 z?BxyRDK3rmpxdv_U~LW3N$!P+Ik+;a?nhA_<<5+s0o3}$t6&>9<2bptl$&;plUpJF zKSVqyH;<nwF^KgG&FgHZm7*z+g6BU+HVhaceGbr$cQ4{|(1#ZKV3NDuoeirag! zOXppaY`YEdo;hQsm9tx1bKnSCFk* z#W^JL7noy+kcb0y{Um}s>f{~HL_%lO2e zAsoY*+RHJym(L7Yg67)qY1$r8Bb!P3fahB0ZL%t*n!neB^g;) z$prElTV5@FGKJjcDSRv}ltP(8E|V1gDlC*nnL>p16y6gSN~KI;H&b|fSSXz`h22fz zbzz}VDqqC|dj_@8M3%q+%5GXsykkE)H^q;4`oy(AI8&BQeaF0M(aVBpI3B$Cq(co- zAIt+hkAMt1Hpz;@uIqmDUq?F*nBN|Eh{yR{92yK$Bwahy0DI~bVV#I*p@VM@0)N_) zvWOU%Qsi83ifgR0sKzRbF0*A;SyW?{MK!j}DvN5Yvgj;ZW|c+6s8o9=+A^ywsSnlaBttGS_ZbRwM0OmsryKrHHfzy2E1h)i-g|{8)3l`G&GvrlCN>67BGDHRzy+%$*N|t_Gvwf3=-sS~T7X9# zQ?7NTC3ZLU**rOwK3kt`n{sA-RhwnshzK}uDh3Q~Av?DuV&~8-ZVblLmu)M=bK08x zU~n>xnSSi$5H1B23fj?(f;GV}I3x}x&$96>BY%KfC&>}On*A5M17Py)T1NqS1swGU z_=NlcA~yip|E~xQ|M8^Y3Un2s#W5cC-Y+CxX4{PAvA-M#_&Y8%4M#bQtHX3{52G{5 zy;CWHQC8^R}mbYK4P9~7JdE;>x7fJ?i; zfs9M6&V5vJGgp>m+V}-r2~QvS1=J_|IgOt+egPjjxiUy2Da|6k0Fh3~y!PuCpggGg zP9_DB<+(8}@S)ZAe8`s%tXhs&z&}fJI7IVbhJB7PE09;fo!R7xQ|}PhH_1?bUXm^I zfjt8H@9h!r^bvamWDeyKFrYnA;Ag}S7yAXE<6PO$vtYlyF7rwI16U(oR3_OooyCz5 zPW}L+I|*t3jlWalgF;NG6jCe59|+sdZ6lM;}5V6Mjt&XUkJq2Oyl~bJ*@Ym-Vl~ zuyJ)Z`KFWGxVJyR=0o}eEJV2bxzHcro5lVB_1GH}`vbfzTZ1F<2PoJZ9KJsQI&d(- z`U9A`evLcr|BydG!H;7r{FkxYGWJye7y1Jf`vF+Po2vwi1cj*Z24B>W^oSIV@_jJRHfny82)prhn<7L5H2K{*ozox$#SRy<~zLi{Eztq zFz0&t16+A{{s6x)Iv=Kt2LTtFB7cCJOpOlQ|KIroq&0Q#s6PPtll?E1uyw3wY6pj_ zTx9va$I1Lij;h`&7~Cc3l~KsG25_oq4df8;T`c@-yz*JFt79_{Moe+Wd0?ftLvNGp zM(zRkaDm&ySH>Fb;o!$yn*)OKJT9 z{wkY4{|Nj6jPd>_>ksgKZWo`JKfp4{*Hk z2e_O@K3;zSYa^uf`MCW7B#*-u)%pWS9*6nq5%~k$a?~F{^bqd)VEzD)OKEfve}Lou zYyJRrAFn?^hqES5{RkoY1^;z_fFD6;JNW}_k?f$@AK-TLM!_H8e?ztp#~)y(KHIN9 zKr(rLk)0!_L&)D4e}LqKuofJbob}t{adtQ}91W|;AHax6&x^bPjCa7~BlQQEW*xbo z54I4k$8e$6ApjFf*`rQ1X47Xz4gs}Bd-Xc{bm!5R3JwA03GXPB>6X_FzFTkz7;TKB za|5Kj>Tn2nRWmsZhk#*x_7^z>$ReQFA>af$E^-L4(h2kv$goELr49kcjwO$714%Dj zJ*rb9)i4~$BN1}}TS36?(UE(A5uCNV4;74yoCj7(_Rzo1BPP9Z4){Un9PqykuTbP1 zaGP-ss4~t0=b*ndEdHOlfFH^^;1ONYJ39xgk+}Sz&H)eUjmSBmvEUql>(=$f&H-Zz z&H?ywePh4Q0pB#6smM9tL{Xe0bPlMKc|XE+;~a2C@C6ADfS$0Ef50;7rjVH)v421^a`|cA$3Gy6qsyWE1I|N{9sH3Yb=Y%< z=i%TBiII(e+(IXJhA0MmmOxrx+ptfQsU)b@5$`X+R14qBM;2~fv$fdT$ z|G=*;@({2UhB0(;(Ka3e-8(!45=aoA3btr7fTRTv0eQ9r-vK(JAJ!oJzw^ zxq@rJMoGK{K;s;M@wyDWtiQ)0`~wyS7Zm&h8mxc7OWJ+7_=f%g@-#lQe*gyM3xijM zVcyHGU*sa7zzs+4A|Uz}+0$DW0i}m3*wbX5Pg;b#NB3k8u|d|;H>$%* zWRZM6x=#peS<%Ht-3%MFNX`P?hxL%Nz#`0@Hpy9_P1EPtr3iKdX944BEFU;~-|?r& zSzs}mg+-CG09nHDh&~)=0n@{sriaMac~RsnFuRj~z)^i_6NvYJNqn{cW_{|9pE#;d zEyT~+JI>lseJYxYk0-v`QGIGhd^OY_NA;;k^{GeossEMuYDe{{NA;;k^{F<#+EIOK z6kqM*)u&pf_^3Yh2;!?9)u-+oU+t(q70Ja>ed__RG)fe0oD$o zPqoa&QGIIes6JJCU)dcU)u&?cXl+RjE8f~sed>Qb-r7-p>QQ~_yiW1fj_OlCW_@bz zt$x}3)us8=VA2pwvYx3~d@h8QL(f~5Eqw_QAM?c z9+Q@nr?TRxN9*^N~4IR0u# z){T=!!yyF|jYn{o+|JUepUQY^?LdPsMSj9X!O+TygBB!BMRgbK<5z_5{uM<<{(}qp z?G;sQI=yyzVi^B0@Y2L9jCb-H1KZT&)s$u)i;UR}Q02i|9xS3l_7w)6%BSpN5oh6< z_BJ#A<$x^hE%$cFVFf=+<9kX*ujiWIC@tGcaINoVyruYFtFCPG2(LUZfL|?udpj8Y zQ+$u#xvI&2kWc4(3ATL%d%j935qB9dBFw8+q2mMjv=S~jpRXd``>|RIMHo#rZz!!T zTekPAykiU_3ahdL$=3T?m8)+#!>r0FfKC&$tI}y=!D#~PY^}>l8IOr=wi6C|s=N?? z^16Oe46gFlb_I)4t{nMgJ<@@!Mc@jaq`Jt(dvALL>Em5*N!~LX#Cx7R3G%!jR8RO( zobqKSLKvAT$=nXYQ7C?3Zbvt#aj~p332ja=kvkTsiDC>0g8wMSkNktvc_H7VNPGnI zOg+M1Fn7|VbiPUP4{e~i{It?k>#J$-F+UEE;OQpUTw+(O)q6RyoQS{4%_(QZi{4AA z{E0Z=W>fhq;{2VM@%taIsE1?RTzjd0loI}sP=YhNVaZLR(*hfkb)deWMo~umlc~Zn^u(SZMe};o>jRS_rulvO4H8`rTycVx1UbwUQ?927=L_QT;oYidEjq#Na56T+eK^Y8JBJRp9qQ$WN6 z;Ae2Hv0bB&{}KAO5ZdsU<4+H$6-$LJ76(8n6_!IJRkf+1N zpWo?-J2d|MJ3H`z_*230aX|bz-TG6fy)|ia1|IC73cg^DcyW9>d=CBoV$<~DzrPK0 z>xkZ(^GcjiHyv}()2+e3Vin!N?{N~1Q`igz)>6W&QQZ{2ivxHg;TQ>eZF0%2fV{ay z5il1D5*=A(NE=Ly3Z;{I%6?2z76q@VcKv#?kimasy!Q!%k5m7;`ozMFiT?VYGvn*v zs|kqb^dZ=W)8|AR_Vw+PaZZd~-_L|o@-J0n(Y>R+l7y9%pZH^D&+LvDB8wY_daWyp zGND+sUJcxy;=F1!Hppud@F>XZl!4@Q;;45E{Hr3p=KCIRf=ChlSM)_qciTj`Jyxu=?bc*^we474XiND&%X=soV(W zIWuPs1il(#@DurX$S(P?*5v~^QWUMrR;BAKUYEZn_Q8>_i?W|mszJp>rx)>7x~4$7(A%}SjO+wK7YtoFMck^>Bl~s z=+}f<%KDdt(XY==RuQ3(brES%Ic`KI`t{ipRC7gCL)x|dWg|o^5$rKYGF^220PXjP zTG^-lbuiDS=YzEWbccQY0owPYR`zLsLR52*_MbNgjTyfZ?2*u5#`oa6L<&mkz4i5p zW<@6sBb?%qLtx_15xQ8R6K!DPYV+K6O_1bJ-2p{ zralTrTt~zg^G4OYY~s0$*AcIg%X)dqUU7&COSexD;;Wd7IU{sG+{aV>LTW7@MDwiU z!l8M7ws@X5Xp`9h%=???!Q(F<&O9&FjY*J*<~jRt=hxRTVw{2do!sqtl+tsM0@Zm-yU#0@9i_5UmFxrQaBsOd**v4$V%t&+EI zwA2|s)AxqY@coSEn$Ga~vk4}57{P@Fp9a2llT!%sI-?Hi5#&M=!V*Oh$hSDTH`sVZ z5y-ECfvm4OoCxIdwc9QKU)x1jNKjB6QsK^ByxO^owGjKm?_#+e%WW4A%H#AS{s{qD zG>dheyZFixb+J+|&HiKrkb#Ld9mP>6oG5YBPl^2a7jd;gR7owI!cr4XRH4*uy>Uu3 z^(LD7m%#;yMv6eFxUHdiP`uai4J0pt>2EkkFOHXoZ1o}Is87a!f0B)(p2>Y^;;8S8 z;;4@iAUItKrhaKx-NY1Gf1R6n-_6$$HtWxmufy}bw+Wc80O}@Y`V#R4T()?nv?FGE zMHDmr5Em`_$fCz6O%p*{qSA@Mf0~FkWB})W_jw(v&P~VFd+W$7p$O^Wg#vbg=;-Hg zu=6nwq-ZXRkIu-V_`i#{lR zT&TJ1gC8dy5I=~y`+p67Tp$t5CyyWOssjB0`z`%gO-#K4{V0ht99aBVC+Nj)G-3BX z4*KyDVM(O_@}A2ipLJ$D$6ZQ9%aD+jmV{)5p7?V^LWXoAA!*Cwg1Hg>*e5>uLGfb{ zOya)y(JtEk@zW25Ncd341uw|+Px!2Ki@}xr1A`RLSjT&DTPDqdqcjWT z=ED@q`o@Q>n8~!z$7Wiv)z(8^)h2rR(}>Gp2sn&vvW2IVY=QWkzt&Nz1BoEw{0vDB z7}0(P%yy%$wSY(YJ&N)zOyNzFZ{ZvKAl}9|?fLY4a3#+l>#*Z{4?7&|*#=%_250D} zJxew0O8C>g#~bGrGu~aWKgHv1=lNqDuX6u&0&_UtYmgFz5WieM4?f2pG4?@L#E0&U(0@o zbgIF7FmZ=`sSm?r!i7YVI6j&bl6#l6v7&pIolM!`VW>^GBnh?0Jcvq?XeKyJxU5hnYXFnj9= z=cc|Tr1|KJJVt3gmP~z1H|}vp{+`Kg*mQ|ser$bgWfnE_5V4r!Qn~eHv6!hm(TSB= z-?d3T28j=y{89pdH-M(Di zk>P{F-eF-!h7SsNK=bu^M}`jyUkeL6GJH_@bXaIIe6;Ye7kJ7#froQM@F^F3%8wL2 zEYXp}hmV-ZzVNZ-d%-6x>7IubDSZLw1FZw)-f}jI^LiqF-eEJ_L zd`P@{hMKy&QD&I&rkKnybur3pW|*ukD`~1Lq0DB68D`76Hq~KK7G{PSXv^YF zbwtexGs9HavTjXv-6*q}VLl`dl{2TNdsAKaU=zPBM1BaBSCE$al2YFpL`9)oR}fk!33Ej$!T z@&ND{3_J!OEX4w)v6Vk=5Pv~I5^Iq!J&VDf?B-^2E*!}hSvA~{hw#Fa#5Qc9y} zh_=0b?vus&jQ*KVK>BMcbO#FcZsS>P)a+Ho~i!);eL^}BD>&WPlf9_pbqRMrz>6XWRZQuHTgenK)sTX5RyHS)U zauSYiqw2SG-eEtv?@PbYOKCbW?eAOP69ftBn2YUSa=zpWC--CBE{gLvy~>V1RPLda zw>p&P$^MUf(>e|kGVvIp4T;YrafPi4MSBB)_da=>ZecnmZ_|yIGn%|7HLO8-o4zI> z!>{$Tt}csg=BYgz{Z%64HqYC>Z#<^?e@8^!z&Dzo5=nKM-?b7r9Wp=FUh{ju)BN5% zjQL&8a+>*FVvpX!{4V5q-_d_pqyIFx9L+Bp|M$3jb{hXygo{T!{tG&d|8s{i{<&b1 z8UKIq116&|{-5$}^J;B2hKUMtX0v1MC$H8Ra}Oo!)&cTraWPj$uKnfJ+8lfy5y5{? zPlI(iHo3w+={fz2dV=FZX3VXGn+FLJgIh%#Z2~cNld^|B&H>!Hx1PE>0L?8Jyy>iI+l5E z)hcXlmBz6-x)!4#ow+pS)UG6rV>WMcoV#Q=&6-@w#8zyPkr4ksm%#vto-6CT{@=4k zwykX=$snCcE+`~aCi`{SUzAWe`~R``E?`nsXWlObEwtLY8%04R+KHVEB_wt$<8&!; zx}X|%NfopjwKc|&Z;W3PXAE*tOpL*0Ml@(NWI<9Af z%NHr*7Tt{~XC{9mTUL1(*I}{kDQ2@>&SAmOXQ+w;qOX>WnIkh>!u1a_SvMFHW@)na zGqL~oOcux6(7)nj-TD*=36sS@Bj2p@$;w~NbxjRx*sl3No6ZEUfF2x{o_c|SGJa`_ zuGf_PzmcBKVQmjZPXPm~q^B!>FBYF-i%qT(EgjgO zDSKS%?|pp65%%{?zx~|_uvYeczc}*m+Xg2xzAeTqcnOY0>s5nrWGZorjD}GSLVJ}{ zWxX*Pj>KqauN!bk5=*NR_0)pcjZ8J2QmjFU$6)XZeDiPoicf%b{f%F-jw!a1S+P>$ zQ?tLwF3I>KsrBsS2eWCijZfjz#a2;%+Na9uX;Wewmb(VOMmM%vlhQ$VhAt`!Gv3Km z1%J;H_k9y(Ce6kT-!|vmBY#u7a6qpo=z2Nowv_RC)=z?greBGzrExjAX%%lvANkuh z6sM{57N_G0x(k%VHk56x;0?vh`etA=uo}6VZC5cJaZSeqP-rN3_q~1}LkrI4I&7{T zHYangK*RQ+ha*>mzT#a%ow<*pj|@nwgEi(Lxq)exjv)c|Lul z$Z*Tg1{*SHi&%P#>vd^LVc1Y=_YpXRecTi&RO}4}kb7SA-BHQ-)A7d=Z=}4ZiCh}( zJ?2c@r__tx<{ z74J%V&&AjB)F>Pdyu8W1DWV^(qX_Y`PW`mf;HLdVZr5NZ-vB4f?IO@?i1~v+uV>+9 z$r&*la(0L5g4#GNTZ8nlIvdO-@r3$1S23A|u^nXGb?+|*_)*)jC9x~*Ond~d<_+>{ z#!tF1>MMZ7DgVTl#2zj^nu%}qPULw6k4$|Nq%^|2bU-q`CK>B#N$lm0H&gMab9)Eg zIEtIvVm*m9vrb^b-Pp7KY01PD1ap3k?@Xal)yy6ysi~<2l`6K$O(dNB8OZDe4ArC( zE1lev5JCzmGS=-kB=OShe1wLyPZt_Ps&Hj2UHo>9uoh9QClbXjER6eF%0D^fofdv~ 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

B~WZY76{tmN=f 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

XG0;Cgc^Ju{yM3MONu!!y*HCK^#-1w{M#a&$CB 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≶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 }OWmKKSMBAYc){4=$ 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