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 | |
| parent | 1cd6599142ec89f9c7eeb8b302e8877c71e1ab4b (diff) | |
| download | libgit2-b88f1713d01e5cca5a296d564ae094dd8bc6a1f2.tar.gz | |
zstream: offer inflating, `git_zstream_inflatebuf`
Introduce `git_zstream_inflatebuf` for simple uses.
| -rw-r--r-- | src/pack-objects.c | 2 | ||||
| -rw-r--r-- | src/zstream.c | 38 | ||||
| -rw-r--r-- | src/zstream.h | 9 | ||||
| -rw-r--r-- | tests/core/zstream.c | 16 |
4 files changed, 51 insertions, 14 deletions
diff --git a/src/pack-objects.c b/src/pack-objects.c index 6f86deb07..ec15970f3 100644 --- a/src/pack-objects.c +++ b/src/pack-objects.c @@ -144,7 +144,7 @@ int git_packbuilder_new(git_packbuilder **out, git_repository *repo) pb->nr_threads = 1; /* do not spawn any thread by default */ if (git_hash_ctx_init(&pb->ctx) < 0 || - git_zstream_init(&pb->zstream) < 0 || + git_zstream_init(&pb->zstream, GIT_ZSTREAM_DEFLATE) < 0 || git_repository_odb(&pb->odb, repo) < 0 || packbuilder_config(pb) < 0) goto on_error; 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); +} diff --git a/src/zstream.h b/src/zstream.h index 9b5bf6ace..f0006d32e 100644 --- a/src/zstream.h +++ b/src/zstream.h @@ -12,8 +12,14 @@ #include "common.h" #include "buffer.h" +typedef enum { + GIT_ZSTREAM_INFLATE, + GIT_ZSTREAM_DEFLATE, +} git_zstream_t; + typedef struct { z_stream z; + git_zstream_t type; const char *in; size_t in_len; int zerr; @@ -21,7 +27,7 @@ typedef struct { #define GIT_ZSTREAM_INIT {{0}} -int git_zstream_init(git_zstream *zstream); +int git_zstream_init(git_zstream *zstream, git_zstream_t type); void git_zstream_free(git_zstream *zstream); int git_zstream_set_input(git_zstream *zstream, const void *in, size_t in_len); @@ -35,5 +41,6 @@ bool git_zstream_done(git_zstream *zstream); void git_zstream_reset(git_zstream *zstream); int git_zstream_deflatebuf(git_buf *out, const void *in, size_t in_len); +int git_zstream_inflatebuf(git_buf *out, const void *in, size_t in_len); #endif /* INCLUDE_zstream_h__ */ diff --git a/tests/core/zstream.c b/tests/core/zstream.c index 7ba9424ba..b13429b0a 100644 --- a/tests/core/zstream.c +++ b/tests/core/zstream.c @@ -48,7 +48,7 @@ void test_core_zstream__basic(void) char out[128]; size_t outlen = sizeof(out); - cl_git_pass(git_zstream_init(&z)); + cl_git_pass(git_zstream_init(&z, GIT_ZSTREAM_DEFLATE)); cl_git_pass(git_zstream_set_input(&z, data, strlen(data) + 1)); cl_git_pass(git_zstream_get_output(out, &outlen, &z)); cl_assert(git_zstream_done(&z)); @@ -68,9 +68,10 @@ void test_core_zstream__buffer(void) #define BIG_STRING_PART "Big Data IS Big - Long Data IS Long - We need a buffer larger than 1024 x 1024 to make sure we trigger chunked compression - Big Big Data IS Bigger than Big - Long Long Data IS Longer than Long" -static void compress_input_various_ways(git_buf *input) +static void compress_and_decompress_input_various_ways(git_buf *input) { git_buf out1 = GIT_BUF_INIT, out2 = GIT_BUF_INIT; + git_buf inflated = GIT_BUF_INIT; size_t i, fixed_size = max(input->size / 2, 256); char *fixed = git__malloc(fixed_size); cl_assert(fixed); @@ -93,7 +94,7 @@ static void compress_input_various_ways(git_buf *input) } cl_assert(use_fixed_size <= fixed_size); - cl_git_pass(git_zstream_init(&zs)); + cl_git_pass(git_zstream_init(&zs, GIT_ZSTREAM_DEFLATE)); cl_git_pass(git_zstream_set_input(&zs, input->ptr, input->size)); while (!git_zstream_done(&zs)) { @@ -112,7 +113,12 @@ static void compress_input_various_ways(git_buf *input) git_buf_free(&out2); } + cl_git_pass(git_zstream_inflatebuf(&inflated, out1.ptr, out1.size)); + cl_assert_equal_i(input->size, inflated.size); + cl_assert(memcmp(input->ptr, inflated.ptr, inflated.size) == 0); + git_buf_free(&out1); + git_buf_free(&inflated); git__free(fixed); } @@ -129,14 +135,14 @@ void test_core_zstream__big_data(void) cl_git_pass( git_buf_put(&in, BIG_STRING_PART, strlen(BIG_STRING_PART))); - compress_input_various_ways(&in); + compress_and_decompress_input_various_ways(&in); /* make a big string that's hard to compress */ srand(0xabad1dea); for (scan = 0; scan < in.size; ++scan) in.ptr[scan] = (char)rand(); - compress_input_various_ways(&in); + compress_and_decompress_input_various_ways(&in); } git_buf_free(&in); |
