Snappy v1.1.3, July 6th 2015:

This is the first release to be done from GitHub, which means that
some minor things like the ChangeLog format has changed (git log
format instead of svn log).

  * Add support for Uncompress() from a Source to a Sink.

  * Various minor changes to improve MSVC support; in particular,
    the unit tests now compile and run under MSVC.


Snappy v1.1.2, February 28th 2014:

This is a maintenance release with no changes to the actual library
source code.

  * Stop distributing benchmark data files that have unclear
    or unsuitable licensing.

  * Add support for padding chunks in the framing format.


Snappy v1.1.1, October 15th 2013:

  * Add support for uncompressing to iovecs (scatter I/O).
    The bulk of this patch was contributed by Mohit Aron.

  * Speed up decompression by ~2%; much more so (~13-20%) on
    a few benchmarks on given compilers and CPUs.

  * Fix a few issues with MSVC compilation.

  * Support truncated test data in the benchmark.


Snappy v1.1.0, January 18th 2013:

  * Snappy now uses 64 kB block size instead of 32 kB. On average,
    this means it compresses about 3% denser (more so for some
    inputs), at the same or better speeds.

  * libsnappy no longer depends on iostream.

  * Some small performance improvements in compression on x86
    (0.5–1%).

  * Various portability fixes for ARM-based platforms, for MSVC,
    and for GNU/Hurd.


Snappy v1.0.5, February 24th 2012:

  * More speed improvements. Exactly how big will depend on
    the architecture:

    - 3–10% faster decompression for the base case (x86-64).

    - ARMv7 and higher can now use unaligned accesses,
      and will see about 30% faster decompression and
      20–40% faster compression.

    - 32-bit platforms (ARM and 32-bit x86) will see 2–5%
      faster compression.

    These are all cumulative (e.g., ARM gets all three speedups).

  * Fixed an issue where the unit test would crash on system
    with less than 256 MB address space available,
    e.g. some embedded platforms.

  * Added a framing format description, for use over e.g. HTTP,
    or for a command-line compressor. We do not have any
    implementations of this at the current point, but there seems
    to be enough of a general interest in the topic.
    Also make the format description slightly clearer.

  * Remove some compile-time warnings in -Wall
    (mostly signed/unsigned comparisons), for easier embedding
    into projects that use -Wall -Werror.


Snappy v1.0.4, September 15th 2011:

  * Speeded up the decompressor somewhat; typically about 2–8%
    for Core i7, in 64-bit mode (comparable for Opteron).
    Somewhat more for some tests, almost no gain for others.
  
  * Make Snappy compile on certain platforms it didn't before
    (Solaris with SunPro C++, HP-UX, AIX).

  * Correct some minor errors in the format description.


Snappy v1.0.3, June 2nd 2011:

  * Speeded up the decompressor somewhat; about 3-6% for Core 2,
    6-13% for Core i7, and 5-12% for Opteron (all in 64-bit mode).

  * Added compressed format documentation. This text is new,
    but an earlier version from Zeev Tarantov was used as reference.

  * Only link snappy_unittest against -lz and other autodetected
    libraries, not libsnappy.so (which doesn't need any such dependency).

  * Fixed some display issues in the microbenchmarks, one of which would
    frequently make the test crash on GNU/Hurd.


Snappy v1.0.2, April 29th 2011:

  * Relicense to a BSD-type license.

  * Added C bindings, contributed by Martin Gieseking.

  * More Win32 fixes, in particular for MSVC.

  * Replace geo.protodata with a newer version.

  * Fix timing inaccuracies in the unit test when comparing Snappy
    to other algorithms.


Snappy v1.0.1, March 25th 2011:

This is a maintenance release, mostly containing minor fixes.
There is no new functionality. The most important fixes include:

  * The COPYING file and all licensing headers now correctly state that
    Snappy is licensed under the Apache 2.0 license.

  * snappy_unittest should now compile natively under Windows,
    as well as on embedded systems with no mmap().

  * Various autotools nits have been fixed.


Snappy v1.0, March 17th 2011:

  * Initial version.
