From: Timo Sirainen Date: Thu, 28 Jun 2012 00:18:55 +0000 (+0300) Subject: Added i_stream_alloc() X-Git-Tag: 2.2.alpha1~448 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=c7acd38cd4ef76a0f4652f9ca659ea5e64458b52;p=thirdparty%2Fdovecot%2Fcore.git Added i_stream_alloc() --- diff --git a/src/lib-mail/istream-binary-converter.c b/src/lib-mail/istream-binary-converter.c index 74a896f803..215de9814e 100644 --- a/src/lib-mail/istream-binary-converter.c +++ b/src/lib-mail/istream-binary-converter.c @@ -30,25 +30,6 @@ struct binary_converter_istream { static void stream_add_data(struct binary_converter_istream *bstream, const void *data, size_t size); -static void * -stream_alloc_data(struct binary_converter_istream *bstream, size_t size) -{ - struct istream_private *stream = &bstream->istream; - size_t old_size, avail_size; - - i_stream_try_alloc(stream, size, &avail_size); - if (avail_size < size) { - old_size = stream->buffer_size; - stream->buffer_size = nearest_power(stream->pos + size); - stream->w_buffer = i_realloc(stream->w_buffer, old_size, - stream->buffer_size); - stream->buffer = stream->w_buffer; - i_stream_try_alloc(stream, size, &avail_size); - i_assert(avail_size >= size); - } - return stream->w_buffer + stream->pos; -} - static bool part_can_convert(const struct message_part *part) { /* some MUAs use "c-t-e: binary" for multiparts. @@ -92,13 +73,14 @@ static void stream_add_data(struct binary_converter_istream *bstream, stream_finish_convert_decision(bstream); } - memcpy(stream_alloc_data(bstream, size), data, size); + memcpy(i_stream_alloc(&bstream->istream, size), data, size); bstream->istream.pos += size; } static void stream_encode_base64(struct binary_converter_istream *bstream, const void *_data, size_t size) { + struct istream_private *stream = &bstream->istream; const unsigned char *data = _data; buffer_t buf; void *dest; @@ -128,23 +110,23 @@ static void stream_encode_base64(struct binary_converter_istream *bstream, } if (bstream->base64_block_pos == BASE64_BLOCKS_PER_LINE) { - memcpy(stream_alloc_data(bstream, 2), "\r\n", 2); - bstream->istream.pos += 2; + memcpy(i_stream_alloc(stream, 2), "\r\n", 2); + stream->pos += 2; bstream->base64_block_pos = 0; } - dest = stream_alloc_data(bstream, BASE64_BLOCK_SIZE); + dest = i_stream_alloc(stream, BASE64_BLOCK_SIZE); buffer_create_data(&buf, dest, BASE64_BLOCK_SIZE); base64_encode(base64_block, base64_block_len, &buf); - bstream->istream.pos += buf.used; + stream->pos += buf.used; bstream->base64_block_pos++; bstream->base64_delayed_len = 0; } while (size >= BASE64_BLOCK_INPUT_SIZE) { if (bstream->base64_block_pos == BASE64_BLOCKS_PER_LINE) { - memcpy(stream_alloc_data(bstream, 2), "\r\n", 2); - bstream->istream.pos += 2; + memcpy(i_stream_alloc(stream, 2), "\r\n", 2); + stream->pos += 2; bstream->base64_block_pos = 0; } @@ -160,10 +142,10 @@ static void stream_encode_base64(struct binary_converter_istream *bstream, } max_encoded_size = MAX_BASE64_ENCODED_SIZE(encode_size); - dest = stream_alloc_data(bstream, max_encoded_size); + dest = i_stream_alloc(stream, max_encoded_size); buffer_create_data(&buf, dest, max_encoded_size); base64_encode(data, encode_size, &buf); - bstream->istream.pos += buf.used; + stream->pos += buf.used; bstream->base64_block_pos += encode_blocks; data += encode_size; diff --git a/src/lib/istream-private.h b/src/lib/istream-private.h index 7fb51e67f1..5cefe37af7 100644 --- a/src/lib/istream-private.h +++ b/src/lib/istream-private.h @@ -56,6 +56,7 @@ void i_stream_grow_buffer(struct istream_private *stream, size_t bytes); bool ATTR_NOWARN_UNUSED_RESULT i_stream_try_alloc(struct istream_private *stream, size_t wanted_size, size_t *size_r); +void *i_stream_alloc(struct istream_private *stream, size_t size); ssize_t i_stream_read_copy_from_parent(struct istream *istream); void i_stream_default_seek(struct istream_private *stream, uoff_t v_offset, bool mark); diff --git a/src/lib/istream.c b/src/lib/istream.c index 94e24df0cb..6207e3f9e7 100644 --- a/src/lib/istream.c +++ b/src/lib/istream.c @@ -515,6 +515,23 @@ bool i_stream_try_alloc(struct istream_private *stream, return stream->pos != stream->buffer_size; } +void *i_stream_alloc(struct istream_private *stream, size_t size) +{ + size_t old_size, avail_size; + + i_stream_try_alloc(stream, size, &avail_size); + if (avail_size < size) { + old_size = stream->buffer_size; + stream->buffer_size = nearest_power(stream->pos + size); + stream->w_buffer = i_realloc(stream->w_buffer, old_size, + stream->buffer_size); + stream->buffer = stream->w_buffer; + i_stream_try_alloc(stream, size, &avail_size); + i_assert(avail_size >= size); + } + return stream->w_buffer + stream->pos; +} + bool i_stream_add_data(struct istream *_stream, const unsigned char *data, size_t size) {