VLC 4.0.0-dev
Loading...
Searching...
No Matches
vlc_memstream.h
Go to the documentation of this file.
1/*****************************************************************************
2 * vlc_memstream.h:
3 *****************************************************************************
4 * Copyright (C) 2016 Rémi Denis-Courmont
5 *
6 * This program is free software; you can redistribute it and/or modify it
7 * under the terms of the GNU Lesser General Public License as published by
8 * the Free Software Foundation; either version 2.1 of the License, or
9 * (at your option) any later version.
10 *
11 * This program is distributed in the hope that it will be useful,
12 * but WITHOUT ANY WARRANTY; without even the implied warranty of
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 * GNU Lesser General Public License for more details.
15 *
16 * You should have received a copy of the GNU Lesser General Public License
17 * along with this program; if not, write to the Free Software Foundation,
18 * Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA.
19 *****************************************************************************/
20
21#ifndef VLC_MEMSTREAM_H
22# define VLC_MEMSTREAM_H 1
23
24# include <stdarg.h>
25# include <stdio.h>
26
27/**
28 * \defgroup memstream In-memory byte streams
29 * \ingroup cext
30 *
31 * In-memory byte stream are a portable wrapper for in-memory formatted output
32 * byte streams. Compare with POSIX @c open_memstream().
33 *
34 * @{
35 */
36
37/**
38 * In-memory stream object.
39 */
40struct vlc_memstream
42 FILE *stream;
43 char *ptr; /**< Buffer start address */
44 size_t length; /**< Buffer length in bytes */
45};
46
47/**
48 * Initializes a byte stream object.
49 *
50 * @note Even when this function fails, the stream object is initialized and
51 * can be used safely. It is sufficient to check for errors from
52 * vlc_memstream_flush() and vlc_memstream_close().
53 *
54 * Compare with POSIX @c open_memstream().
55 *
56 * @param ms byte stream object
57 *
58 * @retval 0 on success
59 * @retval EOF on error
60 */
62int vlc_memstream_open(struct vlc_memstream *ms);
63
64/**
65 * Flushes a byte stream object.
66 *
67 * This function ensures that any previous write to the byte stream is flushed
68 * and the in-memory buffer is synchronized. It can be used observe the content
69 * of the buffer before the final vlc_memstream_close().
70 *
71 * Compare with @c fflush().
72 *
73 * @note vlc_memstream_close() implicitly flushes the object.
74 * Calling vlc_memstream_flush() before closing is thus superfluous.
75 *
76 * @warning @c ms->ptr must <b>not</b> be freed. It can only be freed after
77 * a successful call to vlc_memstream_close().
78 *
79 * @retval 0 success, i.e., @c ms->ptr and @c ms->length are valid
80 * @retval EOF failure (@c ms->ptr and @c ms->length are unspecified)
81 */
84
85/**
86 * Closes a byte stream object.
87 *
88 * This function flushes the stream object, releases any underlying
89 * resource, except for the heap-allocated formatted buffer @c ms->ptr,
90 * and deinitializes the object.
91 *
92 * On success, the caller is responsible for freeing the buffer with @c free().
93 *
94 * Compare with @c fclose().
95 *
96 * \retval 0 success
97 * \retval EOF failure (@c ms->ptr and @c ms->length are unspecified)
98 */
101
102/**
103 * Appends a binary blob to a byte stream.
104 *
105 * Compare with @c fwrite().
106 *
107 * @param ms the VLC memstream to write to
108 * @param ptr start address of the blob
109 * @param len byte length of the blob
110 */
112size_t vlc_memstream_write(struct vlc_memstream *ms,
113 const void *ptr, size_t len);
114
115/**
116 * Appends a single byte to a byte stream.
117 *
118 * Compare with @c putc() or @c fputc().
119 *
120 * @param ms the VLC memstream to write to
121 * @param c Unsigned byte value converted to int.
122 */
124int vlc_memstream_putc(struct vlc_memstream *ms, int c);
125
126/**
127 * Appends a nul-terminated string to a byte stream.
128 *
129 * Compare with @c fputs().
130 */
132int vlc_memstream_puts(struct vlc_memstream *ms, const char *str);
133
134/**
135 * Appends a formatted string to a byte stream.
136 *
137 * Compare with @c vfprintf().
138 */
140int vlc_memstream_vprintf(struct vlc_memstream *ms, const char *fmt,
141 va_list args);
142
143/**
144 * Appends a formatted string to a byte stream.
145 *
146 * Compare with @c fprintf().
147 */
149int vlc_memstream_printf(struct vlc_memstream *s, const char *fmt,
150 ...) VLC_FORMAT(2,3);
151
152# ifdef __GNUC__
153static inline int vlc_memstream_puts_len(struct vlc_memstream *ms,
154 const char *str, size_t len)
155{
156 return (vlc_memstream_write(ms, str, len) == len) ? (int)len : EOF;
157}
158# define vlc_memstream_puts(ms,s) \
159 (__builtin_constant_p(__builtin_strlen(s)) ? \
160 vlc_memstream_puts_len(ms,s,__builtin_strlen(s)) : \
161 vlc_memstream_puts(ms,s))
162# endif
163
164/** @} */
165
166#endif /* VLC_MEMSTREAM_H */
#define VLC_USED
Definition fourcc_gen.c:32
#define VLC_API
Definition fourcc_gen.c:31
#define VLC_FORMAT(x, y)
String format function annotation.
Definition vlc_common.h:193
int vlc_memstream_open(struct vlc_memstream *ms)
Initializes a byte stream object.
Definition memstream.c:119
int vlc_memstream_flush(struct vlc_memstream *ms)
Flushes a byte stream object.
Definition memstream.c:131
int vlc_memstream_printf(struct vlc_memstream *s, const char *fmt,...)
Appends a formatted string to a byte stream.
Definition memstream.c:217
int vlc_memstream_putc(struct vlc_memstream *ms, int c)
Appends a single byte to a byte stream.
Definition memstream.c:174
size_t vlc_memstream_write(struct vlc_memstream *ms, const void *ptr, size_t len)
Appends a binary blob to a byte stream.
Definition memstream.c:147
int vlc_memstream_puts(struct vlc_memstream *ms, const char *str)
Appends a nul-terminated string to a byte stream.
Definition memstream.c:179
int vlc_memstream_vprintf(struct vlc_memstream *ms, const char *fmt, va_list args)
Appends a formatted string to a byte stream.
Definition memstream.c:185
int vlc_memstream_close(struct vlc_memstream *ms)
Closes a byte stream object.
Definition memstream.c:136
In-memory stream object.
Definition vlc_memstream.h:42
char * ptr
Buffer start address.
Definition vlc_memstream.h:44
FILE * stream
Definition vlc_memstream.h:43
size_t length
Buffer length in bytes.
Definition vlc_memstream.h:45
This file is a collection of common definitions and types.