{"thread":{"id":"11587","subject":"[PATCH 2/6] Introduce stream decompress helpers","startedAt":"2008-01-11T18:55:01Z","lastAt":"2008-01-11T18:55:01Z","messageCount":1,"participants":["Marco Costalba"],"isPatch":true,"patchVersion":1,"patchTotal":6},"messages":[{"id":"65045","messageId":"e5bfff550801111055tae555c0sd666ddd05cee472d@mail.gmail.com","threadId":"11587","inReplyTo":null,"subject":"[PATCH 2/6] Introduce stream decompress helpers","fromName":"Marco Costalba","fromEmail":"mcostalba@gmail.com","sentAt":"2008-01-11T18:55:01Z","receivedAt":"2008-01-11T18:55:01Z","isPatch":true,"sender":{"key":"mcostalba@gmail.com","avatar":null},"body":"Decompressing turns out to be more difficult then\ncomrpessing.\n\nHelpers are more because more are the way\nzlib deflate() is used in git.\n\nThis patch just introduces the helpers,\nstill no code change.\n\nSigned-off-by: Marco Costalba <mcostalba@gmail.com>\n---\n\nThis patch will probably be wrapped at the bottom lines\nby the mailer (gmail), sorry in advance for this.\n\n compress.c |   81 ++++++++++++++++++++++++++++++++\n compress.h |   17 ++++++++++++-\n 2 files changed, 97 insertions(+), 1 deletions(-)\n\ndiff --git a/compress.c b/compress.c\nindex a8f46d5..f73cf2c 100644\n--- a/compress.c\n+++ b/compress.c\n@@ -1,6 +1,10 @@\n #include \"cache.h\"\n #include \"compress.h\"\n\n+/*\n+ *     Compression helpers\n+ */\n+\n unsigned long compress_alloc(z_stream *stream, int level, unsigned long size)\n {\n \tmemset(stream, 0, sizeof(*stream));\n@@ -55,3 +59,80 @@ unsigned long compress_all(int level, unsigned\n \t}\n \treturn compress_free(&stream);\n }\n+\n+\n+/*\n+ *     Decompression helpers\n+ */\n+\n+int decompress_alloc(z_stream *stream)\n+{\n+\tmemset(stream, 0, sizeof(*stream));\n+\treturn inflateInit(stream);\n+}\n+\n+int decompress_from(z_stream *stream, unsigned char *in, unsigned long in_size)\n+{\n+\tstream->next_in = in;\n+\tstream->avail_in = in_size;\n+\treturn Z_OK;\n+}\n+\n+int decompress_into(z_stream *stream, unsigned char *out, unsigned\nlong out_size)\n+{\n+\tstream->next_out = out;\n+\tstream->avail_out = out_size;\n+\treturn Z_OK;\n+}\n+\n+int decompress_next(z_stream *stream, int flush)\n+{\n+\treturn inflate(stream, flush);\n+}\n+\n+int decompress_next_from(z_stream *stream, unsigned char *in,\nunsigned long in_size, int flush)\n+{\n+\tdecompress_from(stream, in, in_size);\n+\treturn inflate(stream, flush);\n+}\n+\n+int decompress_next_into(z_stream *stream, unsigned char *out,\nunsigned long out_size, int flush)\n+{\n+\tdecompress_into(stream, out, out_size);\n+\treturn inflate(stream, flush);\n+}\n+\n+unsigned long decompress_free(z_stream *stream)\n+{\n+\tinflateEnd(stream);\n+\treturn stream->total_out;\n+}\n+\n+unsigned long decompress_all(unsigned char *in, unsigned long in_size,\n+                             unsigned char *out, unsigned long out_size)\n+{\n+/* caller should check for return value != 0 */\n+\n+\tz_stream stream;\n+\tint st;\n+\n+\tif (decompress_alloc(&stream) != Z_OK)\n+\t\treturn 0;\n+\n+\tif (   decompress_from(&stream, in, in_size) != Z_OK\n+\t    || decompress_into(&stream, out, out_size) != Z_OK)\n+\t\tgoto fail;\n+\n+\tdo {\n+\t\tst = decompress_next(&stream, Z_FINISH);\n+\t} while (st == Z_OK);\n+\n+\tif (st != Z_STREAM_END)\n+\t\tgoto fail;\n+\n+\treturn decompress_free(&stream);\n+\n+fail:\n+\tdecompress_free(&stream);\n+\treturn 0;\n+}\ndiff --git a/compress.h b/compress.h\nindex 16b0147..a81d006 100644\n--- a/compress.h\n+++ b/compress.h\n@@ -6,7 +6,22 @@ extern int compress_start(z_stream *stream, unsigned char *in,\n                            unsigned char *out, unsigned long out_size);\n extern int compress_next(z_stream *stream, int flush);\n extern unsigned long compress_free(z_stream *stream);\n-extern unsigned long compress_all(int level, unsigned char *data,\nunsigned long size,\n+extern unsigned long compress_all(int level, unsigned char *in,\nunsigned long in_size,\n                                   unsigned char **out);\n\n+\n+extern int decompress_alloc(z_stream *stream);\n+\n+extern int decompress_from(z_stream *stream, unsigned char *in,\nunsigned long in_size);\n+extern int decompress_into(z_stream *stream, unsigned char *out,\nunsigned long out_size);\n+\n+extern int decompress_next(z_stream *stream, int flush);\n+extern int decompress_next_from(z_stream *stream, unsigned char *in,\nunsigned long in_size, int flush);\n+extern int decompress_next_into(z_stream *stream, unsigned char *out,\nunsigned long out_size, int flush);\n+\n+extern unsigned long decompress_free(z_stream *stream);\n+\n+extern unsigned long decompress_all(unsigned char *in, unsigned long in_size,\n+                                    unsigned char *out, unsigned long\nout_size);\n+\n #endif\n-- \n1.5.4.rc2.90.gf158-dirty\n"}]}