summaryrefslogtreecommitdiff
path: root/src/zstream.c
diff options
context:
space:
mode:
authorEdward Thomson <ethomson@edwardthomson.com>2015-06-17 08:07:34 -0700
committerEdward Thomson <ethomson@github.com>2016-05-26 13:01:03 -0500
commitb88f1713d01e5cca5a296d564ae094dd8bc6a1f2 (patch)
tree49dd3e66e51f5dcba0ad00ae726c63a95462ee64 /src/zstream.c
parent1cd6599142ec89f9c7eeb8b302e8877c71e1ab4b (diff)
downloadlibgit2-b88f1713d01e5cca5a296d564ae094dd8bc6a1f2.tar.gz
zstream: offer inflating, `git_zstream_inflatebuf`
Introduce `git_zstream_inflatebuf` for simple uses.
Diffstat (limited to 'src/zstream.c')
-rw-r--r--src/zstream.c38
1 files changed, 31 insertions, 7 deletions
diff --git a/src/zstream.c b/src/zstream.c
index 2130bc3ca..6533449e8 100644
--- a/src/zstream.c
+++ b/src/zstream.c
@@ -28,20 +28,31 @@ static int zstream_seterr(git_zstream *zs)
return -1;
}
-int git_zstream_init(git_zstream *zstream)
+int git_zstream_init(git_zstream *zstream, git_zstream_t type)
{
- zstream->zerr = deflateInit(&zstream->z, Z_DEFAULT_COMPRESSION);
+ zstream->type = type;
+
+ if (zstream->type == GIT_ZSTREAM_INFLATE)
+ zstream->zerr = inflateInit(&zstream->z);
+ else
+ zstream->zerr = deflateInit(&zstream->z, Z_DEFAULT_COMPRESSION);
return zstream_seterr(zstream);
}
void git_zstream_free(git_zstream *zstream)
{
- deflateEnd(&zstream->z);
+ if (zstream->type == GIT_ZSTREAM_INFLATE)
+ inflateEnd(&zstream->z);
+ else
+ deflateEnd(&zstream->z);
}
void git_zstream_reset(git_zstream *zstream)
{
- deflateReset(&zstream->z);
+ if (zstream->type == GIT_ZSTREAM_INFLATE)
+ inflateReset(&zstream->z);
+ else
+ deflateReset(&zstream->z);
zstream->in = NULL;
zstream->in_len = 0;
zstream->zerr = Z_STREAM_END;
@@ -97,7 +108,10 @@ int git_zstream_get_output(void *out, size_t *out_len, git_zstream *zstream)
out_queued = (size_t)zstream->z.avail_out;
/* compress next chunk */
- zstream->zerr = deflate(&zstream->z, zflush);
+ if (zstream->type == GIT_ZSTREAM_INFLATE)
+ zstream->zerr = inflate(&zstream->z, zflush);
+ else
+ zstream->zerr = deflate(&zstream->z, zflush);
if (zstream->zerr == Z_STREAM_ERROR)
return zstream_seterr(zstream);
@@ -120,12 +134,12 @@ int git_zstream_get_output(void *out, size_t *out_len, git_zstream *zstream)
return 0;
}
-int git_zstream_deflatebuf(git_buf *out, const void *in, size_t in_len)
+static int zstream_buf(git_buf *out, const void *in, size_t in_len, git_zstream_t type)
{
git_zstream zs = GIT_ZSTREAM_INIT;
int error = 0;
- if ((error = git_zstream_init(&zs)) < 0)
+ if ((error = git_zstream_init(&zs, type)) < 0)
return error;
if ((error = git_zstream_set_input(&zs, in, in_len)) < 0)
@@ -154,3 +168,13 @@ done:
git_zstream_free(&zs);
return error;
}
+
+int git_zstream_deflatebuf(git_buf *out, const void *in, size_t in_len)
+{
+ return zstream_buf(out, in, in_len, GIT_ZSTREAM_DEFLATE);
+}
+
+int git_zstream_inflatebuf(git_buf *out, const void *in, size_t in_len)
+{
+ return zstream_buf(out, in, in_len, GIT_ZSTREAM_INFLATE);
+}