diff options
author | Edward Thomson <ethomson@edwardthomson.com> | 2015-06-17 08:07:34 -0700 |
---|---|---|
committer | Edward Thomson <ethomson@github.com> | 2016-05-26 13:01:03 -0500 |
commit | b88f1713d01e5cca5a296d564ae094dd8bc6a1f2 (patch) | |
tree | 49dd3e66e51f5dcba0ad00ae726c63a95462ee64 /src/zstream.c | |
parent | 1cd6599142ec89f9c7eeb8b302e8877c71e1ab4b (diff) | |
download | libgit2-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.c | 38 |
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); +} |