* [PATCH 2/6] Introduce stream decompress helpers
@ 2008-01-11 18:55 Marco Costalba
0 siblings, 0 replies; only message in thread
From: Marco Costalba @ 2008-01-11 18:55 UTC (permalink / raw)
To: Junio C Hamano; +Cc: Git Mailing List
Decompressing turns out to be more difficult then
comrpessing.
Helpers are more because more are the way
zlib deflate() is used in git.
This patch just introduces the helpers,
still no code change.
Signed-off-by: Marco Costalba <mcostalba@gmail.com>
---
This patch will probably be wrapped at the bottom lines
by the mailer (gmail), sorry in advance for this.
compress.c | 81 ++++++++++++++++++++++++++++++++
compress.h | 17 ++++++++++++-
2 files changed, 97 insertions(+), 1 deletions(-)
diff --git a/compress.c b/compress.c
index a8f46d5..f73cf2c 100644
--- a/compress.c
+++ b/compress.c
@@ -1,6 +1,10 @@
#include "cache.h"
#include "compress.h"
+/*
+ * Compression helpers
+ */
+
unsigned long compress_alloc(z_stream *stream, int level, unsigned long size)
{
memset(stream, 0, sizeof(*stream));
@@ -55,3 +59,80 @@ unsigned long compress_all(int level, unsigned
}
return compress_free(&stream);
}
+
+
+/*
+ * Decompression helpers
+ */
+
+int decompress_alloc(z_stream *stream)
+{
+ memset(stream, 0, sizeof(*stream));
+ return inflateInit(stream);
+}
+
+int decompress_from(z_stream *stream, unsigned char *in, unsigned long in_size)
+{
+ stream->next_in = in;
+ stream->avail_in = in_size;
+ return Z_OK;
+}
+
+int decompress_into(z_stream *stream, unsigned char *out, unsigned
long out_size)
+{
+ stream->next_out = out;
+ stream->avail_out = out_size;
+ return Z_OK;
+}
+
+int decompress_next(z_stream *stream, int flush)
+{
+ return inflate(stream, flush);
+}
+
+int decompress_next_from(z_stream *stream, unsigned char *in,
unsigned long in_size, int flush)
+{
+ decompress_from(stream, in, in_size);
+ return inflate(stream, flush);
+}
+
+int decompress_next_into(z_stream *stream, unsigned char *out,
unsigned long out_size, int flush)
+{
+ decompress_into(stream, out, out_size);
+ return inflate(stream, flush);
+}
+
+unsigned long decompress_free(z_stream *stream)
+{
+ inflateEnd(stream);
+ return stream->total_out;
+}
+
+unsigned long decompress_all(unsigned char *in, unsigned long in_size,
+ unsigned char *out, unsigned long out_size)
+{
+/* caller should check for return value != 0 */
+
+ z_stream stream;
+ int st;
+
+ if (decompress_alloc(&stream) != Z_OK)
+ return 0;
+
+ if ( decompress_from(&stream, in, in_size) != Z_OK
+ || decompress_into(&stream, out, out_size) != Z_OK)
+ goto fail;
+
+ do {
+ st = decompress_next(&stream, Z_FINISH);
+ } while (st == Z_OK);
+
+ if (st != Z_STREAM_END)
+ goto fail;
+
+ return decompress_free(&stream);
+
+fail:
+ decompress_free(&stream);
+ return 0;
+}
diff --git a/compress.h b/compress.h
index 16b0147..a81d006 100644
--- a/compress.h
+++ b/compress.h
@@ -6,7 +6,22 @@ extern int compress_start(z_stream *stream, unsigned char *in,
unsigned char *out, unsigned long out_size);
extern int compress_next(z_stream *stream, int flush);
extern unsigned long compress_free(z_stream *stream);
-extern unsigned long compress_all(int level, unsigned char *data,
unsigned long size,
+extern unsigned long compress_all(int level, unsigned char *in,
unsigned long in_size,
unsigned char **out);
+
+extern int decompress_alloc(z_stream *stream);
+
+extern int decompress_from(z_stream *stream, unsigned char *in,
unsigned long in_size);
+extern int decompress_into(z_stream *stream, unsigned char *out,
unsigned long out_size);
+
+extern int decompress_next(z_stream *stream, int flush);
+extern int decompress_next_from(z_stream *stream, unsigned char *in,
unsigned long in_size, int flush);
+extern int decompress_next_into(z_stream *stream, unsigned char *out,
unsigned long out_size, int flush);
+
+extern unsigned long decompress_free(z_stream *stream);
+
+extern unsigned long decompress_all(unsigned char *in, unsigned long in_size,
+ unsigned char *out, unsigned long
out_size);
+
#endif
--
1.5.4.rc2.90.gf158-dirty
^ permalink raw reply related [flat|nested] only message in thread
only message in thread, other threads:[~2008-01-11 18:55 UTC | newest]
Thread overview: (only message) (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2008-01-11 18:55 [PATCH 2/6] Introduce stream decompress helpers Marco Costalba
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).