| Line | Branch | Exec | Source |
|---|---|---|---|
| 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 <limits.h> | ||
| 23 | #include <stdarg.h> | ||
| 24 | #include <stdint.h> | ||
| 25 | #include <stdio.h> | ||
| 26 | #include <string.h> | ||
| 27 | |||
| 28 | #include "config.h" | ||
| 29 | #include "mem.h" | ||
| 30 | #include "avassert.h" | ||
| 31 | #include "avstring.h" | ||
| 32 | #include "bprint.h" | ||
| 33 | #include "error.h" | ||
| 34 | #include "macros.h" | ||
| 35 | |||
| 36 | 198874502 | int av_strstart(const char *str, const char *pfx, const char **ptr) | |
| 37 | { | ||
| 38 |
4/4✓ Branch 0 taken 216214027 times.
✓ Branch 1 taken 1371163 times.
✓ Branch 2 taken 18710688 times.
✓ Branch 3 taken 197503339 times.
|
217585190 | while (*pfx && *pfx == *str) { |
| 39 | 18710688 | pfx++; | |
| 40 | 18710688 | str++; | |
| 41 | } | ||
| 42 |
4/4✓ Branch 0 taken 1371163 times.
✓ Branch 1 taken 197503339 times.
✓ Branch 2 taken 1370181 times.
✓ Branch 3 taken 982 times.
|
198874502 | if (!*pfx && ptr) |
| 43 | 1370181 | *ptr = str; | |
| 44 | 198874502 | return !*pfx; | |
| 45 | } | ||
| 46 | |||
| 47 | 13836 | int av_stristart(const char *str, const char *pfx, const char **ptr) | |
| 48 | { | ||
| 49 |
4/4✓ Branch 0 taken 14328 times.
✓ Branch 1 taken 206 times.
✓ Branch 2 taken 698 times.
✓ Branch 3 taken 13630 times.
|
14534 | while (*pfx && av_toupper((unsigned)*pfx) == av_toupper((unsigned)*str)) { |
| 50 | 698 | pfx++; | |
| 51 | 698 | str++; | |
| 52 | } | ||
| 53 |
4/4✓ Branch 0 taken 206 times.
✓ Branch 1 taken 13630 times.
✓ Branch 2 taken 4 times.
✓ Branch 3 taken 202 times.
|
13836 | if (!*pfx && ptr) |
| 54 | 4 | *ptr = str; | |
| 55 | 13836 | return !*pfx; | |
| 56 | } | ||
| 57 | |||
| 58 | 731 | char *av_stristr(const char *s1, const char *s2) | |
| 59 | { | ||
| 60 |
1/2✗ Branch 0 not taken.
✓ Branch 1 taken 731 times.
|
731 | if (!*s2) |
| 61 | ✗ | return (char*)(intptr_t)s1; | |
| 62 | |||
| 63 | do | ||
| 64 |
2/2✓ Branch 1 taken 202 times.
✓ Branch 2 taken 13615 times.
|
13817 | if (av_stristart(s1, s2, NULL)) |
| 65 | 202 | return (char*)(intptr_t)s1; | |
| 66 |
2/2✓ Branch 0 taken 13086 times.
✓ Branch 1 taken 529 times.
|
13615 | while (*s1++); |
| 67 | |||
| 68 | 529 | return NULL; | |
| 69 | } | ||
| 70 | |||
| 71 | 7 | char *av_strnstr(const char *haystack, const char *needle, size_t hay_length) | |
| 72 | { | ||
| 73 | 7 | size_t needle_len = strlen(needle); | |
| 74 |
2/2✓ Branch 0 taken 1 times.
✓ Branch 1 taken 6 times.
|
7 | if (!needle_len) |
| 75 | 1 | return (char*)haystack; | |
| 76 |
2/2✓ Branch 0 taken 141 times.
✓ Branch 1 taken 1 times.
|
142 | while (hay_length >= needle_len) { |
| 77 | 141 | hay_length--; | |
| 78 |
2/2✓ Branch 0 taken 5 times.
✓ Branch 1 taken 136 times.
|
141 | if (!memcmp(haystack, needle, needle_len)) |
| 79 | 5 | return (char*)haystack; | |
| 80 | 136 | haystack++; | |
| 81 | } | ||
| 82 | 1 | return NULL; | |
| 83 | } | ||
| 84 | |||
| 85 | 412966 | size_t av_strlcpy(char *dst, const char *src, size_t size) | |
| 86 | { | ||
| 87 | 412966 | size_t len = 0; | |
| 88 |
4/4✓ Branch 0 taken 2513779 times.
✓ Branch 1 taken 132659 times.
✓ Branch 2 taken 2233472 times.
✓ Branch 3 taken 280307 times.
|
2646438 | while (++len < size && *src) |
| 89 | 2233472 | *dst++ = *src++; | |
| 90 |
1/2✓ Branch 0 taken 412966 times.
✗ Branch 1 not taken.
|
412966 | if (len <= size) |
| 91 | 412966 | *dst = 0; | |
| 92 | 412966 | return len + strlen(src) - 1; | |
| 93 | } | ||
| 94 | |||
| 95 | 65872 | size_t av_strlcat(char *dst, const char *src, size_t size) | |
| 96 | { | ||
| 97 | 65872 | size_t len = strlen(dst); | |
| 98 |
1/2✗ Branch 0 not taken.
✓ Branch 1 taken 65872 times.
|
65872 | if (size <= len + 1) |
| 99 | ✗ | return len + strlen(src); | |
| 100 | 65872 | return len + av_strlcpy(dst + len, src, size - len); | |
| 101 | } | ||
| 102 | |||
| 103 | 156324 | size_t av_strlcatf(char *dst, size_t size, const char *fmt, ...) | |
| 104 | { | ||
| 105 | 156324 | size_t len = strlen(dst); | |
| 106 | va_list vl; | ||
| 107 | |||
| 108 | 156324 | va_start(vl, fmt); | |
| 109 |
1/2✓ Branch 0 taken 156324 times.
✗ Branch 1 not taken.
|
156324 | len += vsnprintf(dst + len, size > len ? size - len : 0, fmt, vl); |
| 110 | 156324 | va_end(vl); | |
| 111 | |||
| 112 | 156324 | return len; | |
| 113 | } | ||
| 114 | |||
| 115 | 17673 | char *av_asprintf(const char *fmt, ...) | |
| 116 | { | ||
| 117 | 17673 | char *p = NULL; | |
| 118 | va_list va; | ||
| 119 | int len; | ||
| 120 | |||
| 121 | 17673 | va_start(va, fmt); | |
| 122 | 17673 | len = vsnprintf(NULL, 0, fmt, va); | |
| 123 | 17673 | va_end(va); | |
| 124 |
1/2✗ Branch 0 not taken.
✓ Branch 1 taken 17673 times.
|
17673 | if (len < 0) |
| 125 | ✗ | goto end; | |
| 126 | |||
| 127 | 17673 | p = av_malloc(len + 1); | |
| 128 |
1/2✗ Branch 0 not taken.
✓ Branch 1 taken 17673 times.
|
17673 | if (!p) |
| 129 | ✗ | goto end; | |
| 130 | |||
| 131 | 17673 | va_start(va, fmt); | |
| 132 | 17673 | len = vsnprintf(p, len + 1, fmt, va); | |
| 133 | 17673 | va_end(va); | |
| 134 |
1/2✓ Branch 0 taken 17673 times.
✗ Branch 1 not taken.
|
17673 | if (len < 0) |
| 135 | ✗ | av_freep(&p); | |
| 136 | |||
| 137 | 17673 | end: | |
| 138 | 17673 | return p; | |
| 139 | } | ||
| 140 | |||
| 141 | #define WHITESPACES " \n\t\r" | ||
| 142 | |||
| 143 | 125505 | char *av_get_token(const char **buf, const char *term) | |
| 144 | { | ||
| 145 | 125505 | char *out = av_realloc(NULL, strlen(*buf) + 1); | |
| 146 | 125505 | char *ret = out, *end = out; | |
| 147 | 125505 | const char *p = *buf; | |
| 148 |
1/2✗ Branch 0 not taken.
✓ Branch 1 taken 125505 times.
|
125505 | if (!out) |
| 149 | ✗ | return NULL; | |
| 150 | 125505 | p += strspn(p, WHITESPACES); | |
| 151 | |||
| 152 |
4/4✓ Branch 0 taken 1275330 times.
✓ Branch 1 taken 46535 times.
✓ Branch 2 taken 1196360 times.
✓ Branch 3 taken 78970 times.
|
1321865 | while (*p && !strspn(p, term)) { |
| 153 | 1196360 | char c = *p++; | |
| 154 |
4/4✓ Branch 0 taken 166 times.
✓ Branch 1 taken 1196194 times.
✓ Branch 2 taken 164 times.
✓ Branch 3 taken 2 times.
|
1196360 | if (c == '\\' && *p) { |
| 155 | 164 | *out++ = *p++; | |
| 156 | 164 | end = out; | |
| 157 |
2/2✓ Branch 0 taken 48 times.
✓ Branch 1 taken 1196148 times.
|
1196196 | } else if (c == '\'') { |
| 158 |
4/4✓ Branch 0 taken 908 times.
✓ Branch 1 taken 4 times.
✓ Branch 2 taken 864 times.
✓ Branch 3 taken 44 times.
|
912 | while (*p && *p != '\'') |
| 159 | 864 | *out++ = *p++; | |
| 160 |
2/2✓ Branch 0 taken 44 times.
✓ Branch 1 taken 4 times.
|
48 | if (*p) { |
| 161 | 44 | p++; | |
| 162 | 44 | end = out; | |
| 163 | } | ||
| 164 | } else { | ||
| 165 | 1196148 | *out++ = c; | |
| 166 | } | ||
| 167 | } | ||
| 168 | |||
| 169 | do | ||
| 170 | 125971 | *out-- = 0; | |
| 171 |
4/4✓ Branch 0 taken 124075 times.
✓ Branch 1 taken 1896 times.
✓ Branch 2 taken 466 times.
✓ Branch 3 taken 123609 times.
|
125971 | while (out >= end && strspn(out, WHITESPACES)); |
| 172 | |||
| 173 | 125505 | *buf = p; | |
| 174 | |||
| 175 | 125505 | char *small_ret = av_realloc(ret, out - ret + 2); | |
| 176 |
1/2✓ Branch 0 taken 125505 times.
✗ Branch 1 not taken.
|
125505 | return small_ret ? small_ret : ret; |
| 177 | } | ||
| 178 | |||
| 179 | 10648 | char *av_strtok(char *s, const char *delim, char **saveptr) | |
| 180 | { | ||
| 181 | char *tok; | ||
| 182 | |||
| 183 |
4/4✓ Branch 0 taken 9007 times.
✓ Branch 1 taken 1641 times.
✓ Branch 2 taken 494 times.
✓ Branch 3 taken 8513 times.
|
10648 | if (!s && !(s = *saveptr)) |
| 184 | 494 | return NULL; | |
| 185 | |||
| 186 | /* skip leading delimiters */ | ||
| 187 | 10154 | s += strspn(s, delim); | |
| 188 | |||
| 189 | /* s now points to the first non delimiter char, or to the end of the string */ | ||
| 190 |
2/2✓ Branch 0 taken 27 times.
✓ Branch 1 taken 10127 times.
|
10154 | if (!*s) { |
| 191 | 27 | *saveptr = NULL; | |
| 192 | 27 | return NULL; | |
| 193 | } | ||
| 194 | 10127 | tok = s++; | |
| 195 | |||
| 196 | /* skip non delimiters */ | ||
| 197 | 10127 | s += strcspn(s, delim); | |
| 198 |
2/2✓ Branch 0 taken 8757 times.
✓ Branch 1 taken 1370 times.
|
10127 | if (*s) { |
| 199 | 8757 | *s = 0; | |
| 200 | 8757 | *saveptr = s+1; | |
| 201 | } else { | ||
| 202 | 1370 | *saveptr = NULL; | |
| 203 | } | ||
| 204 | |||
| 205 | 10127 | return tok; | |
| 206 | } | ||
| 207 | |||
| 208 | 656305 | int av_strcasecmp(const char *a, const char *b) | |
| 209 | { | ||
| 210 | uint8_t c1, c2; | ||
| 211 | do { | ||
| 212 | 729097 | c1 = av_tolower(*a++); | |
| 213 | 729097 | c2 = av_tolower(*b++); | |
| 214 |
4/4✓ Branch 0 taken 723730 times.
✓ Branch 1 taken 5367 times.
✓ Branch 2 taken 72792 times.
✓ Branch 3 taken 650938 times.
|
729097 | } while (c1 && c1 == c2); |
| 215 | 656305 | return c1 - c2; | |
| 216 | } | ||
| 217 | |||
| 218 | 3737066 | int av_strncasecmp(const char *a, const char *b, size_t n) | |
| 219 | { | ||
| 220 | uint8_t c1, c2; | ||
| 221 |
1/2✗ Branch 0 not taken.
✓ Branch 1 taken 3737066 times.
|
3737066 | if (n <= 0) |
| 222 | ✗ | return 0; | |
| 223 | do { | ||
| 224 | 4082815 | c1 = av_tolower(*a++); | |
| 225 | 4082815 | c2 = av_tolower(*b++); | |
| 226 |
6/6✓ Branch 0 taken 4039479 times.
✓ Branch 1 taken 43336 times.
✓ Branch 2 taken 4037459 times.
✓ Branch 3 taken 2020 times.
✓ Branch 4 taken 345749 times.
✓ Branch 5 taken 3691710 times.
|
4082815 | } while (--n && c1 && c1 == c2); |
| 227 | 3737066 | return c1 - c2; | |
| 228 | } | ||
| 229 | |||
| 230 | 6 | char *av_strireplace(const char *str, const char *from, const char *to) | |
| 231 | { | ||
| 232 | 6 | char *ret = NULL; | |
| 233 | 6 | const char *pstr2, *pstr = str; | |
| 234 | 6 | size_t tolen = strlen(to), fromlen = strlen(from); | |
| 235 | AVBPrint pbuf; | ||
| 236 | |||
| 237 | 6 | av_bprint_init(&pbuf, 1, AV_BPRINT_SIZE_UNLIMITED); | |
| 238 |
2/2✓ Branch 1 taken 6 times.
✓ Branch 2 taken 6 times.
|
12 | while ((pstr2 = av_stristr(pstr, from))) { |
| 239 | 6 | av_bprint_append_data(&pbuf, pstr, pstr2 - pstr); | |
| 240 | 6 | pstr = pstr2 + fromlen; | |
| 241 | 6 | av_bprint_append_data(&pbuf, to, tolen); | |
| 242 | } | ||
| 243 | 6 | av_bprint_append_data(&pbuf, pstr, strlen(pstr)); | |
| 244 |
1/2✗ Branch 1 not taken.
✓ Branch 2 taken 6 times.
|
6 | if (!av_bprint_is_complete(&pbuf)) { |
| 245 | ✗ | av_bprint_finalize(&pbuf, NULL); | |
| 246 | } else { | ||
| 247 | 6 | av_bprint_finalize(&pbuf, &ret); | |
| 248 | } | ||
| 249 | |||
| 250 | 6 | return ret; | |
| 251 | } | ||
| 252 | |||
| 253 | 183 | const char *av_basename(const char *path) | |
| 254 | { | ||
| 255 |
2/4✓ Branch 0 taken 183 times.
✗ Branch 1 not taken.
✗ Branch 2 not taken.
✓ Branch 3 taken 183 times.
|
183 | if (!path || *path == '\0') |
| 256 | ✗ | return "."; | |
| 257 | |||
| 258 | 183 | const char *p = strrchr(path, '/'); | |
| 259 | #if HAVE_DOS_PATHS | ||
| 260 | const char *q = strrchr(path, '\\'); | ||
| 261 | const char *d = strchr(path, ':'); | ||
| 262 | p = FFMAX3(p, q, d); | ||
| 263 | #endif | ||
| 264 | |||
| 265 |
2/2✓ Branch 0 taken 5 times.
✓ Branch 1 taken 178 times.
|
183 | if (!p) |
| 266 | 5 | return path; | |
| 267 | |||
| 268 | 178 | return p + 1; | |
| 269 | } | ||
| 270 | |||
| 271 | 50 | const char *av_dirname(char *path) | |
| 272 | { | ||
| 273 |
1/2✓ Branch 0 taken 50 times.
✗ Branch 1 not taken.
|
50 | char *p = path ? strrchr(path, '/') : NULL; |
| 274 | |||
| 275 | #if HAVE_DOS_PATHS | ||
| 276 | char *q = path ? strrchr(path, '\\') : NULL; | ||
| 277 | char *d = path ? strchr(path, ':') : NULL; | ||
| 278 | |||
| 279 | d = d ? d + 1 : d; | ||
| 280 | |||
| 281 | p = FFMAX3(p, q, d); | ||
| 282 | #endif | ||
| 283 | |||
| 284 |
2/2✓ Branch 0 taken 3 times.
✓ Branch 1 taken 47 times.
|
50 | if (!p) |
| 285 | 3 | return "."; | |
| 286 | |||
| 287 | 47 | *p = '\0'; | |
| 288 | |||
| 289 | 47 | return path; | |
| 290 | } | ||
| 291 | |||
| 292 | 9 | char *av_append_path_component(const char *path, const char *component) | |
| 293 | { | ||
| 294 | size_t p_len, c_len; | ||
| 295 | char *fullpath; | ||
| 296 | |||
| 297 |
2/2✓ Branch 0 taken 2 times.
✓ Branch 1 taken 7 times.
|
9 | if (!path) |
| 298 | 2 | return av_strdup(component); | |
| 299 |
2/2✓ Branch 0 taken 1 times.
✓ Branch 1 taken 6 times.
|
7 | if (!component) |
| 300 | 1 | return av_strdup(path); | |
| 301 | |||
| 302 | 6 | p_len = strlen(path); | |
| 303 | 6 | c_len = strlen(component); | |
| 304 |
2/4✓ Branch 0 taken 6 times.
✗ Branch 1 not taken.
✗ Branch 2 not taken.
✓ Branch 3 taken 6 times.
|
6 | if (p_len > SIZE_MAX - c_len || p_len + c_len > SIZE_MAX - 2) |
| 305 | ✗ | return NULL; | |
| 306 | 6 | fullpath = av_malloc(p_len + c_len + 2); | |
| 307 |
1/2✓ Branch 0 taken 6 times.
✗ Branch 1 not taken.
|
6 | if (fullpath) { |
| 308 |
1/2✓ Branch 0 taken 6 times.
✗ Branch 1 not taken.
|
6 | if (p_len) { |
| 309 | 6 | av_strlcpy(fullpath, path, p_len + 1); | |
| 310 |
1/2✓ Branch 0 taken 6 times.
✗ Branch 1 not taken.
|
6 | if (c_len) { |
| 311 |
4/4✓ Branch 0 taken 3 times.
✓ Branch 1 taken 3 times.
✓ Branch 2 taken 2 times.
✓ Branch 3 taken 1 times.
|
6 | if (fullpath[p_len - 1] != '/' && component[0] != '/') |
| 312 | 2 | fullpath[p_len++] = '/'; | |
| 313 |
4/4✓ Branch 0 taken 3 times.
✓ Branch 1 taken 1 times.
✓ Branch 2 taken 2 times.
✓ Branch 3 taken 1 times.
|
4 | else if (fullpath[p_len - 1] == '/' && component[0] == '/') |
| 314 | 2 | p_len--; | |
| 315 | } | ||
| 316 | } | ||
| 317 | 6 | av_strlcpy(&fullpath[p_len], component, c_len + 1); | |
| 318 | 6 | fullpath[p_len + c_len] = 0; | |
| 319 | } | ||
| 320 | 6 | return fullpath; | |
| 321 | } | ||
| 322 | |||
| 323 | ✗ | int av_escape(char **dst, const char *src, const char *special_chars, | |
| 324 | enum AVEscapeMode mode, int flags) | ||
| 325 | { | ||
| 326 | AVBPrint dstbuf; | ||
| 327 | int ret; | ||
| 328 | |||
| 329 | ✗ | av_bprint_init(&dstbuf, 1, INT_MAX); /* (int)dstbuf.len must be >= 0 */ | |
| 330 | ✗ | av_bprint_escape(&dstbuf, src, special_chars, mode, flags); | |
| 331 | |||
| 332 | ✗ | if (!av_bprint_is_complete(&dstbuf)) { | |
| 333 | ✗ | av_bprint_finalize(&dstbuf, NULL); | |
| 334 | ✗ | return AVERROR(ENOMEM); | |
| 335 | } | ||
| 336 | ✗ | if ((ret = av_bprint_finalize(&dstbuf, dst)) < 0) | |
| 337 | ✗ | return ret; | |
| 338 | ✗ | return dstbuf.len; | |
| 339 | } | ||
| 340 | |||
| 341 | 8695284 | int av_match_name(const char *name, const char *names) | |
| 342 | { | ||
| 343 | const char *p; | ||
| 344 | size_t len, namelen; | ||
| 345 | |||
| 346 |
4/4✓ Branch 0 taken 5866018 times.
✓ Branch 1 taken 2829266 times.
✓ Branch 2 taken 2600967 times.
✓ Branch 3 taken 3265051 times.
|
8695284 | if (!name || !names) |
| 347 | 5430233 | return 0; | |
| 348 | |||
| 349 | 3265051 | namelen = strlen(name); | |
| 350 |
2/2✓ Branch 0 taken 3718894 times.
✓ Branch 1 taken 3247729 times.
|
6966623 | while (*names) { |
| 351 | 3718894 | int negate = '-' == *names; | |
| 352 | 3718894 | p = strchr(names, ','); | |
| 353 |
2/2✓ Branch 0 taken 3263333 times.
✓ Branch 1 taken 455561 times.
|
3718894 | if (!p) |
| 354 | 3263333 | p = names + strlen(names); | |
| 355 | 3718894 | names += negate; | |
| 356 | 3718894 | len = FFMAX(p - names, namelen); | |
| 357 |
3/4✓ Branch 1 taken 3701572 times.
✓ Branch 2 taken 17322 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 3701572 times.
|
3718894 | if (!av_strncasecmp(name, names, len) || !strncmp("ALL", names, FFMAX(3, p - names))) |
| 358 | 17322 | return !negate; | |
| 359 | 3701572 | names = p + (*p == ','); | |
| 360 | } | ||
| 361 | 3247729 | return 0; | |
| 362 | } | ||
| 363 | |||
| 364 | 231919 | int av_utf8_decode(int32_t *codep, const uint8_t **bufp, const uint8_t *buf_end, | |
| 365 | unsigned int flags) | ||
| 366 | { | ||
| 367 | 231919 | const uint8_t *p = *bufp; | |
| 368 | uint32_t top; | ||
| 369 | uint64_t code; | ||
| 370 | 231919 | int ret = 0, tail_len; | |
| 371 | 231919 | uint32_t overlong_encoding_mins[6] = { | |
| 372 | 0x00000000, 0x00000080, 0x00000800, 0x00010000, 0x00200000, 0x04000000, | ||
| 373 | }; | ||
| 374 | |||
| 375 |
1/2✗ Branch 0 not taken.
✓ Branch 1 taken 231919 times.
|
231919 | if (p >= buf_end) |
| 376 | ✗ | return 0; | |
| 377 | |||
| 378 | 231919 | code = *p++; | |
| 379 | |||
| 380 | /* first sequence byte starts with 10, or is 1111-1110 or 1111-1111, | ||
| 381 | which is not admitted */ | ||
| 382 |
2/4✓ Branch 0 taken 231919 times.
✗ Branch 1 not taken.
✗ Branch 2 not taken.
✓ Branch 3 taken 231919 times.
|
231919 | if ((code & 0xc0) == 0x80 || code >= 0xFE) { |
| 383 | ✗ | ret = AVERROR(EILSEQ); | |
| 384 | ✗ | goto end; | |
| 385 | } | ||
| 386 | 231919 | top = (code & 128) >> 1; | |
| 387 | |||
| 388 | 231919 | tail_len = 0; | |
| 389 |
2/2✓ Branch 0 taken 683 times.
✓ Branch 1 taken 231919 times.
|
232602 | while (code & top) { |
| 390 | int tmp; | ||
| 391 | 683 | tail_len++; | |
| 392 |
1/2✗ Branch 0 not taken.
✓ Branch 1 taken 683 times.
|
683 | if (p >= buf_end) { |
| 393 | ✗ | (*bufp) ++; | |
| 394 | ✗ | return AVERROR(EILSEQ); /* incomplete sequence */ | |
| 395 | } | ||
| 396 | |||
| 397 | /* we assume the byte to be in the form 10xx-xxxx */ | ||
| 398 | 683 | tmp = *p++ - 128; /* strip leading 1 */ | |
| 399 |
1/2✗ Branch 0 not taken.
✓ Branch 1 taken 683 times.
|
683 | if (tmp>>6) { |
| 400 | ✗ | (*bufp) ++; | |
| 401 | ✗ | return AVERROR(EILSEQ); | |
| 402 | } | ||
| 403 | 683 | code = (code<<6) + tmp; | |
| 404 | 683 | top <<= 5; | |
| 405 | } | ||
| 406 | 231919 | code &= (top << 1) - 1; | |
| 407 | |||
| 408 | /* check for overlong encodings */ | ||
| 409 |
1/2✗ Branch 0 not taken.
✓ Branch 1 taken 231919 times.
|
231919 | av_assert0(tail_len <= 5); |
| 410 |
1/2✗ Branch 0 not taken.
✓ Branch 1 taken 231919 times.
|
231919 | if (code < overlong_encoding_mins[tail_len]) { |
| 411 | ✗ | ret = AVERROR(EILSEQ); | |
| 412 | ✗ | goto end; | |
| 413 | } | ||
| 414 | |||
| 415 |
1/2✗ Branch 0 not taken.
✓ Branch 1 taken 231919 times.
|
231919 | if (code >= 1U<<31) { |
| 416 | ✗ | ret = AVERROR(EILSEQ); /* out-of-range value */ | |
| 417 | ✗ | goto end; | |
| 418 | } | ||
| 419 | |||
| 420 | 231919 | *codep = code; | |
| 421 | |||
| 422 |
1/2✗ Branch 0 not taken.
✓ Branch 1 taken 231919 times.
|
231919 | if (code > 0x10FFFF && |
| 423 | ✗ | !(flags & AV_UTF8_FLAG_ACCEPT_INVALID_BIG_CODES)) | |
| 424 | ✗ | ret = AVERROR(EILSEQ); | |
| 425 |
6/8✓ Branch 0 taken 2003 times.
✓ Branch 1 taken 229916 times.
✓ Branch 2 taken 2003 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 91 times.
✓ Branch 5 taken 1912 times.
✗ Branch 6 not taken.
✓ Branch 7 taken 91 times.
|
231919 | if (code < 0x20 && code != 0x9 && code != 0xA && code != 0xD && |
| 426 | ✗ | flags & AV_UTF8_FLAG_EXCLUDE_XML_INVALID_CONTROL_CODES) | |
| 427 | ✗ | ret = AVERROR(EILSEQ); | |
| 428 |
3/4✓ Branch 0 taken 267 times.
✓ Branch 1 taken 231652 times.
✗ Branch 2 not taken.
✓ Branch 3 taken 267 times.
|
231919 | if (code >= 0xD800 && code <= 0xDFFF && |
| 429 | ✗ | !(flags & AV_UTF8_FLAG_ACCEPT_SURROGATES)) | |
| 430 | ✗ | ret = AVERROR(EILSEQ); | |
| 431 |
2/4✓ Branch 0 taken 231919 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 231919 times.
✗ Branch 3 not taken.
|
231919 | if ((code == 0xFFFE || code == 0xFFFF) && |
| 432 | ✗ | !(flags & AV_UTF8_FLAG_ACCEPT_NON_CHARACTERS)) | |
| 433 | ✗ | ret = AVERROR(EILSEQ); | |
| 434 | |||
| 435 | 231919 | end: | |
| 436 | 231919 | *bufp = p; | |
| 437 | 231919 | return ret; | |
| 438 | } | ||
| 439 | |||
| 440 | 189 | int av_match_list(const char *name, const char *list, char separator) | |
| 441 | { | ||
| 442 | const char *p, *q; | ||
| 443 | |||
| 444 |
2/4✓ Branch 0 taken 189 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 189 times.
✗ Branch 3 not taken.
|
378 | for (p = name; p && *p; ) { |
| 445 |
2/4✓ Branch 0 taken 195 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 195 times.
✗ Branch 3 not taken.
|
384 | for (q = list; q && *q; ) { |
| 446 | int k; | ||
| 447 |
5/6✓ Branch 0 taken 756 times.
✓ Branch 1 taken 195 times.
✓ Branch 2 taken 189 times.
✓ Branch 3 taken 6 times.
✓ Branch 4 taken 189 times.
✗ Branch 5 not taken.
|
951 | for (k = 0; p[k] == q[k] || (p[k]*q[k] == 0 && p[k]+q[k] == separator); k++) |
| 448 |
5/6✓ Branch 0 taken 756 times.
✓ Branch 1 taken 189 times.
✓ Branch 2 taken 567 times.
✓ Branch 3 taken 189 times.
✗ Branch 4 not taken.
✓ Branch 5 taken 567 times.
|
945 | if (k && (!p[k] || p[k] == separator)) |
| 449 | 189 | return 1; | |
| 450 | 6 | q = strchr(q, separator); | |
| 451 |
1/2✓ Branch 0 taken 6 times.
✗ Branch 1 not taken.
|
6 | if(q) |
| 452 | 6 | q++; | |
| 453 | } | ||
| 454 | ✗ | p = strchr(p, separator); | |
| 455 | ✗ | if (p) | |
| 456 | ✗ | p++; | |
| 457 | } | ||
| 458 | |||
| 459 | ✗ | return 0; | |
| 460 | } | ||
| 461 |