1 |
/* blast.h -- interface for blast.c |
2 |
Copyright (C) 2003, 2012 Mark Adler |
3 |
version 1.2, 24 Oct 2012 |
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 |
* The binary mode for stdio functions should be used to assure that the |
33 |
* compressed data is not corrupted when read or written. For example: |
34 |
* fopen(..., "rb") and fopen(..., "wb"). |
35 |
*/ |
36 |
|
37 |
|
38 |
typedef unsigned (*blast_in)(void *how, unsigned char **buf); |
39 |
typedef int (*blast_out)(void *how, unsigned char *buf, unsigned len); |
40 |
/* Definitions for input/output functions passed to blast(). See below for |
41 |
* what the provided functions need to do. |
42 |
*/ |
43 |
|
44 |
|
45 |
int blast(blast_in infun, void *inhow, blast_out outfun, void *outhow); |
46 |
/* Decompress input to output using the provided infun() and outfun() calls. |
47 |
* On success, the return value of blast() is zero. If there is an error in |
48 |
* the source data, i.e. it is not in the proper format, then a negative value |
49 |
* is returned. If there is not enough input available or there is not enough |
50 |
* output space, then a positive error is returned. |
51 |
* |
52 |
* The input function is invoked: len = infun(how, &buf), where buf is set by |
53 |
* infun() to point to the input buffer, and infun() returns the number of |
54 |
* available bytes there. If infun() returns zero, then blast() returns with |
55 |
* an input error. (blast() only asks for input if it needs it.) inhow is for |
56 |
* use by the application to pass an input descriptor to infun(), if desired. |
57 |
* |
58 |
* The output function is invoked: err = outfun(how, buf, len), where the bytes |
59 |
* to be written are buf[0..len-1]. If err is not zero, then blast() returns |
60 |
* with an output error. outfun() is always called with len <= 4096. outhow |
61 |
* is for use by the application to pass an output descriptor to outfun(), if |
62 |
* desired. |
63 |
* |
64 |
* The return codes are: |
65 |
* |
66 |
* 2: ran out of input before completing decompression |
67 |
* 1: output error before completing decompression |
68 |
* 0: successful decompression |
69 |
* -1: literal flag not zero or one |
70 |
* -2: dictionary size not in 4..6 |
71 |
* -3: distance is too far back |
72 |
* |
73 |
* At the bottom of blast.c is an example program that uses blast() that can be |
74 |
* compiled to produce a command-line decompression filter by defining TEST. |
75 |
*/ |