1 | /* |
1 | /* |
2 | * Copyright (c) 2000 Marc Alexander Lehmann <pcg@goof.com> |
2 | * Copyright (c) 2000-2005 Marc Alexander Lehmann <schmorp@schmorp.de> |
3 | * |
3 | * |
4 | * Redistribution and use in source and binary forms, with or without modifica- |
4 | * Redistribution and use in source and binary forms, with or without modifica- |
5 | * tion, are permitted provided that the following conditions are met: |
5 | * tion, are permitted provided that the following conditions are met: |
6 | * |
6 | * |
7 | * 1. Redistributions of source code must retain the above copyright notice, |
7 | * 1. Redistributions of source code must retain the above copyright notice, |
… | |
… | |
22 | * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; |
22 | * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; |
23 | * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, |
23 | * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, |
24 | * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTH- |
24 | * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTH- |
25 | * ERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED |
25 | * ERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED |
26 | * OF THE POSSIBILITY OF SUCH DAMAGE. |
26 | * OF THE POSSIBILITY OF SUCH DAMAGE. |
|
|
27 | * |
|
|
28 | * Alternatively, the contents of this file may be used under the terms of |
|
|
29 | * the GNU General Public License version 2 (the "GPL"), in which case the |
|
|
30 | * provisions of the GPL are applicable instead of the above. If you wish to |
|
|
31 | * allow the use of your version of this file only under the terms of the |
|
|
32 | * GPL and not to allow others to use your version of this file under the |
|
|
33 | * BSD license, indicate your decision by deleting the provisions above and |
|
|
34 | * replace them with the notice and other provisions required by the GPL. If |
|
|
35 | * you do not delete the provisions above, a recipient may use your version |
|
|
36 | * of this file under either the BSD or the GPL. |
27 | */ |
37 | */ |
28 | |
38 | |
29 | #include "config.h" |
39 | #include "config.h" |
30 | |
40 | |
31 | #include <stdio.h> |
41 | #include <stdio.h> |
32 | #include <stdlib.h> |
42 | #include <stdlib.h> |
|
|
43 | #include <string.h> |
33 | #include <assert.h> |
44 | #include <assert.h> |
34 | |
45 | |
35 | #include <unistd.h> |
46 | #include <unistd.h> |
36 | #include <getopt.h> |
47 | #include <getopt.h> |
37 | |
48 | |
38 | #include "lzf.h" |
49 | #include "lzf.h" |
39 | |
50 | |
|
|
51 | typedef unsigned char u8; |
|
|
52 | |
40 | static void |
53 | static void |
41 | usage (int ec) |
54 | usage (int ec) |
42 | { |
55 | { |
43 | fprintf (stderr, "\n" |
56 | fprintf (stderr, "\n" |
44 | "lzf, a very leightweight compression/decompression filter\n" |
57 | "lzf, a very lightweight compression/decompression filter\n" |
45 | "written by Marc Lehmann <pcg@goof.com> You can find more info at\n" |
58 | "written by Marc Lehmann <schmorp@schmorp.de> You can find more info at\n" |
46 | "http://liblzv.plan9.de/\n" |
59 | "http://liblzf.plan9.de/\n" |
47 | "\n" |
60 | "\n" |
48 | "USAGE: lzf -c [-b blocksize] | -d\n" |
61 | "USAGE: lzf -c [-b blocksize] | -d\n" |
49 | " -c compress\n" |
62 | " -c compress\n" |
50 | " -d decompress\n" |
63 | " -d decompress\n" |
51 | " -b specify the blocksize (default 64k-1)\n" |
64 | " -b specify the blocksize (default 64k-1)\n" |
… | |
… | |
56 | } |
69 | } |
57 | |
70 | |
58 | /* |
71 | /* |
59 | * Anatomy: an lzf file consists of any number of blocks in the following format: |
72 | * Anatomy: an lzf file consists of any number of blocks in the following format: |
60 | * |
73 | * |
|
|
74 | * \x00 EOF (optional) |
61 | * "ZV\0" 2-byte-usize <uncompressed data> |
75 | * "ZV\0" 2-byte-usize <uncompressed data> |
62 | * "ZV\1" 2-byte-csize 2-byte-usize <compressed data> |
76 | * "ZV\1" 2-byte-csize 2-byte-usize <compressed data> |
63 | * "ZV\2" 4-byte-crc32-0xdebb20e3 (NYI) |
77 | * "ZV\2" 4-byte-crc32-0xdebb20e3 (NYI) |
64 | * |
78 | * |
65 | */ |
79 | */ |
… | |
… | |
109 | header[4] = us & 0xff; |
123 | header[4] = us & 0xff; |
110 | |
124 | |
111 | fwrite (header, 3+2, 1, stdout); |
125 | fwrite (header, 3+2, 1, stdout); |
112 | fwrite (buff1, us, 1, stdout); |
126 | fwrite (buff1, us, 1, stdout); |
113 | } |
127 | } |
114 | } while (!feof (stdin)); |
128 | } |
115 | } |
129 | } |
116 | |
130 | |
117 | static void decompress (void) |
131 | static void decompress (void) |
118 | { |
132 | { |
119 | ssize_t us; |
133 | ssize_t us; |
… | |
… | |
121 | u8 buff1[64*1024]; |
135 | u8 buff1[64*1024]; |
122 | u8 buff2[64*1024]; |
136 | u8 buff2[64*1024]; |
123 | u8 header[3+2+2]; |
137 | u8 header[3+2+2]; |
124 | |
138 | |
125 | for(;;) { |
139 | for(;;) { |
126 | if (fread (header, 3+2, 1, stdin) != 1) |
140 | int hdrsize = fread (header, 1, 3+2, stdin); |
|
|
141 | |
|
|
142 | /* check for \0 record */ |
|
|
143 | if (hdrsize) |
|
|
144 | { |
|
|
145 | if (!header[0]) |
|
|
146 | break; |
|
|
147 | else if (hdrsize != 3+2) |
|
|
148 | { |
|
|
149 | if (feof (stdin)) |
|
|
150 | fprintf (stderr, "decompress: invalid stream - short header\n"); |
|
|
151 | else |
|
|
152 | perror ("decompress"); |
|
|
153 | |
|
|
154 | exit (1); |
|
|
155 | } |
|
|
156 | } |
|
|
157 | else |
127 | { |
158 | { |
128 | if (feof (stdin)) |
159 | if (feof (stdin)) |
129 | break; |
160 | break; |
130 | else |
161 | else |
131 | { |
162 | { |