============================================================================
User visible changes for LZO -- a real-time data compression library
============================================================================

Changes in 2.03 (30 Apr 2008)
  * Updated the ELF assembler sources to mark the stack as non-executable.
  * Fixed a HP-UX 11 build issue with Itanium in ILP32 mode.
  * Updated the configure system.

Changes in 2.02 (17 Oct 2005)
  * Updated the build and Autoconf scripts to fix some reported
    compilation problems.

Changes in 2.01 (27 Jun 2005)
  * Changed the configure system to install the LZO library under the
    name "liblzo2" so that parallel installation with LZO v1 is possible.
  * Improved auto-configuration in miniLZO for some embedded targets like
    Blackfin and H8/300 processors.

Changes in 2.00 (30 May 2005)

  [Library interface changes]
  * The 'lzo_uint' typedef has been changed to match 'size_t', which means
    it now is 64 bits on most 64-bit architectures. 32-bit machines
    are not affected by this change.
  * The formula for maximum expansion of incompressible data has changed.
    See doc/LZO.FAQ. This is needed for some upcoming speed improvements,
    and also for compatibility with our commercial LZO Professional product.
  * The progress indicator callback interface has been revamped.
  * All public header files now get installed into a "lzo" subdirectory, so
    your applications should use #include <lzo/lzoXXX.h>.
  * A number of (internal) macros have been renamed. See LZO_CFG_COMPAT
    in <lzo/lzoconf.h> if your code depends on these.

  [Speed]
  * Small overall speedup by exploiting features like branch prediction
    hints and explicit inline control present in modern C/C++ compilers.
  * Significant speedup for 64-bit architectures like AMD64.

  [Portability]
  * LZO now fully supports the LLP64 programming model.
  * LZO now fully supports the ILP64 and SILP64 programming models which
    are used on some supercomputing architectures.
  * Full Win64 support for AMD64 (aka x64) and IA64 (Itanium).
  * Full 16-bit support for ancient DOS 286 protected mode, OS/2 1.x
    and Windows 3.x.
  * The LZO library now compiles and works on completely freestanding or
    embedded systems as long as you have <limits.h> and <stddef.h> header
    files. See the B/generic/build_freestanding.sh build script.

  [Misc]
  * The i386 assembler versions of the decompressors are now automatically
    built and installed. See also asm/i386/00README.TXT.
  * Added include file <lzo/lzo_asm.h> that provides prototypes for all
    assembler functions.
  * Under MacOS X, the configure script now will use the `-no-cpp-precomp'
    compiler option in order to work around bugs in some versions of
    Apple's native "smart" preprocessor.
  * Worked around a preprocessor bug that is present in all compilers which
    are based on the lcc compiler kit.
  * Added simple B/generic/build.sh build script family.
  * Added lots of new build scripts for various DOS/Windows compilers.

  [Upgrade instructions from LZO v1 to LZO v2]
  * On 64-bit architectures, revisit all uses of lzo_uint.
  * Adapt for the maximum expansion change of incompressible data.
  * If you use the progress callback then adapt for the new interface.
  * Use #include <lzo/lzoXXX.h> or adjust your include path.
  * Check your code for use of deprecated macros. Add a
    #define LZO_CFG_COMPAT if necessary.
  * Other than that LZO v2 should be fully source-compatible with LZO v1.
    Of course, the compressed data is fully compatible as well.
  * Re-compile and re-link your application.
  * Enjoy the improvements!

----------------------------------------------------------------------------

Changes in 1.08 (12 Jul 2002)
  * Much better support for cross compiling.
  * Straighten out ANSI-conforming compiler checks.
  * Avoid harmless compiler warnings reported by -Wcast-align.
  * Fixed some sign extension problems on rather exotic machines where
    sizeof(size_t) < sizeof(ptrdiff_t) and sizeof(lzo_uint) == sizeof(size_t)
  * Updated the configure system to use the latest Autoconf, Automake
    and Libtool versions.

Changes in 1.07 (18 Oct 2000)
  * Default to `--disable-shared' (I'm getting tired of Libtool's
    shared library build problems, this time AIX was the culprit).
  * Avoid some harmless compiler warnings.

Changes in 1.06 (29 Nov 1999)
  * Updated the configure system to use Autoconf 2.13, Automake 1.4 and
    Libtool 1.3.3. This should hopefully fix the shared-library build
    problems that were reported on some machines.
  * Enhanced example programs a little bit.

Changes in 1.05 (14 Apr 1998)
  * Just a one-line change in the configure script to workaround
    a HPUX and IRIX build problem.

Changes in 1.04 (15 Mar 1998)
  * Worked around a bug in the cpp preprocessor under HPUX 10.20.
  * Adapted for Automake 1.2f and Libtool 1.1.

Changes in 1.03 (18 Jan 1998)
  * minor compression ratio improvement
  * extended example program to show how to do overlapping compression
  * assembler changes, added support for the nasm assembler
  * better support for cross compiling
  * some cleanups

Changes in 1.02 (07 Dec 1997)
  * improved LZO1X-999 and LZO1Y-999 compression ratio a little bit again
  * introduced compression levels for LZO1X-999 and LZO1Y-999
  * added support for preset dictionaries
  * implemented LZO1X-1(12): needs 16 kB for compression
  * new algorithm LZO1Z: this is another variant of LZO1X
  * added example program: how to use preset dictionaries
  * added example program: how to do in-place decompression
  * added a little file-packer example program
  * LZO now works cleanly under checkergcc
  * strict 16-bit memory model is working (but not officially supported)
  * shared libraries are supported on many platforms
  * adapted for Automake 1.2d and Libtool 1.0h

