FFmpeg
avstring.c
Go to the documentation of this file.
1 /*
2  * Copyright (c) 2000, 2001, 2002 Fabrice Bellard
3  * Copyright (c) 2007 Mans Rullgard
4  *
5  * This file is part of FFmpeg.
6  *
7  * FFmpeg is free software; you can redistribute it and/or
8  * modify it under the terms of the GNU Lesser General Public
9  * License as published by the Free Software Foundation; either
10  * version 2.1 of the License, or (at your option) any later version.
11  *
12  * FFmpeg is distributed in the hope that it will be useful,
13  * but WITHOUT ANY WARRANTY; without even the implied warranty of
14  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
15  * Lesser General Public License for more details.
16  *
17  * You should have received a copy of the GNU Lesser General Public
18  * License along with FFmpeg; if not, write to the Free Software
19  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
20  */
21 
22 #include <stdarg.h>
23 #include <stdint.h>
24 #include <stdio.h>
25 #include <string.h>
26 
27 #include "config.h"
28 #include "common.h"
29 #include "mem.h"
30 #include "avassert.h"
31 #include "avstring.h"
32 #include "bprint.h"
33 
34 int av_strstart(const char *str, const char *pfx, const char **ptr)
35 {
36  while (*pfx && *pfx == *str) {
37  pfx++;
38  str++;
39  }
40  if (!*pfx && ptr)
41  *ptr = str;
42  return !*pfx;
43 }
44 
45 int av_stristart(const char *str, const char *pfx, const char **ptr)
46 {
47  while (*pfx && av_toupper((unsigned)*pfx) == av_toupper((unsigned)*str)) {
48  pfx++;
49  str++;
50  }
51  if (!*pfx && ptr)
52  *ptr = str;
53  return !*pfx;
54 }
55 
56 char *av_stristr(const char *s1, const char *s2)
57 {
58  if (!*s2)
59  return (char*)(intptr_t)s1;
60 
61  do
62  if (av_stristart(s1, s2, NULL))
63  return (char*)(intptr_t)s1;
64  while (*s1++);
65 
66  return NULL;
67 }
68 
69 char *av_strnstr(const char *haystack, const char *needle, size_t hay_length)
70 {
71  size_t needle_len = strlen(needle);
72  if (!needle_len)
73  return (char*)haystack;
74  while (hay_length >= needle_len) {
75  hay_length--;
76  if (!memcmp(haystack, needle, needle_len))
77  return (char*)haystack;
78  haystack++;
79  }
80  return NULL;
81 }
82 
83 size_t av_strlcpy(char *dst, const char *src, size_t size)
84 {
85  size_t len = 0;
86  while (++len < size && *src)
87  *dst++ = *src++;
88  if (len <= size)
89  *dst = 0;
90  return len + strlen(src) - 1;
91 }
92 
93 size_t av_strlcat(char *dst, const char *src, size_t size)
94 {
95  size_t len = strlen(dst);
96  if (size <= len + 1)
97  return len + strlen(src);
98  return len + av_strlcpy(dst + len, src, size - len);
99 }
100 
101 size_t av_strlcatf(char *dst, size_t size, const char *fmt, ...)
102 {
103  size_t len = strlen(dst);
104  va_list vl;
105 
106  va_start(vl, fmt);
107  len += vsnprintf(dst + len, size > len ? size - len : 0, fmt, vl);
108  va_end(vl);
109 
110  return len;
111 }
112 
113 char *av_asprintf(const char *fmt, ...)
114 {
115  char *p = NULL;
116  va_list va;
117  int len;
118 
119  va_start(va, fmt);
120  len = vsnprintf(NULL, 0, fmt, va);
121  va_end(va);
122  if (len < 0)
123  goto end;
124 
125  p = av_malloc(len + 1);
126  if (!p)
127  goto end;
128 
129  va_start(va, fmt);
130  len = vsnprintf(p, len + 1, fmt, va);
131  va_end(va);
132  if (len < 0)
133  av_freep(&p);
134 
135 end:
136  return p;
137 }
138 
139 char *av_d2str(double d)
140 {
141  char *str = av_malloc(16);
142  if (str)
143  snprintf(str, 16, "%f", d);
144  return str;
145 }
146 
147 #define WHITESPACES " \n\t\r"
148 
149 char *av_get_token(const char **buf, const char *term)
150 {
151  char *out = av_malloc(strlen(*buf) + 1);
152  char *ret = out, *end = out;
153  const char *p = *buf;
154  if (!out)
155  return NULL;
156  p += strspn(p, WHITESPACES);
157 
158  while (*p && !strspn(p, term)) {
159  char c = *p++;
160  if (c == '\\' && *p) {
161  *out++ = *p++;
162  end = out;
163  } else if (c == '\'') {
164  while (*p && *p != '\'')
165  *out++ = *p++;
166  if (*p) {
167  p++;
168  end = out;
169  }
170  } else {
171  *out++ = c;
172  }
173  }
174 
175  do
176  *out-- = 0;
177  while (out >= end && strspn(out, WHITESPACES));
178 
179  *buf = p;
180 
181  return ret;
182 }
183 
184 char *av_strtok(char *s, const char *delim, char **saveptr)
185 {
186  char *tok;
187 
188  if (!s && !(s = *saveptr))
189  return NULL;
190 
191  /* skip leading delimiters */
192  s += strspn(s, delim);
193 
194  /* s now points to the first non delimiter char, or to the end of the string */
195  if (!*s) {
196  *saveptr = NULL;
197  return NULL;
198  }
199  tok = s++;
200 
201  /* skip non delimiters */
202  s += strcspn(s, delim);
203  if (*s) {
204  *s = 0;
205  *saveptr = s+1;
206  } else {
207  *saveptr = NULL;
208  }
209 
210  return tok;
211 }
212 
213 int av_strcasecmp(const char *a, const char *b)
214 {
215  uint8_t c1, c2;
216  do {
217  c1 = av_tolower(*a++);
218  c2 = av_tolower(*b++);
219  } while (c1 && c1 == c2);
220  return c1 - c2;
221 }
222 
223 int av_strncasecmp(const char *a, const char *b, size_t n)
224 {
225  uint8_t c1, c2;
226  if (n <= 0)
227  return 0;
228  do {
229  c1 = av_tolower(*a++);
230  c2 = av_tolower(*b++);
231  } while (--n && c1 && c1 == c2);
232  return c1 - c2;
233 }
234 
235 char *av_strireplace(const char *str, const char *from, const char *to)
236 {
237  char *ret = NULL;
238  const char *pstr2, *pstr = str;
239  size_t tolen = strlen(to), fromlen = strlen(from);
240  AVBPrint pbuf;
241 
243  while ((pstr2 = av_stristr(pstr, from))) {
244  av_bprint_append_data(&pbuf, pstr, pstr2 - pstr);
245  pstr = pstr2 + fromlen;
246  av_bprint_append_data(&pbuf, to, tolen);
247  }
248  av_bprint_append_data(&pbuf, pstr, strlen(pstr));
249  if (!av_bprint_is_complete(&pbuf)) {
250  av_bprint_finalize(&pbuf, NULL);
251  } else {
252  av_bprint_finalize(&pbuf, &ret);
253  }
254 
255  return ret;
256 }
257 
258 const char *av_basename(const char *path)
259 {
260  char *p;
261 #if HAVE_DOS_PATHS
262  char *q, *d;
263 #endif
264 
265  if (!path || *path == '\0')
266  return ".";
267 
268  p = strrchr(path, '/');
269 #if HAVE_DOS_PATHS
270  q = strrchr(path, '\\');
271  d = strchr(path, ':');
272  p = FFMAX3(p, q, d);
273 #endif
274 
275  if (!p)
276  return path;
277 
278  return p + 1;
279 }
280 
281 const char *av_dirname(char *path)
282 {
283  char *p = path ? strrchr(path, '/') : NULL;
284 
285 #if HAVE_DOS_PATHS
286  char *q = path ? strrchr(path, '\\') : NULL;
287  char *d = path ? strchr(path, ':') : NULL;
288 
289  d = d ? d + 1 : d;
290 
291  p = FFMAX3(p, q, d);
292 #endif
293 
294  if (!p)
295  return ".";
296 
297  *p = '\0';
298 
299  return path;
300 }
301 
302 char *av_append_path_component(const char *path, const char *component)
303 {
304  size_t p_len, c_len;
305  char *fullpath;
306 
307  if (!path)
308  return av_strdup(component);
309  if (!component)
310  return av_strdup(path);
311 
312  p_len = strlen(path);
313  c_len = strlen(component);
314  if (p_len > SIZE_MAX - c_len || p_len + c_len > SIZE_MAX - 2)
315  return NULL;
316  fullpath = av_malloc(p_len + c_len + 2);
317  if (fullpath) {
318  if (p_len) {
319  av_strlcpy(fullpath, path, p_len + 1);
320  if (c_len) {
321  if (fullpath[p_len - 1] != '/' && component[0] != '/')
322  fullpath[p_len++] = '/';
323  else if (fullpath[p_len - 1] == '/' && component[0] == '/')
324  p_len--;
325  }
326  }
327  av_strlcpy(&fullpath[p_len], component, c_len + 1);
328  fullpath[p_len + c_len] = 0;
329  }
330  return fullpath;
331 }
332 
333 int av_escape(char **dst, const char *src, const char *special_chars,
334  enum AVEscapeMode mode, int flags)
335 {
336  AVBPrint dstbuf;
337 
339  av_bprint_escape(&dstbuf, src, special_chars, mode, flags);
340 
341  if (!av_bprint_is_complete(&dstbuf)) {
342  av_bprint_finalize(&dstbuf, NULL);
343  return AVERROR(ENOMEM);
344  } else {
345  av_bprint_finalize(&dstbuf, dst);
346  return dstbuf.len;
347  }
348 }
349 
350 int av_match_name(const char *name, const char *names)
351 {
352  const char *p;
353  int len, namelen;
354 
355  if (!name || !names)
356  return 0;
357 
358  namelen = strlen(name);
359  while (*names) {
360  int negate = '-' == *names;
361  p = strchr(names, ',');
362  if (!p)
363  p = names + strlen(names);
364  names += negate;
365  len = FFMAX(p - names, namelen);
366  if (!av_strncasecmp(name, names, len) || !strncmp("ALL", names, FFMAX(3, p - names)))
367  return !negate;
368  names = p + (*p == ',');
369  }
370  return 0;
371 }
372 
373 int av_utf8_decode(int32_t *codep, const uint8_t **bufp, const uint8_t *buf_end,
374  unsigned int flags)
375 {
376  const uint8_t *p = *bufp;
377  uint32_t top;
378  uint64_t code;
379  int ret = 0, tail_len;
380  uint32_t overlong_encoding_mins[6] = {
381  0x00000000, 0x00000080, 0x00000800, 0x00010000, 0x00200000, 0x04000000,
382  };
383 
384  if (p >= buf_end)
385  return 0;
386 
387  code = *p++;
388 
389  /* first sequence byte starts with 10, or is 1111-1110 or 1111-1111,
390  which is not admitted */
391  if ((code & 0xc0) == 0x80 || code >= 0xFE) {
392  ret = AVERROR(EILSEQ);
393  goto end;
394  }
395  top = (code & 128) >> 1;
396 
397  tail_len = 0;
398  while (code & top) {
399  int tmp;
400  tail_len++;
401  if (p >= buf_end) {
402  (*bufp) ++;
403  return AVERROR(EILSEQ); /* incomplete sequence */
404  }
405 
406  /* we assume the byte to be in the form 10xx-xxxx */
407  tmp = *p++ - 128; /* strip leading 1 */
408  if (tmp>>6) {
409  (*bufp) ++;
410  return AVERROR(EILSEQ);
411  }
412  code = (code<<6) + tmp;
413  top <<= 5;
414  }
415  code &= (top << 1) - 1;
416 
417  /* check for overlong encodings */
418  av_assert0(tail_len <= 5);
419  if (code < overlong_encoding_mins[tail_len]) {
420  ret = AVERROR(EILSEQ);
421  goto end;
422  }
423 
424  if (code >= 1U<<31) {
425  ret = AVERROR(EILSEQ); /* out-of-range value */
426  goto end;
427  }
428 
429  *codep = code;
430 
431  if (code > 0x10FFFF &&
433  ret = AVERROR(EILSEQ);
434  if (code < 0x20 && code != 0x9 && code != 0xA && code != 0xD &&
436  ret = AVERROR(EILSEQ);
437  if (code >= 0xD800 && code <= 0xDFFF &&
439  ret = AVERROR(EILSEQ);
440  if ((code == 0xFFFE || code == 0xFFFF) &&
442  ret = AVERROR(EILSEQ);
443 
444 end:
445  *bufp = p;
446  return ret;
447 }
448 
449 int av_match_list(const char *name, const char *list, char separator)
450 {
451  const char *p, *q;
452 
453  for (p = name; p && *p; ) {
454  for (q = list; q && *q; ) {
455  int k;
456  for (k = 0; p[k] == q[k] || (p[k]*q[k] == 0 && p[k]+q[k] == separator); k++)
457  if (k && (!p[k] || p[k] == separator))
458  return 1;
459  q = strchr(q, separator);
460  q += !!q;
461  }
462  p = strchr(p, separator);
463  p += !!p;
464  }
465 
466  return 0;
467 }
av_utf8_decode
int av_utf8_decode(int32_t *codep, const uint8_t **bufp, const uint8_t *buf_end, unsigned int flags)
Read and decode a single UTF-8 code point (character) from the buffer in *buf, and update *buf to poi...
Definition: avstring.c:373
AV_BPRINT_SIZE_UNLIMITED
#define AV_BPRINT_SIZE_UNLIMITED
name
it s the only field you need to keep assuming you have a context There is some magic you don t need to care about around this just let it vf default minimum maximum flags name is the option name
Definition: writing_filters.txt:88
AVERROR
Filter the word “frame” indicates either a video frame or a group of audio as stored in an AVFrame structure Format for each input and each output the list of supported formats For video that means pixel format For audio that means channel sample they are references to shared objects When the negotiation mechanism computes the intersection of the formats supported at each end of a all references to both lists are replaced with a reference to the intersection And when a single format is eventually chosen for a link amongst the remaining all references to the list are updated That means that if a filter requires that its input and output have the same format amongst a supported all it has to do is use a reference to the same list of formats query_formats can leave some formats unset and return AVERROR(EAGAIN) to cause the negotiation mechanism toagain later. That can be used by filters with complex requirements to use the format negotiated on one link to set the formats supported on another. Frame references ownership and permissions
av_bprint_finalize
int av_bprint_finalize(AVBPrint *buf, char **ret_str)
Finalize a print buffer.
Definition: bprint.c:235
out
FILE * out
Definition: movenc.c:54
av_bprint_init
void av_bprint_init(AVBPrint *buf, unsigned size_init, unsigned size_max)
Definition: bprint.c:69
av_get_token
char * av_get_token(const char **buf, const char *term)
Unescape the given string until a non escaped terminating char, and return the token corresponding to...
Definition: avstring.c:149
av_stristr
char * av_stristr(const char *s1, const char *s2)
Locate the first case-independent occurrence in the string haystack of the string needle.
Definition: avstring.c:56
AV_UTF8_FLAG_ACCEPT_NON_CHARACTERS
#define AV_UTF8_FLAG_ACCEPT_NON_CHARACTERS
accept non-characters - 0xFFFE and 0xFFFF
Definition: avstring.h:362
av_asprintf
char * av_asprintf(const char *fmt,...)
Definition: avstring.c:113
av_strcasecmp
int av_strcasecmp(const char *a, const char *b)
Locale-independent case-insensitive compare.
Definition: avstring.c:213
end
static av_cold int end(AVCodecContext *avctx)
Definition: avrndec.c:92
tmp
static uint8_t tmp[11]
Definition: aes_ctr.c:26
av_d2str
char * av_d2str(double d)
Convert a number to an av_malloced string.
Definition: avstring.c:139
b
#define b
Definition: input.c:41
av_bprint_append_data
void av_bprint_append_data(AVBPrint *buf, const char *data, unsigned size)
Append data to a print buffer.
Definition: bprint.c:158
c1
static const uint64_t c1
Definition: murmur3.c:49
AV_UTF8_FLAG_ACCEPT_SURROGATES
#define AV_UTF8_FLAG_ACCEPT_SURROGATES
accept UTF-16 surrogates codes
Definition: avstring.h:363
av_strlcatf
size_t av_strlcatf(char *dst, size_t size, const char *fmt,...)
Definition: avstring.c:101
av_basename
const char * av_basename(const char *path)
Thread safe basename.
Definition: avstring.c:258
av_malloc
#define av_malloc(s)
Definition: tableprint_vlc.h:31
av_append_path_component
char * av_append_path_component(const char *path, const char *component)
Append path component to the existing path.
Definition: avstring.c:302
AV_UTF8_FLAG_EXCLUDE_XML_INVALID_CONTROL_CODES
#define AV_UTF8_FLAG_EXCLUDE_XML_INVALID_CONTROL_CODES
exclude control codes not accepted by XML
Definition: avstring.h:364
av_escape
int av_escape(char **dst, const char *src, const char *special_chars, enum AVEscapeMode mode, int flags)
Escape string in src, and put the escaped string in an allocated string in *dst, which must be freed ...
Definition: avstring.c:333
U
#define U(x)
Definition: vp56_arith.h:37
av_dirname
const char * av_dirname(char *path)
Thread safe dirname.
Definition: avstring.c:281
avassert.h
AV_UTF8_FLAG_ACCEPT_INVALID_BIG_CODES
#define AV_UTF8_FLAG_ACCEPT_INVALID_BIG_CODES
accept codepoints over 0x10FFFF
Definition: avstring.h:361
FFMAX3
#define FFMAX3(a, b, c)
Definition: common.h:95
s
#define s(width, name)
Definition: cbs_vp9.c:257
s1
#define s1
Definition: regdef.h:38
av_strtok
char * av_strtok(char *s, const char *delim, char **saveptr)
Split the string into several tokens which can be accessed by successive calls to av_strtok().
Definition: avstring.c:184
from
const char * from
Definition: jacosubdec.c:65
to
const char * to
Definition: webvttdec.c:34
av_assert0
#define av_assert0(cond)
assert() equivalent, that is always enabled.
Definition: avassert.h:37
av_stristart
int av_stristart(const char *str, const char *pfx, const char **ptr)
Return non-zero if pfx is a prefix of str independent of case.
Definition: avstring.c:45
int32_t
int32_t
Definition: audio_convert.c:194
NULL
#define NULL
Definition: coverity.c:32
av_match_list
int av_match_list(const char *name, const char *list, char separator)
Check if a name is in a list.
Definition: avstring.c:449
av_strireplace
char * av_strireplace(const char *str, const char *from, const char *to)
Locale-independent strings replace.
Definition: avstring.c:235
src
#define src
Definition: vp8dsp.c:254
list
Filter the word “frame” indicates either a video frame or a group of audio as stored in an AVFrame structure Format for each input and each output the list of supported formats For video that means pixel format For audio that means channel sample they are references to shared objects When the negotiation mechanism computes the intersection of the formats supported at each end of a all references to both lists are replaced with a reference to the intersection And when a single format is eventually chosen for a link amongst the remaining list
Definition: filter_design.txt:25
c
Undefined Behavior In the C some operations are like signed integer dereferencing freed accessing outside allocated Undefined Behavior must not occur in a C it is not safe even if the output of undefined operations is unused The unsafety may seem nit picking but Optimizing compilers have in fact optimized code on the assumption that no undefined Behavior occurs Optimizing code based on wrong assumptions can and has in some cases lead to effects beyond the output of computations The signed integer overflow problem in speed critical code Code which is highly optimized and works with signed integers sometimes has the problem that often the output of the computation does not c
Definition: undefined.txt:32
av_bprint_is_complete
static int av_bprint_is_complete(const AVBPrint *buf)
Test if the print buffer is complete (not truncated).
Definition: bprint.h:185
FFFILE::buf
unsigned char * buf
Definition: avsscanf.c:39
av_strncasecmp
int av_strncasecmp(const char *a, const char *b, size_t n)
Locale-independent case-insensitive compare.
Definition: avstring.c:223
s2
#define s2
Definition: regdef.h:39
FFMAX
#define FFMAX(a, b)
Definition: common.h:94
size
int size
Definition: twinvq_data.h:11134
WHITESPACES
#define WHITESPACES
Definition: avstring.c:147
a
The reader does not expect b to be semantically here and if the code is changed by maybe adding a a division or other the signedness will almost certainly be mistaken To avoid this confusion a new type was SUINT is the C unsigned type but it holds a signed int to use the same example SUINT a
Definition: undefined.txt:41
av_strstart
int av_strstart(const char *str, const char *pfx, const char **ptr)
Return non-zero if pfx is a prefix of str.
Definition: avstring.c:34
bprint.h
code
and forward the test the status of outputs and forward it to the corresponding return FFERROR_NOT_READY If the filters stores internally one or a few frame for some it can consider them to be part of the FIFO and delay acknowledging a status change accordingly Example code
Definition: filter_design.txt:178
vsnprintf
#define vsnprintf
Definition: snprintf.h:36
common.h
av_toupper
static av_const int av_toupper(int c)
Locale-independent conversion of ASCII characters to uppercase.
Definition: avstring.h:231
uint8_t
uint8_t
Definition: audio_convert.c:194
len
int len
Definition: vorbis_enc_data.h:452
ret
ret
Definition: filter_design.txt:187
av_strlcat
size_t av_strlcat(char *dst, const char *src, size_t size)
Append the string src to the string dst, but to a total length of no more than size - 1 bytes,...
Definition: avstring.c:93
av_strnstr
char * av_strnstr(const char *haystack, const char *needle, size_t hay_length)
Locate the first occurrence of the string needle in the string haystack where not more than hay_lengt...
Definition: avstring.c:69
av_bprint_escape
void av_bprint_escape(AVBPrint *dstbuf, const char *src, const char *special_chars, enum AVEscapeMode mode, int flags)
Escape the content in src and append it to dstbuf.
Definition: bprint.c:265
c2
static const uint64_t c2
Definition: murmur3.c:50
mode
mode
Definition: ebur128.h:83
av_match_name
int av_match_name(const char *name, const char *names)
Match instances of a name in a comma-separated list of names.
Definition: avstring.c:350
av_strdup
char * av_strdup(const char *s)
Duplicate a string.
Definition: mem.c:253
mem.h
av_freep
#define av_freep(p)
Definition: tableprint_vlc.h:35
convert_header.str
string str
Definition: convert_header.py:20
flags
#define flags(name, subs,...)
Definition: cbs_av1.c:565
av_strlcpy
size_t av_strlcpy(char *dst, const char *src, size_t size)
Copy the string src to dst, but no more than size - 1 bytes, and null-terminate dst.
Definition: avstring.c:83
AVEscapeMode
AVEscapeMode
Definition: avstring.h:318
avstring.h
snprintf
#define snprintf
Definition: snprintf.h:34
av_tolower
static av_const int av_tolower(int c)
Locale-independent conversion of ASCII characters to lowercase.
Definition: avstring.h:241