summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMark Adler <madler@alumni.caltech.edu>2016-12-30 16:29:56 -0800
committerMark Adler <madler@alumni.caltech.edu>2016-12-30 16:29:56 -0800
commitee7d7b5dda25c111e61e19ac7b476c26aa6f3020 (patch)
treecfc5d9b06269fb46f1c4d1dcab77ce71ae5143bd
parentfeafcfaa05537869bd128af5474f62b19df8b502 (diff)
downloadzlib-ee7d7b5dda25c111e61e19ac7b476c26aa6f3020.tar.gz
zlib-ee7d7b5dda25c111e61e19ac7b476c26aa6f3020.tar.bz2
zlib-ee7d7b5dda25c111e61e19ac7b476c26aa6f3020.zip
Add deflateGetDictionary() function.
Per request, but its utility is likely to be very limited. See the comments in zlib.h.
-rw-r--r--deflate.c21
-rw-r--r--zlib.h22
2 files changed, 43 insertions, 0 deletions
diff --git a/deflate.c b/deflate.c
index 47d55af..cf4c056 100644
--- a/deflate.c
+++ b/deflate.c
@@ -441,6 +441,27 @@ int ZEXPORT deflateSetDictionary (strm, dictionary, dictLength)
441} 441}
442 442
443/* ========================================================================= */ 443/* ========================================================================= */
444int ZEXPORT deflateGetDictionary (strm, dictionary, dictLength)
445 z_streamp strm;
446 Bytef *dictionary;
447 uInt *dictLength;
448{
449 deflate_state *s;
450
451 if (deflateStateCheck(strm))
452 return Z_STREAM_ERROR;
453 s = strm->state;
454 uInt len = s->strstart + s->lookahead;
455 if (len > s->w_size)
456 len = s->w_size;
457 if (dictionary != Z_NULL && len)
458 zmemcpy(dictionary, s->window + s->strstart + s->lookahead - len, len);
459 if (dictLength != Z_NULL)
460 *dictLength = len;
461 return Z_OK;
462}
463
464/* ========================================================================= */
444int ZEXPORT deflateResetKeep (strm) 465int ZEXPORT deflateResetKeep (strm)
445 z_streamp strm; 466 z_streamp strm;
446{ 467{
diff --git a/zlib.h b/zlib.h
index 053e6e2..6f4a049 100644
--- a/zlib.h
+++ b/zlib.h
@@ -651,6 +651,28 @@ ZEXTERN int ZEXPORT deflateSetDictionary OF((z_streamp strm,
651 not perform any compression: this will be done by deflate(). 651 not perform any compression: this will be done by deflate().
652*/ 652*/
653 653
654ZEXTERN int ZEXPORT deflateGetDictionary OF((z_streamp strm,
655 Bytef *dictionary,
656 uInt *dictLength));
657/*
658 Returns the sliding dictionary being maintained by deflate. dictLength is
659 set to the number of bytes in the dictionary, and that many bytes are copied
660 to dictionary. dictionary must have enough space, where 32768 bytes is
661 always enough. If deflateGetDictionary() is called with dictionary equal to
662 Z_NULL, then only the dictionary length is returned, and nothing is copied.
663 Similary, if dictLength is Z_NULL, then it is not set.
664
665 deflateGetDictionary() may return a length less than the window size, even
666 when more than the window size in input has been provided. It may return up
667 to 258 bytes less in that case, due to how zlib's implementation of deflate
668 manages the sliding window and lookahead for matches, where matches can be
669 up to 258 bytes long. If the application needs the last window-size bytes of
670 input, then that would need to be saved by the application outside of zlib.
671
672 deflateGetDictionary returns Z_OK on success, or Z_STREAM_ERROR if the
673 stream state is inconsistent.
674*/
675
654ZEXTERN int ZEXPORT deflateCopy OF((z_streamp dest, 676ZEXTERN int ZEXPORT deflateCopy OF((z_streamp dest,
655 z_streamp source)); 677 z_streamp source));
656/* 678/*