Skip site navigation (1)Skip section navigation (2)
Date:      Thu, 7 Feb 2013 22:12:22 +0100
From:      Jilles Tjoelker <jilles@stack.nl>
To:        John Baldwin <jhb@freebsd.org>
Cc:        current@freebsd.org
Subject:   Re: [PATCH] open_memstream() and open_wmemstream()
Message-ID:  <20130207211222.GA98989@stack.nl>
In-Reply-To: <201302051546.43839.jhb@freebsd.org>
References:  <201302051546.43839.jhb@freebsd.org>

next in thread | previous in thread | raw e-mail | index | archive | help
On Tue, Feb 05, 2013 at 03:46:43PM -0500, John Baldwin wrote:
> I've written an implementation of open_memstream() and
> open_wmemstream() along with a set of regression tests.  I'm pretty
> sure open_memstream() is correct, and I believe open_wmemstream() is
> correct for expected usage.  The latter might even do the right thing
> if you split a multi-byte character across multiple writes.  One
> question I have is if my choice to discard any pending multi-byte
> state in the stream anytime a seek changes the effective position in
> the output stream.  I think this is correct as stdio will flush any
> pending data before doing a seek, so if there is a partially parsed
> character we aren't going to get the rest of it.

I don't think partially parsed characters can happen with a correct
application. As per C99, an application must not call byte output
functions on a wide-oriented stream, and vice versa.

Discarding the shift state on fseek()/fseeko() is permitted (but should
be documented as this is implementation-defined behaviour).
State-dependent encodings (where this is relevant) are rarely used
nowadays.

The conversion to bytes and back probably makes open_wmemstream() quite
slow but I don't think that is very important.

> http://www.FreeBSD.org/~jhb/patches/open_memstream.patch

The seek functions should check for overflow in the addition (for
SEEK_CUR and SEEK_END) and the conversion to size_t.

-- 
Jilles Tjoelker



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?20130207211222.GA98989>