summaryrefslogtreecommitdiff
path: root/zlib.c
diff options
context:
space:
mode:
authorJunio C Hamano <gitster@pobox.com>2011-06-10 17:55:10 (GMT)
committerJunio C Hamano <gitster@pobox.com>2011-06-10 18:10:29 (GMT)
commit55bb5c9147a209eba44c3e9866704ece424c3d31 (patch)
tree1b3561115345d0b236085d741da75390cb1e759b /zlib.c
parent5e86c1fb866ca4bc8d6e015ccbdafd114fd616fa (diff)
downloadgit-55bb5c9147a209eba44c3e9866704ece424c3d31.zip
git-55bb5c9147a209eba44c3e9866704ece424c3d31.tar.gz
git-55bb5c9147a209eba44c3e9866704ece424c3d31.tar.bz2
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.c62
1 files changed, 62 insertions, 0 deletions
diff --git a/zlib.c b/zlib.c
index b613cbd..ee47a3a 100644
--- a/zlib.c
+++ b/zlib.c
@@ -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;
+}