diff options
author | Junio C Hamano <gitster@pobox.com> | 2011-06-10 10:55:10 -0700 |
---|---|---|
committer | Junio C Hamano <gitster@pobox.com> | 2011-06-10 11:10:29 -0700 |
commit | 55bb5c9147a209eba44c3e9866704ece424c3d31 (patch) | |
tree | 1b3561115345d0b236085d741da75390cb1e759b /zlib.c | |
parent | 5e86c1fb866ca4bc8d6e015ccbdafd114fd616fa (diff) | |
download | git-55bb5c9147a209eba44c3e9866704ece424c3d31.tar.gz |
zlib: wrap deflate side of the API
Wrap deflateInit, deflate, and deflateEnd for everybody, and the sole use
of deflateInit2 in remote-curl.c to tell the library to use gzip header
and trailer in git_deflate_init_gzip().
There is only one caller that cares about the status from deflateEnd().
Introduce git_deflate_end_gently() to let that sole caller retrieve the
status and act on it (i.e. die) for now, but we would probably want to
make inflate_end/deflate_end die when they ran out of memory and get
rid of the _gently() kind.
Signed-off-by: Junio C Hamano <gitster@pobox.com>
Diffstat (limited to 'zlib.c')
-rw-r--r-- | zlib.c | 62 |
1 files changed, 62 insertions, 0 deletions
@@ -77,3 +77,65 @@ int git_inflate(z_streamp strm, int flush) strm->msg ? strm->msg : "no message"); return status; } + +void git_deflate_init(z_streamp strm, int level) +{ + int status = deflateInit(strm, level); + + if (status == Z_OK) + return; + die("deflateInit: %s (%s)", zerr_to_string(status), + strm->msg ? strm->msg : "no message"); +} + +void git_deflate_init_gzip(z_streamp strm, int level) +{ + /* + * Use default 15 bits, +16 is to generate gzip header/trailer + * instead of the zlib wrapper. + */ + const int windowBits = 15 + 16; + int status = deflateInit2(strm, level, + Z_DEFLATED, windowBits, + 8, Z_DEFAULT_STRATEGY); + if (status == Z_OK) + return; + die("deflateInit2: %s (%s)", zerr_to_string(status), + strm->msg ? strm->msg : "no message"); +} + +void git_deflate_end(z_streamp strm) +{ + int status = deflateEnd(strm); + + if (status == Z_OK) + return; + error("deflateEnd: %s (%s)", zerr_to_string(status), + strm->msg ? strm->msg : "no message"); +} + +int git_deflate_end_gently(z_streamp strm) +{ + return deflateEnd(strm); +} + +int git_deflate(z_streamp strm, int flush) +{ + int status = deflate(strm, flush); + + switch (status) { + /* Z_BUF_ERROR: normal, needs more space in the output buffer */ + case Z_BUF_ERROR: + case Z_OK: + case Z_STREAM_END: + return status; + + case Z_MEM_ERROR: + die("deflate: out of memory"); + default: + break; + } + error("deflate: %s (%s)", zerr_to_string(status), + strm->msg ? strm->msg : "no message"); + return status; +} |