Changes in 1.01 (10 Aug 1997)
  * improved LZO1X-999 and LZO1Y-999 compression ratio a little bit
  * i386+gcc: significant speedup of the C version of the LZO1, LZO1A,
    LZO1B and LZO1C decompressors
  * added example programs that show how to generate pre-compressed data
  * added Makefiles for DOS, Windows and OS/2 targets

Changes in 1.00 (13 Jul 1997)
  * added miniLZO - can be easily included in your project
  * improved documentation, added LZO.FAQ
  * added build scripts for many systems where Autoconf is not available:
    Windows 3.1 (LIB+DLL), Windows 95/NT (LIB+DLL), DOS (16+32 bit), OS/2
  * adapted for Automake 1.2 and Libtool 1.0

Changes in 0.90 (27 Jun 1997): never released
  * LZO now uses GNU Automake 1.0 - lots of configuration changes
  * added LZO1X-1(11): this version needs only 8 kB for compression
  * implemented LZO1Y-1
  * added i386 assembler decompressors for MASM/TASM/WASM
  * the name of some assembler functions changed
  * the numeric value of some error codes changed
  * portability fixes

Changes in 0.29 (04 May 1997)
  * Linux ELF shared library support
  * workaround for gcc 2.7.2 optimizer bug under AIX
  * added lzo_crc32() checksum

Changes in 0.28 (22 Feb 1997)
  * new algorithm LZO1Y: LZO1Y-999 and LZO1Y decompressor
  * added lzo1x_optimize() and lzo1y_optimize()
  * minor speedup in assembler decompressors (i386+gcc)
  * ltest.c rewritten

Changes in 0.27 (19 Jan 1997)
  * fixed a bug in LZO1B-999 and LZO1C-999 that could produce
    invalid compressed data in very rare cases

Changes in 0.26 (18 Jan 1997): never released
  * implemented LZO1B-999
  * renamed LZO1D to LZO2A (also updated all docs)
  * some cleanups

Changes in 0.25 (28 Dec 1996): never released
  * some portability fixes (LZO now works on my old Atari ST :-)
  * adapted for Autoconf 2.12

Changes in 0.24 (30 Nov 1996): never released
  * improved performance of LZO1X assembler decompressor on a Pentium (i386+gcc)

Changes in 0.23 (23 Nov 1996)
  * added LZO1C, LZO1F and LZO1X decompressors in assembler (i386+gcc)
  * added corresponding LZO_PUBLIC to all LZO_EXTERN functions
  * added support for Microsoft C 7.0 (16-bit DOS)
  * introduced lzo_uint32. This could prove useful for a strict 16-bit
    version that doesn't use `huge' pointers.
  * all algorithms use incremental hashing now
  * some cleanups and portability fixes

Changes in 0.22 (19 Sep 1996)
  * LZO1X: minor decompressor speedup, added some checks in safe decompressor
  * Autoconf: added detection of gcc strength-reduction bug
  * Makefile changes

Changes in 0.21 (08 Sep 1996)
  * LZO now uses GNU Autoconf 2.10 - lots of configuration changes
  * a few cosmetical changes

Changes in 0.20 (11 Aug 1996)
  * new algorithm LZO1X: LZO1X-1, LZO1X-999 and LZO1X decompressor
  * significantly speeded up LZO1B, LZO1C and LZO1F decompressors
    on CPUs which allow unaligned memory access (e.g. Intel i386)
  * greatly speeded up LZO2A-999 compressor at the cost of some memory
  * some cleanups, portability fixes and minor speedups

Changes in 0.16 (22 Jul 1996)
  * speeded up LZO1F decompressor a little bit
  * improved LZO1F-999 compression ratio

Changes in 0.15 (10 Jul 1996)
  * new algorithm LZO1F: LZO1F-1, LZO1F-999 and LZO1F decompressor
  * improved LZO2A-999 compression ratio
  * removed LZO1E as it is dominated by LZO1F

Changes in 0.14 (06 Jul 1996): never released
  * experimental algorithms: LZO1E and LZO1F
  * added LZO_EXTERN to all prototypes. Useful when building a DLL.
  * improved LZO1C-999 and LZO2A-999 compression ratio a little bit
  * fixed progress indicator callback (it was called only once)

Changes in 0.13 (20 Jun 1996)
  * some speed improvements in LZO1C-999 and LZO2A-999

Changes in 0.12 (18 Jun 1996): never released
  * added LZO1C-999, a slow but nearly optimal compressor
    intended for generating pre-compressed data
  * added tests for lookbehind-overrun in all safe decompressors
  * source tree completely rearranged, some filenames changed
  * extensions changed: a .ch file is a C source code that is included
    for reasons of code sharing
  * new algorithm LZO2A: LZO2A-999 and LZO2A decompressor. There is
    no fast compressor yet.
  * some cleanups

Changes in 0.11 (29 May 1996)
  * source tree rearranged
  * LZO now compiles fine as a C++ library (interface still has C linkage)
  * improved overall compression ratio a little bit
  * LZO1B-99/LZO1C-99 now search for longer matches
  * incremental hash is working, it's a little bit faster
  * Makefile changed
  * added lzo_uint and lzo_sizeof in some places
  * split LZO1B compressor into even more include-files

Changes in 0.10 (20 May 1996): first public release of the LZO library
  * includes LZO1, LZO1A, LZO1B and LZO1C algorithms
    (compression levels 1-9 and 99)

14 Mar 1996:
  * public release of the LZO1A algorithm

04 Mar 1996:
  * public release of the LZO1 algorithm
