Blame src/lzo_dict.h

Packit Service 5195f2
/* lzo_dict.h -- dictionary definitions for the the LZO library
Packit Service 5195f2
Packit Service 5195f2
   This file is part of the LZO real-time data compression library.
Packit Service 5195f2
Packit Service 5195f2
   Copyright (C) 1996-2014 Markus Franz Xaver Johannes Oberhumer
Packit Service 5195f2
   All Rights Reserved.
Packit Service 5195f2
Packit Service 5195f2
   The LZO library is free software; you can redistribute it and/or
Packit Service 5195f2
   modify it under the terms of the GNU General Public License as
Packit Service 5195f2
   published by the Free Software Foundation; either version 2 of
Packit Service 5195f2
   the License, or (at your option) any later version.
Packit Service 5195f2
Packit Service 5195f2
   The LZO library is distributed in the hope that it will be useful,
Packit Service 5195f2
   but WITHOUT ANY WARRANTY; without even the implied warranty of
Packit Service 5195f2
   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
Packit Service 5195f2
   GNU General Public License for more details.
Packit Service 5195f2
Packit Service 5195f2
   You should have received a copy of the GNU General Public License
Packit Service 5195f2
   along with the LZO library; see the file COPYING.
Packit Service 5195f2
   If not, write to the Free Software Foundation, Inc.,
Packit Service 5195f2
   51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
Packit Service 5195f2
Packit Service 5195f2
   Markus F.X.J. Oberhumer
Packit Service 5195f2
   <markus@oberhumer.com>
Packit Service 5195f2
   http://www.oberhumer.com/opensource/lzo/
Packit Service 5195f2
 */
Packit Service 5195f2
Packit Service 5195f2
Packit Service 5195f2
/* WARNING: this file should *not* be used by applications. It is
Packit Service 5195f2
   part of the implementation of the library and is subject
Packit Service 5195f2
   to change.
Packit Service 5195f2
 */
