diff options
| author | bug1 <bug1@69ca8d6d-28ef-0310-b511-8ec308f3f277> | 2002-11-28 09:09:47 +0000 |
|---|---|---|
| committer | bug1 <bug1@69ca8d6d-28ef-0310-b511-8ec308f3f277> | 2002-11-28 09:09:47 +0000 |
| commit | ec2b1314b229cb963155c8a982c199e48cb205a0 (patch) | |
| tree | 83db6adf5c0ec2ae9c348a4bb4a6cfdd7511b34c | |
| parent | 0b87619227262396d1acd7d72a54a298ef8ed64e (diff) | |
| download | busybox-w32-ec2b1314b229cb963155c8a982c199e48cb205a0.tar.gz busybox-w32-ec2b1314b229cb963155c8a982c199e48cb205a0.tar.bz2 busybox-w32-ec2b1314b229cb963155c8a982c199e48cb205a0.zip | |
Style
git-svn-id: svn://busybox.net/trunk/busybox@6040 69ca8d6d-28ef-0310-b511-8ec308f3f277
| -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); |
