annotate src/zlib-1.2.8/contrib/puff/README @ 169:223a55898ab9 tip default

Add null config files
author Chris Cannam <cannam@all-day-breakfast.com>
date Mon, 02 Mar 2020 14:03:47 +0000
parents 5b4145a0d408
children
rev   line source
cannam@128 1 Puff -- A Simple Inflate
cannam@128 2 3 Mar 2003
cannam@128 3 Mark Adler
cannam@128 4 madler@alumni.caltech.edu
cannam@128 5
cannam@128 6 What this is --
cannam@128 7
cannam@128 8 puff.c provides the routine puff() to decompress the deflate data format. It
cannam@128 9 does so more slowly than zlib, but the code is about one-fifth the size of the
cannam@128 10 inflate code in zlib, and written to be very easy to read.
cannam@128 11
cannam@128 12 Why I wrote this --
cannam@128 13
cannam@128 14 puff.c was written to document the deflate format unambiguously, by virtue of
cannam@128 15 being working C code. It is meant to supplement RFC 1951, which formally
cannam@128 16 describes the deflate format. I have received many questions on details of the
cannam@128 17 deflate format, and I hope that reading this code will answer those questions.
cannam@128 18 puff.c is heavily commented with details of the deflate format, especially
cannam@128 19 those little nooks and cranies of the format that might not be obvious from a
cannam@128 20 specification.
cannam@128 21
cannam@128 22 puff.c may also be useful in applications where code size or memory usage is a
cannam@128 23 very limited resource, and speed is not as important.
cannam@128 24
cannam@128 25 How to use it --
cannam@128 26
cannam@128 27 Well, most likely you should just be reading puff.c and using zlib for actual
cannam@128 28 applications, but if you must ...
cannam@128 29
cannam@128 30 Include puff.h in your code, which provides this prototype:
cannam@128 31
cannam@128 32 int puff(unsigned char *dest, /* pointer to destination pointer */
cannam@128 33 unsigned long *destlen, /* amount of output space */
cannam@128 34 unsigned char *source, /* pointer to source data pointer */
cannam@128 35 unsigned long *sourcelen); /* amount of input available */
cannam@128 36
cannam@128 37 Then you can call puff() to decompress a deflate stream that is in memory in
cannam@128 38 its entirety at source, to a sufficiently sized block of memory for the
cannam@128 39 decompressed data at dest. puff() is the only external symbol in puff.c The
cannam@128 40 only C library functions that puff.c needs are setjmp() and longjmp(), which
cannam@128 41 are used to simplify error checking in the code to improve readabilty. puff.c
cannam@128 42 does no memory allocation, and uses less than 2K bytes off of the stack.
cannam@128 43
cannam@128 44 If destlen is not enough space for the uncompressed data, then inflate will
cannam@128 45 return an error without writing more than destlen bytes. Note that this means
cannam@128 46 that in order to decompress the deflate data successfully, you need to know
cannam@128 47 the size of the uncompressed data ahead of time.
cannam@128 48
cannam@128 49 If needed, puff() can determine the size of the uncompressed data with no
cannam@128 50 output space. This is done by passing dest equal to (unsigned char *)0. Then
cannam@128 51 the initial value of *destlen is ignored and *destlen is set to the length of
cannam@128 52 the uncompressed data. So if the size of the uncompressed data is not known,
cannam@128 53 then two passes of puff() can be used--first to determine the size, and second
cannam@128 54 to do the actual inflation after allocating the appropriate memory. Not
cannam@128 55 pretty, but it works. (This is one of the reasons you should be using zlib.)
cannam@128 56
cannam@128 57 The deflate format is self-terminating. If the deflate stream does not end
cannam@128 58 in *sourcelen bytes, puff() will return an error without reading at or past
cannam@128 59 endsource.
cannam@128 60
cannam@128 61 On return, *sourcelen is updated to the amount of input data consumed, and
cannam@128 62 *destlen is updated to the size of the uncompressed data. See the comments
cannam@128 63 in puff.c for the possible return codes for puff().