Coverage Report

Created: 2026-01-25 07:18

next uncovered line (L), next uncovered region (R), next uncovered branch (B)
/src/ffmpeg/libavutil/bprint.h
Line
Count
Source
1
/*
2
 * Copyright (c) 2012 Nicolas George
3
 *
4
 * This file is part of FFmpeg.
5
 *
6
 * FFmpeg is free software; you can redistribute it and/or
7
 * modify it under the terms of the GNU Lesser General Public
8
 * License as published by the Free Software Foundation; either
9
 * version 2.1 of the License, or (at your option) any later version.
10
 *
11
 * FFmpeg 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 GNU
14
 * Lesser General Public License for more details.
15
 *
16
 * You should have received a copy of the GNU Lesser General Public
17
 * License along with FFmpeg; if not, write to the Free Software
18
 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
19
 */
20
21
/**
22
 * @file
23
 * @ingroup lavu_avbprint
24
 * AVBPrint public header
25
 */
26
27
#ifndef AVUTIL_BPRINT_H
28
#define AVUTIL_BPRINT_H
29
30
#include <stdarg.h>
31
32
#include "attributes.h"
33
#include "avstring.h"
34
35
/**
36
 * @defgroup lavu_avbprint AVBPrint
37
 * @ingroup lavu_data
38
 *
39
 * A buffer to print data progressively
40
 * @{
41
 */
42
43
/**
44
 * Define a structure with extra padding to a fixed size
45
 * This helps ensuring binary compatibility with future versions.
46
 */
