|
1 /* blast.h -- interface for blast.c |
|
2 Copyright (C) 2003 Mark Adler |
|
3 version 1.1, 16 Feb 2003 |
|
4 |
|
5 This software is provided 'as-is', without any express or implied |
|
6 warranty. In no event will the author be held liable for any damages |
|
7 arising from the use of this software. |
|
8 |
|
9 Permission is granted to anyone to use this software for any purpose, |
|
10 including commercial applications, and to alter it and redistribute it |
|
11 freely, subject to the following restrictions: |
|
12 |
|
13 1. The origin of this software must not be misrepresented; you must not |
|
14 claim that you wrote the original software. If you use this software |
|
15 in a product, an acknowledgment in the product documentation would be |
|
16 appreciated but is not required. |
|
17 2. Altered source versions must be plainly marked as such, and must not be |
|
18 misrepresented as being the original software. |
|
19 3. This notice may not be removed or altered from any source distribution. |
|
20 |
|
21 Mark Adler madler@alumni.caltech.edu |
|
22 */ |
|
23 |
|
24 |
|
25 /* |
|
26 * blast() decompresses the PKWare Data Compression Library (DCL) compressed |
|
27 * format. It provides the same functionality as the explode() function in |
|
28 * that library. (Note: PKWare overused the "implode" verb, and the format |
|
29 * used by their library implode() function is completely different and |
|
30 * incompatible with the implode compression method supported by PKZIP.) |
|
31 */ |
|
32 |
|
33 |
|
34 typedef unsigned (*blast_in)(void *how, unsigned char **buf); |
|
35 typedef int (*blast_out)(void *how, unsigned char *buf, unsigned len); |
|
36 /* Definitions for input/output functions passed to blast(). See below for |
|
37 * what the provided functions need to do. |
|
38 */ |
|
39 |
|
40 |
|
41 int blast(blast_in infun, void *inhow, blast_out outfun, void *outhow); |
|
42 /* Decompress input to output using the provided infun() and outfun() calls. |
|
43 * On success, the return value of blast() is zero. If there is an error in |
|
44 * the source data, i.e. it is not in the proper format, then a negative value |
|
45 * is returned. If there is not enough input available or there is not enough |
|
46 * output space, then a positive error is returned. |
|
47 * |
|
48 * The input function is invoked: len = infun(how, &buf), where buf is set by |
|
49 * infun() to point to the input buffer, and infun() returns the number of |
|
50 * available bytes there. If infun() returns zero, then blast() returns with |
|
51 * an input error. (blast() only asks for input if it needs it.) inhow is for |
|
52 * use by the application to pass an input descriptor to infun(), if desired. |
|
53 * |
|
54 * The output function is invoked: err = outfun(how, buf, len), where the bytes |
|
55 * to be written are buf[0..len-1]. If err is not zero, then blast() returns |
|
56 * with an output error. outfun() is always called with len <= 4096. outhow |
|
57 * is for use by the application to pass an output descriptor to outfun(), if |
|
58 * desired. |
|
59 * |
|
60 * The return codes are: |
|
61 * |
|
62 * 2: ran out of input before completing decompression |
|
63 * 1: output error before completing decompression |
|
64 * 0: successful decompression |
|
65 * -1: literal flag not zero or one |
|
66 * -2: dictionary size not in 4..6 |
|
67 * -3: distance is too far back |
|
68 * |
|
69 * At the bottom of blast.c is an example program that uses blast() that can be |
|
70 * compiled to produce a command-line decompression filter by defining TEST. |
|
71 */ |