1 /* lzo_dict.h -- dictionary definitions for the the LZO library 2 3 This file is part of the LZO real-time data compression library. 4 5 Copyright (C) 1996-2014 Markus Franz Xaver Johannes Oberhumer 6 All Rights Reserved. 7 8 The LZO library is free software; you can redistribute it and/or 9 modify it under the terms of the GNU General Public License as 10 published by the Free Software Foundation; either version 2 of 11 the License, or (at your option) any later version. 12 13 The LZO library is distributed in the hope that it will be useful, 14 but WITHOUT ANY WARRANTY; without even the implied warranty of 15 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 16 GNU General Public License for more details. 17 18 You should have received a copy of the GNU General Public License 19 along with the LZO library; see the file COPYING. 20 If not, write to the Free Software Foundation, Inc., 21 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. 22 23 Markus F.X.J. Oberhumer 24 <markus (at) oberhumer.com> 25 http://www.oberhumer.com/opensource/lzo/ 26 */ 27 28 29 /* WARNING: this file should *not* be used by applications. It is 30 part of the implementation of the library and is subject 31 to change. 32 */ 33 34 35 #ifndef __LZO_DICT_H 36 #define __LZO_DICT_H 1 37 38 #ifdef __cplusplus 39 extern "C" { 40 #endif 41 42 43 44 /*********************************************************************** 45 // dictionary size 46 ************************************************************************/ 47 48 /* dictionary needed for compression */ 49 #if !defined(D_BITS) && defined(DBITS) 50 # define D_BITS DBITS 51 #endif 52 #if !defined(D_BITS) 53 # error "D_BITS is not defined" 54 #endif 55 #if (D_BITS < 16) 56 # define D_SIZE LZO_SIZE(D_BITS) 57 # define D_MASK LZO_MASK(D_BITS) 58 #else 59 # define D_SIZE LZO_USIZE(D_BITS) 60 # define D_MASK LZO_UMASK(D_BITS) 61 #endif 62 #define D_HIGH ((D_MASK >> 1) + 1) 63 64 65 /* dictionary depth */ 66 #if !defined(DD_BITS) 67 # define DD_BITS 0 68 #endif 69 #define DD_SIZE LZO_SIZE(DD_BITS) 70 #define DD_MASK LZO_MASK(DD_BITS) 71 72 /* dictionary length */ 73 #if !defined(DL_BITS) 74 # define DL_BITS (D_BITS - DD_BITS) 75 #endif 76 #if (DL_BITS < 16) 77 # define DL_SIZE LZO_SIZE(DL_BITS) 78 # define DL_MASK LZO_MASK(DL_BITS) 79 #else 80 # define DL_SIZE LZO_USIZE(DL_BITS) 81 # define DL_MASK LZO_UMASK(DL_BITS) 82 #endif 83 84 85 #if (D_BITS != DL_BITS + DD_BITS) 86 # error "D_BITS does not match" 87 #endif 88 #if (D_BITS < 6 || D_BITS > 18) 89 # error "invalid D_BITS" 90 #endif 91 #if (DL_BITS < 6 || DL_BITS > 20) 92 # error "invalid DL_BITS" 93 #endif 94 #if (DD_BITS < 0 || DD_BITS > 6) 95 # error "invalid DD_BITS" 96 #endif 97 98 99 #if !defined(DL_MIN_LEN) 100 # define DL_MIN_LEN 3 101 #endif 102 #if !defined(DL_SHIFT) 103 # define DL_SHIFT ((DL_BITS + (DL_MIN_LEN - 1)) / DL_MIN_LEN) 104 #endif 105 106 107 108 /*********************************************************************** 109 // dictionary access 110 ************************************************************************/ 111 112 #define LZO_HASH_GZIP 1 113 #define LZO_HASH_GZIP_INCREMENTAL 2 114 #define LZO_HASH_LZO_INCREMENTAL_A 3 115 #define LZO_HASH_LZO_INCREMENTAL_B 4 116 117 #if !defined(LZO_HASH) 118 # error "choose a hashing strategy" 119 #endif 120 121 #undef DM 122 #undef DX 123 124 #if (DL_MIN_LEN == 3) 125 # define _DV2_A(p,shift1,shift2) \ 126 (((( (lzo_xint)((p)[0]) << shift1) ^ (p)[1]) << shift2) ^ (p)[2]) 127 # define _DV2_B(p,shift1,shift2) \ 128 (((( (lzo_xint)((p)[2]) << shift1) ^ (p)[1]) << shift2) ^ (p)[0]) 129 # define _DV3_B(p,shift1,shift2,shift3) \ 130 ((_DV2_B((p)+1,shift1,shift2) << (shift3)) ^ (p)[0]) 131 #elif (DL_MIN_LEN == 2) 132 # define _DV2_A(p,shift1,shift2) \ 133 (( (lzo_xint)(p[0]) << shift1) ^ p[1]) 134 # define _DV2_B(p,shift1,shift2) \ 135 (( (lzo_xint)(p[1]) << shift1) ^ p[2]) 136 #else 137 # error "invalid DL_MIN_LEN" 138 #endif 139 #define _DV_A(p,shift) _DV2_A(p,shift,shift) 140 #define _DV_B(p,shift) _DV2_B(p,shift,shift) 141 #define DA2(p,s1,s2) \ 142 (((((lzo_xint)((p)[2]) << (s2)) + (p)[1]) << (s1)) + (p)[0]) 143 #define DS2(p,s1,s2) \ 144 (((((lzo_xint)((p)[2]) << (s2)) - (p)[1]) << (s1)) - (p)[0]) 145 #define DX2(p,s1,s2) \ 146 (((((lzo_xint)((p)[2]) << (s2)) ^ (p)[1]) << (s1)) ^ (p)[0]) 147 #define DA3(p,s1,s2,s3) ((DA2((p)+1,s2,s3) << (s1)) + (p)[0]) 148 #define DS3(p,s1,s2,s3) ((DS2((p)+1,s2,s3) << (s1)) - (p)[0]) 149 #define DX3(p,s1,s2,s3) ((DX2((p)+1,s2,s3) << (s1)) ^ (p)[0]) 150 #define DMS(v,s) ((lzo_uint) (((v) & (D_MASK >> (s))) << (s))) 151 #define DM(v) DMS(v,0) 152 153 154 #if (LZO_HASH == LZO_HASH_GZIP) 155 /* hash function like in gzip/zlib (deflate) */ 156 # define _DINDEX(dv,p) (_DV_A((p),DL_SHIFT)) 157 158 #elif (LZO_HASH == LZO_HASH_GZIP_INCREMENTAL) 159 /* incremental hash like in gzip/zlib (deflate) */ 160 # define __LZO_HASH_INCREMENTAL 1 161 # define DVAL_FIRST(dv,p) dv = _DV_A((p),DL_SHIFT) 162 # define DVAL_NEXT(dv,p) dv = (((dv) << DL_SHIFT) ^ p[2]) 163 # define _DINDEX(dv,p) (dv) 164 # define DVAL_LOOKAHEAD DL_MIN_LEN 165 166 #elif (LZO_HASH == LZO_HASH_LZO_INCREMENTAL_A) 167 /* incremental LZO hash version A */ 168 # define __LZO_HASH_INCREMENTAL 1 169 # define DVAL_FIRST(dv,p) dv = _DV_A((p),5) 170 # define DVAL_NEXT(dv,p) \ 171 dv ^= (lzo_xint)(p[-1]) << (2*5); dv = (((dv) << 5) ^ p[2]) 172 # define _DINDEX(dv,p) ((DMUL(0x9f5f,dv)) >> 5) 173 # define DVAL_LOOKAHEAD DL_MIN_LEN 174 175 #elif (LZO_HASH == LZO_HASH_LZO_INCREMENTAL_B) 176 /* incremental LZO hash version B */ 177 # define __LZO_HASH_INCREMENTAL 1 178 # define DVAL_FIRST(dv,p) dv = _DV_B((p),5) 179 # define DVAL_NEXT(dv,p) \ 180 dv ^= p[-1]; dv = (((dv) >> 5) ^ ((lzo_xint)(p[2]) << (2*5))) 181 # define _DINDEX(dv,p) ((DMUL(0x9f5f,dv)) >> 5) 182 # define DVAL_LOOKAHEAD DL_MIN_LEN 183 184 #else 185 # error "choose a hashing strategy" 186 #endif 187 188 189 #ifndef DINDEX 190 #define DINDEX(dv,p) ((lzo_uint)((_DINDEX(dv,p)) & DL_MASK) << DD_BITS) 191 #endif 192 #if !defined(DINDEX1) && defined(D_INDEX1) 193 #define DINDEX1 D_INDEX1 194 #endif 195 #if !defined(DINDEX2) && defined(D_INDEX2) 196 #define DINDEX2 D_INDEX2 197 #endif 198 199 200 201 #if !defined(__LZO_HASH_INCREMENTAL) 202 # define DVAL_FIRST(dv,p) ((void) 0) 203 # define DVAL_NEXT(dv,p) ((void) 0) 204 # define DVAL_LOOKAHEAD 0 205 #endif 206 207 208 #if !defined(DVAL_ASSERT) 209 #if defined(__LZO_HASH_INCREMENTAL) && !defined(NDEBUG) 210 #if (LZO_CC_CLANG || (LZO_CC_GNUC >= 0x020700ul) || LZO_CC_LLVM) 211 static void __attribute__((__unused__)) 212 #else 213 static void 214 #endif 215 DVAL_ASSERT(lzo_xint dv, const lzo_bytep p) 216 { 217 lzo_xint df; 218 DVAL_FIRST(df,(p)); 219 assert(DINDEX(dv,p) == DINDEX(df,p)); 220 } 221 #else 222 # define DVAL_ASSERT(dv,p) ((void) 0) 223 #endif 224 #endif 225 226 227 228 /*********************************************************************** 229 // dictionary updating 230 ************************************************************************/ 231 232 #if (LZO_DICT_USE_PTR) 233 # define DENTRY(p,in) (p) 234 # define GINDEX(m_pos,m_off,dict,dindex,in) m_pos = dict[dindex] 235 #else 236 # define DENTRY(p,in) ((lzo_dict_t) pd(p, in)) 237 # define GINDEX(m_pos,m_off,dict,dindex,in) m_off = dict[dindex] 238 #endif 239 240 241 #if (DD_BITS == 0) 242 243 # define UPDATE_D(dict,drun,dv,p,in) dict[ DINDEX(dv,p) ] = DENTRY(p,in) 244 # define UPDATE_I(dict,drun,index,p,in) dict[index] = DENTRY(p,in) 245 # define UPDATE_P(ptr,drun,p,in) (ptr)[0] = DENTRY(p,in) 246 247 #else 248 249 # define UPDATE_D(dict,drun,dv,p,in) \ 250 dict[ DINDEX(dv,p) + drun++ ] = DENTRY(p,in); drun &= DD_MASK 251 # define UPDATE_I(dict,drun,index,p,in) \ 252 dict[ (index) + drun++ ] = DENTRY(p,in); drun &= DD_MASK 253 # define UPDATE_P(ptr,drun,p,in) \ 254 (ptr) [ drun++ ] = DENTRY(p,in); drun &= DD_MASK 255 256 #endif 257 258 259 /*********************************************************************** 260 // test for a match 261 ************************************************************************/ 262 263 #if (LZO_DICT_USE_PTR) 264 265 /* m_pos is either NULL or a valid pointer */ 266 #define LZO_CHECK_MPOS_DET(m_pos,m_off,in,ip,max_offset) \ 267 (m_pos == NULL || (m_off = pd(ip, m_pos)) > max_offset) 268 269 /* m_pos may point anywhere... */ 270 #define LZO_CHECK_MPOS_NON_DET(m_pos,m_off,in,ip,max_offset) \ 271 (BOUNDS_CHECKING_OFF_IN_EXPR(( \ 272 m_pos = ip - (lzo_uint) PTR_DIFF(ip,m_pos), \ 273 PTR_LT(m_pos,in) || \ 274 (m_off = (lzo_uint) PTR_DIFF(ip,m_pos)) == 0 || \ 275 m_off > max_offset ))) 276 277 #else 278 279 #define LZO_CHECK_MPOS_DET(m_pos,m_off,in,ip,max_offset) \ 280 (m_off == 0 || \ 281 ((m_off = pd(ip, in) - m_off) > max_offset) || \ 282 (m_pos = (ip) - (m_off), 0) ) 283 284 #define LZO_CHECK_MPOS_NON_DET(m_pos,m_off,in,ip,max_offset) \ 285 (pd(ip, in) <= m_off || \ 286 ((m_off = pd(ip, in) - m_off) > max_offset) || \ 287 (m_pos = (ip) - (m_off), 0) ) 288 289 #endif 290 291 292 #if (LZO_DETERMINISTIC) 293 # define LZO_CHECK_MPOS LZO_CHECK_MPOS_DET 294 #else 295 # define LZO_CHECK_MPOS LZO_CHECK_MPOS_NON_DET 296 #endif 297 298 299 300 #ifdef __cplusplus 301 } /* extern "C" */ 302 #endif 303 304 #endif /* already included */ 305 306 /* 307 vi:ts=4:et 308 */ 309 310