diff options
-rw-r--r-- | deflate.c | 74 | ||||
-rw-r--r-- | deflate.h | 25 | ||||
-rw-r--r-- | trees.c | 50 |
3 files changed, 79 insertions, 70 deletions
@@ -255,11 +255,6 @@ int ZEXPORT deflateInit2_(strm, level, method, windowBits, memLevel, strategy, | |||
255 | int wrap = 1; | 255 | int wrap = 1; |
256 | static const char my_version[] = ZLIB_VERSION; | 256 | static const char my_version[] = ZLIB_VERSION; |
257 | 257 | ||
258 | ushf *overlay; | ||
259 | /* We overlay pending_buf and d_buf+l_buf. This works since the average | ||
260 | * output size for (length,distance) codes is <= 24 bits. | ||
261 | */ | ||
262 | |||
263 | if (version == Z_NULL || version[0] != my_version[0] || | 258 | if (version == Z_NULL || version[0] != my_version[0] || |
264 | stream_size != sizeof(z_stream)) { | 259 | stream_size != sizeof(z_stream)) { |
265 | return Z_VERSION_ERROR; | 260 | return Z_VERSION_ERROR; |
@@ -329,9 +324,47 @@ int ZEXPORT deflateInit2_(strm, level, method, windowBits, memLevel, strategy, | |||
329 | 324 | ||
330 | s->lit_bufsize = 1 << (memLevel + 6); /* 16K elements by default */ | 325 | s->lit_bufsize = 1 << (memLevel + 6); /* 16K elements by default */ |
331 | 326 | ||
332 | overlay = (ushf *) ZALLOC(strm, s->lit_bufsize, sizeof(ush)+2); | 327 | /* We overlay pending_buf and sym_buf. This works since the average size |
333 | s->pending_buf = (uchf *) overlay; | 328 | * for length/distance pairs over any compressed block is assured to be 31 |
334 | s->pending_buf_size = (ulg)s->lit_bufsize * (sizeof(ush)+2L); | 329 | * bits or less. |
330 | * | ||
331 | * Analysis: The longest fixed codes are a length code of 8 bits plus 5 | ||
332 | * extra bits, for lengths 131 to 257. The longest fixed distance codes are | ||
333 | * 5 bits plus 13 extra bits, for distances 16385 to 32768. The longest | ||
334 | * possible fixed-codes length/distance pair is then 31 bits total. | ||
335 | * | ||
336 | * sym_buf starts one-fourth of the way into pending_buf. So there are | ||
337 | * three bytes in sym_buf for every four bytes in pending_buf. Each symbol | ||
338 | * in sym_buf is three bytes -- two for the distance and one for the | ||
339 | * literal/length. As each symbol is consumed, the pointer to the next | ||
340 | * sym_buf value to read moves forward three bytes. From that symbol, up to | ||
341 | * 31 bits are written to pending_buf. The closest the written pending_buf | ||
342 | * bits gets to the next sym_buf symbol to read is just before the last | ||
343 | * code is written. At that time, 31*(n-2) bits have been written, just | ||
344 | * after 24*(n-2) bits have been consumed from sym_buf. sym_buf starts at | ||
345 | * 8*n bits into pending_buf. (Note that the symbol buffer fills when n-1 | ||
346 | * symbols are written.) The closest the writing gets to what is unread is | ||
347 | * then n+14 bits. Here n is lit_bufsize, which is 16384 by default, and | ||
348 | * can range from 128 to 32768. | ||
349 | * | ||
350 | * Therefore, at a minimum, there are 142 bits of space between what is | ||
351 | * written and what is read in the overlain buffers, so the symbols cannot | ||
352 | * be overwritten by the compressed data. That space is actually 139 bits, | ||
353 | * due to the three-bit fixed-code block header. | ||
354 | * | ||
355 | * That covers the case where either Z_FIXED is specified, forcing fixed | ||
356 | * codes, or when the use of fixed codes is chosen, because that choice | ||
357 | * results in a smaller compressed block than dynamic codes. That latter | ||
358 | * condition then assures that the above analysis also covers all dynamic | ||
359 | * blocks. A dynamic-code block will only be chosen to be emitted if it has | ||
360 | * fewer bits than a fixed-code block would for the same set of symbols. | ||
361 | * Therefore its average symbol length is assured to be less than 31. So | ||
362 | * the compressed data for a dynamic block also cannot overwrite the | ||
363 | * symbols from which it is being constructed. | ||
364 | */ | ||
365 | |||
366 | s->pending_buf = (uchf *) ZALLOC(strm, s->lit_bufsize, 4); | ||
367 | s->pending_buf_size = (ulg)s->lit_bufsize * 4; | ||
335 | 368 | ||
336 | if (s->window == Z_NULL || s->prev == Z_NULL || s->head == Z_NULL || | 369 | if (s->window == Z_NULL || s->prev == Z_NULL || s->head == Z_NULL || |
337 | s->pending_buf == Z_NULL) { | 370 | s->pending_buf == Z_NULL) { |
@@ -340,8 +373,12 @@ int ZEXPORT deflateInit2_(strm, level, method, windowBits, memLevel, strategy, | |||
340 | deflateEnd (strm); | 373 | deflateEnd (strm); |
341 | return Z_MEM_ERROR; | 374 | return Z_MEM_ERROR; |
342 | } | 375 | } |
343 | s->d_buf = overlay + s->lit_bufsize/sizeof(ush); | 376 | s->sym_buf = s->pending_buf + s->lit_bufsize; |
344 | s->l_buf = s->pending_buf + (1+sizeof(ush))*s->lit_bufsize; | 377 | s->sym_end = (s->lit_bufsize - 1) * 3; |
378 | /* We avoid equality with lit_bufsize*3 because of wraparound at 64K | ||
379 | * on 16 bit machines and because stored blocks are restricted to | ||
380 | * 64K-1 bytes. | ||
381 | */ | ||
345 | 382 | ||
346 | s->level = level; | 383 | s->level = level; |
347 | s->strategy = strategy; | 384 | s->strategy = strategy; |
@@ -552,7 +589,7 @@ int ZEXPORT deflatePrime (strm, bits, value) | |||
552 | 589 | ||
553 | if (deflateStateCheck(strm)) return Z_STREAM_ERROR; | 590 | if (deflateStateCheck(strm)) return Z_STREAM_ERROR; |
554 | s = strm->state; | 591 | s = strm->state; |
555 | if ((Bytef *)(s->d_buf) < s->pending_out + ((Buf_size + 7) >> 3)) | 592 | if (s->sym_buf < s->pending_out + ((Buf_size + 7) >> 3)) |
556 | return Z_BUF_ERROR; | 593 | return Z_BUF_ERROR; |
557 | do { | 594 | do { |
558 | put = Buf_size - s->bi_valid; | 595 | put = Buf_size - s->bi_valid; |
@@ -1113,7 +1150,6 @@ int ZEXPORT deflateCopy (dest, source) | |||
1113 | #else | 1150 | #else |
1114 | deflate_state *ds; | 1151 | deflate_state *ds; |
1115 | deflate_state *ss; | 1152 | deflate_state *ss; |
1116 | ushf *overlay; | ||
1117 | 1153 | ||
1118 | 1154 | ||
1119 | if (deflateStateCheck(source) || dest == Z_NULL) { | 1155 | if (deflateStateCheck(source) || dest == Z_NULL) { |
@@ -1133,8 +1169,7 @@ int ZEXPORT deflateCopy (dest, source) | |||
1133 | ds->window = (Bytef *) ZALLOC(dest, ds->w_size, 2*sizeof(Byte)); | 1169 | ds->window = (Bytef *) ZALLOC(dest, ds->w_size, 2*sizeof(Byte)); |
1134 | ds->prev = (Posf *) ZALLOC(dest, ds->w_size, sizeof(Pos)); | 1170 | ds->prev = (Posf *) ZALLOC(dest, ds->w_size, sizeof(Pos)); |
1135 | ds->head = (Posf *) ZALLOC(dest, ds->hash_size, sizeof(Pos)); | 1171 | ds->head = (Posf *) ZALLOC(dest, ds->hash_size, sizeof(Pos)); |
1136 | overlay = (ushf *) ZALLOC(dest, ds->lit_bufsize, sizeof(ush)+2); | 1172 | ds->pending_buf = (uchf *) ZALLOC(dest, ds->lit_bufsize, 4); |
1137 | ds->pending_buf = (uchf *) overlay; | ||
1138 | 1173 | ||
1139 | if (ds->window == Z_NULL || ds->prev == Z_NULL || ds->head == Z_NULL || | 1174 | if (ds->window == Z_NULL || ds->prev == Z_NULL || ds->head == Z_NULL || |
1140 | ds->pending_buf == Z_NULL) { | 1175 | ds->pending_buf == Z_NULL) { |
@@ -1148,8 +1183,7 @@ int ZEXPORT deflateCopy (dest, source) | |||
1148 | zmemcpy(ds->pending_buf, ss->pending_buf, (uInt)ds->pending_buf_size); | 1183 | zmemcpy(ds->pending_buf, ss->pending_buf, (uInt)ds->pending_buf_size); |
1149 | 1184 | ||
1150 | ds->pending_out = ds->pending_buf + (ss->pending_out - ss->pending_buf); | 1185 | ds->pending_out = ds->pending_buf + (ss->pending_out - ss->pending_buf); |
1151 | ds->d_buf = overlay + ds->lit_bufsize/sizeof(ush); | 1186 | ds->sym_buf = ds->pending_buf + ds->lit_bufsize; |
1152 | ds->l_buf = ds->pending_buf + (1+sizeof(ush))*ds->lit_bufsize; | ||
1153 | 1187 | ||
1154 | ds->l_desc.dyn_tree = ds->dyn_ltree; | 1188 | ds->l_desc.dyn_tree = ds->dyn_ltree; |
1155 | ds->d_desc.dyn_tree = ds->dyn_dtree; | 1189 | ds->d_desc.dyn_tree = ds->dyn_dtree; |
@@ -1925,7 +1959,7 @@ local block_state deflate_fast(s, flush) | |||
1925 | FLUSH_BLOCK(s, 1); | 1959 | FLUSH_BLOCK(s, 1); |
1926 | return finish_done; | 1960 | return finish_done; |
1927 | } | 1961 | } |
1928 | if (s->last_lit) | 1962 | if (s->sym_next) |
1929 | FLUSH_BLOCK(s, 0); | 1963 | FLUSH_BLOCK(s, 0); |
1930 | return block_done; | 1964 | return block_done; |
1931 | } | 1965 | } |
@@ -2056,7 +2090,7 @@ local block_state deflate_slow(s, flush) | |||
2056 | FLUSH_BLOCK(s, 1); | 2090 | FLUSH_BLOCK(s, 1); |
2057 | return finish_done; | 2091 | return finish_done; |
2058 | } | 2092 | } |
2059 | if (s->last_lit) | 2093 | if (s->sym_next) |
2060 | FLUSH_BLOCK(s, 0); | 2094 | FLUSH_BLOCK(s, 0); |
2061 | return block_done; | 2095 | return block_done; |
2062 | } | 2096 | } |
@@ -2131,7 +2165,7 @@ local block_state deflate_rle(s, flush) | |||
2131 | FLUSH_BLOCK(s, 1); | 2165 | FLUSH_BLOCK(s, 1); |
2132 | return finish_done; | 2166 | return finish_done; |
2133 | } | 2167 | } |
2134 | if (s->last_lit) | 2168 | if (s->sym_next) |
2135 | FLUSH_BLOCK(s, 0); | 2169 | FLUSH_BLOCK(s, 0); |
2136 | return block_done; | 2170 | return block_done; |
2137 | } | 2171 | } |
@@ -2170,7 +2204,7 @@ local block_state deflate_huff(s, flush) | |||
2170 | FLUSH_BLOCK(s, 1); | 2204 | FLUSH_BLOCK(s, 1); |
2171 | return finish_done; | 2205 | return finish_done; |
2172 | } | 2206 | } |
2173 | if (s->last_lit) | 2207 | if (s->sym_next) |
2174 | FLUSH_BLOCK(s, 0); | 2208 | FLUSH_BLOCK(s, 0); |
2175 | return block_done; | 2209 | return block_done; |
2176 | } | 2210 | } |
@@ -217,7 +217,7 @@ typedef struct internal_state { | |||
217 | /* Depth of each subtree used as tie breaker for trees of equal frequency | 217 | /* Depth of each subtree used as tie breaker for trees of equal frequency |
218 | */ | 218 | */ |
219 | 219 | ||
220 | uchf *l_buf; /* buffer for literals or lengths */ | 220 | uchf *sym_buf; /* buffer for distances and literals/lengths */ |
221 | 221 | ||
222 | uInt lit_bufsize; | 222 | uInt lit_bufsize; |
223 | /* Size of match buffer for literals/lengths. There are 4 reasons for | 223 | /* Size of match buffer for literals/lengths. There are 4 reasons for |
@@ -239,13 +239,8 @@ typedef struct internal_state { | |||
239 | * - I can't count above 4 | 239 | * - I can't count above 4 |
240 | */ | 240 | */ |
241 | 241 | ||
242 | uInt last_lit; /* running index in l_buf */ | 242 | uInt sym_next; /* running index in sym_buf */ |
243 | 243 | uInt sym_end; /* symbol table full when sym_next reaches this */ | |
244 | ushf *d_buf; | ||
245 | /* Buffer for distances. To simplify the code, d_buf and l_buf have | ||
246 | * the same number of elements. To use different lengths, an extra flag | ||
247 | * array would be necessary. | ||
248 | */ | ||
249 | 244 | ||
250 | ulg opt_len; /* bit length of current block with optimal trees */ | 245 | ulg opt_len; /* bit length of current block with optimal trees */ |
251 | ulg static_len; /* bit length of current block with static trees */ | 246 | ulg static_len; /* bit length of current block with static trees */ |
@@ -325,20 +320,22 @@ void ZLIB_INTERNAL _tr_stored_block OF((deflate_state *s, charf *buf, | |||
325 | 320 | ||
326 | # define _tr_tally_lit(s, c, flush) \ | 321 | # define _tr_tally_lit(s, c, flush) \ |
327 | { uch cc = (c); \ | 322 | { uch cc = (c); \ |
328 | s->d_buf[s->last_lit] = 0; \ | 323 | s->sym_buf[s->sym_next++] = 0; \ |
329 | s->l_buf[s->last_lit++] = cc; \ | 324 | s->sym_buf[s->sym_next++] = 0; \ |
325 | s->sym_buf[s->sym_next++] = cc; \ | ||
330 | s->dyn_ltree[cc].Freq++; \ | 326 | s->dyn_ltree[cc].Freq++; \ |
331 | flush = (s->last_lit == s->lit_bufsize-1); \ | 327 | flush = (s->sym_next == s->sym_end); \ |
332 | } | 328 | } |
333 | # define _tr_tally_dist(s, distance, length, flush) \ | 329 | # define _tr_tally_dist(s, distance, length, flush) \ |
334 | { uch len = (uch)(length); \ | 330 | { uch len = (uch)(length); \ |
335 | ush dist = (ush)(distance); \ | 331 | ush dist = (ush)(distance); \ |
336 | s->d_buf[s->last_lit] = dist; \ | 332 | s->sym_buf[s->sym_next++] = dist; \ |
337 | s->l_buf[s->last_lit++] = len; \ | 333 | s->sym_buf[s->sym_next++] = dist >> 8; \ |
334 | s->sym_buf[s->sym_next++] = len; \ | ||
338 | dist--; \ | 335 | dist--; \ |
339 | s->dyn_ltree[_length_code[len]+LITERALS+1].Freq++; \ | 336 | s->dyn_ltree[_length_code[len]+LITERALS+1].Freq++; \ |
340 | s->dyn_dtree[d_code(dist)].Freq++; \ | 337 | s->dyn_dtree[d_code(dist)].Freq++; \ |
341 | flush = (s->last_lit == s->lit_bufsize-1); \ | 338 | flush = (s->sym_next == s->sym_end); \ |
342 | } | 339 | } |
343 | #else | 340 | #else |
344 | # define _tr_tally_lit(s, c, flush) flush = _tr_tally(s, 0, c) | 341 | # define _tr_tally_lit(s, c, flush) flush = _tr_tally(s, 0, c) |
@@ -416,7 +416,7 @@ local void init_block(s) | |||
416 | 416 | ||
417 | s->dyn_ltree[END_BLOCK].Freq = 1; | 417 | s->dyn_ltree[END_BLOCK].Freq = 1; |
418 | s->opt_len = s->static_len = 0L; | 418 | s->opt_len = s->static_len = 0L; |
419 | s->last_lit = s->matches = 0; | 419 | s->sym_next = s->matches = 0; |
420 | } | 420 | } |
421 | 421 | ||
422 | #define SMALLEST 1 | 422 | #define SMALLEST 1 |
@@ -948,7 +948,7 @@ void ZLIB_INTERNAL _tr_flush_block(s, buf, stored_len, last) | |||
948 | 948 | ||
949 | Tracev((stderr, "\nopt %lu(%lu) stat %lu(%lu) stored %lu lit %u ", | 949 | Tracev((stderr, "\nopt %lu(%lu) stat %lu(%lu) stored %lu lit %u ", |
950 | opt_lenb, s->opt_len, static_lenb, s->static_len, stored_len, | 950 | opt_lenb, s->opt_len, static_lenb, s->static_len, stored_len, |
951 | s->last_lit)); | 951 | s->sym_next / 3)); |
952 | 952 | ||
953 | if (static_lenb <= opt_lenb) opt_lenb = static_lenb; | 953 | if (static_lenb <= opt_lenb) opt_lenb = static_lenb; |
954 | 954 | ||
@@ -1017,8 +1017,9 @@ int ZLIB_INTERNAL _tr_tally (s, dist, lc) | |||
1017 | unsigned dist; /* distance of matched string */ | 1017 | unsigned dist; /* distance of matched string */ |
1018 | unsigned lc; /* match length-MIN_MATCH or unmatched char (if dist==0) */ | 1018 | unsigned lc; /* match length-MIN_MATCH or unmatched char (if dist==0) */ |
1019 | { | 1019 | { |
1020 | s->d_buf[s->last_lit] = (ush)dist; | 1020 | s->sym_buf[s->sym_next++] = dist; |
1021 | s->l_buf[s->last_lit++] = (uch)lc; | 1021 | s->sym_buf[s->sym_next++] = dist >> 8; |
1022 | s->sym_buf[s->sym_next++] = lc; | ||
1022 | if (dist == 0) { | 1023 | if (dist == 0) { |
1023 | /* lc is the unmatched char */ | 1024 | /* lc is the unmatched char */ |
1024 | s->dyn_ltree[lc].Freq++; | 1025 | s->dyn_ltree[lc].Freq++; |
@@ -1033,30 +1034,7 @@ int ZLIB_INTERNAL _tr_tally (s, dist, lc) | |||
1033 | s->dyn_ltree[_length_code[lc]+LITERALS+1].Freq++; | 1034 | s->dyn_ltree[_length_code[lc]+LITERALS+1].Freq++; |
1034 | s->dyn_dtree[d_code(dist)].Freq++; | 1035 | s->dyn_dtree[d_code(dist)].Freq++; |
1035 | } | 1036 | } |
1036 | 1037 | return (s->sym_next == s->sym_end); | |
1037 | #ifdef TRUNCATE_BLOCK | ||
1038 | /* Try to guess if it is profitable to stop the current block here */ | ||
1039 | if ((s->last_lit & 0x1fff) == 0 && s->level > 2) { | ||
1040 | /* Compute an upper bound for the compressed length */ | ||
1041 | ulg out_length = (ulg)s->last_lit*8L; | ||
1042 | ulg in_length = (ulg)((long)s->strstart - s->block_start); | ||
1043 | int dcode; | ||
1044 | for (dcode = 0; dcode < D_CODES; dcode++) { | ||
1045 | out_length += (ulg)s->dyn_dtree[dcode].Freq * | ||
1046 | (5L+extra_dbits[dcode]); | ||
1047 | } | ||
1048 | out_length >>= 3; | ||
1049 | Tracev((stderr,"\nlast_lit %u, in %ld, out ~%ld(%ld%%) ", | ||
1050 | s->last_lit, in_length, out_length, | ||
1051 | 100L - out_length*100L/in_length)); | ||
1052 | if (s->matches < s->last_lit/2 && out_length < in_length/2) return 1; | ||
1053 | } | ||
1054 | #endif | ||
1055 | return (s->last_lit == s->lit_bufsize-1); | ||
1056 | /* We avoid equality with lit_bufsize because of wraparound at 64K | ||
1057 | * on 16 bit machines and because stored blocks are restricted to | ||
1058 | * 64K-1 bytes. | ||
1059 | */ | ||
1060 | } | 1038 | } |
1061 | 1039 | ||
1062 | /* =========================================================================== | 1040 | /* =========================================================================== |
@@ -1069,13 +1047,14 @@ local void compress_block(s, ltree, dtree) | |||
1069 | { | 1047 | { |
1070 | unsigned dist; /* distance of matched string */ | 1048 | unsigned dist; /* distance of matched string */ |
1071 | int lc; /* match length or unmatched char (if dist == 0) */ | 1049 | int lc; /* match length or unmatched char (if dist == 0) */ |
1072 | unsigned lx = 0; /* running index in l_buf */ | 1050 | unsigned sx = 0; /* running index in sym_buf */ |
1073 | unsigned code; /* the code to send */ | 1051 | unsigned code; /* the code to send */ |
1074 | int extra; /* number of extra bits to send */ | 1052 | int extra; /* number of extra bits to send */ |
1075 | 1053 | ||
1076 | if (s->last_lit != 0) do { | 1054 | if (s->sym_next != 0) do { |
1077 | dist = s->d_buf[lx]; | 1055 | dist = s->sym_buf[sx++] & 0xff; |
1078 | lc = s->l_buf[lx++]; | 1056 | dist += (unsigned)(s->sym_buf[sx++] & 0xff) << 8; |
1057 | lc = s->sym_buf[sx++]; | ||
1079 | if (dist == 0) { | 1058 | if (dist == 0) { |
1080 | send_code(s, lc, ltree); /* send a literal byte */ | 1059 | send_code(s, lc, ltree); /* send a literal byte */ |
1081 | Tracecv(isgraph(lc), (stderr," '%c' ", lc)); | 1060 | Tracecv(isgraph(lc), (stderr," '%c' ", lc)); |
@@ -1100,11 +1079,10 @@ local void compress_block(s, ltree, dtree) | |||
1100 | } | 1079 | } |
1101 | } /* literal or match pair ? */ | 1080 | } /* literal or match pair ? */ |
1102 | 1081 | ||
1103 | /* Check that the overlay between pending_buf and d_buf+l_buf is ok: */ | 1082 | /* Check that the overlay between pending_buf and sym_buf is ok: */ |
1104 | Assert((uInt)(s->pending) < s->lit_bufsize + 2*lx, | 1083 | Assert(s->pending < s->lit_bufsize + sx, "pendingBuf overflow"); |
1105 | "pendingBuf overflow"); | ||
1106 | 1084 | ||
1107 | } while (lx < s->last_lit); | 1085 | } while (sx < s->sym_next); |
1108 | 1086 | ||
1109 | send_code(s, END_BLOCK, ltree); | 1087 | send_code(s, END_BLOCK, ltree); |
1110 | } | 1088 | } |