aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMark Adler <madler@alumni.caltech.edu>2011-12-29 00:03:55 -0800
committerMark Adler <madler@alumni.caltech.edu>2011-12-29 00:03:55 -0800
commit9d55abc96968db80749df5ebf412d36e2d66de26 (patch)
tree2b422f40b006d947ce8f690641129bc8c95aef2b
parentf1ebdd6a9c495a5db9a22aa80dd7d54ae7db42e9 (diff)
downloadzlib-9d55abc96968db80749df5ebf412d36e2d66de26.tar.gz
zlib-9d55abc96968db80749df5ebf412d36e2d66de26.tar.bz2
zlib-9d55abc96968db80749df5ebf412d36e2d66de26.zip
Avoid extraneous empty blocks when doing empty flushes.
Previously when doing an empty flush, a extra static or stored block could be emitted before the requested empty static or stored block. This patch prevents the emission of empty blocks by the deflate_* functions.
-rw-r--r--deflate.c45
1 files changed, 35 insertions, 10 deletions
diff --git a/deflate.c b/deflate.c
index 5d1d7bd..159e665 100644
--- a/deflate.c
+++ b/deflate.c
@@ -1571,8 +1571,13 @@ local block_state deflate_stored(s, flush)
1571 FLUSH_BLOCK(s, 0); 1571 FLUSH_BLOCK(s, 0);
1572 } 1572 }
1573 } 1573 }
1574 FLUSH_BLOCK(s, flush == Z_FINISH); 1574 if (flush == Z_FINISH) {
1575 return flush == Z_FINISH ? finish_done : block_done; 1575 FLUSH_BLOCK(s, 1);
1576 return finish_done;
1577 }
1578 if ((long)s->strstart > s->block_start)
1579 FLUSH_BLOCK(s, 0);
1580 return block_done;
1576} 1581}
1577 1582
1578/* =========================================================================== 1583/* ===========================================================================
@@ -1668,8 +1673,13 @@ local block_state deflate_fast(s, flush)
1668 } 1673 }
1669 if (bflush) FLUSH_BLOCK(s, 0); 1674 if (bflush) FLUSH_BLOCK(s, 0);
1670 } 1675 }
1671 FLUSH_BLOCK(s, flush == Z_FINISH); 1676 if (flush == Z_FINISH) {
1672 return flush == Z_FINISH ? finish_done : block_done; 1677 FLUSH_BLOCK(s, 1);
1678 return finish_done;
1679 }
1680 if (s->last_lit)
1681 FLUSH_BLOCK(s, 0);
1682 return block_done;
1673} 1683}
1674 1684
1675#ifndef FASTEST 1685#ifndef FASTEST
@@ -1793,8 +1803,13 @@ local block_state deflate_slow(s, flush)
1793 _tr_tally_lit(s, s->window[s->strstart-1], bflush); 1803 _tr_tally_lit(s, s->window[s->strstart-1], bflush);
1794 s->match_available = 0; 1804 s->match_available = 0;
1795 } 1805 }
1796 FLUSH_BLOCK(s, flush == Z_FINISH); 1806 if (flush == Z_FINISH) {
1797 return flush == Z_FINISH ? finish_done : block_done; 1807 FLUSH_BLOCK(s, 1);
1808 return finish_done;
1809 }
1810 if (s->last_lit)
1811 FLUSH_BLOCK(s, 0);
1812 return block_done;
1798} 1813}
1799#endif /* FASTEST */ 1814#endif /* FASTEST */
1800 1815
@@ -1862,8 +1877,13 @@ local block_state deflate_rle(s, flush)
1862 } 1877 }
1863 if (bflush) FLUSH_BLOCK(s, 0); 1878 if (bflush) FLUSH_BLOCK(s, 0);
1864 } 1879 }
1865 FLUSH_BLOCK(s, flush == Z_FINISH); 1880 if (flush == Z_FINISH) {
1866 return flush == Z_FINISH ? finish_done : block_done; 1881 FLUSH_BLOCK(s, 1);
1882 return finish_done;
1883 }
1884 if (s->last_lit)
1885 FLUSH_BLOCK(s, 0);
1886 return block_done;
1867} 1887}
1868 1888
1869/* =========================================================================== 1889/* ===========================================================================
@@ -1895,6 +1915,11 @@ local block_state deflate_huff(s, flush)
1895 s->strstart++; 1915 s->strstart++;
1896 if (bflush) FLUSH_BLOCK(s, 0); 1916 if (bflush) FLUSH_BLOCK(s, 0);
1897 } 1917 }
1898 FLUSH_BLOCK(s, flush == Z_FINISH); 1918 if (flush == Z_FINISH) {
1899 return flush == Z_FINISH ? finish_done : block_done; 1919 FLUSH_BLOCK(s, 1);
1920 return finish_done;
1921 }
1922 if (s->last_lit)
1923 FLUSH_BLOCK(s, 0);
1924 return block_done;
1900} 1925}