}
zstream->high_pos = 0;
- if (stream->pos + CHUNK_SIZE > stream->buffer_size) {
- /* try to keep at least CHUNK_SIZE available */
- if (!zstream->marked && stream->skip > 0) {
- /* don't try to keep anything cached if we don't
- have a seek mark. */
- i_stream_compress(stream);
- }
- if (stream->buffer_size < i_stream_get_max_buffer_size(&stream->istream))
- i_stream_grow_buffer(stream, CHUNK_SIZE);
-
- if (stream->pos == stream->buffer_size) {
- if (stream->skip > 0) {
- /* lose our buffer cache */
- i_stream_compress(stream);
- }
-
- if (stream->pos == stream->buffer_size)
- return -2; /* buffer full */
- }
+ if (!zstream->marked) {
+ if (!i_stream_try_alloc(stream, CHUNK_SIZE, &out_size))
+ return -2; /* buffer full */
+ } else {
+ /* try to avoid compressing, so we can quickly seek backwards */
+ if (!i_stream_try_alloc_avoid_compress(stream, CHUNK_SIZE, &out_size))
+ return -2; /* buffer full */
}
if (i_stream_read_more(stream->parent, &data, &size) < 0) {
zstream->zs.next_in = (char *)data;
zstream->zs.avail_in = size;
- out_size = stream->buffer_size - stream->pos;
zstream->zs.next_out = (char *)stream->w_buffer + stream->pos;
zstream->zs.avail_out = out_size;
ret = BZ2_bzDecompress(&zstream->zs);
}
zstream->high_pos = 0;
- if (stream->pos + CHUNK_SIZE > stream->buffer_size) {
- /* try to keep at least CHUNK_SIZE available */
- if (!zstream->marked && stream->skip > 0) {
- /* don't try to keep anything cached if we don't
- have a seek mark. */
- i_stream_compress(stream);
- }
- if (stream->buffer_size < i_stream_get_max_buffer_size(&stream->istream))
- i_stream_grow_buffer(stream, CHUNK_SIZE);
-
- if (stream->pos == stream->buffer_size) {
- if (stream->skip > 0) {
- /* lose our buffer cache */
- i_stream_compress(stream);
- }
-
- if (stream->pos == stream->buffer_size)
- return -2; /* buffer full */
- }
+ if (!zstream->marked) {
+ if (!i_stream_try_alloc(stream, CHUNK_SIZE, &out_size))
+ return -2; /* buffer full */
+ } else {
+ /* try to avoid compressing, so we can quickly seek backwards */
+ if (!i_stream_try_alloc_avoid_compress(stream, CHUNK_SIZE, &out_size))
+ return -2; /* buffer full */
}
if (i_stream_read_more(stream->parent, &data, &size) < 0) {
zstream->strm.next_in = data;
zstream->strm.avail_in = size;
- out_size = stream->buffer_size - stream->pos;
zstream->strm.next_out = stream->w_buffer + stream->pos;
zstream->strm.avail_out = out_size;
ret = lzma_code(&zstream->strm, LZMA_RUN);
}
zstream->high_pos = 0;
- if (stream->pos + CHUNK_SIZE > stream->buffer_size) {
- /* try to keep at least CHUNK_SIZE available */
- if (!zstream->marked && stream->skip > 0) {
- /* don't try to keep anything cached if we don't
- have a seek mark. */
- i_stream_compress(stream);
- }
- if (stream->buffer_size < i_stream_get_max_buffer_size(&stream->istream))
- i_stream_grow_buffer(stream, CHUNK_SIZE);
-
- if (stream->pos == stream->buffer_size) {
- if (stream->skip > 0) {
- /* lose our buffer cache */
- i_stream_compress(stream);
- }
-
- if (stream->pos == stream->buffer_size)
- return -2; /* buffer full */
- }
+ if (!zstream->marked) {
+ if (!i_stream_try_alloc(stream, CHUNK_SIZE, &out_size))
+ return -2; /* buffer full */
+ } else {
+ /* try to avoid compressing, so we can quickly seek backwards */
+ if (!i_stream_try_alloc_avoid_compress(stream, CHUNK_SIZE, &out_size))
+ return -2; /* buffer full */
}
if (i_stream_read_more(stream->parent, &data, &size) < 0) {
zstream->zs.next_in = (void *)data;
zstream->zs.avail_in = size;
- out_size = stream->buffer_size - stream->pos;
zstream->zs.next_out = stream->w_buffer + stream->pos;
zstream->zs.avail_out = out_size;
ret = inflate(&zstream->zs, Z_SYNC_FLUSH);