Packit Service 5195f2
Packit Service 5195f2
Packit Service 5195f2
#ifndef __LZO_DICT_H
Packit Service 5195f2
#define __LZO_DICT_H 1
Packit Service 5195f2
Packit Service 5195f2
#ifdef __cplusplus
Packit Service 5195f2
extern "C" {
Packit Service 5195f2
#endif
Packit Service 5195f2
Packit Service 5195f2
Packit Service 5195f2
Packit Service 5195f2
/***********************************************************************
Packit Service 5195f2
// dictionary size
Packit Service 5195f2
************************************************************************/
Packit Service 5195f2
Packit Service 5195f2
/* dictionary needed for compression */
Packit Service 5195f2
#if !defined(D_BITS) && defined(DBITS)
Packit Service 5195f2
#  define D_BITS        DBITS
Packit Service 5195f2
#endif
Packit Service 5195f2
#if !defined(D_BITS)
Packit Service 5195f2
#  error "D_BITS is not defined"
Packit Service 5195f2
#endif
Packit Service 5195f2
#if (D_BITS < 16)
Packit Service 5195f2
#  define D_SIZE        LZO_SIZE(D_BITS)
Packit Service 5195f2
#  define D_MASK        LZO_MASK(D_BITS)
Packit Service 5195f2
#else
Packit Service 5195f2
#  define D_SIZE        LZO_USIZE(D_BITS)
Packit Service 5195f2
#  define D_MASK        LZO_UMASK(D_BITS)
Packit Service 5195f2
#endif
Packit Service 5195f2
#define D_HIGH          ((D_MASK >> 1) + 1)
Packit Service 5195f2
Packit Service 5195f2
Packit Service 5195f2
/* dictionary depth */
Packit Service 5195f2
#if !defined(DD_BITS)
Packit Service 5195f2
#  define DD_BITS       0
Packit Service 5195f2
#endif
Packit Service 5195f2
#define DD_SIZE         LZO_SIZE(DD_BITS)
Packit Service 5195f2
#define DD_MASK         LZO_MASK(DD_BITS)
Packit Service 5195f2
Packit Service 5195f2
/* dictionary length */
Packit Service 5195f2
#if !defined(DL_BITS)
Packit Service 5195f2
#  define DL_BITS       (D_BITS - DD_BITS)
Packit Service 5195f2
#endif
Packit Service 5195f2
#if (DL_BITS < 16)
Packit Service 5195f2
#  define DL_SIZE       LZO_SIZE(DL_BITS)
Packit Service 5195f2
#  define DL_MASK       LZO_MASK(DL_BITS)
Packit Service 5195f2
#else
Packit Service 5195f2
#  define DL_SIZE       LZO_USIZE(DL_BITS)
Packit Service 5195f2
#  define DL_MASK       LZO_UMASK(DL_BITS)
Packit Service 5195f2
#endif
Packit Service 5195f2
Packit Service 5195f2
Packit Service 5195f2
#if (D_BITS != DL_BITS + DD_BITS)
Packit Service 5195f2
#  error "D_BITS does not match"
Packit Service 5195f2
#endif
Packit Service 5195f2
#if (D_BITS < 6 || D_BITS > 18)
Packit Service 5195f2
#  error "invalid D_BITS"
Packit Service 5195f2
#endif
Packit Service 5195f2
#if (DL_BITS < 6 || DL_BITS > 20)
Packit Service 5195f2
#  error "invalid DL_BITS"
Packit Service 5195f2
#endif
Packit Service 5195f2
#if (DD_BITS < 0 || DD_BITS > 6)
Packit Service 5195f2
#  error "invalid DD_BITS"
Packit Service 5195f2
#endif
Packit Service 5195f2
Packit Service 5195f2
Packit Service 5195f2
#if !defined(DL_MIN_LEN)
Packit Service 5195f2
#  define DL_MIN_LEN    3
Packit Service 5195f2
#endif
Packit Service 5195f2
#if !defined(DL_SHIFT)
Packit Service 5195f2
#  define DL_SHIFT      ((DL_BITS + (DL_MIN_LEN - 1)) / DL_MIN_LEN)
Packit Service 5195f2
#endif
Packit Service 5195f2
Packit Service 5195f2
Packit Service 5195f2
Packit Service 5195f2
/***********************************************************************
Packit Service 5195f2
// dictionary access
Packit Service 5195f2
************************************************************************/
Packit Service 5195f2
Packit Service 5195f2
#define LZO_HASH_GZIP                   1
Packit Service 5195f2
#define LZO_HASH_GZIP_INCREMENTAL       2
Packit Service 5195f2
#define LZO_HASH_LZO_INCREMENTAL_A      3
Packit Service 5195f2
#define LZO_HASH_LZO_INCREMENTAL_B      4
Packit Service 5195f2
Packit Service 5195f2
#if !defined(LZO_HASH)
Packit Service 5195f2
#  error "choose a hashing strategy"
Packit Service 5195f2
#endif
Packit Service 5195f2
Packit Service 5195f2
#undef DM
Packit Service 5195f2
#undef DX
Packit Service 5195f2
Packit Service 5195f2
#if (DL_MIN_LEN == 3)
Packit Service 5195f2
#  define _DV2_A(p,shift1,shift2) \
Packit Service 5195f2
        (((( (lzo_xint)((p)[0]) << shift1) ^ (p)[1]) << shift2) ^ (p)[2])
Packit Service 5195f2
#  define _DV2_B(p,shift1,shift2) \
Packit Service 5195f2
        (((( (lzo_xint)((p)[2]) << shift1) ^ (p)[1]) << shift2) ^ (p)[0])
Packit Service 5195f2
#  define _DV3_B(p,shift1,shift2,shift3) \
Packit Service 5195f2
        ((_DV2_B((p)+1,shift1,shift2) << (shift3)) ^ (p)[0])
Packit Service 5195f2
#elif (DL_MIN_LEN == 2)
Packit Service 5195f2
#  define _DV2_A(p,shift1,shift2) \
Packit Service 5195f2
        (( (lzo_xint)(p[0]) << shift1) ^ p[1])
Packit Service 5195f2
#  define _DV2_B(p,shift1,shift2) \
Packit Service 5195f2
        (( (lzo_xint)(p[1]) << shift1) ^ p[2])
Packit Service 5195f2
#else
Packit Service 5195f2
#  error "invalid DL_MIN_LEN"
Packit Service 5195f2
#endif
Packit Service 5195f2
#define _DV_A(p,shift)      _DV2_A(p,shift,shift)
Packit Service 5195f2
#define _DV_B(p,shift)      _DV2_B(p,shift,shift)
Packit Service 5195f2
#define DA2(p,s1,s2) \
Packit Service 5195f2
        (((((lzo_xint)((p)[2]) << (s2)) + (p)[1]) << (s1)) + (p)[0])
Packit Service 5195f2
#define DS2(p,s1,s2) \
Packit Service 5195f2
        (((((lzo_xint)((p)[2]) << (s2)) - (p)[1]) << (s1)) - (p)[0])
Packit Service 5195f2
#define DX2(p,s1,s2) \
Packit Service 5195f2
        (((((lzo_xint)((p)[2]) << (s2)) ^ (p)[1]) << (s1)) ^ (p)[0])
Packit Service 5195f2
#define DA3(p,s1,s2,s3) ((DA2((p)+1,s2,s3) << (s1)) + (p)[0])
Packit Service 5195f2
#define DS3(p,s1,s2,s3) ((DS2((p)+1,s2,s3) << (s1)) - (p)[0])
Packit Service 5195f2
#define DX3(p,s1,s2,s3) ((DX2((p)+1,s2,s3) << (s1)) ^ (p)[0])
Packit Service 5195f2
#define DMS(v,s)        ((lzo_uint) (((v) & (D_MASK >> (s))) << (s)))
Packit Service 5195f2
#define DM(v)           DMS(v,0)
Packit Service 5195f2
Packit Service 5195f2
Packit Service 5195f2
#if (LZO_HASH == LZO_HASH_GZIP)
Packit Service 5195f2
   /* hash function like in gzip/zlib (deflate) */
Packit Service 5195f2
#  define _DINDEX(dv,p)     (_DV_A((p),DL_SHIFT))
Packit Service 5195f2
Packit Service 5195f2
#elif (LZO_HASH == LZO_HASH_GZIP_INCREMENTAL)
Packit Service 5195f2
   /* incremental hash like in gzip/zlib (deflate) */
Packit Service 5195f2
#  define __LZO_HASH_INCREMENTAL 1
Packit Service 5195f2
#  define DVAL_FIRST(dv,p)  dv = _DV_A((p),DL_SHIFT)
Packit Service 5195f2
#  define DVAL_NEXT(dv,p)   dv = (((dv) << DL_SHIFT) ^ p[2])
Packit Service 5195f2
#  define _DINDEX(dv,p)     (dv)
Packit Service 5195f2
#  define DVAL_LOOKAHEAD    DL_MIN_LEN
Packit Service 5195f2
Packit Service 5195f2
#elif (LZO_HASH == LZO_HASH_LZO_INCREMENTAL_A)
Packit Service 5195f2
   /* incremental LZO hash version A */
Packit Service 5195f2
#  define __LZO_HASH_INCREMENTAL 1
Packit Service 5195f2
#  define DVAL_FIRST(dv,p)  dv = _DV_A((p),5)
Packit Service 5195f2
#  define DVAL_NEXT(dv,p) \
Packit Service 5195f2
                dv ^= (lzo_xint)(p[-1]) << (2*5); dv = (((dv) << 5) ^ p[2])
Packit Service 5195f2
#  define _DINDEX(dv,p)     ((DMUL(0x9f5f,dv)) >> 5)
Packit Service 5195f2
#  define DVAL_LOOKAHEAD    DL_MIN_LEN
Packit Service 5195f2
Packit Service 5195f2
#elif (LZO_HASH == LZO_HASH_LZO_INCREMENTAL_B)
Packit Service 5195f2
   /* incremental LZO hash version B */
Packit Service 5195f2
#  define __LZO_HASH_INCREMENTAL 1
Packit Service 5195f2
#  define DVAL_FIRST(dv,p)  dv = _DV_B((p),5)
Packit Service 5195f2
#  define DVAL_NEXT(dv,p) \
Packit Service 5195f2
                dv ^= p[-1]; dv = (((dv) >> 5) ^ ((lzo_xint)(p[2]) << (2*5)))
Packit Service 5195f2
#  define _DINDEX(dv,p)     ((DMUL(0x9f5f,dv)) >> 5)
Packit Service 5195f2
#  define DVAL_LOOKAHEAD    DL_MIN_LEN
Packit Service 5195f2
Packit Service 5195f2
#else
Packit Service 5195f2
#  error "choose a hashing strategy"
Packit Service 5195f2
#endif
Packit Service 5195f2
Packit Service 5195f2
Packit Service 5195f2
#ifndef DINDEX
Packit Service 5195f2
#define DINDEX(dv,p)        ((lzo_uint)((_DINDEX(dv,p)) & DL_MASK) << DD_BITS)
Packit Service 5195f2
#endif
Packit Service 5195f2
#if !defined(DINDEX1) && defined(D_INDEX1)
Packit Service 5195f2
#define DINDEX1             D_INDEX1
Packit Service 5195f2
#endif
Packit Service 5195f2
#if !defined(DINDEX2) && defined(D_INDEX2)
Packit Service 5195f2
#define DINDEX2             D_INDEX2
Packit Service 5195f2
#endif
Packit Service 5195f2
Packit Service 5195f2
Packit Service 5195f2
Packit Service 5195f2
#if !defined(__LZO_HASH_INCREMENTAL)
Packit Service 5195f2
#  define DVAL_FIRST(dv,p)  ((void) 0)
Packit Service 5195f2
#  define DVAL_NEXT(dv,p)   ((void) 0)
Packit Service 5195f2
#  define DVAL_LOOKAHEAD    0
Packit Service 5195f2
#endif
Packit Service 5195f2
Packit Service 5195f2
Packit Service 5195f2
#if !defined(DVAL_ASSERT)
Packit Service 5195f2
#if defined(__LZO_HASH_INCREMENTAL) && !defined(NDEBUG)
Packit Service 5195f2
#if (LZO_CC_CLANG || (LZO_CC_GNUC >= 0x020700ul) || LZO_CC_LLVM)
Packit Service 5195f2
static void __attribute__((__unused__))
Packit Service 5195f2
#else
Packit Service 5195f2
static void
Packit Service 5195f2
#endif
Packit Service 5195f2
DVAL_ASSERT(lzo_xint dv, const lzo_bytep p)
Packit Service 5195f2
{
Packit Service 5195f2
    lzo_xint df;
Packit Service 5195f2
    DVAL_FIRST(df,(p));
Packit Service 5195f2
    assert(DINDEX(dv,p) == DINDEX(df,p));
Packit Service 5195f2
}
Packit Service 5195f2
#else
Packit Service 5195f2
#  define DVAL_ASSERT(dv,p) ((void) 0)
Packit Service 5195f2
#endif
Packit Service 5195f2
#endif
Packit Service 5195f2
Packit Service 5195f2
Packit Service 5195f2
Packit Service 5195f2
/***********************************************************************
Packit Service 5195f2
// dictionary updating
Packit Service 5195f2
************************************************************************/
Packit Service 5195f2
Packit Service 5195f2
#if (LZO_DICT_USE_PTR)
Packit Service 5195f2
#  define DENTRY(p,in)                          (p)
Packit Service 5195f2
#  define GINDEX(m_pos,m_off,dict,dindex,in)    m_pos = dict[dindex]
Packit Service 5195f2
#else
Packit Service 5195f2
#  define DENTRY(p,in)                          ((lzo_dict_t) pd(p, in))
Packit Service 5195f2
#  define GINDEX(m_pos,m_off,dict,dindex,in)    m_off = dict[dindex]
Packit Service 5195f2
#endif
Packit Service 5195f2
Packit Service 5195f2
Packit Service 5195f2
#if (DD_BITS == 0)
Packit Service 5195f2
Packit Service 5195f2
#  define UPDATE_D(dict,drun,dv,p,in)       dict[ DINDEX(dv,p) ] = DENTRY(p,in)
Packit Service 5195f2
#  define UPDATE_I(dict,drun,index,p,in)    dict[index] = DENTRY(p,in)
Packit Service 5195f2
#  define UPDATE_P(ptr,drun,p,in)           (ptr)[0] = DENTRY(p,in)
Packit Service 5195f2
Packit Service 5195f2
#else
Packit Service 5195f2
Packit Service 5195f2
#  define UPDATE_D(dict,drun,dv,p,in)   \
Packit Service 5195f2
        dict[ DINDEX(dv,p) + drun++ ] = DENTRY(p,in); drun &= DD_MASK
Packit Service 5195f2
#  define UPDATE_I(dict,drun,index,p,in)    \
Packit Service 5195f2
        dict[ (index) + drun++ ] = DENTRY(p,in); drun &= DD_MASK
Packit Service 5195f2
#  define UPDATE_P(ptr,drun,p,in)   \
Packit Service 5195f2
        (ptr) [ drun++ ] = DENTRY(p,in); drun &= DD_MASK
Packit Service 5195f2
Packit Service 5195f2
#endif
Packit Service 5195f2
Packit Service 5195f2
Packit Service 5195f2
/***********************************************************************
Packit Service 5195f2
// test for a match
Packit Service 5195f2
************************************************************************/
Packit Service 5195f2
Packit Service 5195f2
#if (LZO_DICT_USE_PTR)
Packit Service 5195f2
Packit Service 5195f2
/* m_pos is either NULL or a valid pointer */
Packit Service 5195f2
#define LZO_CHECK_MPOS_DET(m_pos,m_off,in,ip,max_offset) \
Packit Service 5195f2
        (m_pos == NULL || (m_off = pd(ip, m_pos)) > max_offset)
Packit Service 5195f2
Packit Service 5195f2
/* m_pos may point anywhere... */
Packit Service 5195f2
#define LZO_CHECK_MPOS_NON_DET(m_pos,m_off,in,ip,max_offset) \
Packit Service 5195f2
    (BOUNDS_CHECKING_OFF_IN_EXPR(( \
Packit Service 5195f2
        m_pos = ip - (lzo_uint) PTR_DIFF(ip,m_pos), \
Packit Service 5195f2
        PTR_LT(m_pos,in) || \
Packit Service 5195f2
        (m_off = (lzo_uint) PTR_DIFF(ip,m_pos)) == 0 || \
Packit Service 5195f2
         m_off > max_offset )))
Packit Service 5195f2
Packit Service 5195f2
#else
Packit Service 5195f2
Packit Service 5195f2
#define LZO_CHECK_MPOS_DET(m_pos,m_off,in,ip,max_offset) \
Packit Service 5195f2
        (m_off == 0 || \
Packit Service 5195f2
         ((m_off = pd(ip, in) - m_off) > max_offset) || \
Packit Service 5195f2
         (m_pos = (ip) - (m_off), 0) )
Packit Service 5195f2
Packit Service 5195f2
#define LZO_CHECK_MPOS_NON_DET(m_pos,m_off,in,ip,max_offset) \
Packit Service 5195f2
        (pd(ip, in) <= m_off || \
Packit Service 5195f2
         ((m_off = pd(ip, in) - m_off) > max_offset) || \
Packit Service 5195f2
         (m_pos = (ip) - (m_off), 0) )
Packit Service 5195f2
Packit Service 5195f2
#endif
Packit Service 5195f2
Packit Service 5195f2
Packit Service 5195f2
#if (LZO_DETERMINISTIC)
Packit Service 5195f2
#  define LZO_CHECK_MPOS    LZO_CHECK_MPOS_DET
Packit Service 5195f2
#else
Packit Service 5195f2
#  define LZO_CHECK_MPOS    LZO_CHECK_MPOS_NON_DET
Packit Service 5195f2
#endif
Packit Service 5195f2
Packit Service 5195f2
Packit Service 5195f2
Packit Service 5195f2
#ifdef __cplusplus
Packit Service 5195f2
} /* extern "C" */
Packit Service 5195f2
#endif
Packit Service 5195f2
Packit Service 5195f2
#endif /* already included */
Packit Service 5195f2
Packit Service 5195f2
/*
Packit Service 5195f2
vi:ts=4:et
Packit Service 5195f2
*/
Packit Service 5195f2