diff options
author | Glenn L McGrath <bug1@ihug.co.nz> | 2002-11-28 09:09:47 +0000 |
---|---|---|
committer | Glenn L McGrath <bug1@ihug.co.nz> | 2002-11-28 09:09:47 +0000 |
commit | fedbfe40595c8f503b38382b4e882f93e7ec1e40 (patch) | |
tree | 83db6adf5c0ec2ae9c348a4bb4a6cfdd7511b34c /archival | |
parent | 8e027f6474bc0f3e48cc2383b5fd2079cb284841 (diff) | |
download | busybox-w32-fedbfe40595c8f503b38382b4e882f93e7ec1e40.tar.gz busybox-w32-fedbfe40595c8f503b38382b4e882f93e7ec1e40.tar.bz2 busybox-w32-fedbfe40595c8f503b38382b4e882f93e7ec1e40.zip |
Style
Diffstat (limited to 'archival')
-rw-r--r-- | archival/libunarchive/decompress_uncompress.c | 307 | ||||
-rw-r--r-- | archival/libunarchive/uncompress.c | 307 |
2 files changed, 298 insertions, 316 deletions
diff --git a/archival/libunarchive/decompress_uncompress.c b/archival/libunarchive/decompress_uncompress.c index fe0f2b331..192e98126 100644 --- a/archival/libunarchive/decompress_uncompress.c +++ b/archival/libunarchive/decompress_uncompress.c | |||
@@ -32,66 +32,64 @@ | |||
32 | #include <string.h> | 32 | #include <string.h> |
33 | #include <unistd.h> | 33 | #include <unistd.h> |
34 | 34 | ||
35 | #define IBUFSIZ 2048 /* Defailt input buffer size */ | 35 | /* Defailt input buffer size */ |
36 | #define OBUFSIZ 2048 /* Default output buffer size */ | 36 | #define IBUFSIZ 2048 |
37 | 37 | ||
38 | /* Defines for third byte of header */ | 38 | /* Default output buffer size */ |
39 | #define MAGIC_1 (char_type)'\037'/* First byte of compressed file */ | 39 | #define OBUFSIZ 2048 |
40 | #define MAGIC_2 (char_type)'\235'/* Second byte of compressed file */ | 40 | |
41 | #define BIT_MASK 0x1f /* Mask for 'number of compresssion bits' */ | 41 | /* Defines for third byte of header */ |
42 | /* Masks 0x20 and 0x40 are free. */ | 42 | #define MAGIC_1 (char_type)'\037' /* First byte of compressed file */ |
43 | /* I think 0x20 should mean that there is */ | 43 | #define MAGIC_2 (char_type)'\235' /* Second byte of compressed file */ |
44 | /* a fourth header byte (for expansion). */ | 44 | #define BIT_MASK 0x1f /* Mask for 'number of compresssion bits' */ |
45 | #define BLOCK_MODE 0x80 /* Block compresssion if table is full and */ | 45 | /* Masks 0x20 and 0x40 are free. */ |
46 | /* compression rate is dropping flush tables */ | 46 | /* I think 0x20 should mean that there is */ |
47 | 47 | /* a fourth header byte (for expansion). */ | |
48 | /* the next two codes should not be changed lightly, as they must not */ | 48 | #define BLOCK_MODE 0x80 /* Block compresssion if table is full and */ |
49 | /* lie within the contiguous general code space. */ | 49 | /* compression rate is dropping flush tables */ |
50 | #define FIRST 257 /* first free entry */ | 50 | /* the next two codes should not be changed lightly, as they must not */ |
51 | #define CLEAR 256 /* table clear output code */ | 51 | /* lie within the contiguous general code space. */ |
52 | 52 | #define FIRST 257 /* first free entry */ | |
53 | #define INIT_BITS 9 /* initial number of bits/code */ | 53 | #define CLEAR 256 /* table clear output code */ |
54 | 54 | ||
55 | 55 | #define INIT_BITS 9 /* initial number of bits/code */ | |
56 | /* | 56 | |
57 | * machine variants which require cc -Dmachine: pdp11, z8000, DOS | 57 | |
58 | */ | 58 | /* machine variants which require cc -Dmachine: pdp11, z8000, DOS */ |
59 | #define FAST | 59 | #define FAST |
60 | 60 | ||
61 | #define HBITS 17 /* 50% occupancy */ | 61 | #define HBITS 17 /* 50% occupancy */ |
62 | #define HSIZE (1<<HBITS) | 62 | #define HSIZE (1<<HBITS) |
63 | #define HMASK (HSIZE-1) | 63 | #define HMASK (HSIZE-1) |
64 | #define HPRIME 9941 | 64 | #define HPRIME 9941 |
65 | #define BITS 16 | 65 | #define BITS 16 |
66 | #undef MAXSEG_64K | 66 | #undef MAXSEG_64K |
67 | |||
68 | typedef long int code_int; | ||
69 | |||
70 | typedef long int count_int; | ||
71 | typedef long int cmp_code_int; | ||
72 | |||
73 | typedef unsigned char char_type; | ||
74 | |||
75 | #define MAXCODE(n) (1L << (n)) | 67 | #define MAXCODE(n) (1L << (n)) |
76 | 68 | ||
69 | /* Block compress mode -C compatible with 2.0 */ | ||
70 | int block_mode = BLOCK_MODE; | ||
71 | |||
72 | /* user settable max # bits/code */ | ||
73 | int maxbits = BITS; | ||
77 | 74 | ||
75 | /* Exitcode of compress (-1 no file compressed) */ | ||
76 | int exit_code = -1; | ||
78 | 77 | ||
79 | int block_mode = BLOCK_MODE;/* Block compress mode -C compatible with 2.0*/ | 78 | /* Input buffer */ |
80 | int maxbits = BITS; /* user settable max # bits/code */ | 79 | unsigned char inbuf[IBUFSIZ + 64]; |
81 | int exit_code = -1; /* Exitcode of compress (-1 no file compressed) */ | ||
82 | 80 | ||
83 | char_type inbuf[IBUFSIZ+64]; /* Input buffer */ | 81 | /* Output buffer */ |
84 | char_type outbuf[OBUFSIZ+2048];/* Output buffer */ | 82 | unsigned char outbuf[OBUFSIZ + 2048]; |
85 | 83 | ||
86 | 84 | ||
87 | count_int htab[HSIZE]; | 85 | long int htab[HSIZE]; |
88 | unsigned short codetab[HSIZE]; | 86 | unsigned short codetab[HSIZE]; |
89 | 87 | ||
90 | #define htabof(i) htab[i] | 88 | #define htabof(i) htab[i] |
91 | #define codetabof(i) codetab[i] | 89 | #define codetabof(i) codetab[i] |
92 | #define tab_prefixof(i) codetabof(i) | 90 | #define tab_prefixof(i) codetabof(i) |
93 | #define tab_suffixof(i) ((char_type *)(htab))[i] | 91 | #define tab_suffixof(i) ((unsigned char *)(htab))[i] |
94 | #define de_stack ((char_type *)&(htab[HSIZE-1])) | 92 | #define de_stack ((unsigned char *)&(htab[HSIZE-1])) |
95 | #define clear_htab() memset(htab, -1, sizeof(htab)) | 93 | #define clear_htab() memset(htab, -1, sizeof(htab)) |
96 | #define clear_tab_prefixof() memset(codetab, 0, 256); | 94 | #define clear_tab_prefixof() memset(codetab, 0, 256); |
97 | 95 | ||
@@ -105,196 +103,189 @@ unsigned short codetab[HSIZE]; | |||
105 | 103 | ||
106 | extern int uncompress(int fd_in, int fd_out) | 104 | extern int uncompress(int fd_in, int fd_out) |
107 | { | 105 | { |
108 | char_type *stackp; | 106 | unsigned char *stackp; |
109 | code_int code; | 107 | long int code; |
110 | int finchar; | 108 | int finchar; |
111 | code_int oldcode; | 109 | long int oldcode; |
112 | code_int incode; | 110 | long int incode; |
113 | int inbits; | 111 | int inbits; |
114 | int posbits; | 112 | int posbits; |
115 | int outpos; | 113 | int outpos; |
116 | int insize; | 114 | int insize; |
117 | int bitmask; | 115 | int bitmask; |
118 | code_int free_ent; | 116 | long int free_ent; |
119 | code_int maxcode; | 117 | long int maxcode; |
120 | code_int maxmaxcode; | 118 | long int maxmaxcode; |
121 | int n_bits; | 119 | int n_bits; |
122 | int rsize = 0; | 120 | int rsize = 0; |
123 | 121 | ||
124 | insize = 0; | 122 | insize = 0; |
125 | 123 | ||
126 | inbuf [0] = xread_char(fd_in); | 124 | inbuf[0] = xread_char(fd_in); |
127 | 125 | ||
128 | maxbits = inbuf[0] & BIT_MASK; | 126 | maxbits = inbuf[0] & BIT_MASK; |
129 | block_mode = inbuf[0] & BLOCK_MODE; | 127 | block_mode = inbuf[0] & BLOCK_MODE; |
130 | maxmaxcode = MAXCODE(maxbits); | 128 | maxmaxcode = MAXCODE(maxbits); |
131 | 129 | ||
132 | if (maxbits > BITS) | 130 | if (maxbits > BITS) { |
133 | { | 131 | error_msg("compressed with %d bits, can only handle %d bits", maxbits, |
134 | fprintf(stderr, "compressed with %d bits, can only handle %d bits\n", maxbits, BITS); | 132 | BITS); |
135 | return -1; | 133 | return -1; |
136 | } | 134 | } |
137 | 135 | ||
138 | //fprintf(stderr, "Bits: %d, block_mode: %d\n", maxbits, block_mode ); | 136 | maxcode = MAXCODE(n_bits = INIT_BITS) - 1; |
139 | 137 | bitmask = (1 << n_bits) - 1; | |
140 | maxcode = MAXCODE(n_bits = INIT_BITS)-1; | ||
141 | bitmask = (1<<n_bits)-1; | ||
142 | oldcode = -1; | 138 | oldcode = -1; |
143 | finchar = 0; | 139 | finchar = 0; |
144 | outpos = 0; | 140 | outpos = 0; |
145 | posbits = 0<<3; | 141 | posbits = 0 << 3; |
146 | 142 | ||
147 | free_ent = ((block_mode) ? FIRST : 256); | 143 | free_ent = ((block_mode) ? FIRST : 256); |
148 | 144 | ||
149 | clear_tab_prefixof(); /* As above, initialize the first | 145 | /* As above, initialize the first 256 entries in the table. */ |
150 | 256 entries in the table. */ | 146 | clear_tab_prefixof(); |
151 | 147 | ||
152 | for (code = 255 ; code >= 0 ; --code) | 148 | for (code = 255; code >= 0; --code) { |
153 | tab_suffixof(code) = (char_type)code; | 149 | tab_suffixof(code) = (unsigned char) code; |
150 | } | ||
154 | 151 | ||
155 | do | 152 | do { |
156 | { | 153 | resetbuf:; |
157 | resetbuf: ; | ||
158 | { | 154 | { |
159 | int i; | 155 | int i; |
160 | int e; | 156 | int e; |
161 | int o; | 157 | int o; |
162 | 158 | ||
163 | e = insize-(o = (posbits>>3)); | 159 | e = insize - (o = (posbits >> 3)); |
164 | 160 | ||
165 | for (i = 0 ; i < e ; ++i) | 161 | for (i = 0; i < e; ++i) |
166 | inbuf[i] = inbuf[i+o]; | 162 | inbuf[i] = inbuf[i + o]; |
167 | 163 | ||
168 | insize = e; | 164 | insize = e; |
169 | posbits = 0; | 165 | posbits = 0; |
170 | } | 166 | } |
171 | 167 | ||
172 | if (insize < (int) sizeof(inbuf)-IBUFSIZ) | 168 | if (insize < (int) sizeof(inbuf) - IBUFSIZ) { |
173 | { | 169 | rsize = read(fd_in, inbuf + insize, IBUFSIZ); |
174 | rsize = read(fd_in, inbuf+insize, IBUFSIZ); | ||
175 | insize += rsize; | 170 | insize += rsize; |
176 | } | 171 | } |
177 | 172 | ||
178 | inbits = ((rsize > 0) ? (insize - insize%n_bits)<<3 : | 173 | inbits = ((rsize > 0) ? (insize - insize % n_bits) << 3 : |
179 | (insize<<3)-(n_bits-1)); | 174 | (insize << 3) - (n_bits - 1)); |
180 | |||
181 | while (inbits > posbits) | ||
182 | { | ||
183 | if (free_ent > maxcode) | ||
184 | { | ||
185 | posbits = ((posbits-1) + ((n_bits<<3) - | ||
186 | (posbits-1+(n_bits<<3))%(n_bits<<3))); | ||
187 | 175 | ||
176 | while (inbits > posbits) { | ||
177 | if (free_ent > maxcode) { | ||
178 | posbits = | ||
179 | ((posbits - 1) + | ||
180 | ((n_bits << 3) - | ||
181 | (posbits - 1 + (n_bits << 3)) % (n_bits << 3))); | ||
188 | ++n_bits; | 182 | ++n_bits; |
189 | if (n_bits == maxbits) | 183 | if (n_bits == maxbits) { |
190 | maxcode = maxmaxcode; | 184 | maxcode = maxmaxcode; |
191 | else | 185 | } else { |
192 | maxcode = MAXCODE(n_bits)-1; | 186 | maxcode = MAXCODE(n_bits) - 1; |
193 | 187 | } | |
194 | bitmask = (1<<n_bits)-1; | 188 | bitmask = (1 << n_bits) - 1; |
195 | goto resetbuf; | 189 | goto resetbuf; |
196 | } | 190 | } |
191 | { | ||
192 | unsigned char *p = &inbuf[posbits >> 3]; | ||
197 | 193 | ||
198 | 194 | code = | |
199 | { | 195 | ((((long) (p[0])) | ((long) (p[1]) << 8) | |
200 | char_type *p = &inbuf[posbits>>3]; | 196 | ((long) (p[2]) << 16)) >> (posbits & 0x7)) & bitmask; |
201 | code = ((((long)(p[0]))|((long)(p[1])<<8)|((long)(p[2])<<16))>>(posbits&0x7))&bitmask; | ||
202 | } | 197 | } |
203 | posbits += n_bits; | 198 | posbits += n_bits; |
204 | |||
205 | 199 | ||
206 | if (oldcode == -1) | 200 | |
207 | { | 201 | if (oldcode == -1) { |
208 | outbuf[outpos++] = (char_type)(finchar = (int)(oldcode = code)); | 202 | outbuf[outpos++] = (unsigned char) (finchar = |
203 | (int) (oldcode = code)); | ||
209 | continue; | 204 | continue; |
210 | } | 205 | } |
211 | 206 | ||
212 | if (code == CLEAR && block_mode) | 207 | if (code == CLEAR && block_mode) { |
213 | { | ||
214 | clear_tab_prefixof(); | 208 | clear_tab_prefixof(); |
215 | free_ent = FIRST - 1; | 209 | free_ent = FIRST - 1; |
216 | posbits = ((posbits-1) + ((n_bits<<3) - | 210 | posbits = |
217 | (posbits-1+(n_bits<<3))%(n_bits<<3))); | 211 | ((posbits - 1) + |
218 | maxcode = MAXCODE(n_bits = INIT_BITS)-1; | 212 | ((n_bits << 3) - |
219 | bitmask = (1<<n_bits)-1; | 213 | (posbits - 1 + (n_bits << 3)) % (n_bits << 3))); |
214 | maxcode = MAXCODE(n_bits = INIT_BITS) - 1; | ||
215 | bitmask = (1 << n_bits) - 1; | ||
220 | goto resetbuf; | 216 | goto resetbuf; |
221 | } | 217 | } |
222 | 218 | ||
223 | incode = code; | 219 | incode = code; |
224 | stackp = de_stack; | 220 | stackp = de_stack; |
225 | 221 | ||
226 | if (code >= free_ent) /* Special case for KwKwK string. */ | 222 | /* Special case for KwKwK string. */ |
227 | { | 223 | if (code >= free_ent) { |
228 | if (code > free_ent) | 224 | if (code > free_ent) { |
229 | { | 225 | unsigned char *p; |
230 | char_type *p; | ||
231 | 226 | ||
232 | posbits -= n_bits; | 227 | posbits -= n_bits; |
233 | p = &inbuf[posbits>>3]; | 228 | p = &inbuf[posbits >> 3]; |
234 | 229 | ||
235 | fprintf(stderr, "insize:%d posbits:%d inbuf:%02X %02X %02X %02X %02X (%d)\n", insize, posbits, | 230 | error_msg |
236 | p[-1],p[0],p[1],p[2],p[3], (posbits&07)); | 231 | ("insize:%d posbits:%d inbuf:%02X %02X %02X %02X %02X (%d)", |
237 | fprintf(stderr, "uncompress: corrupt input\n"); | 232 | insize, posbits, p[-1], p[0], p[1], p[2], p[3], |
233 | (posbits & 07)); | ||
234 | error_msg("uncompress: corrupt input"); | ||
238 | return -1; | 235 | return -1; |
239 | } | 236 | } |
240 | 237 | ||
241 | *--stackp = (char_type)finchar; | 238 | *--stackp = (unsigned char) finchar; |
242 | code = oldcode; | 239 | code = oldcode; |
243 | } | 240 | } |
244 | 241 | ||
245 | while ((cmp_code_int)code >= (cmp_code_int)256) | 242 | /* Generate output characters in reverse order */ |
246 | { /* Generate output characters in reverse order */ | 243 | while ((long int) code >= (long int) 256) { |
247 | *--stackp = tab_suffixof(code); | 244 | *--stackp = tab_suffixof(code); |
248 | code = tab_prefixof(code); | 245 | code = tab_prefixof(code); |
249 | } | 246 | } |
250 | 247 | ||
251 | *--stackp = (char_type)(finchar = tab_suffixof(code)); | 248 | *--stackp = (unsigned char) (finchar = tab_suffixof(code)); |
252 | |||
253 | /* And put them out in forward order */ | ||
254 | 249 | ||
250 | /* And put them out in forward order */ | ||
255 | { | 251 | { |
256 | int i; | 252 | int i; |
257 | 253 | ||
258 | if (outpos+(i = (de_stack-stackp)) >= OBUFSIZ) | 254 | if (outpos + (i = (de_stack - stackp)) >= OBUFSIZ) { |
259 | { | 255 | do { |
260 | do | 256 | if (i > OBUFSIZ - outpos) { |
261 | { | 257 | i = OBUFSIZ - outpos; |
262 | if (i > OBUFSIZ-outpos) i = OBUFSIZ-outpos; | 258 | } |
263 | 259 | ||
264 | if (i > 0) | 260 | if (i > 0) { |
265 | { | 261 | memcpy(outbuf + outpos, stackp, i); |
266 | memcpy(outbuf+outpos, stackp, i); | ||
267 | outpos += i; | 262 | outpos += i; |
268 | } | 263 | } |
269 | 264 | ||
270 | if (outpos >= OBUFSIZ) | 265 | if (outpos >= OBUFSIZ) { |
271 | { | ||
272 | write(fd_out, outbuf, outpos); | 266 | write(fd_out, outbuf, outpos); |
273 | outpos = 0; | 267 | outpos = 0; |
274 | } | 268 | } |
275 | stackp+= i; | 269 | stackp += i; |
276 | } | 270 | } while ((i = (de_stack - stackp)) > 0); |
277 | while ((i = (de_stack-stackp)) > 0); | 271 | } else { |
278 | } | 272 | memcpy(outbuf + outpos, stackp, i); |
279 | else | ||
280 | { | ||
281 | memcpy(outbuf+outpos, stackp, i); | ||
282 | outpos += i; | 273 | outpos += i; |
283 | } | 274 | } |
284 | } | 275 | } |
285 | 276 | ||
286 | if ((code = free_ent) < maxmaxcode) /* Generate the new entry. */ | 277 | /* Generate the new entry. */ |
287 | { | 278 | if ((code = free_ent) < maxmaxcode) { |
288 | tab_prefixof(code) = (unsigned short)oldcode; | 279 | tab_prefixof(code) = (unsigned short) oldcode; |
289 | tab_suffixof(code) = (char_type)finchar; | 280 | tab_suffixof(code) = (unsigned char) finchar; |
290 | free_ent = code+1; | 281 | free_ent = code + 1; |
291 | } | 282 | } |
292 | 283 | ||
293 | oldcode = incode; /* Remember previous code. */ | 284 | /* Remember previous code. */ |
285 | oldcode = incode; | ||
294 | } | 286 | } |
295 | 287 | ||
296 | } | 288 | } while (rsize > 0); |
297 | while (rsize > 0); | ||
298 | 289 | ||
299 | if (outpos > 0) { | 290 | if (outpos > 0) { |
300 | write(fd_out, outbuf, outpos); | 291 | write(fd_out, outbuf, outpos); |
diff --git a/archival/libunarchive/uncompress.c b/archival/libunarchive/uncompress.c index fe0f2b331..192e98126 100644 --- a/archival/libunarchive/uncompress.c +++ b/archival/libunarchive/uncompress.c | |||
@@ -32,66 +32,64 @@ | |||
32 | #include <string.h> | 32 | #include <string.h> |
33 | #include <unistd.h> | 33 | #include <unistd.h> |
34 | 34 | ||
35 | #define IBUFSIZ 2048 /* Defailt input buffer size */ | 35 | /* Defailt input buffer size */ |
36 | #define OBUFSIZ 2048 /* Default output buffer size */ | 36 | #define IBUFSIZ 2048 |
37 | 37 | ||
38 | /* Defines for third byte of header */ | 38 | /* Default output buffer size */ |
39 | #define MAGIC_1 (char_type)'\037'/* First byte of compressed file */ | 39 | #define OBUFSIZ 2048 |
40 | #define MAGIC_2 (char_type)'\235'/* Second byte of compressed file */ | 40 | |
41 | #define BIT_MASK 0x1f /* Mask for 'number of compresssion bits' */ | 41 | /* Defines for third byte of header */ |
42 | /* Masks 0x20 and 0x40 are free. */ | 42 | #define MAGIC_1 (char_type)'\037' /* First byte of compressed file */ |
43 | /* I think 0x20 should mean that there is */ | 43 | #define MAGIC_2 (char_type)'\235' /* Second byte of compressed file */ |
44 | /* a fourth header byte (for expansion). */ | 44 | #define BIT_MASK 0x1f /* Mask for 'number of compresssion bits' */ |
45 | #define BLOCK_MODE 0x80 /* Block compresssion if table is full and */ | 45 | /* Masks 0x20 and 0x40 are free. */ |
46 | /* compression rate is dropping flush tables */ | 46 | /* I think 0x20 should mean that there is */ |
47 | 47 | /* a fourth header byte (for expansion). */ | |
48 | /* the next two codes should not be changed lightly, as they must not */ | 48 | #define BLOCK_MODE 0x80 /* Block compresssion if table is full and */ |
49 | /* lie within the contiguous general code space. */ | 49 | /* compression rate is dropping flush tables */ |
50 | #define FIRST 257 /* first free entry */ | 50 | /* the next two codes should not be changed lightly, as they must not */ |
51 | #define CLEAR 256 /* table clear output code */ | 51 | /* lie within the contiguous general code space. */ |
52 | 52 | #define FIRST 257 /* first free entry */ | |
53 | #define INIT_BITS 9 /* initial number of bits/code */ | 53 | #define CLEAR 256 /* table clear output code */ |
54 | 54 | ||
55 | 55 | #define INIT_BITS 9 /* initial number of bits/code */ | |
56 | /* | 56 | |
57 | * machine variants which require cc -Dmachine: pdp11, z8000, DOS | 57 | |
58 | */ | 58 | /* machine variants which require cc -Dmachine: pdp11, z8000, DOS */ |
59 | #define FAST | 59 | #define FAST |
60 | 60 | ||
61 | #define HBITS 17 /* 50% occupancy */ | 61 | #define HBITS 17 /* 50% occupancy */ |
62 | #define HSIZE (1<<HBITS) | 62 | #define HSIZE (1<<HBITS) |
63 | #define HMASK (HSIZE-1) | 63 | #define HMASK (HSIZE-1) |
64 | #define HPRIME 9941 | 64 | #define HPRIME 9941 |
65 | #define BITS 16 | 65 | #define BITS 16 |
66 | #undef MAXSEG_64K | 66 | #undef MAXSEG_64K |
67 | |||
68 | typedef long int code_int; | ||
69 | |||
70 | typedef long int count_int; | ||
71 | typedef long int cmp_code_int; | ||
72 | |||
73 | typedef unsigned char char_type; | ||
74 | |||
75 | #define MAXCODE(n) (1L << (n)) | 67 | #define MAXCODE(n) (1L << (n)) |
76 | 68 | ||
69 | /* Block compress mode -C compatible with 2.0 */ | ||
70 | int block_mode = BLOCK_MODE; | ||
71 | |||
72 | /* user settable max # bits/code */ | ||
73 | int maxbits = BITS; | ||
77 | 74 | ||
75 | /* Exitcode of compress (-1 no file compressed) */ | ||
76 | int exit_code = -1; | ||
78 | 77 | ||
79 | int block_mode = BLOCK_MODE;/* Block compress mode -C compatible with 2.0*/ | 78 | /* Input buffer */ |
80 | int maxbits = BITS; /* user settable max # bits/code */ | 79 | unsigned char inbuf[IBUFSIZ + 64]; |
81 | int exit_code = -1; /* Exitcode of compress (-1 no file compressed) */ | ||
82 | 80 | ||
83 | char_type inbuf[IBUFSIZ+64]; /* Input buffer */ | 81 | /* Output buffer */ |
84 | char_type outbuf[OBUFSIZ+2048];/* Output buffer */ | 82 | unsigned char outbuf[OBUFSIZ + 2048]; |
85 | 83 | ||
86 | 84 | ||
87 | count_int htab[HSIZE]; | 85 | long int htab[HSIZE]; |
88 | unsigned short codetab[HSIZE]; | 86 | unsigned short codetab[HSIZE]; |
89 | 87 | ||
90 | #define htabof(i) htab[i] | 88 | #define htabof(i) htab[i] |
91 | #define codetabof(i) codetab[i] | 89 | #define codetabof(i) codetab[i] |
92 | #define tab_prefixof(i) codetabof(i) | 90 | #define tab_prefixof(i) codetabof(i) |
93 | #define tab_suffixof(i) ((char_type *)(htab))[i] | 91 | #define tab_suffixof(i) ((unsigned char *)(htab))[i] |
94 | #define de_stack ((char_type *)&(htab[HSIZE-1])) | 92 | #define de_stack ((unsigned char *)&(htab[HSIZE-1])) |
95 | #define clear_htab() memset(htab, -1, sizeof(htab)) | 93 | #define clear_htab() memset(htab, -1, sizeof(htab)) |
96 | #define clear_tab_prefixof() memset(codetab, 0, 256); | 94 | #define clear_tab_prefixof() memset(codetab, 0, 256); |
97 | 95 | ||
@@ -105,196 +103,189 @@ unsigned short codetab[HSIZE]; | |||
105 | 103 | ||
106 | extern int uncompress(int fd_in, int fd_out) | 104 | extern int uncompress(int fd_in, int fd_out) |
107 | { | 105 | { |
108 | char_type *stackp; | 106 | unsigned char *stackp; |
109 | code_int code; | 107 | long int code; |
110 | int finchar; | 108 | int finchar; |
111 | code_int oldcode; | 109 | long int oldcode; |
112 | code_int incode; | 110 | long int incode; |
113 | int inbits; | 111 | int inbits; |
114 | int posbits; | 112 | int posbits; |
115 | int outpos; | 113 | int outpos; |
116 | int insize; | 114 | int insize; |
117 | int bitmask; | 115 | int bitmask; |
118 | code_int free_ent; | 116 | long int free_ent; |
119 | code_int maxcode; | 117 | long int maxcode; |
120 | code_int maxmaxcode; | 118 | long int maxmaxcode; |
121 | int n_bits; | 119 | int n_bits; |
122 | int rsize = 0; | 120 | int rsize = 0; |
123 | 121 | ||
124 | insize = 0; | 122 | insize = 0; |
125 | 123 | ||
126 | inbuf [0] = xread_char(fd_in); | 124 | inbuf[0] = xread_char(fd_in); |
127 | 125 | ||
128 | maxbits = inbuf[0] & BIT_MASK; | 126 | maxbits = inbuf[0] & BIT_MASK; |
129 | block_mode = inbuf[0] & BLOCK_MODE; | 127 | block_mode = inbuf[0] & BLOCK_MODE; |
130 | maxmaxcode = MAXCODE(maxbits); | 128 | maxmaxcode = MAXCODE(maxbits); |
131 | 129 | ||
132 | if (maxbits > BITS) | 130 | if (maxbits > BITS) { |
133 | { | 131 | error_msg("compressed with %d bits, can only handle %d bits", maxbits, |
134 | fprintf(stderr, "compressed with %d bits, can only handle %d bits\n", maxbits, BITS); | 132 | BITS); |
135 | return -1; | 133 | return -1; |
136 | } | 134 | } |
137 | 135 | ||
138 | //fprintf(stderr, "Bits: %d, block_mode: %d\n", maxbits, block_mode ); | 136 | maxcode = MAXCODE(n_bits = INIT_BITS) - 1; |
139 | 137 | bitmask = (1 << n_bits) - 1; | |
140 | maxcode = MAXCODE(n_bits = INIT_BITS)-1; | ||
141 | bitmask = (1<<n_bits)-1; | ||
142 | oldcode = -1; | 138 | oldcode = -1; |
143 | finchar = 0; | 139 | finchar = 0; |
144 | outpos = 0; | 140 | outpos = 0; |
145 | posbits = 0<<3; | 141 | posbits = 0 << 3; |
146 | 142 | ||
147 | free_ent = ((block_mode) ? FIRST : 256); | 143 | free_ent = ((block_mode) ? FIRST : 256); |
148 | 144 | ||
149 | clear_tab_prefixof(); /* As above, initialize the first | 145 | /* As above, initialize the first 256 entries in the table. */ |
150 | 256 entries in the table. */ | 146 | clear_tab_prefixof(); |
151 | 147 | ||
152 | for (code = 255 ; code >= 0 ; --code) | 148 | for (code = 255; code >= 0; --code) { |
153 | tab_suffixof(code) = (char_type)code; | 149 | tab_suffixof(code) = (unsigned char) code; |
150 | } | ||
154 | 151 | ||
155 | do | 152 | do { |
156 | { | 153 | resetbuf:; |
157 | resetbuf: ; | ||
158 | { | 154 | { |
159 | int i; | 155 | int i; |
160 | int e; | 156 | int e; |
161 | int o; | 157 | int o; |
162 | 158 | ||
163 | e = insize-(o = (posbits>>3)); | 159 | e = insize - (o = (posbits >> 3)); |
164 | 160 | ||
165 | for (i = 0 ; i < e ; ++i) | 161 | for (i = 0; i < e; ++i) |
166 | inbuf[i] = inbuf[i+o]; | 162 | inbuf[i] = inbuf[i + o]; |
167 | 163 | ||
168 | insize = e; | 164 | insize = e; |
169 | posbits = 0; | 165 | posbits = 0; |
170 | } | 166 | } |
171 | 167 | ||
172 | if (insize < (int) sizeof(inbuf)-IBUFSIZ) | 168 | if (insize < (int) sizeof(inbuf) - IBUFSIZ) { |
173 | { | 169 | rsize = read(fd_in, inbuf + insize, IBUFSIZ); |
174 | rsize = read(fd_in, inbuf+insize, IBUFSIZ); | ||
175 | insize += rsize; | 170 | insize += rsize; |
176 | } | 171 | } |
177 | 172 | ||
178 | inbits = ((rsize > 0) ? (insize - insize%n_bits)<<3 : | 173 | inbits = ((rsize > 0) ? (insize - insize % n_bits) << 3 : |
179 | (insize<<3)-(n_bits-1)); | 174 | (insize << 3) - (n_bits - 1)); |
180 | |||
181 | while (inbits > posbits) | ||
182 | { | ||
183 | if (free_ent > maxcode) | ||
184 | { | ||
185 | posbits = ((posbits-1) + ((n_bits<<3) - | ||
186 | (posbits-1+(n_bits<<3))%(n_bits<<3))); | ||
187 | 175 | ||
176 | while (inbits > posbits) { | ||
177 | if (free_ent > maxcode) { | ||
178 | posbits = | ||
179 | ((posbits - 1) + | ||
180 | ((n_bits << 3) - | ||
181 | (posbits - 1 + (n_bits << 3)) % (n_bits << 3))); | ||
188 | ++n_bits; | 182 | ++n_bits; |
189 | if (n_bits == maxbits) | 183 | if (n_bits == maxbits) { |
190 | maxcode = maxmaxcode; | 184 | maxcode = maxmaxcode; |
191 | else | 185 | } else { |
192 | maxcode = MAXCODE(n_bits)-1; | 186 | maxcode = MAXCODE(n_bits) - 1; |
193 | 187 | } | |
194 | bitmask = (1<<n_bits)-1; | 188 | bitmask = (1 << n_bits) - 1; |
195 | goto resetbuf; | 189 | goto resetbuf; |
196 | } | 190 | } |
191 | { | ||
192 | unsigned char *p = &inbuf[posbits >> 3]; | ||
197 | 193 | ||
198 | 194 | code = | |
199 | { | 195 | ((((long) (p[0])) | ((long) (p[1]) << 8) | |
200 | char_type *p = &inbuf[posbits>>3]; | 196 | ((long) (p[2]) << 16)) >> (posbits & 0x7)) & bitmask; |
201 | code = ((((long)(p[0]))|((long)(p[1])<<8)|((long)(p[2])<<16))>>(posbits&0x7))&bitmask; | ||
202 | } | 197 | } |
203 | posbits += n_bits; | 198 | posbits += n_bits; |
204 | |||
205 | 199 | ||
206 | if (oldcode == -1) | 200 | |
207 | { | 201 | if (oldcode == -1) { |
208 | outbuf[outpos++] = (char_type)(finchar = (int)(oldcode = code)); | 202 | outbuf[outpos++] = (unsigned char) (finchar = |
203 | (int) (oldcode = code)); | ||
209 | continue; | 204 | continue; |
210 | } | 205 | } |
211 | 206 | ||
212 | if (code == CLEAR && block_mode) | 207 | if (code == CLEAR && block_mode) { |
213 | { | ||
214 | clear_tab_prefixof(); | 208 | clear_tab_prefixof(); |
215 | free_ent = FIRST - 1; | 209 | free_ent = FIRST - 1; |
216 | posbits = ((posbits-1) + ((n_bits<<3) - | 210 | posbits = |
217 | (posbits-1+(n_bits<<3))%(n_bits<<3))); | 211 | ((posbits - 1) + |
218 | maxcode = MAXCODE(n_bits = INIT_BITS)-1; | 212 | ((n_bits << 3) - |
219 | bitmask = (1<<n_bits)-1; | 213 | (posbits - 1 + (n_bits << 3)) % (n_bits << 3))); |
214 | maxcode = MAXCODE(n_bits = INIT_BITS) - 1; | ||
215 | bitmask = (1 << n_bits) - 1; | ||
220 | goto resetbuf; | 216 | goto resetbuf; |
221 | } | 217 | } |
222 | 218 | ||
223 | incode = code; | 219 | incode = code; |
224 | stackp = de_stack; | 220 | stackp = de_stack; |
225 | 221 | ||
226 | if (code >= free_ent) /* Special case for KwKwK string. */ | 222 | /* Special case for KwKwK string. */ |
227 | { | 223 | if (code >= free_ent) { |
228 | if (code > free_ent) | 224 | if (code > free_ent) { |
229 | { | 225 | unsigned char *p; |
230 | char_type *p; | ||
231 | 226 | ||
232 | posbits -= n_bits; | 227 | posbits -= n_bits; |
233 | p = &inbuf[posbits>>3]; | 228 | p = &inbuf[posbits >> 3]; |
234 | 229 | ||
235 | fprintf(stderr, "insize:%d posbits:%d inbuf:%02X %02X %02X %02X %02X (%d)\n", insize, posbits, | 230 | error_msg |
236 | p[-1],p[0],p[1],p[2],p[3], (posbits&07)); | 231 | ("insize:%d posbits:%d inbuf:%02X %02X %02X %02X %02X (%d)", |
237 | fprintf(stderr, "uncompress: corrupt input\n"); | 232 | insize, posbits, p[-1], p[0], p[1], p[2], p[3], |
233 | (posbits & 07)); | ||
234 | error_msg("uncompress: corrupt input"); | ||
238 | return -1; | 235 | return -1; |
239 | } | 236 | } |
240 | 237 | ||
241 | *--stackp = (char_type)finchar; | 238 | *--stackp = (unsigned char) finchar; |
242 | code = oldcode; | 239 | code = oldcode; |
243 | } | 240 | } |
244 | 241 | ||
245 | while ((cmp_code_int)code >= (cmp_code_int)256) | 242 | /* Generate output characters in reverse order */ |
246 | { /* Generate output characters in reverse order */ | 243 | while ((long int) code >= (long int) 256) { |
247 | *--stackp = tab_suffixof(code); | 244 | *--stackp = tab_suffixof(code); |
248 | code = tab_prefixof(code); | 245 | code = tab_prefixof(code); |
249 | } | 246 | } |
250 | 247 | ||
251 | *--stackp = (char_type)(finchar = tab_suffixof(code)); | 248 | *--stackp = (unsigned char) (finchar = tab_suffixof(code)); |
252 | |||
253 | /* And put them out in forward order */ | ||
254 | 249 | ||
250 | /* And put them out in forward order */ | ||
255 | { | 251 | { |
256 | int i; | 252 | int i; |
257 | 253 | ||
258 | if (outpos+(i = (de_stack-stackp)) >= OBUFSIZ) | 254 | if (outpos + (i = (de_stack - stackp)) >= OBUFSIZ) { |
259 | { | 255 | do { |
260 | do | 256 | if (i > OBUFSIZ - outpos) { |
261 | { | 257 | i = OBUFSIZ - outpos; |
262 | if (i > OBUFSIZ-outpos) i = OBUFSIZ-outpos; | 258 | } |
263 | 259 | ||
264 | if (i > 0) | 260 | if (i > 0) { |
265 | { | 261 | memcpy(outbuf + outpos, stackp, i); |
266 | memcpy(outbuf+outpos, stackp, i); | ||
267 | outpos += i; | 262 | outpos += i; |
268 | } | 263 | } |
269 | 264 | ||
270 | if (outpos >= OBUFSIZ) | 265 | if (outpos >= OBUFSIZ) { |
271 | { | ||
272 | write(fd_out, outbuf, outpos); | 266 | write(fd_out, outbuf, outpos); |
273 | outpos = 0; | 267 | outpos = 0; |
274 | } | 268 | } |
275 | stackp+= i; | 269 | stackp += i; |
276 | } | 270 | } while ((i = (de_stack - stackp)) > 0); |
277 | while ((i = (de_stack-stackp)) > 0); | 271 | } else { |
278 | } | 272 | memcpy(outbuf + outpos, stackp, i); |
279 | else | ||
280 | { | ||
281 | memcpy(outbuf+outpos, stackp, i); | ||
282 | outpos += i; | 273 | outpos += i; |
283 | } | 274 | } |
284 | } | 275 | } |
285 | 276 | ||
286 | if ((code = free_ent) < maxmaxcode) /* Generate the new entry. */ | 277 | /* Generate the new entry. */ |
287 | { | 278 | if ((code = free_ent) < maxmaxcode) { |
288 | tab_prefixof(code) = (unsigned short)oldcode; | 279 | tab_prefixof(code) = (unsigned short) oldcode; |
289 | tab_suffixof(code) = (char_type)finchar; | 280 | tab_suffixof(code) = (unsigned char) finchar; |
290 | free_ent = code+1; | 281 | free_ent = code + 1; |
291 | } | 282 | } |
292 | 283 | ||
293 | oldcode = incode; /* Remember previous code. */ | 284 | /* Remember previous code. */ |
285 | oldcode = incode; | ||
294 | } | 286 | } |
295 | 287 | ||
296 | } | 288 | } while (rsize > 0); |
297 | while (rsize > 0); | ||
298 | 289 | ||
299 | if (outpos > 0) { | 290 | if (outpos > 0) { |
300 | write(fd_out, outbuf, outpos); | 291 | write(fd_out, outbuf, outpos); |