47
48
#define FF_PAD_STRUCTURE(name, size, ...) \
49
struct ff_pad_helper_##name { __VA_ARGS__ }; \
50
typedef struct name { \
51
    __VA_ARGS__ \
52
    char reserved_padding[size - sizeof(struct ff_pad_helper_##name)]; \
53
} name;
54
55
/**
56
 * Buffer to print data progressively
57
 *
58
 * The string buffer grows as necessary and is always 0-terminated.
59
 * The content of the string is never accessed, and thus is
60
 * encoding-agnostic and can even hold binary data.
61
 *
62
 * Small buffers are kept in the structure itself, and thus require no
63
 * memory allocation at all (unless the contents of the buffer is needed
64
 * after the structure goes out of scope). This is almost as lightweight as
65
 * declaring a local `char buf[512]`.
66
 *
67
 * The length of the string can go beyond the allocated size: the buffer is
68
 * then truncated, but the functions still keep account of the actual total
69
 * length.
70
 *
71
 * In other words, AVBPrint.len can be greater than AVBPrint.size and records
72
 * the total length of what would have been to the buffer if there had been
73
 * enough memory.
74
 *
75
 * Append operations do not need to be tested for failure: if a memory
76
 * allocation fails, data stop being appended to the buffer, but the length
77
 * is still updated. This situation can be tested with
78
 * av_bprint_is_complete().
79
 *
80
 * The AVBPrint.size_max field determines several possible behaviours:
81
 * - `size_max = -1` (= `UINT_MAX`) or any large value will let the buffer be
82
 *   reallocated as necessary, with an amortized linear cost.
83
 * - `size_max = 0` prevents writing anything to the buffer: only the total
84
 *   length is computed. The write operations can then possibly be repeated in
85
 *   a buffer with exactly the necessary size
86
 *   (using `size_init = size_max = len + 1`).
87
 * - `size_max = 1` is automatically replaced by the exact size available in the
88
 *   structure itself, thus ensuring no dynamic memory allocation. The
89
 *   internal buffer is large enough to hold a reasonable paragraph of text,
90
 *   such as the current paragraph.
91
 */
92
93
FF_PAD_STRUCTURE(AVBPrint, 1024,
94
    char *str;         /**< string so far */
95
    unsigned len;      /**< length so far */
96
    unsigned size;     /**< allocated memory */
97
    unsigned size_max; /**< maximum allocated memory */
98
    char reserved_internal_buffer[1];
99
)
100
101
/**
102
 * @name Max size special values
103
 * Convenience macros for special values for av_bprint_init() size_max
104
 * parameter.
105
 * @{
106
 */
107
108
/**
109
 * Buffer will be reallocated as necessary, with an amortized linear cost.
110
 */
111
0
#define AV_BPRINT_SIZE_UNLIMITED  ((unsigned)-1)
112
/**
113
 * Use the exact size available in the AVBPrint structure itself.
114
 *
115
 * Thus ensuring no dynamic memory allocation. The internal buffer is large
116
 * enough to hold a reasonable paragraph of text, such as the current paragraph.
117
 */
118
0
#define AV_BPRINT_SIZE_AUTOMATIC  1
119
/**
120
 * Do not write anything to the buffer, only calculate the total length.
121
 *
122
 * The write operations can then possibly be repeated in a buffer with
123
 * exactly the necessary size (using `size_init = size_max = AVBPrint.len + 1`).
124
 */
125
0
#define AV_BPRINT_SIZE_COUNT_ONLY 0
126
/** @} */
127
128
/**
129
 * Init a print buffer.
130
 *
131
 * @param buf        buffer to init
132
 * @param size_init  initial size (including the final 0)
133
 * @param size_max   maximum size;
134
 *                   - `0` means do not write anything, just count the length
135
 *                   - `1` is replaced by the maximum value for automatic storage
136
 *                       any large value means that the internal buffer will be
137
 *                       reallocated as needed up to that limit
138
 *                   - `-1` is converted to `UINT_MAX`, the largest limit possible.
139
 *                   Check also `AV_BPRINT_SIZE_*` macros.
140
 */
141
void av_bprint_init(AVBPrint *buf, unsigned size_init, unsigned size_max);
142
143
/**
144
 * Init a print buffer using a pre-existing buffer.
145
 *
146
 * The buffer will not be reallocated.
147
 * In case size equals zero, the AVBPrint will be initialized to use
148
 * the internal buffer as if using AV_BPRINT_SIZE_COUNT_ONLY with
149
 * av_bprint_init().
150
 *
151
 * @param buf     buffer structure to init
152
 * @param buffer  byte buffer to use for the string data
153
 * @param size    size of buffer
154
 */
155
void av_bprint_init_for_buffer(AVBPrint *buf, char *buffer, unsigned size);
156
157
/**
158
 * Append a formatted string to a print buffer.
159
 */
160
void av_bprintf(AVBPrint *buf, const char *fmt, ...) av_printf_format(2, 3);
161
162
/**
163
 * Append a formatted string to a print buffer.
164
 */
165
void av_vbprintf(AVBPrint *buf, const char *fmt, va_list vl_arg);
166
167
/**
168
 * Append char c n times to a print buffer.
169
 */
170
void av_bprint_chars(AVBPrint *buf, char c, unsigned n);
171
172
/**
173
 * Append data to a print buffer.
174
 *
175
 * @param buf  bprint buffer to use
176
 * @param data pointer to data
177
 * @param size size of data
178
 */
179
void av_bprint_append_data(AVBPrint *buf, const char *data, unsigned size);
180
181
struct tm;
182
/**
183
 * Append a formatted date and time to a print buffer.
184
 *
185
 * @param buf  bprint buffer to use
186
 * @param fmt  date and time format string, see strftime()
187
 * @param tm   broken-down time structure to translate
188
 *
189
 * @note due to poor design of the standard strftime function, it may
190
 * produce poor results if the format string expands to a very long text and
191
 * the bprint buffer is near the limit stated by the size_max option.
192
 */
193
void av_bprint_strftime(AVBPrint *buf, const char *fmt, const struct tm *tm);
194
195
/**
196
 * Allocate bytes in the buffer for external use.
197
 *
198
 * @param[in]  buf          buffer structure
199
 * @param[in]  size         required size
200
 * @param[out] mem          pointer to the memory area
201
 * @param[out] actual_size  size of the memory area after allocation;
202
 *                          can be larger or smaller than size
203
 */
204
void av_bprint_get_buffer(AVBPrint *buf, unsigned size,
205
                          unsigned char **mem, unsigned *actual_size);
206
207
/**
208
 * Reset the string to "" but keep internal allocated data.
209
 */
210
void av_bprint_clear(AVBPrint *buf);
211
212
/**
213
 * Test if the print buffer is complete (not truncated).
214
 *
215
 * It may have been truncated due to a memory allocation failure
216
 * or the size_max limit (compare size and size_max if necessary).
217
 */
218
static inline int av_bprint_is_complete(const AVBPrint *buf)
219
0
{
220
0
    return buf->len < buf->size;
221
0
}
Unexecuted instantiation: avfiltergraph.c:av_bprint_is_complete
Unexecuted instantiation: formats.c:av_bprint_is_complete
Unexecuted instantiation: avfilter.c:av_bprint_is_complete
Unexecuted instantiation: id3v2.c:av_bprint_is_complete
Unexecuted instantiation: utils.c:av_bprint_is_complete
Unexecuted instantiation: aviobuf.c:av_bprint_is_complete
Unexecuted instantiation: network.c:av_bprint_is_complete
Unexecuted instantiation: avcodec.c:av_bprint_is_complete
Unexecuted instantiation: bsf.c:av_bprint_is_complete
Unexecuted instantiation: exif.c:av_bprint_is_complete
Unexecuted instantiation: tiff_common.c:av_bprint_is_complete
Unexecuted instantiation: avstring.c:av_bprint_is_complete
Unexecuted instantiation: bprint.c:av_bprint_is_complete
Unexecuted instantiation: channel_layout.c:av_bprint_is_complete
Unexecuted instantiation: dict.c:av_bprint_is_complete
Unexecuted instantiation: log.c:av_bprint_is_complete
Unexecuted instantiation: opt.c:av_bprint_is_complete
222
223
/**
224
 * Finalize a print buffer.
225
 *
226
 * The print buffer can no longer be used afterwards,
227
 * but the len and size fields are still valid.
228
 *
229
 * @arg[out] ret_str  if not NULL, used to return a permanent copy of the
230
 *                    buffer contents, or NULL if memory allocation fails;
231
 *                    if NULL, the buffer is discarded and freed
232
 * @return  0 for success or error code (probably AVERROR(ENOMEM))
233
 */
234
int av_bprint_finalize(AVBPrint *buf, char **ret_str);
235
236
/**
237
 * Escape the content in src and append it to dstbuf.
238
 *
239
 * @param dstbuf        already inited destination bprint buffer
240
 * @param src           string containing the text to escape
241
 * @param special_chars string containing the special characters which
242
 *                      need to be escaped, can be NULL
243
 * @param mode          escape mode to employ, see AV_ESCAPE_MODE_* macros.
244
 *                      Any unknown value for mode will be considered equivalent to
245
 *                      AV_ESCAPE_MODE_BACKSLASH, but this behaviour can change without
246
 *                      notice.
247
 * @param flags         flags which control how to escape, see AV_ESCAPE_FLAG_* macros
248
 */
249
void av_bprint_escape(AVBPrint *dstbuf, const char *src, const char *special_chars,
250
                      enum AVEscapeMode mode, int flags);
251
252
/** @} */
253
254
#endif /* AVUTIL_BPRINT_H */