diff options
author | Mark Adler <madler@alumni.caltech.edu> | 2016-12-30 16:29:56 -0800 |
---|---|---|
committer | Mark Adler <madler@alumni.caltech.edu> | 2016-12-30 16:29:56 -0800 |
commit | ee7d7b5dda25c111e61e19ac7b476c26aa6f3020 (patch) | |
tree | cfc5d9b06269fb46f1c4d1dcab77ce71ae5143bd | |
parent | feafcfaa05537869bd128af5474f62b19df8b502 (diff) | |
download | zlib-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.c | 21 | ||||
-rw-r--r-- | zlib.h | 22 |
2 files changed, 43 insertions, 0 deletions
@@ -441,6 +441,27 @@ int ZEXPORT deflateSetDictionary (strm, dictionary, dictLength) | |||
441 | } | 441 | } |
442 | 442 | ||
443 | /* ========================================================================= */ | 443 | /* ========================================================================= */ |
444 | int 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 | /* ========================================================================= */ | ||
444 | int ZEXPORT deflateResetKeep (strm) | 465 | int ZEXPORT deflateResetKeep (strm) |
445 | z_streamp strm; | 466 | z_streamp strm; |
446 | { | 467 | { |
@@ -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 | ||
654 | ZEXTERN 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 | |||
654 | ZEXTERN int ZEXPORT deflateCopy OF((z_streamp dest, | 676 | ZEXTERN int ZEXPORT deflateCopy OF((z_streamp dest, |
655 | z_streamp source)); | 677 | z_streamp source)); |
656 | /* | 678 | /* |