Index: third_party/zlib/mixed-source.patch |
diff --git a/third_party/zlib/mixed-source.patch b/third_party/zlib/mixed-source.patch |
deleted file mode 100644 |
index 4ce1632528385d2451248a6b9ae91645b438495b..0000000000000000000000000000000000000000 |
--- a/third_party/zlib/mixed-source.patch |
+++ /dev/null |
@@ -1,498 +0,0 @@ |
-diff --git a/third_party/zlib/deflate.c b/third_party/zlib/deflate.c |
-index 6969577..7c95b30 100644 |
---- a/third_party/zlib/deflate.c |
-+++ b/third_party/zlib/deflate.c |
-@@ -70,14 +70,15 @@ typedef enum { |
- finish_done /* finish done, accept no more input or output */ |
- } block_state; |
- |
--typedef block_state (*compress_func) OF((deflate_state *s, int flush)); |
-+typedef block_state (*compress_func) OF((deflate_state *s, int flush, |
-+ int clas)); |
- /* Compression function. Returns the block state after the call. */ |
- |
- local void fill_window OF((deflate_state *s)); |
--local block_state deflate_stored OF((deflate_state *s, int flush)); |
--local block_state deflate_fast OF((deflate_state *s, int flush)); |
-+local block_state deflate_stored OF((deflate_state *s, int flush, int clas)); |
-+local block_state deflate_fast OF((deflate_state *s, int flush, int clas)); |
- #ifndef FASTEST |
--local block_state deflate_slow OF((deflate_state *s, int flush)); |
-+local block_state deflate_slow OF((deflate_state *s, int flush, int clas)); |
- #endif |
- local block_state deflate_rle OF((deflate_state *s, int flush)); |
- local block_state deflate_huff OF((deflate_state *s, int flush)); |
-@@ -87,9 +88,9 @@ local void flush_pending OF((z_streamp strm)); |
- local int read_buf OF((z_streamp strm, Bytef *buf, unsigned size)); |
- #ifdef ASMV |
- void match_init OF((void)); /* asm code initialization */ |
-- uInt longest_match OF((deflate_state *s, IPos cur_match)); |
-+ uInt longest_match OF((deflate_state *s, IPos cur_match, int clas)); |
- #else |
--local uInt longest_match OF((deflate_state *s, IPos cur_match)); |
-+local uInt longest_match OF((deflate_state *s, IPos cur_match, int clas)); |
- #endif |
- |
- #ifdef DEBUG |
-@@ -293,6 +294,9 @@ int ZEXPORT deflateInit2_(strm, level, method, windowBits, memLevel, strategy, |
- s->window = (Bytef *) ZALLOC(strm, s->w_size, 2*sizeof(Byte)); |
- s->prev = (Posf *) ZALLOC(strm, s->w_size, sizeof(Pos)); |
- s->head = (Posf *) ZALLOC(strm, s->hash_size, sizeof(Pos)); |
-+ s->class_bitmap = NULL; |
-+ zmemzero(&s->cookie_locations, sizeof(s->cookie_locations)); |
-+ strm->clas = 0; |
- |
- s->high_water = 0; /* nothing written to s->window yet */ |
- |
-@@ -406,6 +410,8 @@ int ZEXPORT deflateResetKeep (strm) |
- s = (deflate_state *)strm->state; |
- s->pending = 0; |
- s->pending_out = s->pending_buf; |
-+ TRY_FREE(strm, s->class_bitmap); |
-+ s->class_bitmap = NULL; |
- |
- if (s->wrap < 0) { |
- s->wrap = -s->wrap; /* was made negative by deflate(..., Z_FINISH); */ |
-@@ -900,9 +906,26 @@ int ZEXPORT deflate (strm, flush) |
- (flush != Z_NO_FLUSH && s->status != FINISH_STATE)) { |
- block_state bstate; |
- |
-- bstate = s->strategy == Z_HUFFMAN_ONLY ? deflate_huff(s, flush) : |
-- (s->strategy == Z_RLE ? deflate_rle(s, flush) : |
-- (*(configuration_table[s->level].func))(s, flush)); |
-+ if (strm->clas && s->class_bitmap == NULL) { |
-+ /* This is the first time that we have seen alternative class |
-+ * data. All data up till this point has been standard class. */ |
-+ s->class_bitmap = (Bytef*) ZALLOC(strm, s->w_size/4, sizeof(Byte)); |
-+ zmemzero(s->class_bitmap, s->w_size/4); |
-+ } |
-+ |
-+ if (strm->clas && s->strategy == Z_RLE) { |
-+ /* We haven't patched deflate_rle. */ |
-+ ERR_RETURN(strm, Z_BUF_ERROR); |
-+ } |
-+ |
-+ if (s->strategy == Z_HUFFMAN_ONLY) { |
-+ bstate = deflate_huff(s, flush); |
-+ } else if (s->strategy == Z_RLE) { |
-+ bstate = deflate_rle(s, flush); |
-+ } else { |
-+ bstate = (*(configuration_table[s->level].func)) |
-+ (s, flush, strm->clas); |
-+ } |
- |
- if (bstate == finish_started || bstate == finish_done) { |
- s->status = FINISH_STATE; |
-@@ -999,6 +1022,7 @@ int ZEXPORT deflateEnd (strm) |
- TRY_FREE(strm, strm->state->head); |
- TRY_FREE(strm, strm->state->prev); |
- TRY_FREE(strm, strm->state->window); |
-+ TRY_FREE(strm, strm->state->class_bitmap); |
- |
- ZFREE(strm, strm->state); |
- strm->state = Z_NULL; |
-@@ -1131,6 +1155,57 @@ local void lm_init (s) |
- #endif |
- } |
- |
-+/* class_set sets bits [offset,offset+len) in s->class_bitmap to either 1 (if |
-+ * class != 0) or 0 (otherwise). */ |
-+local void class_set(s, offset, len, clas) |
-+ deflate_state *s; |
-+ IPos offset; |
-+ uInt len; |
-+ int clas; |
-+{ |
-+ IPos byte = offset >> 3; |
-+ IPos bit = offset & 7; |
-+ Bytef class_byte_value = clas ? 0xff : 0x00; |
-+ Bytef class_bit_value = clas ? 1 : 0; |
-+ static const Bytef mask[8] = {0xfe, 0xfd, 0xfb, 0xf7, |
-+ 0xef, 0xdf, 0xbf, 0x7f}; |
-+ |
-+ if (bit) { |
-+ while (len) { |
-+ s->class_bitmap[byte] &= mask[bit]; |
-+ s->class_bitmap[byte] |= class_bit_value << bit; |
-+ bit++; |
-+ len--; |
-+ if (bit == 8) { |
-+ bit = 0; |
-+ byte++; |
-+ break; |
-+ } |
-+ } |
-+ } |
-+ |
-+ while (len >= 8) { |
-+ s->class_bitmap[byte++] = class_byte_value; |
-+ len -= 8; |
-+ } |
-+ |
-+ while (len) { |
-+ s->class_bitmap[byte] &= mask[bit]; |
-+ s->class_bitmap[byte] |= class_bit_value << bit; |
-+ bit++; |
-+ len--; |
-+ } |
-+} |
-+ |
-+local int class_at(s, window_offset) |
-+ deflate_state *s; |
-+ IPos window_offset; |
-+{ |
-+ IPos byte = window_offset >> 3; |
-+ IPos bit = window_offset & 7; |
-+ return (s->class_bitmap[byte] >> bit) & 1; |
-+} |
-+ |
- #ifndef FASTEST |
- /* =========================================================================== |
- * Set match_start to the longest match starting at the given string and |
-@@ -1145,9 +1220,10 @@ local void lm_init (s) |
- /* For 80x86 and 680x0, an optimized version will be provided in match.asm or |
- * match.S. The code will be functionally equivalent. |
- */ |
--local uInt longest_match(s, cur_match) |
-+local uInt longest_match(s, cur_match, clas) |
- deflate_state *s; |
- IPos cur_match; /* current match */ |
-+ int clas; |
- { |
- unsigned chain_length = s->max_chain_length;/* max hash chain length */ |
- register Bytef *scan = s->window + s->strstart; /* current string */ |
-@@ -1195,6 +1271,9 @@ local uInt longest_match(s, cur_match) |
- do { |
- Assert(cur_match < s->strstart, "no future"); |
- match = s->window + cur_match; |
-+ /* If the matched data is in the wrong class, skip it. */ |
-+ if (s->class_bitmap && class_at(s, cur_match) != clas) |
-+ continue; |
- |
- /* Skip to next match if the match length cannot increase |
- * or if the match length is less than 2. Note that the checks below |
-@@ -1237,6 +1316,8 @@ local uInt longest_match(s, cur_match) |
- len = (MAX_MATCH - 1) - (int)(strend-scan); |
- scan = strend - (MAX_MATCH-1); |
- |
-+#error "UNALIGNED_OK hasn't been patched." |
-+ |
- #else /* UNALIGNED_OK */ |
- |
- if (match[best_len] != scan_end || |
-@@ -1253,15 +1334,23 @@ local uInt longest_match(s, cur_match) |
- scan += 2, match++; |
- Assert(*scan == *match, "match[2]?"); |
- |
-- /* We check for insufficient lookahead only every 8th comparison; |
-- * the 256th check will be made at strstart+258. |
-- */ |
-- do { |
-- } while (*++scan == *++match && *++scan == *++match && |
-- *++scan == *++match && *++scan == *++match && |
-- *++scan == *++match && *++scan == *++match && |
-- *++scan == *++match && *++scan == *++match && |
-- scan < strend); |
-+ if (!s->class_bitmap) { |
-+ /* We check for insufficient lookahead only every 8th comparison; |
-+ * the 256th check will be made at strstart+258. |
-+ */ |
-+ do { |
-+ } while (*++scan == *++match && *++scan == *++match && |
-+ *++scan == *++match && *++scan == *++match && |
-+ *++scan == *++match && *++scan == *++match && |
-+ *++scan == *++match && *++scan == *++match && |
-+ scan < strend); |
-+ } else { |
-+ /* We have to be mindful of the class of the data and not stray. */ |
-+ do { |
-+ } while (*++scan == *++match && |
-+ class_at(s, match - s->window) == clas && |
-+ scan < strend); |
-+ } |
- |
- Assert(scan <= s->window+(unsigned)(s->window_size-1), "wild scan"); |
- |
-@@ -1289,20 +1378,74 @@ local uInt longest_match(s, cur_match) |
- } |
- #endif /* ASMV */ |
- |
-+/* cookie_match is a replacement for longest_match in the case of cookie data. |
-+ * Here we only wish to match the entire value so trying the partial matches in |
-+ * longest_match is both wasteful and often fails to find the correct match. |
-+ * |
-+ * So we take the djb2 hash of the cookie and look up the last position for a |
-+ * match in a special hash table. */ |
-+local uInt cookie_match(s, start, len) |
-+ deflate_state *s; |
-+ IPos start; |
-+ unsigned len; |
-+{ |
-+ unsigned hash = 5381; |
-+ Bytef *str = s->window + start; |
-+ unsigned i; |
-+ IPos cookie_location; |
-+ |
-+ if (len >= MAX_MATCH || len == 0) |
-+ return 0; |
-+ |
-+ for (i = 0; i < len; i++) |
-+ hash = ((hash << 5) + hash) + str[i]; |
-+ |
-+ hash &= Z_COOKIE_HASH_MASK; |
-+ cookie_location = s->cookie_locations[hash]; |
-+ s->cookie_locations[hash] = start; |
-+ s->match_start = 0; |
-+ if (cookie_location && |
-+ (start - cookie_location) > len && |
-+ (start - cookie_location) < MAX_DIST(s) && |
-+ len <= s->lookahead) { |
-+ for (i = 0; i < len; i++) { |
-+ if (s->window[start+i] != s->window[cookie_location+i] || |
-+ class_at(s, cookie_location+i) != 1) { |
-+ return 0; |
-+ } |
-+ } |
-+ /* Check that we aren't matching a prefix of another cookie by ensuring |
-+ * that the final byte is either a semicolon (which cannot appear in a |
-+ * cookie value), or non-cookie data. */ |
-+ if (s->window[cookie_location+len-1] != ';' && |
-+ class_at(s, cookie_location+len) != 0) { |
-+ return 0; |
-+ } |
-+ s->match_start = cookie_location; |
-+ return len; |
-+ } |
-+ |
-+ return 0; |
-+} |
-+ |
-+ |
- #else /* FASTEST */ |
- |
- /* --------------------------------------------------------------------------- |
- * Optimized version for FASTEST only |
- */ |
--local uInt longest_match(s, cur_match) |
-+local uInt longest_match(s, cur_match, clas) |
- deflate_state *s; |
- IPos cur_match; /* current match */ |
-+ int clas; |
- { |
- register Bytef *scan = s->window + s->strstart; /* current string */ |
- register Bytef *match; /* matched string */ |
- register int len; /* length of current match */ |
- register Bytef *strend = s->window + s->strstart + MAX_MATCH; |
- |
-+#error "This code not patched" |
-+ |
- /* The code is optimized for HASH_BITS >= 8 and MAX_MATCH-2 multiple of 16. |
- * It is easy to get rid of this optimization if necessary. |
- */ |
-@@ -1447,6 +1590,20 @@ local void fill_window(s) |
- */ |
- } while (--n); |
- #endif |
-+ for (n = 0; n < Z_COOKIE_HASH_SIZE; n++) { |
-+ if (s->cookie_locations[n] > wsize) { |
-+ s->cookie_locations[n] -= wsize; |
-+ } else { |
-+ s->cookie_locations[n] = 0; |
-+ } |
-+ } |
-+ |
-+ if (s->class_bitmap) { |
-+ zmemcpy(s->class_bitmap, s->class_bitmap + s->w_size/8, |
-+ s->w_size/8); |
-+ zmemzero(s->class_bitmap + s->w_size/8, s->w_size/8); |
-+ } |
-+ |
- more += wsize; |
- } |
- if (s->strm->avail_in == 0) break; |
-@@ -1465,6 +1622,9 @@ local void fill_window(s) |
- Assert(more >= 2, "more < 2"); |
- |
- n = read_buf(s->strm, s->window + s->strstart + s->lookahead, more); |
-+ if (s->class_bitmap != NULL) { |
-+ class_set(s, s->strstart + s->lookahead, n, s->strm->clas); |
-+ } |
- s->lookahead += n; |
- |
- /* Initialize the hash value now that we have some input: */ |
-@@ -1561,9 +1721,10 @@ local void fill_window(s) |
- * NOTE: this function should be optimized to avoid extra copying from |
- * window to pending_buf. |
- */ |
--local block_state deflate_stored(s, flush) |
-+local block_state deflate_stored(s, flush, clas) |
- deflate_state *s; |
- int flush; |
-+ int clas; |
- { |
- /* Stored blocks are limited to 0xffff bytes, pending_buf is limited |
- * to pending_buf_size, and each stored block has a 5 byte header: |
-@@ -1625,13 +1786,19 @@ local block_state deflate_stored(s, flush) |
- * new strings in the dictionary only for unmatched strings or for short |
- * matches. It is used only for the fast compression options. |
- */ |
--local block_state deflate_fast(s, flush) |
-+local block_state deflate_fast(s, flush, clas) |
- deflate_state *s; |
- int flush; |
-+ int clas; |
- { |
- IPos hash_head; /* head of the hash chain */ |
- int bflush; /* set if current block must be flushed */ |
- |
-+ if (clas != 0) { |
-+ /* We haven't patched this code for alternative class data. */ |
-+ return Z_BUF_ERROR; |
-+ } |
-+ |
- for (;;) { |
- /* Make sure that we always have enough lookahead, except |
- * at the end of the input file. We need MAX_MATCH bytes |
-@@ -1662,7 +1829,7 @@ local block_state deflate_fast(s, flush) |
- * of window index 0 (in particular we have to avoid a match |
- * of the string with itself at the start of the input file). |
- */ |
-- s->match_length = longest_match (s, hash_head); |
-+ s->match_length = longest_match (s, hash_head, clas); |
- /* longest_match() sets match_start */ |
- } |
- if (s->match_length >= MIN_MATCH) { |
-@@ -1727,12 +1894,25 @@ local block_state deflate_fast(s, flush) |
- * evaluation for matches: a match is finally adopted only if there is |
- * no better match at the next window position. |
- */ |
--local block_state deflate_slow(s, flush) |
-+local block_state deflate_slow(s, flush, clas) |
- deflate_state *s; |
- int flush; |
-+ int clas; |
- { |
- IPos hash_head; /* head of hash chain */ |
- int bflush; /* set if current block must be flushed */ |
-+ uInt input_length ; |
-+ int first = 1; /* first says whether this is the first iteration |
-+ of the loop, below. */ |
-+ |
-+ if (clas == Z_CLASS_COOKIE) { |
-+ if (s->lookahead) { |
-+ /* Alternative class data must always be presented at the beginning |
-+ * of a block. */ |
-+ return Z_BUF_ERROR; |
-+ } |
-+ input_length = s->strm->avail_in; |
-+ } |
- |
- /* Process the input block. */ |
- for (;;) { |
-@@ -1762,13 +1942,18 @@ local block_state deflate_slow(s, flush) |
- s->prev_length = s->match_length, s->prev_match = s->match_start; |
- s->match_length = MIN_MATCH-1; |
- |
-- if (hash_head != NIL && s->prev_length < s->max_lazy_match && |
-- s->strstart - hash_head <= MAX_DIST(s)) { |
-+ if (clas == Z_CLASS_COOKIE && first) { |
-+ s->match_length = cookie_match(s, s->strstart, input_length); |
-+ } else if (clas == Z_CLASS_STANDARD && |
-+ hash_head != NIL && |
-+ s->prev_length < s->max_lazy_match && |
-+ s->strstart - hash_head <= MAX_DIST(s)) { |
- /* To simplify the code, we prevent matches with the string |
- * of window index 0 (in particular we have to avoid a match |
- * of the string with itself at the start of the input file). |
- */ |
-- s->match_length = longest_match (s, hash_head); |
-+ s->match_length = longest_match (s, hash_head, clas); |
-+ |
- /* longest_match() sets match_start */ |
- |
- if (s->match_length <= 5 && (s->strategy == Z_FILTERED |
-@@ -1787,7 +1972,20 @@ local block_state deflate_slow(s, flush) |
- /* If there was a match at the previous step and the current |
- * match is not better, output the previous match: |
- */ |
-- if (s->prev_length >= MIN_MATCH && s->match_length <= s->prev_length) { |
-+ first = 0; |
-+ if (s->prev_length >= MIN_MATCH && s->match_length <= s->prev_length && |
-+ /* We will only accept an exact match for Z_CLASS_COOKIE data and |
-+ * we won't match Z_CLASS_HUFFMAN_ONLY data at all. */ |
-+ (clas == Z_CLASS_STANDARD || (clas == Z_CLASS_COOKIE && |
-+ s->prev_length == input_length && |
-+ s->prev_match > 0 && |
-+ /* We require that a Z_CLASS_COOKIE match be |
-+ * preceded by either a semicolon (which cannot be |
-+ * part of a cookie), or non-cookie data. This is |
-+ * to prevent a cookie from being a suffix of |
-+ * another. */ |
-+ (class_at(s, s->prev_match-1) == Z_CLASS_STANDARD || |
-+ *(s->window + s->prev_match-1) == ';')))) { |
- uInt max_insert = s->strstart + s->lookahead - MIN_MATCH; |
- /* Do not insert strings in hash table beyond this. */ |
- |
-diff --git a/third_party/zlib/deflate.h b/third_party/zlib/deflate.h |
-index ce0299e..c795034 100644 |
---- a/third_party/zlib/deflate.h |
-+++ b/third_party/zlib/deflate.h |
-@@ -94,6 +94,9 @@ typedef unsigned IPos; |
- * save space in the various tables. IPos is used only for parameter passing. |
- */ |
- |
-+#define Z_COOKIE_HASH_SIZE 256 |
-+#define Z_COOKIE_HASH_MASK (Z_COOKIE_HASH_SIZE-1) |
-+ |
- typedef struct internal_state { |
- z_streamp strm; /* pointer back to this zlib stream */ |
- int status; /* as the name implies */ |
-@@ -142,6 +145,8 @@ typedef struct internal_state { |
- uInt hash_mask; /* hash_size-1 */ |
- |
- uInt hash_shift; |
-+ Bytef *class_bitmap; /* bitmap of class for each byte in window */ |
-+ IPos cookie_locations[Z_COOKIE_HASH_SIZE]; |
- /* Number of bits by which ins_h must be shifted at each input |
- * step. It must be such that after MIN_MATCH steps, the oldest |
- * byte no longer takes part in the hash key, that is: |
-diff --git a/third_party/zlib/zlib.h b/third_party/zlib/zlib.h |
-index 36c73af..5544c88 100644 |
---- a/third_party/zlib/zlib.h |
-+++ b/third_party/zlib/zlib.h |
-@@ -101,6 +101,7 @@ typedef struct z_stream_s { |
- int data_type; /* best guess about the data type: binary or text */ |
- uLong adler; /* adler32 value of the uncompressed data */ |
- uLong reserved; /* reserved for future use */ |
-+ int clas; |
- } z_stream; |
- |
- typedef z_stream FAR *z_streamp; |
-@@ -207,6 +208,10 @@ typedef gz_header FAR *gz_headerp; |
- |
- #define Z_NULL 0 /* for initializing zalloc, zfree, opaque */ |
- |
-+#define Z_CLASS_STANDARD 0 |
-+#define Z_CLASS_COOKIE 1 |
-+#define Z_CLASS_HUFFMAN_ONLY 2 |
-+ |
- #define zlib_version zlibVersion() |
- /* for compatibility with versions < 1.0.2 */ |
- |
-@@ -1744,6 +1749,13 @@ ZEXTERN int ZEXPORT gzgetc_ OF((gzFile file)); /* backward compatibility */ |
- ZEXTERN z_off_t ZEXPORT gzoffset64 OF((gzFile)); |
- ZEXTERN uLong ZEXPORT adler32_combine64 OF((uLong, uLong, z_off_t)); |
- ZEXTERN uLong ZEXPORT crc32_combine64 OF((uLong, uLong, z_off_t)); |
-+# else |
-+ ZEXTERN gzFile ZEXPORT gzopen OF((const char *, const char *)); |
-+ ZEXTERN z_off_t ZEXPORT gzseek OF((gzFile, z_off_t, int)); |
-+ ZEXTERN z_off_t ZEXPORT gztell OF((gzFile)); |
-+ ZEXTERN z_off_t ZEXPORT gzoffset OF((gzFile)); |
-+ ZEXTERN uLong ZEXPORT adler32_combine OF((uLong, uLong, z_off_t)); |
-+ ZEXTERN uLong ZEXPORT crc32_combine OF((uLong, uLong, z_off_t)); |
- # endif |
- #else |
- ZEXTERN gzFile ZEXPORT gzopen OF((const char *, const char *)); |
--- |
-2.7.4 |
- |