summaryrefslogtreecommitdiff
path: root/usr/src/man/man3c/open_memstream.3c
diff options
context:
space:
mode:
Diffstat (limited to 'usr/src/man/man3c/open_memstream.3c')
-rw-r--r--usr/src/man/man3c/open_memstream.3c195
1 files changed, 195 insertions, 0 deletions
diff --git a/usr/src/man/man3c/open_memstream.3c b/usr/src/man/man3c/open_memstream.3c
new file mode 100644
index 0000000000..9dc9315328
--- /dev/null
+++ b/usr/src/man/man3c/open_memstream.3c
@@ -0,0 +1,195 @@
+.\"
+.\" This file and its contents are supplied under the terms of the
+.\" Common Development and Distribution License ("CDDL"), version 1.0.
+.\" You may only use this file in accordance with the terms of version
+.\" 1.0 of the CDDL.
+.\"
+.\" A full copy of the text of the CDDL should have accompanied this
+.\" source. A copy of the CDDL is also available via the Internet at
+.\" http://www.illumos.org/license/CDDL.
+.\"
+.\"
+.\" Copyright 2020 Robert Mustacchi
+.\"
+.Dd March 25, 2020
+.Dt OPEN_MEMSTREAM 3C
+.Os
+.Sh NAME
+.Nm open_memstream ,
+.Nm open_wmemstream
+.Nd open a memory stream
+.Sh SYNOPSIS
+.In stdio.h
+.Ft "FILE *"
+.Fo open_memstream
+.Fa "char **bufp"
+.Fa "size_t *sizep"
+.Fc
+.In wchar.h
+.Ft "FILE *"
+.Fo open_wmemstream
+.Fa "wchar_t **bufp"
+.Fa "size_t *sizep"
+.Fc
+.Sh DESCRIPTION
+The
+.Fn open_memstream
+and
+.Fn open_wmemstream
+functions create an I/O stream that is backed by a dynamic memory buffer
+which will grow as needed.
+The stream is seekable and writable.
+The stream is not readable.
+The stream is byte-oriented in the case of the
+.Fn open_memstream
+function or it is wide-oriented in the case of the
+.Fn open_wmemstream
+function.
+.Pp
+Memory for the stream is dynamically allocated and reallocated as though
+a call to
+.Xr malloc 3C .
+As the stream is written to, flushed, or closed, the underlying buffer
+will be grown automatically as required.
+After the stream is flushed or closed, the
+.Fa bufp
+argument will be filled in with a pointer to the current buffer.
+The
+.Fa sizep
+argument will be filled in with the smaller of the current buffer length
+and the current position in bytes
+.Pq Fn open_memstream
+or wide characters
+.Pq Fn open_wmemstream ,
+excluding a NUL character.
+Note, because the current position is taken into account, the actual
+size of the buffer may be larger than is found in
+.Fa sizep ;
+however data should not be accessed beyond the indicated size.
+The values stored in the
+.Fa bufp
+and
+.Fa sizep
+arguments are only valid until the next write operation on the stream
+or a call to
+.Xr fclose 3C .
+.Pp
+The stream maintains both the current position and the current length of
+the stream.
+Both the initial position and length of the buffer are set to zero.
+Whenever a write at the current position exceeds the current length of the
+buffer, the current length is increased and a NUL character,
+.Sq \e0
+.Pq Fn open_memstream
+or NUL wide character,
+.Sq L\e0
+.Pq Fn open_wmemstream
+will be added to the buffer.
+If the stream is seeked beyond the current length and a subsequent write
+occurs, intervening characters will be filled with the corresponding NUL
+character for the stream.
+.Pp
+To release the stream, the caller must call the
+.Xr fclose 3C
+function.
+The corresponding dynamically allocated memory will be disassociated
+from the stream and will become owned by the caller.
+The caller must eventually release the memory buffer pointed to in the
+.Fa bufp
+argument with a call to
+.Xr free 3C .
+.Ss Fn open_wmemstream , Xr fseek 3C , Xr fsetops 3C, and Xr ftell 3C
+The specification for the
+.Fn open_wmemstream
+function causes the
+.Xr fseek 3C
+and
+.Xr ftell 3C
+families of functions to operate differently.
+Traditionally, these functions always return units in bytes, regardless
+of whether the underlying stream is byte- or wide-oriented.
+However, when used against a stream created by the
+.Fn open_wmemstream
+function these now count in terms of units of wide characters.
+While this is different from the traditional behavior, this does mean
+that the units will be the same as tracked in
+.Fa sizep .
+.Ss Fn open_wmemstream and byte-oriented functions
+Unlike other streams, streams created by
+.Fn open_wmemstream
+are not only wide-oriented, but operate in terms of the
+.Vt wchar_t
+data type.
+When normal bytes are written to the stream, an implicit multi-byte
+conversion state is maintained.
+Writing byte sequences that don't correspond to valid byte sequences in
+the locale can cause I/O errors to occur when using write functions such
+as
+.Xr fputc 3C
+or
+.Xr fwrite 3C ,
+or when buffered data is flushed through functions like
+.Xr fflush 3C
+or
+.Xr fclose 3C .
+.Pp
+The same problem can occur when explicitly using wide characters, for
+example,
+.Xr fputwc 3C ,
+if the
+wide character represents a code point that is not valid in the current
+locale.
+To avoid these errors when flushing or closing, one can disable
+buffering by passing
+.Dv _IONBF
+as the buffering type with
+.Xr setvbuf 3C .
+.Pp
+It is not recommended to change the locale of such a stream while
+writing a byte sequence that represents valid wide characters.
+The behavior of using byte-oriented functions is not standardized and
+not all systems will behave the same way.
+.Sh RETURN VALUES
+Upon successful completion, the
+.Fn open_memstream
+and
+.Fn open_wmemstream
+functions returns a pointer to a stream.
+Otherwise,
+.Dv NULL
+is returned and
+.Dv errno
+is set to indicate the error.
+.Sh ERRORS
+The
+.Fn fmemopen
+function will fail if:
+.Bl -tag -width Er
+.It Er EINVAL
+Either of the
+.Fa bufp
+or
+.Fa sizep
+arguments are
+.Dv NULL .
+.It Er EMFILE
+.Brq FOPEN_MAX
+streams are currently open in the calling process.
+.Pp
+.Brq STREAM_MAX
+streams are currently open in the calling process.
+.It Er ENOMEM
+The system was unable to allocate memory for the stream or its backing
+memory buffer.
+.El
+.Sh MT-LEVEL
+.Sy MT-Safe
+.Sh INTERFACE STABILITY
+.Sy Committed
+.Sh SEE ALSO
+.Xr fclose 3C ,
+.Xr fflush 3C ,
+.Xr fmemopen 3C ,
+.Xr free 3C ,
+.Xr malloc 3C ,
+.Xr setvbuf 3C