176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman/* lzo1x_d3.c -- LZO1X decompression with preset dictionary
276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman   This file is part of the LZO real-time data compression library.
476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman   Copyright (C) 1996-2014 Markus Franz Xaver Johannes Oberhumer
676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman   All Rights Reserved.
776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman   The LZO library is free software; you can redistribute it and/or
976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman   modify it under the terms of the GNU General Public License as
1076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman   published by the Free Software Foundation; either version 2 of
1176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman   the License, or (at your option) any later version.
1276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
1376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman   The LZO library is distributed in the hope that it will be useful,
1476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman   but WITHOUT ANY WARRANTY; without even the implied warranty of
1576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
1676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman   GNU General Public License for more details.
1776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
1876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman   You should have received a copy of the GNU General Public License
1976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman   along with the LZO library; see the file COPYING.
2076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman   If not, write to the Free Software Foundation, Inc.,
2176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman   51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
2276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
2376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman   Markus F.X.J. Oberhumer
2476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman   <markus@oberhumer.com>
2576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman   http://www.oberhumer.com/opensource/lzo/
2676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman */
2776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
2876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
2976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#include "config1x.h"
3076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
3176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#define LZO_TEST_OVERRUN 1
3276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
3376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
3476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#define SLOW_MEMCPY(a,b,l)      { do *a++ = *b++; while (--l > 0); }
3576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#define FAST_MEMCPY(a,b,l)      { lzo_memcpy(a,b,l); a += l; }
3676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
3776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#if 1 && defined(FAST_MEMCPY)
3876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#  define DICT_MEMMOVE(op,m_pos,m_len,m_off) \
3976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman        if (m_off >= (m_len)) \
4076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman            FAST_MEMCPY(op,m_pos,m_len) \
4176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman        else \
4276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman            SLOW_MEMCPY(op,m_pos,m_len)
4376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#else
4476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#  define DICT_MEMMOVE(op,m_pos,m_len,m_off) \
4576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman        SLOW_MEMCPY(op,m_pos,m_len)
4676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#endif
4776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
4876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#if !defined(FAST_MEMCPY)
4976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#  define FAST_MEMCPY   SLOW_MEMCPY
5076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#endif
5176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
5276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
5376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#define COPY_DICT_DICT(m_len,m_off) \
5476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman    { \
5576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman        const lzo_bytep m_pos; \
5676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman        m_off -= pd(op, out); assert(m_off > 0); \
5776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman        if (m_off > dict_len) goto lookbehind_overrun; \
5876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman        m_pos = dict_end - m_off; \
5976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman        if (m_len > m_off) \
6076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman        { \
6176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman            m_len -= m_off; \
6276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman            FAST_MEMCPY(op,m_pos,m_off) \
6376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman            m_pos = out; \
6476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman            SLOW_MEMCPY(op,m_pos,m_len) \
6576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman        } \
6676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman        else \
6776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman            FAST_MEMCPY(op,m_pos,m_len) \
6876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman    }
6976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
7076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#define COPY_DICT(m_len,m_off) \
7176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman    assert(m_len >= 2); assert(m_off > 0); assert(op > out); \
7276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman    if (m_off <= pd(op, out)) \
7376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman    { \
7476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman        const lzo_bytep m_pos = op - m_off; \
7576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman        DICT_MEMMOVE(op,m_pos,m_len,m_off) \
7676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman    } \
7776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman    else \
7876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman        COPY_DICT_DICT(m_len,m_off)
7976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
8076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
8176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
8276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
8376d05dc695b06c4e987bb8078f78032441e1430cGreg HartmanLZO_PUBLIC(int)
8476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartmanlzo1x_decompress_dict_safe ( const lzo_bytep in,  lzo_uint  in_len,
8576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman                                   lzo_bytep out, lzo_uintp out_len,
8676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman                                   lzo_voidp wrkmem /* NOT USED */,
8776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman                             const lzo_bytep dict, lzo_uint dict_len)
8876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
8976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
9076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#include "lzo1x_d.ch"
9176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
9276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
9376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman/*
9476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartmanvi:ts=4:et
9576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman*/
9676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
97