James Robinson | 646469d | 2014-10-03 15:33:28 -0700 | [diff] [blame] | 1 | diff --git a/third_party/zlib/deflate.c b/third_party/zlib/deflate.c |
| 2 | index 5c4022f..88b2ec0 100644 |
| 3 | --- a/third_party/zlib/deflate.c |
| 4 | +++ b/third_party/zlib/deflate.c |
| 5 | @@ -70,14 +70,15 @@ typedef enum { |
| 6 | finish_done /* finish done, accept no more input or output */ |
| 7 | } block_state; |
| 8 | |
| 9 | -typedef block_state (*compress_func) OF((deflate_state *s, int flush)); |
| 10 | +typedef block_state (*compress_func) OF((deflate_state *s, int flush, |
| 11 | + int clas)); |
| 12 | /* Compression function. Returns the block state after the call. */ |
| 13 | |
| 14 | local void fill_window OF((deflate_state *s)); |
| 15 | -local block_state deflate_stored OF((deflate_state *s, int flush)); |
| 16 | -local block_state deflate_fast OF((deflate_state *s, int flush)); |
| 17 | +local block_state deflate_stored OF((deflate_state *s, int flush, int clas)); |
| 18 | +local block_state deflate_fast OF((deflate_state *s, int flush, int clas)); |
| 19 | #ifndef FASTEST |
| 20 | -local block_state deflate_slow OF((deflate_state *s, int flush)); |
| 21 | +local block_state deflate_slow OF((deflate_state *s, int flush, int clas)); |
| 22 | #endif |
| 23 | local block_state deflate_rle OF((deflate_state *s, int flush)); |
| 24 | local block_state deflate_huff OF((deflate_state *s, int flush)); |
| 25 | @@ -87,9 +88,9 @@ local void flush_pending OF((z_streamp strm)); |
| 26 | local int read_buf OF((z_streamp strm, Bytef *buf, unsigned size)); |
| 27 | #ifdef ASMV |
| 28 | void match_init OF((void)); /* asm code initialization */ |
| 29 | - uInt longest_match OF((deflate_state *s, IPos cur_match)); |
| 30 | + uInt longest_match OF((deflate_state *s, IPos cur_match, int clas)); |
| 31 | #else |
| 32 | -local uInt longest_match OF((deflate_state *s, IPos cur_match)); |
| 33 | +local uInt longest_match OF((deflate_state *s, IPos cur_match, int clas)); |
| 34 | #endif |
| 35 | |
| 36 | #ifdef DEBUG |
| 37 | @@ -281,6 +282,9 @@ int ZEXPORT deflateInit2_(strm, level, method, windowBits, memLevel, strategy, |
| 38 | s->window = (Bytef *) ZALLOC(strm, s->w_size, 2*sizeof(Byte)); |
| 39 | s->prev = (Posf *) ZALLOC(strm, s->w_size, sizeof(Pos)); |
| 40 | s->head = (Posf *) ZALLOC(strm, s->hash_size, sizeof(Pos)); |
| 41 | + s->class_bitmap = NULL; |
| 42 | + zmemzero(&s->cookie_locations, sizeof(s->cookie_locations)); |
| 43 | + strm->clas = 0; |
| 44 | |
| 45 | s->high_water = 0; /* nothing written to s->window yet */ |
| 46 | |
| 47 | @@ -367,6 +371,8 @@ int ZEXPORT deflateReset (strm) |
| 48 | s = (deflate_state *)strm->state; |
| 49 | s->pending = 0; |
| 50 | s->pending_out = s->pending_buf; |
| 51 | + TRY_FREE(strm, s->class_bitmap); |
| 52 | + s->class_bitmap = NULL; |
| 53 | |
| 54 | if (s->wrap < 0) { |
| 55 | s->wrap = -s->wrap; /* was made negative by deflate(..., Z_FINISH); */ |
| 56 | @@ -817,9 +823,26 @@ int ZEXPORT deflate (strm, flush) |
| 57 | (flush != Z_NO_FLUSH && s->status != FINISH_STATE)) { |
| 58 | block_state bstate; |
| 59 | |
| 60 | - bstate = s->strategy == Z_HUFFMAN_ONLY ? deflate_huff(s, flush) : |
| 61 | - (s->strategy == Z_RLE ? deflate_rle(s, flush) : |
| 62 | - (*(configuration_table[s->level].func))(s, flush)); |
| 63 | + if (strm->clas && s->class_bitmap == NULL) { |
| 64 | + /* This is the first time that we have seen alternative class |
| 65 | + * data. All data up till this point has been standard class. */ |
| 66 | + s->class_bitmap = (Bytef*) ZALLOC(strm, s->w_size/4, sizeof(Byte)); |
| 67 | + zmemzero(s->class_bitmap, s->w_size/4); |
| 68 | + } |
| 69 | + |
| 70 | + if (strm->clas && s->strategy == Z_RLE) { |
| 71 | + /* We haven't patched deflate_rle. */ |
| 72 | + ERR_RETURN(strm, Z_BUF_ERROR); |
| 73 | + } |
| 74 | + |
| 75 | + if (s->strategy == Z_HUFFMAN_ONLY) { |
| 76 | + bstate = deflate_huff(s, flush); |
| 77 | + } else if (s->strategy == Z_RLE) { |
| 78 | + bstate = deflate_rle(s, flush); |
| 79 | + } else { |
| 80 | + bstate = (*(configuration_table[s->level].func)) |
| 81 | + (s, flush, strm->clas); |
| 82 | + } |
| 83 | |
| 84 | if (bstate == finish_started || bstate == finish_done) { |
| 85 | s->status = FINISH_STATE; |
| 86 | @@ -915,6 +938,7 @@ int ZEXPORT deflateEnd (strm) |
| 87 | TRY_FREE(strm, strm->state->head); |
| 88 | TRY_FREE(strm, strm->state->prev); |
| 89 | TRY_FREE(strm, strm->state->window); |
| 90 | + TRY_FREE(strm, strm->state->class_bitmap); |
| 91 | |
| 92 | ZFREE(strm, strm->state); |
| 93 | strm->state = Z_NULL; |
| 94 | @@ -1046,6 +1070,57 @@ local void lm_init (s) |
| 95 | #endif |
| 96 | } |
| 97 | |
| 98 | +/* class_set sets bits [offset,offset+len) in s->class_bitmap to either 1 (if |
| 99 | + * class != 0) or 0 (otherwise). */ |
| 100 | +local void class_set(s, offset, len, clas) |
| 101 | + deflate_state *s; |
| 102 | + IPos offset; |
| 103 | + uInt len; |
| 104 | + int clas; |
| 105 | +{ |
| 106 | + IPos byte = offset >> 3; |
| 107 | + IPos bit = offset & 7; |
| 108 | + Bytef class_byte_value = clas ? 0xff : 0x00; |
| 109 | + Bytef class_bit_value = clas ? 1 : 0; |
| 110 | + static const Bytef mask[8] = {0xfe, 0xfd, 0xfb, 0xf7, |
| 111 | + 0xef, 0xdf, 0xbf, 0x7f}; |
| 112 | + |
| 113 | + if (bit) { |
| 114 | + while (len) { |
| 115 | + s->class_bitmap[byte] &= mask[bit]; |
| 116 | + s->class_bitmap[byte] |= class_bit_value << bit; |
| 117 | + bit++; |
| 118 | + len--; |
| 119 | + if (bit == 8) { |
| 120 | + bit = 0; |
| 121 | + byte++; |
| 122 | + break; |
| 123 | + } |
| 124 | + } |
| 125 | + } |
| 126 | + |
| 127 | + while (len >= 8) { |
| 128 | + s->class_bitmap[byte++] = class_byte_value; |
| 129 | + len -= 8; |
| 130 | + } |
| 131 | + |
| 132 | + while (len) { |
| 133 | + s->class_bitmap[byte] &= mask[bit]; |
| 134 | + s->class_bitmap[byte] |= class_bit_value << bit; |
| 135 | + bit++; |
| 136 | + len--; |
| 137 | + } |
| 138 | +} |
| 139 | + |
| 140 | +local int class_at(s, window_offset) |
| 141 | + deflate_state *s; |
| 142 | + IPos window_offset; |
| 143 | +{ |
| 144 | + IPos byte = window_offset >> 3; |
| 145 | + IPos bit = window_offset & 7; |
| 146 | + return (s->class_bitmap[byte] >> bit) & 1; |
| 147 | +} |
| 148 | + |
| 149 | #ifndef FASTEST |
| 150 | /* =========================================================================== |
| 151 | * Set match_start to the longest match starting at the given string and |
| 152 | @@ -1060,9 +1135,10 @@ local void lm_init (s) |
| 153 | /* For 80x86 and 680x0, an optimized version will be provided in match.asm or |
| 154 | * match.S. The code will be functionally equivalent. |
| 155 | */ |
| 156 | -local uInt longest_match(s, cur_match) |
| 157 | +local uInt longest_match(s, cur_match, clas) |
| 158 | deflate_state *s; |
| 159 | IPos cur_match; /* current match */ |
| 160 | + int clas; |
| 161 | { |
| 162 | unsigned chain_length = s->max_chain_length;/* max hash chain length */ |
| 163 | register Bytef *scan = s->window + s->strstart; /* current string */ |
| 164 | @@ -1110,6 +1186,9 @@ local uInt longest_match(s, cur_match) |
| 165 | do { |
| 166 | Assert(cur_match < s->strstart, "no future"); |
| 167 | match = s->window + cur_match; |
| 168 | + /* If the matched data is in the wrong class, skip it. */ |
| 169 | + if (s->class_bitmap && class_at(s, cur_match) != clas) |
| 170 | + continue; |
| 171 | |
| 172 | /* Skip to next match if the match length cannot increase |
| 173 | * or if the match length is less than 2. Note that the checks below |
| 174 | @@ -1152,6 +1231,8 @@ local uInt longest_match(s, cur_match) |
| 175 | len = (MAX_MATCH - 1) - (int)(strend-scan); |
| 176 | scan = strend - (MAX_MATCH-1); |
| 177 | |
| 178 | +#error "UNALIGNED_OK hasn't been patched." |
| 179 | + |
| 180 | #else /* UNALIGNED_OK */ |
| 181 | |
| 182 | if (match[best_len] != scan_end || |
| 183 | @@ -1168,15 +1249,23 @@ local uInt longest_match(s, cur_match) |
| 184 | scan += 2, match++; |
| 185 | Assert(*scan == *match, "match[2]?"); |
| 186 | |
| 187 | - /* We check for insufficient lookahead only every 8th comparison; |
| 188 | - * the 256th check will be made at strstart+258. |
| 189 | - */ |
| 190 | - do { |
| 191 | - } while (*++scan == *++match && *++scan == *++match && |
| 192 | - *++scan == *++match && *++scan == *++match && |
| 193 | - *++scan == *++match && *++scan == *++match && |
| 194 | - *++scan == *++match && *++scan == *++match && |
| 195 | - scan < strend); |
| 196 | + if (!s->class_bitmap) { |
| 197 | + /* We check for insufficient lookahead only every 8th comparison; |
| 198 | + * the 256th check will be made at strstart+258. |
| 199 | + */ |
| 200 | + do { |
| 201 | + } while (*++scan == *++match && *++scan == *++match && |
| 202 | + *++scan == *++match && *++scan == *++match && |
| 203 | + *++scan == *++match && *++scan == *++match && |
| 204 | + *++scan == *++match && *++scan == *++match && |
| 205 | + scan < strend); |
| 206 | + } else { |
| 207 | + /* We have to be mindful of the class of the data and not stray. */ |
| 208 | + do { |
| 209 | + } while (*++scan == *++match && |
| 210 | + class_at(s, match - s->window) == clas && |
| 211 | + scan < strend); |
| 212 | + } |
| 213 | |
| 214 | Assert(scan <= s->window+(unsigned)(s->window_size-1), "wild scan"); |
| 215 | |
| 216 | @@ -1204,20 +1293,74 @@ local uInt longest_match(s, cur_match) |
| 217 | } |
| 218 | #endif /* ASMV */ |
| 219 | |
| 220 | +/* cookie_match is a replacement for longest_match in the case of cookie data. |
| 221 | + * Here we only wish to match the entire value so trying the partial matches in |
| 222 | + * longest_match is both wasteful and often fails to find the correct match. |
| 223 | + * |
| 224 | + * So we take the djb2 hash of the cookie and look up the last position for a |
| 225 | + * match in a special hash table. */ |
| 226 | +local uInt cookie_match(s, start, len) |
| 227 | + deflate_state *s; |
| 228 | + IPos start; |
| 229 | + unsigned len; |
| 230 | +{ |
| 231 | + unsigned hash = 5381; |
| 232 | + Bytef *str = s->window + start; |
| 233 | + unsigned i; |
| 234 | + IPos cookie_location; |
| 235 | + |
| 236 | + if (len >= MAX_MATCH || len == 0) |
| 237 | + return 0; |
| 238 | + |
| 239 | + for (i = 0; i < len; i++) |
| 240 | + hash = ((hash << 5) + hash) + str[i]; |
| 241 | + |
| 242 | + hash &= Z_COOKIE_HASH_MASK; |
| 243 | + cookie_location = s->cookie_locations[hash]; |
| 244 | + s->cookie_locations[hash] = start; |
| 245 | + s->match_start = 0; |
| 246 | + if (cookie_location && |
| 247 | + (start - cookie_location) > len && |
| 248 | + (start - cookie_location) < MAX_DIST(s) && |
| 249 | + len <= s->lookahead) { |
| 250 | + for (i = 0; i < len; i++) { |
| 251 | + if (s->window[start+i] != s->window[cookie_location+i] || |
| 252 | + class_at(s, cookie_location+i) != 1) { |
| 253 | + return 0; |
| 254 | + } |
| 255 | + } |
| 256 | + /* Check that we aren't matching a prefix of another cookie by ensuring |
| 257 | + * that the final byte is either a semicolon (which cannot appear in a |
| 258 | + * cookie value), or non-cookie data. */ |
| 259 | + if (s->window[cookie_location+len-1] != ';' && |
| 260 | + class_at(s, cookie_location+len) != 0) { |
| 261 | + return 0; |
| 262 | + } |
| 263 | + s->match_start = cookie_location; |
| 264 | + return len; |
| 265 | + } |
| 266 | + |
| 267 | + return 0; |
| 268 | +} |
| 269 | + |
| 270 | + |
| 271 | #else /* FASTEST */ |
| 272 | |
| 273 | /* --------------------------------------------------------------------------- |
| 274 | * Optimized version for FASTEST only |
| 275 | */ |
| 276 | -local uInt longest_match(s, cur_match) |
| 277 | +local uInt longest_match(s, cur_match, clas) |
| 278 | deflate_state *s; |
| 279 | IPos cur_match; /* current match */ |
| 280 | + int clas; |
| 281 | { |
| 282 | register Bytef *scan = s->window + s->strstart; /* current string */ |
| 283 | register Bytef *match; /* matched string */ |
| 284 | register int len; /* length of current match */ |
| 285 | register Bytef *strend = s->window + s->strstart + MAX_MATCH; |
| 286 | |
| 287 | +#error "This code not patched" |
| 288 | + |
| 289 | /* The code is optimized for HASH_BITS >= 8 and MAX_MATCH-2 multiple of 16. |
| 290 | * It is easy to get rid of this optimization if necessary. |
| 291 | */ |
| 292 | @@ -1360,6 +1503,21 @@ local void fill_window(s) |
| 293 | */ |
| 294 | } while (--n); |
| 295 | #endif |
| 296 | + |
| 297 | + for (n = 0; n < Z_COOKIE_HASH_SIZE; n++) { |
| 298 | + if (s->cookie_locations[n] > wsize) { |
| 299 | + s->cookie_locations[n] -= wsize; |
| 300 | + } else { |
| 301 | + s->cookie_locations[n] = 0; |
| 302 | + } |
| 303 | + } |
| 304 | + |
| 305 | + if (s->class_bitmap) { |
| 306 | + zmemcpy(s->class_bitmap, s->class_bitmap + s->w_size/8, |
| 307 | + s->w_size/8); |
| 308 | + zmemzero(s->class_bitmap + s->w_size/8, s->w_size/8); |
| 309 | + } |
| 310 | + |
| 311 | more += wsize; |
| 312 | } |
| 313 | if (s->strm->avail_in == 0) return; |
| 314 | @@ -1378,6 +1536,9 @@ local void fill_window(s) |
| 315 | Assert(more >= 2, "more < 2"); |
| 316 | |
| 317 | n = read_buf(s->strm, s->window + s->strstart + s->lookahead, more); |
| 318 | + if (s->class_bitmap != NULL) { |
| 319 | + class_set(s, s->strstart + s->lookahead, n, s->strm->clas); |
| 320 | + } |
| 321 | s->lookahead += n; |
| 322 | |
| 323 | /* Initialize the hash value now that we have some input: */ |
| 324 | @@ -1459,9 +1620,10 @@ local void fill_window(s) |
| 325 | * NOTE: this function should be optimized to avoid extra copying from |
| 326 | * window to pending_buf. |
| 327 | */ |
| 328 | -local block_state deflate_stored(s, flush) |
| 329 | +local block_state deflate_stored(s, flush, clas) |
| 330 | deflate_state *s; |
| 331 | int flush; |
| 332 | + int clas; |
| 333 | { |
| 334 | /* Stored blocks are limited to 0xffff bytes, pending_buf is limited |
| 335 | * to pending_buf_size, and each stored block has a 5 byte header: |
| 336 | @@ -1517,13 +1679,19 @@ local block_state deflate_stored(s, flush) |
| 337 | * new strings in the dictionary only for unmatched strings or for short |
| 338 | * matches. It is used only for the fast compression options. |
| 339 | */ |
| 340 | -local block_state deflate_fast(s, flush) |
| 341 | +local block_state deflate_fast(s, flush, clas) |
| 342 | deflate_state *s; |
| 343 | int flush; |
| 344 | + int clas; |
| 345 | { |
| 346 | IPos hash_head; /* head of the hash chain */ |
| 347 | int bflush; /* set if current block must be flushed */ |
| 348 | |
| 349 | + if (clas != 0) { |
| 350 | + /* We haven't patched this code for alternative class data. */ |
| 351 | + return Z_BUF_ERROR; |
| 352 | + } |
| 353 | + |
| 354 | for (;;) { |
| 355 | /* Make sure that we always have enough lookahead, except |
| 356 | * at the end of the input file. We need MAX_MATCH bytes |
| 357 | @@ -1554,7 +1722,7 @@ local block_state deflate_fast(s, flush) |
| 358 | * of window index 0 (in particular we have to avoid a match |
| 359 | * of the string with itself at the start of the input file). |
| 360 | */ |
| 361 | - s->match_length = longest_match (s, hash_head); |
| 362 | + s->match_length = longest_match (s, hash_head, clas); |
| 363 | /* longest_match() sets match_start */ |
| 364 | } |
| 365 | if (s->match_length >= MIN_MATCH) { |
| 366 | @@ -1613,12 +1781,25 @@ local block_state deflate_fast(s, flush) |
| 367 | * evaluation for matches: a match is finally adopted only if there is |
| 368 | * no better match at the next window position. |
| 369 | */ |
| 370 | -local block_state deflate_slow(s, flush) |
| 371 | +local block_state deflate_slow(s, flush, clas) |
| 372 | deflate_state *s; |
| 373 | int flush; |
| 374 | + int clas; |
| 375 | { |
| 376 | IPos hash_head; /* head of hash chain */ |
| 377 | int bflush; /* set if current block must be flushed */ |
| 378 | + uInt input_length ; |
| 379 | + int first = 1; /* first says whether this is the first iteration |
| 380 | + of the loop, below. */ |
| 381 | + |
| 382 | + if (clas == Z_CLASS_COOKIE) { |
| 383 | + if (s->lookahead) { |
| 384 | + /* Alternative class data must always be presented at the beginning |
| 385 | + * of a block. */ |
| 386 | + return Z_BUF_ERROR; |
| 387 | + } |
| 388 | + input_length = s->strm->avail_in; |
| 389 | + } |
| 390 | |
| 391 | /* Process the input block. */ |
| 392 | for (;;) { |
| 393 | @@ -1648,13 +1829,18 @@ local block_state deflate_slow(s, flush) |
| 394 | s->prev_length = s->match_length, s->prev_match = s->match_start; |
| 395 | s->match_length = MIN_MATCH-1; |
| 396 | |
| 397 | - if (hash_head != NIL && s->prev_length < s->max_lazy_match && |
| 398 | - s->strstart - hash_head <= MAX_DIST(s)) { |
| 399 | + if (clas == Z_CLASS_COOKIE && first) { |
| 400 | + s->match_length = cookie_match(s, s->strstart, input_length); |
| 401 | + } else if (clas == Z_CLASS_STANDARD && |
| 402 | + hash_head != NIL && |
| 403 | + s->prev_length < s->max_lazy_match && |
| 404 | + s->strstart - hash_head <= MAX_DIST(s)) { |
| 405 | /* To simplify the code, we prevent matches with the string |
| 406 | * of window index 0 (in particular we have to avoid a match |
| 407 | * of the string with itself at the start of the input file). |
| 408 | */ |
| 409 | - s->match_length = longest_match (s, hash_head); |
| 410 | + s->match_length = longest_match (s, hash_head, clas); |
| 411 | + |
| 412 | /* longest_match() sets match_start */ |
| 413 | |
| 414 | if (s->match_length <= 5 && (s->strategy == Z_FILTERED |
| 415 | @@ -1673,7 +1859,20 @@ local block_state deflate_slow(s, flush) |
| 416 | /* If there was a match at the previous step and the current |
| 417 | * match is not better, output the previous match: |
| 418 | */ |
| 419 | - if (s->prev_length >= MIN_MATCH && s->match_length <= s->prev_length) { |
| 420 | + first = 0; |
| 421 | + if (s->prev_length >= MIN_MATCH && s->match_length <= s->prev_length && |
| 422 | + /* We will only accept an exact match for Z_CLASS_COOKIE data and |
| 423 | + * we won't match Z_CLASS_HUFFMAN_ONLY data at all. */ |
| 424 | + (clas == Z_CLASS_STANDARD || (clas == Z_CLASS_COOKIE && |
| 425 | + s->prev_length == input_length && |
| 426 | + s->prev_match > 0 && |
| 427 | + /* We require that a Z_CLASS_COOKIE match be |
| 428 | + * preceded by either a semicolon (which cannot be |
| 429 | + * part of a cookie), or non-cookie data. This is |
| 430 | + * to prevent a cookie from being a suffix of |
| 431 | + * another. */ |
| 432 | + (class_at(s, s->prev_match-1) == Z_CLASS_STANDARD || |
| 433 | + *(s->window + s->prev_match-1) == ';')))) { |
| 434 | uInt max_insert = s->strstart + s->lookahead - MIN_MATCH; |
| 435 | /* Do not insert strings in hash table beyond this. */ |
| 436 | |
| 437 | diff --git a/third_party/zlib/deflate.h b/third_party/zlib/deflate.h |
| 438 | index cbf0d1e..2fe6fd6 100644 |
| 439 | --- a/third_party/zlib/deflate.h |
| 440 | +++ b/third_party/zlib/deflate.h |
| 441 | @@ -91,6 +91,9 @@ typedef unsigned IPos; |
| 442 | * save space in the various tables. IPos is used only for parameter passing. |
| 443 | */ |
| 444 | |
| 445 | +#define Z_COOKIE_HASH_SIZE 256 |
| 446 | +#define Z_COOKIE_HASH_MASK (Z_COOKIE_HASH_SIZE-1) |
| 447 | + |
| 448 | typedef struct internal_state { |
| 449 | z_streamp strm; /* pointer back to this zlib stream */ |
| 450 | int status; /* as the name implies */ |
| 451 | @@ -139,6 +142,8 @@ typedef struct internal_state { |
| 452 | uInt hash_mask; /* hash_size-1 */ |
| 453 | |
| 454 | uInt hash_shift; |
| 455 | + Bytef *class_bitmap; /* bitmap of class for each byte in window */ |
| 456 | + IPos cookie_locations[Z_COOKIE_HASH_SIZE]; |
| 457 | /* Number of bits by which ins_h must be shifted at each input |
| 458 | * step. It must be such that after MIN_MATCH steps, the oldest |
| 459 | * byte no longer takes part in the hash key, that is: |
| 460 | diff --git a/third_party/zlib/zlib.h b/third_party/zlib/zlib.h |
| 461 | index 4d54af9..da7e971 100644 |
| 462 | --- a/third_party/zlib/zlib.h |
| 463 | +++ b/third_party/zlib/zlib.h |
| 464 | @@ -101,6 +101,7 @@ typedef struct z_stream_s { |
| 465 | int data_type; /* best guess about the data type: binary or text */ |
| 466 | uLong adler; /* adler32 value of the uncompressed data */ |
| 467 | uLong reserved; /* reserved for future use */ |
| 468 | + int clas; |
| 469 | } z_stream; |
| 470 | |
| 471 | typedef z_stream FAR *z_streamp; |
| 472 | @@ -207,6 +208,10 @@ typedef gz_header FAR *gz_headerp; |
| 473 | |
| 474 | #define Z_NULL 0 /* for initializing zalloc, zfree, opaque */ |
| 475 | |
| 476 | +#define Z_CLASS_STANDARD 0 |
| 477 | +#define Z_CLASS_COOKIE 1 |
| 478 | +#define Z_CLASS_HUFFMAN_ONLY 2 |
| 479 | + |
| 480 | #define zlib_version zlibVersion() |
| 481 | /* for compatibility with versions < 1.0.2 */ |
| 482 | |
| 483 | @@ -1587,6 +1592,13 @@ ZEXTERN int ZEXPORT inflateBackInit_ OF((z_streamp strm, int windowBits, |
| 484 | ZEXTERN z_off_t ZEXPORT gzoffset64 OF((gzFile)); |
| 485 | ZEXTERN uLong ZEXPORT adler32_combine64 OF((uLong, uLong, z_off_t)); |
| 486 | ZEXTERN uLong ZEXPORT crc32_combine64 OF((uLong, uLong, z_off_t)); |
| 487 | +# else |
| 488 | + ZEXTERN gzFile ZEXPORT gzopen OF((const char *, const char *)); |
| 489 | + ZEXTERN z_off_t ZEXPORT gzseek OF((gzFile, z_off_t, int)); |
| 490 | + ZEXTERN z_off_t ZEXPORT gztell OF((gzFile)); |
| 491 | + ZEXTERN z_off_t ZEXPORT gzoffset OF((gzFile)); |
| 492 | + ZEXTERN uLong ZEXPORT adler32_combine OF((uLong, uLong, z_off_t)); |
| 493 | + ZEXTERN uLong ZEXPORT crc32_combine OF((uLong, uLong, z_off_t)); |
| 494 | # endif |
| 495 | #else |
| 496 | ZEXTERN gzFile ZEXPORT gzopen OF((const char *, const char *)); |