summaryrefslogtreecommitdiff
path: root/src/lzo1b_de.h
diff options
context:
space:
mode:
Diffstat (limited to 'src/lzo1b_de.h')
-rw-r--r--src/lzo1b_de.h344
1 files changed, 344 insertions, 0 deletions
diff --git a/src/lzo1b_de.h b/src/lzo1b_de.h
new file mode 100644
index 0000000..badba73
--- /dev/null
+++ b/src/lzo1b_de.h
@@ -0,0 +1,344 @@
+/* lzo1b_de.h -- definitions for the the LZO1B/LZO1C algorithm
+
+ This file is part of the LZO real-time data compression library.
+
+ Copyright (C) 2008 Markus Franz Xaver Johannes Oberhumer
+ Copyright (C) 2007 Markus Franz Xaver Johannes Oberhumer
+ Copyright (C) 2006 Markus Franz Xaver Johannes Oberhumer
+ Copyright (C) 2005 Markus Franz Xaver Johannes Oberhumer
+ Copyright (C) 2004 Markus Franz Xaver Johannes Oberhumer
+ Copyright (C) 2003 Markus Franz Xaver Johannes Oberhumer
+ Copyright (C) 2002 Markus Franz Xaver Johannes Oberhumer
+ Copyright (C) 2001 Markus Franz Xaver Johannes Oberhumer
+ Copyright (C) 2000 Markus Franz Xaver Johannes Oberhumer
+ Copyright (C) 1999 Markus Franz Xaver Johannes Oberhumer
+ Copyright (C) 1998 Markus Franz Xaver Johannes Oberhumer
+ Copyright (C) 1997 Markus Franz Xaver Johannes Oberhumer
+ Copyright (C) 1996 Markus Franz Xaver Johannes Oberhumer
+ All Rights Reserved.
+
+ The LZO library is free software; you can redistribute it and/or
+ modify it under the terms of the GNU General Public License as
+ published by the Free Software Foundation; either version 2 of
+ the License, or (at your option) any later version.
+
+ The LZO library is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with the LZO library; see the file COPYING.
+ If not, write to the Free Software Foundation, Inc.,
+ 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+
+ Markus F.X.J. Oberhumer
+ <markus@oberhumer.com>
+ http://www.oberhumer.com/opensource/lzo/
+ */
+
+
+/* WARNING: this file should *not* be used by applications. It is
+ part of the implementation of the library and is subject
+ to change.
+ */
+
+
+#ifndef __LZO_DEFS_H
+#define __LZO_DEFS_H
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+
+/***********************************************************************
+//
+************************************************************************/
+
+/*
+ Format of the marker byte
+
+ 76543210
+ --------
+ 00000000 R0 - a long literal run ('R0' run)
+ 000rrrrr R - a short literal run with len r
+ 00100000 M4 - a very long match
+ 001mmmmm M3 - a long match (len = m+M3_MIN_LEN)
+ mmmooooo M2 - a short match (len = m+M2_MIN_LEN, o = offset low bits)
+
+ M1 is not used !
+*/
+
+
+#ifndef R_BITS
+#define R_BITS (5)
+#endif
+
+
+#ifndef M1L_BITS
+#define M1L_BITS (0)
+#endif
+#ifndef M2L_BITS
+#define M2L_BITS (CHAR_BIT - M2O_BITS)
+#endif
+#ifndef M3L_BITS
+#define M3L_BITS (R_BITS)
+#endif
+#ifndef M4L_BITS
+#define M4L_BITS (CHAR_BIT)
+#endif
+
+#ifndef M1O_BITS
+#define M1O_BITS (6)
+#endif
+#ifndef M2O_BITS
+#define M2O_BITS (R_BITS)
+#endif
+#ifndef M3O_BITS
+#define M3O_BITS (CHAR_BIT)
+#endif
+#ifndef M4O_BITS
+#define M4O_BITS (M3O_BITS) /* must be the same */
+#endif
+
+#ifndef M1X_BITS
+#define M1X_BITS (M1O_BITS)
+#endif
+#ifndef M2X_BITS
+#define M2X_BITS (M2O_BITS + CHAR_BIT)
+#endif
+#ifndef M3X_BITS
+#define M3X_BITS (M3O_BITS + CHAR_BIT)
+#endif
+#ifndef M4X_BITS
+#define M4X_BITS M3X_BITS
+#endif
+
+
+#define __MIN_OFFSET(bits) 1
+#define __MAX_OFFSET(bits) LZO_LSIZE(bits)
+
+#define M1_MIN_OFFSET __MIN_OFFSET(M1X_BITS)
+#define M2_MIN_OFFSET __MIN_OFFSET(M2X_BITS)
+#define M3_MIN_OFFSET __MIN_OFFSET(M3X_BITS)
+#define M4_MIN_OFFSET M3_MIN_OFFSET
+
+#if defined(LZO_EOF_CODE) && !defined(M3_EOF_OFFSET)
+#define M3_EOF_OFFSET 1
+#else
+#define M3_EOF_OFFSET 0
+#endif
+
+#ifndef _M1_MAX_OFFSET
+#define _M1_MAX_OFFSET __MAX_OFFSET(M1X_BITS)
+#endif
+#ifndef _M2_MAX_OFFSET
+#define _M2_MAX_OFFSET __MAX_OFFSET(M2X_BITS)
+#endif
+#ifndef _M3_MAX_OFFSET
+#define _M3_MAX_OFFSET (__MAX_OFFSET(M3X_BITS) - M3_EOF_OFFSET)
+#endif
+#ifndef _M4_MAX_OFFSET
+#define _M4_MAX_OFFSET _M3_MAX_OFFSET
+#endif
+#ifndef _MAX_OFFSET
+#define _MAX_OFFSET _M4_MAX_OFFSET
+#endif
+
+#if (M3_EOF_OFFSET > 0) && (_M2_MAX_OFFSET == _M3_MAX_OFFSET + M3_EOF_OFFSET)
+# undef _M2_MAX_OFFSET
+# define _M2_MAX_OFFSET _M3_MAX_OFFSET
+#endif
+#if (_M2_MAX_OFFSET > _M3_MAX_OFFSET)
+# error
+#endif
+
+#define M1_MAX_OFFSET ((lzo_uint) _M1_MAX_OFFSET)
+#define M2_MAX_OFFSET ((lzo_uint) _M2_MAX_OFFSET)
+#define M3_MAX_OFFSET ((lzo_uint) _M3_MAX_OFFSET)
+#define M4_MAX_OFFSET ((lzo_uint) _M4_MAX_OFFSET)
+#define MAX_OFFSET ((lzo_uint) _MAX_OFFSET)
+
+
+#ifndef M1_MIN_LEN
+#define M1_MIN_LEN (2)
+#endif
+#ifndef M2_MIN_LEN
+#define M2_MIN_LEN (3)
+#endif
+#ifndef M3_MIN_LEN
+#if (M3X_BITS == M2X_BITS)
+#define M3_MIN_LEN (M2_MAX_LEN + 1)
+#else
+#define M3_MIN_LEN (4)
+#endif
+#endif
+#ifndef M4_MIN_LEN
+#define M4_MIN_LEN (M3_MAX_LEN + 1)
+#endif
+
+#ifndef M1_MAX_LEN
+#define M1_MAX_LEN (M1_MIN_LEN + LZO_SIZE(M1L_BITS) - 1)
+#endif
+#ifndef M2_MAX_LEN
+#define M2_MAX_LEN (M2_MIN_LEN + LZO_SIZE(M2L_BITS) - 3)
+#endif
+#ifndef M3_MAX_LEN
+#define M3_MAX_LEN (M3_MIN_LEN + LZO_SIZE(M3L_BITS) - 2)
+#endif
+#ifndef M4_MAX_LEN
+#define M4_MAX_LEN (ULONG_MAX)
+#endif
+
+
+#define M1O_MASK LZO_MASK(M1O_BITS)
+#define M1L_MASK LZO_MASK(M1L_BITS)
+#define M2O_MASK LZO_MASK(M2O_BITS)
+#define M2L_MASK LZO_MASK(M2L_BITS)
+#define M3O_MASK LZO_MASK(M3O_BITS)
+#define M3L_MASK LZO_MASK(M3L_BITS)
+#define M4O_MASK LZO_MASK(M4O_BITS)
+#define M4L_MASK LZO_MASK(M4L_BITS)
+
+
+#define M1_MARKER (1 << M1O_BITS)
+#define M2_MARKER (2 << M2O_BITS)
+#define M3_MARKER (1 << M3L_BITS)
+#define M4_MARKER M3_MARKER
+
+
+/***********************************************************************
+// R0 literal run (a long run)
+************************************************************************/
+
+#ifndef R0MIN
+#define R0MIN (LZO_SIZE(R_BITS)) /* Minimum len of R0 run of literals */
+#endif
+#define R0MAX (R0MIN + 256 - 1) /* Maximum len of R0 run of literals */
+
+#if (R0MAX - (R0MAX & ~7u) >= 7)
+#define R0FAST (R0MAX & ~7u) /* R0MAX aligned to 8 byte boundary */
+#else
+#define R0FAST (R0MAX & ~15u) /* R0MAX aligned to 8 byte boundary */
+#endif
+
+#if (R0MAX - R0FAST < 7) || ((R0FAST & 7) != 0)
+# error "something went wrong"
+#endif
+#if (R0FAST * 2 < 512)
+# error "R0FAST is not big enough"
+#endif
+
+/* 7 special codes from R0FAST+1 .. R0MAX
+ * these codes mean long R0 runs with lengths
+ * 512, 1024, 2048, 4096, 8192, 16384, 32768
+ */
+
+
+
+/***********************************************************************
+// matching
+************************************************************************/
+
+#define PS *m_pos++ != *ip++
+
+
+/* We already matched M2_MIN_LEN bytes.
+ * Try to match another M2_MAX_LEN - M2_MIN_LEN bytes. */
+
+#if (M2_MAX_LEN - M2_MIN_LEN == 4)
+# define MATCH_M2X (PS || PS || PS || PS)
+#elif (M2_MAX_LEN - M2_MIN_LEN == 5)
+# define MATCH_M2X (PS || PS || PS || PS || PS)
+#elif (M2_MAX_LEN - M2_MIN_LEN == 6)
+# define MATCH_M2X (PS || PS || PS || PS || PS || PS)
+#elif (M2_MAX_LEN - M2_MIN_LEN == 7)
+# define MATCH_M2X (PS || PS || PS || PS || PS || PS || PS)
+#elif (M2_MAX_LEN - M2_MIN_LEN == 13)
+# define MATCH_M2X (PS || PS || PS || PS || PS || PS || PS || PS || \
+ PS || PS || PS || PS || PS)
+#elif (M2_MAX_LEN - M2_MIN_LEN == 14)
+# define MATCH_M2X (PS || PS || PS || PS || PS || PS || PS || PS || \
+ PS || PS || PS || PS || PS || PS)
+#elif (M2_MAX_LEN - M2_MIN_LEN == 16)
+# define MATCH_M2X (PS || PS || PS || PS || PS || PS || PS || PS || \
+ PS || PS || PS || PS || PS || PS || PS || PS)
+#elif (M2_MAX_LEN - M2_MIN_LEN == 29)
+# define MATCH_M2X (PS || PS || PS || PS || PS || PS || PS || PS || \
+ PS || PS || PS || PS || PS || PS || PS || PS || \
+ PS || PS || PS || PS || PS || PS || PS || PS || \
+ PS || PS || PS || PS || PS)
+#else
+# error "MATCH_M2X not yet implemented"
+#endif
+
+
+/* We already matched M2_MIN_LEN bytes.
+ * Try to match another M2_MAX_LEN + 1 - M2_MIN_LEN bytes
+ * to see if we get more than a M2 match */
+
+#define MATCH_M2 (MATCH_M2X || PS)
+
+
+/***********************************************************************
+// copying
+************************************************************************/
+
+#define _CP *op++ = *m_pos++
+
+#if (M2_MIN_LEN == 2)
+# define COPY_M2X _CP
+#elif (M2_MIN_LEN == 3)
+# define COPY_M2X _CP; _CP
+#elif (M2_MIN_LEN == 4)
+# define COPY_M2X _CP; _CP; _CP
+#else
+# error "COPY_M2X not yet implemented"
+#endif
+
+#if (M3_MIN_LEN == 3)
+# define COPY_M3X _CP; _CP
+#elif (M3_MIN_LEN == 4)
+# define COPY_M3X _CP; _CP; _CP
+#elif (M3_MIN_LEN == 9)
+# define COPY_M3X _CP; _CP; _CP; _CP; _CP; _CP; _CP; _CP
+#else
+# error "COPY_M3X not yet implemented"
+#endif
+
+#define COPY_M2 COPY_M2X; *op++ = *m_pos++
+#define COPY_M3 COPY_M3X; *op++ = *m_pos++
+
+
+/***********************************************************************
+//
+************************************************************************/
+
+#if defined(LZO_NEED_DICT_H)
+
+#define DL_MIN_LEN M2_MIN_LEN
+#define D_INDEX1(d,p) d = DM(DMUL(0x21,DX3(p,5,5,6)) >> 5)
+#define D_INDEX2(d,p) d = (d & (D_MASK & 0x7ff)) ^ (D_HIGH | 0x1f)
+#include "lzo_dict.h"
+
+#ifndef MIN_LOOKAHEAD
+#define MIN_LOOKAHEAD (M2_MAX_LEN + 1)
+#endif
+#ifndef MAX_LOOKBEHIND
+#define MAX_LOOKBEHIND (MAX_OFFSET)
+#endif
+
+#endif /* defined(LZO_NEED_DICT_H) */
+
+
+#ifdef __cplusplus
+} /* extern "C" */
+#endif
+
+#endif /* already included */
+
+/*
+vi:ts=4:et
+*/
+