00001 /******************************************************************************
00002 * lzsscomprs.h - definition of Class SWCompress used for data compression
00003 *
00004 * $Id: lzsscomprs.h-source.html,v 1.10 2001/05/25 10:44:21 jansorg Exp $
00005 *
00006 * Copyright 1998 CrossWire Bible Society (http://www.crosswire.org)
00007 * CrossWire Bible Society
00008 * P. O. Box 2528
00009 * Tempe, AZ 85280-2528
00010 *
00011 * This program is free software; you can redistribute it and/or modify it
00012 * under the terms of the GNU General Public License as published by the
00013 * Free Software Foundation version 2.
00014 *
00015 * This program is distributed in the hope that it will be useful, but
00016 * WITHOUT ANY WARRANTY; without even the implied warranty of
00017 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
00018 * General Public License for more details.
00019 *
00020 */
00021
00022 #ifndef LZSSCOMPRS_H
00023 #define LZSSCOMPRS_H
00024
00025 #include <swcomprs.h>
00026
00027 #include <defs.h>
00028
00029 // The following are constant sizes used by the compression algorithm.
00030 //
00031 // N - This is the size of the ring buffer. It is set
00032 // to 4K. It is important to note that a position
00033 // within the ring buffer requires 12 bits.
00034 //
00035 // F - This is the maximum length of a character sequence
00036 // that can be taken from the ring buffer. It is set
00037 // to 18. Note that a length must be 3 before it is
00038 // worthwhile to store a position/length pair, so the
00039 // length can be encoded in only 4 bits. Or, put yet
00040 // another way, it is not necessary to encode a length
00041 // of 0-18, it is necessary to encode a length of
00042 // 3-18, which requires 4 bits.
00043 //
00044 // THRESHOLD - It takes 2 bytes to store an offset and
00045 // a length. If a character sequence only
00046 // requires 1 or 2 characters to store
00047 // uncompressed, then it is better to store
00048 // it uncompressed than as an offset into
00049 // the ring buffer.
00050 //
00051 // Note that the 12 bits used to store the position and the 4 bits
00052 // used to store the length equal a total of 16 bits, or 2 bytes.
00053
00054 #define N 4096
00055 #define F 18
00056 #define THRESHOLD 3
00057 #define NOT_USED N
00058
00059
00060
00061 class SWDLLEXPORT LZSSCompress:public SWCompress
00062 {
00063 static unsigned char m_ring_buffer[N + F - 1];
00064 static short int m_match_position;
00065 static short int m_match_length;
00066 static short int m_lson[N + 1];
00067 static short int m_rson[N + 257];
00068 static short int m_dad[N + 1];
00069 void InitTree ();
00070 void InsertNode (short int Pos);
00071 void DeleteNode (short int Node);
00072 public:
00073 LZSSCompress ();
00074 virtual ~ LZSSCompress ();
00075 virtual void Encode (void);
00076 virtual void Decode (void);
00077 };
00078
00079 #endif
1.1.5 written by Dimitri van Heesch,
© 1997-2000