/*-1* SPDX-License-Identifier: BSD-2-Clause2*3* Copyright (c) 2000-2008 Marc Alexander Lehmann <[email protected]>4*5* Redistribution and use in source and binary forms, with or without modifica-6* tion, are permitted provided that the following conditions are met:7*8* 1. Redistributions of source code must retain the above copyright notice,9* this list of conditions and the following disclaimer.10*11* 2. Redistributions in binary form must reproduce the above copyright12* notice, this list of conditions and the following disclaimer in the13* documentation and/or other materials provided with the distribution.14*15* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED16* WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MER-17* CHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO18* EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPE-19* CIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,20* PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;21* OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,22* WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTH-23* ERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED24* OF THE POSSIBILITY OF SUCH DAMAGE.25*26* Alternatively, the contents of this file may be used under the terms of27* the GNU General Public License ("GPL") version 2 or any later version,28* in which case the provisions of the GPL are applicable instead of29* the above. If you wish to allow the use of your version of this file30* only under the terms of the GPL and not to allow others to use your31* version of this file under the BSD license, indicate your decision32* by deleting the provisions above and replace them with the notice33* and other provisions required by the GPL. If you do not delete the34* provisions above, a recipient may use your version of this file under35* either the BSD or the GPL.36*/3738#ifndef LZF_H39#define LZF_H4041/***********************************************************************42**43** lzf -- an extremely fast/free compression/decompression-method44** http://liblzf.plan9.de/45**46** This algorithm is believed to be patent-free.47**48***********************************************************************/4950#define LZF_VERSION 0x0105 /* 1.5, API version */5152/*53* Compress in_len bytes stored at the memory block starting at54* in_data and write the result to out_data, up to a maximum length55* of out_len bytes.56*57* If the output buffer is not large enough or any error occurs return 0,58* otherwise return the number of bytes used, which might be considerably59* more than in_len (but less than 104% of the original size), so it60* makes sense to always use out_len == in_len - 1), to ensure _some_61* compression, and store the data uncompressed otherwise (with a flag, of62* course.63*64* lzf_compress might use different algorithms on different systems and65* even different runs, thus might result in different compressed strings66* depending on the phase of the moon or similar factors. However, all67* these strings are architecture-independent and will result in the68* original data when decompressed using lzf_decompress.69*70* The buffers must not be overlapping.71*72* If the option LZF_STATE_ARG is enabled, an extra argument must be73* supplied which is not reflected in this header file. Refer to lzfP.h74* and lzf_c.c.75*76*/77unsigned int78lzf_compress (const void *const in_data, unsigned int in_len,79void *out_data, unsigned int out_len);8081/*82* Decompress data compressed with some version of the lzf_compress83* function and stored at location in_data and length in_len. The result84* will be stored at out_data up to a maximum of out_len characters.85*86* If the output buffer is not large enough to hold the decompressed87* data, a 0 is returned and errno is set to E2BIG. Otherwise the number88* of decompressed bytes (i.e. the original length of the data) is89* returned.90*91* If an error in the compressed data is detected, a zero is returned and92* errno is set to EINVAL.93*94* This function is very fast, about as fast as a copying loop.95*/96unsigned int97lzf_decompress (const void *const in_data, unsigned int in_len,98void *out_data, unsigned int out_len);99100/*101* Size of hashtable is (1 << HLOG) * sizeof (char *)102* decompression is independent of the hash table size103* the difference between 15 and 14 is very small104* for small blocks (and 14 is usually a bit faster).105* For a low-memory/faster configuration, use HLOG == 13;106* For best compression, use 15 or 16 (or more, up to 23).107*/108#ifndef HLOG109# define HLOG 16110#endif111112/*113* Sacrifice very little compression quality in favour of compression speed.114* This gives almost the same compression as the default code, and is115* (very roughly) 15% faster. This is the preferred mode of operation.116*/117#ifndef VERY_FAST118# define VERY_FAST 1119#endif120121/*122* Sacrifice some more compression quality in favour of compression speed.123* (roughly 1-2% worse compression for large blocks and124* 9-10% for small, redundant, blocks and >>20% better speed in both cases)125* In short: when in need for speed, enable this for binary data,126* possibly disable this for text data.127*/128#ifndef ULTRA_FAST129# define ULTRA_FAST 0130#endif131132/*133* Unconditionally aligning does not cost very much, so do it if unsure134*/135#ifndef STRICT_ALIGN136# if !(defined(__i386) || defined (__amd64))137# define STRICT_ALIGN 1138# else139# define STRICT_ALIGN 0140# endif141#endif142143/*144* You may choose to pre-set the hash table (might be faster on some145* modern cpus and large (>>64k) blocks, and also makes compression146* deterministic/repeatable when the configuration otherwise is the same).147*/148#ifndef INIT_HTAB149# define INIT_HTAB 1150#endif151152/*153* Avoid assigning values to errno variable? for some embedding purposes154* (linux kernel for example), this is necessary. NOTE: this breaks155* the documentation in lzf.h.156*/157#ifndef AVOID_ERRNO158# define AVOID_ERRNO 0159#endif160161/*162* Whether to pass the LZF_STATE variable as argument, or allocate it163* on the stack. For small-stack environments, define this to 1.164* NOTE: this breaks the prototype in lzf.h.165*/166#ifndef LZF_STATE_ARG167# define LZF_STATE_ARG 0168#endif169170/*171* Whether to add extra checks for input validity in lzf_decompress172* and return EINVAL if the input stream has been corrupted. This173* only shields against overflowing the input buffer and will not174* detect most corrupted streams.175* This check is not normally noticeable on modern hardware176* (<1% slowdown), but might slow down older cpus considerably.177*/178#ifndef CHECK_INPUT179# define CHECK_INPUT 1180#endif181182/*****************************************************************************/183/* nothing should be changed below */184185typedef unsigned char u8;186187typedef const u8 *LZF_STATE[1 << (HLOG)];188189#if !STRICT_ALIGN190/* for unaligned accesses we need a 16 bit datatype. */191# include <limits.h>192# if USHRT_MAX == 65535193typedef unsigned short u16;194# elif UINT_MAX == 65535195typedef unsigned int u16;196# else197# undef STRICT_ALIGN198# define STRICT_ALIGN 1199# endif200#endif201202#if ULTRA_FAST203# if defined(VERY_FAST)204# undef VERY_FAST205# endif206#endif207208#if INIT_HTAB209# ifdef __cplusplus210# include <cstring>211# else212# include <string.h>213# endif214#endif215216#endif217218219