Blame src/lzo_dict.h

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