From 4bc1a30f135db3edbcddf8a548f00353c54dacd8 Mon Sep 17 00:00:00 2001 From: Michael Schubert Date: Sun, 10 Jun 2012 22:04:24 +0200 Subject: [PATCH] util: add git__compress() --- src/compress.c | 53 ++++++++++++++++++++++++++++++++++++++++++++++++++ src/compress.h | 16 +++++++++++++++ 2 files changed, 69 insertions(+) create mode 100644 src/compress.c create mode 100644 src/compress.h diff --git a/src/compress.c b/src/compress.c new file mode 100644 index 000000000..9388df1f2 --- /dev/null +++ b/src/compress.c @@ -0,0 +1,53 @@ +/* + * Copyright (C) 2009-2012 the libgit2 contributors + * + * This file is part of libgit2, distributed under the GNU GPL v2 with + * a Linking Exception. For full terms see the included COPYING file. + */ + +#include "compress.h" + +#include + +#define BUFFER_SIZE (1024 * 1024) + +int git__compress(git_buf *buf, const void *buff, size_t len) +{ + z_stream zs; + char *zb; + size_t have; + + memset(&zs, 0, sizeof(zs)); + if (deflateInit(&zs, Z_DEFAULT_COMPRESSION) != Z_OK) + return -1; + + zb = git__malloc(BUFFER_SIZE); + GITERR_CHECK_ALLOC(zb); + + zs.next_in = (void *)buff; + zs.avail_in = (uInt)len; + + do { + zs.next_out = (unsigned char *)zb; + zs.avail_out = BUFFER_SIZE; + + if (deflate(&zs, Z_FINISH) == Z_STREAM_ERROR) { + git__free(zb); + return -1; + } + + have = BUFFER_SIZE - (size_t)zs.avail_out; + + if (git_buf_put(buf, zb, have) < 0) { + git__free(zb); + return -1; + } + + } while (zs.avail_out == 0); + + assert(zs.avail_in == 0); + + deflateEnd(&zs); + git__free(zb); + return 0; +} diff --git a/src/compress.h b/src/compress.h new file mode 100644 index 000000000..4b7388564 --- /dev/null +++ b/src/compress.h @@ -0,0 +1,16 @@ +/* + * Copyright (C) 2009-2012 the libgit2 contributors + * + * This file is part of libgit2, distributed under the GNU GPL v2 with + * a Linking Exception. For full terms see the included COPYING file. + */ +#ifndef INCLUDE_compress_h__ +#define INCLUDE_compress_h__ + +#include "common.h" + +#include "buffer.h" + +int git__compress(git_buf *buf, const void *buff, size_t len); + +#endif /* INCLUDE_compress_h__ */