Changeset: 16158a5cc256 for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=16158a5cc256
Modified Files:
        common/stream/bz2_stream.c
Branch: default
Log Message:

Support reading concatenated .bz2 files in libstream


diffs (49 lines):

diff --git a/common/stream/bz2_stream.c b/common/stream/bz2_stream.c
--- a/common/stream/bz2_stream.c
+++ b/common/stream/bz2_stream.c
@@ -20,6 +20,7 @@ struct inner_state {
        bz_stream strm;
        int (*work)(bz_stream *strm, int flush);
        int (*end)(bz_stream *strm);
+       void (*reset)(inner_state_t *inner_state);
        bool eof_reached;
        char buf[64*1024];
 };
@@ -108,6 +109,11 @@ work(inner_state_t *inner_state, pump_ac
                        /* flushing and finishing is not yet done */
                        return PUMP_OK;
                case BZ_STREAM_END:
+                       if (action == PUMP_NO_FLUSH && inner_state->reset != 
NULL) {
+                               // attempt to read concatenated additional bz2 
stream
+                               inner_state->reset(inner_state);
+                               return PUMP_OK;
+                       }
                        inner_state->eof_reached = true;
                        return PUMP_END;
                default:
@@ -136,6 +142,17 @@ BZ2_bzDecompress_wrapper(bz_stream *strm
        return BZ2_bzDecompress(strm);
 }
 
+static void
+bz2_decompress_reset(inner_state_t *inner_state)
+{
+       pump_buffer src = get_src_win(inner_state);
+       pump_buffer dst = get_dst_win(inner_state);
+       BZ2_bzDecompressEnd(&inner_state->strm);
+       BZ2_bzDecompressInit(&inner_state->strm, 0, 0);
+       set_src_win(inner_state, src);
+       set_dst_win(inner_state, dst);
+}
+
 stream *
 bz2_stream(stream *inner, int level)
 {
@@ -162,6 +179,7 @@ bz2_stream(stream *inner, int level)
        if (inner->readonly) {
                bz->work = BZ2_bzDecompress_wrapper;
                bz->end = BZ2_bzDecompressEnd;
+               bz->reset = bz2_decompress_reset;
                ret = BZ2_bzDecompressInit(&bz->strm, 0, 0);
        } else {
                bz->work = BZ2_bzCompress;
_______________________________________________
checkin-list mailing list
checkin-list@monetdb.org
https://www.monetdb.org/mailman/listinfo/checkin-list

Reply via email to