| 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 | 198968126 | int av_strstart(const char *str, const char *pfx, const char **ptr) | |
| 37 | { | ||
| 38 |
4/4✓ Branch 0 taken 216615099 times.
✓ Branch 1 taken 1354510 times.
✓ Branch 2 taken 19001483 times.
✓ Branch 3 taken 197613616 times.
|
217969609 | while (*pfx && *pfx == *str) { |
| 39 | 19001483 | pfx++; | |
| 40 | 19001483 | str++; | |
| 41 | } | ||
| 42 |
4/4✓ Branch 0 taken 1354510 times.
✓ Branch 1 taken 197613616 times.
✓ Branch 2 taken 1351331 times.
✓ Branch 3 taken 3179 times.
|
198968126 | if (!*pfx && ptr) |
| 43 | 1351331 | *ptr = str; | |
| 44 | 198968126 | return !*pfx; | |
| 45 | } | ||
| 46 | |||
| 47 | 12436 | int av_stristart(const char *str, const char *pfx, const char **ptr) | |
| 48 | { | ||
| 49 |
4/4✓ Branch 0 taken 12906 times.
✓ Branch 1 taken 188 times.
✓ Branch 2 taken 658 times.
✓ Branch 3 taken 12248 times.
|
13094 | while (*pfx && av_toupper((unsigned)*pfx) == av_toupper((unsigned)*str)) { |
| 50 | 658 | pfx++; | |
| 51 | 658 | str++; | |
| 52 | } | ||
| 53 |
4/4✓ Branch 0 taken 188 times.
✓ Branch 1 taken 12248 times.
✓ Branch 2 taken 4 times.
✓ Branch 3 taken 184 times.
|
12436 | if (!*pfx && ptr) |
| 54 | 4 | *ptr = str; | |
| 55 | 12436 | return !*pfx; | |
| 56 | } | ||
| 57 | |||
| 58 | 695 | char *av_stristr(const char *s1, const char *s2) | |
| 59 | { | ||
| 60 |
1/2✗ Branch 0 not taken.
✓ Branch 1 taken 695 times.
|
695 | if (!*s2) |
| 61 | ✗ | return (char*)(intptr_t)s1; | |
| 62 | |||
| 63 | do | ||
| 64 |
2/2✓ Branch 1 taken 184 times.
✓ Branch 2 taken 12233 times.
|
12417 | if (av_stristart(s1, s2, NULL)) |
| 65 | 184 | return (char*)(intptr_t)s1; | |
| 66 |
2/2✓ Branch 0 taken 11722 times.
✓ Branch 1 taken 511 times.
|
12233 | while (*s1++); |
| 67 | |||
| 68 | 511 | 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 | 393630 | size_t av_strlcpy(char *dst, const char *src, size_t size) | |
| 86 | { | ||
| 87 | 393630 | size_t len = 0; | |
| 88 |
4/4✓ Branch 0 taken 2410390 times.
✓ Branch 1 taken 130908 times.
✓ Branch 2 taken 2147668 times.
✓ Branch 3 taken 262722 times.
|
2541298 | while (++len < size && *src) |
| 89 | 2147668 | *dst++ = *src++; | |
| 90 |
1/2✓ Branch 0 taken 393630 times.
✗ Branch 1 not taken.
|
393630 | if (len <= size) |
| 91 | 393630 | *dst = 0; | |
| 92 | 393630 | return len + strlen(src) - 1; | |
| 93 | } | ||
| 94 | |||
| 95 | 64681 | size_t av_strlcat(char *dst, const char *src, size_t size) | |
| 96 | { | ||
| 97 | 64681 | size_t len = strlen(dst); | |
| 98 |
1/2✗ Branch 0 not taken.
✓ Branch 1 taken 64681 times.
|
64681 | if (size <= len + 1) |
| 99 | ✗ | return len + strlen(src); | |
| 100 | 64681 | return len + av_strlcpy(dst + len, src, size - len); | |
| 101 | } | ||
| 102 | |||
| 103 | 152052 | size_t av_strlcatf(char *dst, size_t size, const char *fmt, ...) | |
| 104 | { | ||
| 105 | 152052 | size_t len = strlen(dst); | |
| 106 | va_list vl; | ||
| 107 | |||
| 108 | 152052 | va_start(vl, fmt); | |
| 109 |
1/2✓ Branch 0 taken 152052 times.
✗ Branch 1 not taken.
|
152052 | len += vsnprintf(dst + len, size > len ? size - len : 0, fmt, vl); |
| 110 | 152052 | va_end(vl); | |
| 111 | |||
| 112 | 152052 | return len; | |
| 113 | } | ||
| 114 | |||
| 115 | 17434 | char *av_asprintf(const char *fmt, ...) | |
| 116 | { | ||
| 117 | 17434 | char *p = NULL; | |
| 118 | va_list va; | ||
| 119 | int len; | ||
| 120 | |||
| 121 | 17434 | va_start(va, fmt); | |
| 122 | 17434 | len = vsnprintf(NULL, 0, fmt, va); | |
| 123 | 17434 | va_end(va); | |
| 124 |
1/2✗ Branch 0 not taken.
✓ Branch 1 taken 17434 times.
|
17434 | if (len < 0) |
| 125 | ✗ | goto end; | |
| 126 | |||
| 127 | 17434 | p = av_malloc(len + 1); | |
| 128 |
1/2✗ Branch 0 not taken.
✓ Branch 1 taken 17434 times.
|
17434 | if (!p) |
| 129 | ✗ | goto end; | |
| 130 | |||
| 131 | 17434 | va_start(va, fmt); | |
| 132 | 17434 | len = vsnprintf(p, len + 1, fmt, va); | |
| 133 | 17434 | va_end(va); | |
| 134 |
1/2✓ Branch 0 taken 17434 times.
✗ Branch 1 not taken.
|
17434 | if (len < 0) |
| 135 | ✗ | av_freep(&p); | |
| 136 | |||
| 137 | 17434 | end: | |
| 138 | 17434 | return p; | |
| 139 | } | ||
| 140 | |||
| 141 | #define WHITESPACES " \n\t\r" | ||
| 142 | |||
| 143 | 124255 | char *av_get_token(const char **buf, const char *term) | |
| 144 | { | ||
| 145 | 124255 | char *out = av_realloc(NULL, strlen(*buf) + 1); | |
| 146 | 124255 | char *ret = out, *end = out; | |
| 147 | 124255 | const char *p = *buf; | |
| 148 |
1/2✗ Branch 0 not taken.
✓ Branch 1 taken 124255 times.
|
124255 | if (!out) |
| 149 | ✗ | return NULL; | |
| 150 | 124255 | p += strspn(p, WHITESPACES); | |
| 151 | |||
| 152 |
4/4✓ Branch 0 taken 1265043 times.
✓ Branch 1 taken 46058 times.
✓ Branch 2 taken 1186846 times.
✓ Branch 3 taken 78197 times.
|
1311101 | while (*p && !strspn(p, term)) { |
| 153 | 1186846 | char c = *p++; | |
| 154 |
4/4✓ Branch 0 taken 166 times.
✓ Branch 1 taken 1186680 times.
✓ Branch 2 taken 164 times.
✓ Branch 3 taken 2 times.
|
1186846 | if (c == '\\' && *p) { |
| 155 | 164 | *out++ = *p++; | |
| 156 | 164 | end = out; | |
| 157 |
2/2✓ Branch 0 taken 48 times.
✓ Branch 1 taken 1186634 times.
|
1186682 | } 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 | 1186634 | *out++ = c; | |
| 166 | } | ||
| 167 | } | ||
| 168 | |||
| 169 | do | ||
| 170 | 124721 | *out-- = 0; | |
| 171 |
4/4✓ Branch 0 taken 122825 times.
✓ Branch 1 taken 1896 times.
✓ Branch 2 taken 466 times.
✓ Branch 3 taken 122359 times.
|
124721 | while (out >= end && strspn(out, WHITESPACES)); |
| 172 | |||
| 173 | 124255 | *buf = p; | |
| 174 | |||
| 175 | 124255 | char *small_ret = av_realloc(ret, out - ret + 2); | |
| 176 |
1/2✓ Branch 0 taken 124255 times.
✗ Branch 1 not taken.
|
124255 | return small_ret ? small_ret : ret; |
| 177 | } | ||
| 178 | |||
| 179 | 10553 | char *av_strtok(char *s, const char *delim, char **saveptr) | |
| 180 | { | ||
| 181 | char *tok; | ||
| 182 | |||
| 183 |
4/4✓ Branch 0 taken 8995 times.
✓ Branch 1 taken 1558 times.
✓ Branch 2 taken 488 times.
✓ Branch 3 taken 8507 times.
|
10553 | if (!s && !(s = *saveptr)) |
| 184 | 488 | return NULL; | |
| 185 | |||
| 186 | /* skip leading delimiters */ | ||
| 187 | 10065 | 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 26 times.
✓ Branch 1 taken 10039 times.
|
10065 | if (!*s) { |
| 191 | 26 | *saveptr = NULL; | |
| 192 | 26 | return NULL; | |
| 193 | } | ||
| 194 | 10039 | tok = s++; | |
| 195 | |||
| 196 | /* skip non delimiters */ | ||
| 197 | 10039 | s += strcspn(s, delim); | |
| 198 |
2/2✓ Branch 0 taken 8727 times.
✓ Branch 1 taken 1312 times.
|
10039 | if (*s) { |
| 199 | 8727 | *s = 0; | |
| 200 | 8727 | *saveptr = s+1; | |
| 201 | } else { | ||
| 202 | 1312 | *saveptr = NULL; | |
| 203 | } | ||
| 204 | |||
| 205 | 10039 | return tok; | |
| 206 | } | ||
| 207 | |||
| 208 | 615325 | int av_strcasecmp(const char *a, const char *b) | |
| 209 | { | ||
| 210 | uint8_t c1, c2; | ||
| 211 | do { | ||
| 212 | 678153 | c1 = av_tolower(*a++); | |
| 213 | 678153 | c2 = av_tolower(*b++); | |
| 214 |
4/4✓ Branch 0 taken 673229 times.
✓ Branch 1 taken 4924 times.
✓ Branch 2 taken 62828 times.
✓ Branch 3 taken 610401 times.
|
678153 | } while (c1 && c1 == c2); |
| 215 | 615325 | return c1 - c2; | |
| 216 | } | ||
| 217 | |||
| 218 | 3628204 | 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 3628204 times.
|
3628204 | if (n <= 0) |
| 222 | ✗ | return 0; | |
| 223 | do { | ||
| 224 | 3963067 | c1 = av_tolower(*a++); | |
| 225 | 3963067 | c2 = av_tolower(*b++); | |
| 226 |
6/6✓ Branch 0 taken 3921169 times.
✓ Branch 1 taken 41898 times.
✓ Branch 2 taken 3919202 times.
✓ Branch 3 taken 1967 times.
✓ Branch 4 taken 334863 times.
✓ Branch 5 taken 3584339 times.
|
3963067 | } while (--n && c1 && c1 == c2); |
| 227 | 3628204 | return c1 - c2; | |
| 228 | } | ||
| 229 | |||
| 230 | 4 | char *av_strireplace(const char *str, const char *from, const char *to) | |
| 231 | { | ||
| 232 | 4 | char *ret = NULL; | |
| 233 | 4 | const char *pstr2, *pstr = str; | |
| 234 | 4 | size_t tolen = strlen(to), fromlen = strlen(from); | |
| 235 | AVBPrint pbuf; | ||
| 236 | |||
| 237 | 4 | av_bprint_init(&pbuf, 1, AV_BPRINT_SIZE_UNLIMITED); | |
| 238 |
2/2✓ Branch 1 taken 4 times.
✓ Branch 2 taken 4 times.
|
8 | while ((pstr2 = av_stristr(pstr, from))) { |
| 239 | 4 | av_bprint_append_data(&pbuf, pstr, pstr2 - pstr); | |
| 240 | 4 | pstr = pstr2 + fromlen; | |
| 241 | 4 | av_bprint_append_data(&pbuf, to, tolen); | |
| 242 | } | ||
| 243 | 4 | av_bprint_append_data(&pbuf, pstr, strlen(pstr)); | |
| 244 |
1/2✗ Branch 1 not taken.
✓ Branch 2 taken 4 times.
|
4 | if (!av_bprint_is_complete(&pbuf)) { |
| 245 | ✗ | av_bprint_finalize(&pbuf, NULL); | |
| 246 | } else { | ||
| 247 | 4 | av_bprint_finalize(&pbuf, &ret); | |
| 248 | } | ||
| 249 | |||
| 250 | 4 | return ret; | |
| 251 | } | ||
| 252 | |||
| 253 | 164 | const char *av_basename(const char *path) | |
| 254 | { | ||
| 255 | char *p; | ||
| 256 | #if HAVE_DOS_PATHS | ||
| 257 | char *q, *d; | ||
| 258 | #endif | ||
| 259 | |||
| 260 |
2/4✓ Branch 0 taken 164 times.
✗ Branch 1 not taken.
✗ Branch 2 not taken.
✓ Branch 3 taken 164 times.
|
164 | if (!path || *path == '\0') |
| 261 | ✗ | return "."; | |
| 262 | |||
| 263 | 164 | p = strrchr(path, '/'); | |
| 264 | #if HAVE_DOS_PATHS | ||
| 265 | q = strrchr(path, '\\'); | ||
| 266 | d = strchr(path, ':'); | ||
| 267 | p = FFMAX3(p, q, d); | ||
| 268 | #endif | ||
| 269 | |||
| 270 |
2/2✓ Branch 0 taken 5 times.
✓ Branch 1 taken 159 times.
|
164 | if (!p) |
| 271 | 5 | return path; | |
| 272 | |||
| 273 | 159 | return p + 1; | |
| 274 | } | ||
| 275 | |||
| 276 | 39 | const char *av_dirname(char *path) | |
| 277 | { | ||
| 278 |
1/2✓ Branch 0 taken 39 times.
✗ Branch 1 not taken.
|
39 | char *p = path ? strrchr(path, '/') : NULL; |
| 279 | |||
| 280 | #if HAVE_DOS_PATHS | ||
| 281 | char *q = path ? strrchr(path, '\\') : NULL; | ||
| 282 | char *d = path ? strchr(path, ':') : NULL; | ||
| 283 | |||
| 284 | d = d ? d + 1 : d; | ||
| 285 | |||
| 286 | p = FFMAX3(p, q, d); | ||
| 287 | #endif | ||
| 288 | |||
| 289 |
2/2✓ Branch 0 taken 3 times.
✓ Branch 1 taken 36 times.
|
39 | if (!p) |
| 290 | 3 | return "."; | |
| 291 | |||
| 292 | 36 | *p = '\0'; | |
| 293 | |||
| 294 | 36 | return path; | |
| 295 | } | ||
| 296 | |||
| 297 | 8 | char *av_append_path_component(const char *path, const char *component) | |
| 298 | { | ||
| 299 | size_t p_len, c_len; | ||
| 300 | char *fullpath; | ||
| 301 | |||
| 302 |
2/2✓ Branch 0 taken 2 times.
✓ Branch 1 taken 6 times.
|
8 | if (!path) |
| 303 | 2 | return av_strdup(component); | |
| 304 |
2/2✓ Branch 0 taken 1 times.
✓ Branch 1 taken 5 times.
|
6 | if (!component) |
| 305 | 1 | return av_strdup(path); | |
| 306 | |||
| 307 | 5 | p_len = strlen(path); | |
| 308 | 5 | c_len = strlen(component); | |
| 309 |
2/4✓ Branch 0 taken 5 times.
✗ Branch 1 not taken.
✗ Branch 2 not taken.
✓ Branch 3 taken 5 times.
|
5 | if (p_len > SIZE_MAX - c_len || p_len + c_len > SIZE_MAX - 2) |
| 310 | ✗ | return NULL; | |
| 311 | 5 | fullpath = av_malloc(p_len + c_len + 2); | |
| 312 |
1/2✓ Branch 0 taken 5 times.
✗ Branch 1 not taken.
|
5 | if (fullpath) { |
| 313 |
1/2✓ Branch 0 taken 5 times.
✗ Branch 1 not taken.
|
5 | if (p_len) { |
| 314 | 5 | av_strlcpy(fullpath, path, p_len + 1); | |
| 315 |
1/2✓ Branch 0 taken 5 times.
✗ Branch 1 not taken.
|
5 | if (c_len) { |
| 316 |
4/4✓ Branch 0 taken 2 times.
✓ Branch 1 taken 3 times.
✓ Branch 2 taken 1 times.
✓ Branch 3 taken 1 times.
|
5 | if (fullpath[p_len - 1] != '/' && component[0] != '/') |
| 317 | 1 | fullpath[p_len++] = '/'; | |
| 318 |
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] == '/') |
| 319 | 2 | p_len--; | |
| 320 | } | ||
| 321 | } | ||
| 322 | 5 | av_strlcpy(&fullpath[p_len], component, c_len + 1); | |
| 323 | 5 | fullpath[p_len + c_len] = 0; | |
| 324 | } | ||
| 325 | 5 | return fullpath; | |
| 326 | } | ||
| 327 | |||
| 328 | ✗ | int av_escape(char **dst, const char *src, const char *special_chars, | |
| 329 | enum AVEscapeMode mode, int flags) | ||
| 330 | { | ||
| 331 | AVBPrint dstbuf; | ||
| 332 | int ret; | ||
| 333 | |||
| 334 | ✗ | av_bprint_init(&dstbuf, 1, INT_MAX); /* (int)dstbuf.len must be >= 0 */ | |
| 335 | ✗ | av_bprint_escape(&dstbuf, src, special_chars, mode, flags); | |
| 336 | |||
| 337 | ✗ | if (!av_bprint_is_complete(&dstbuf)) { | |
| 338 | ✗ | av_bprint_finalize(&dstbuf, NULL); | |
| 339 | ✗ | return AVERROR(ENOMEM); | |
| 340 | } | ||
| 341 | ✗ | if ((ret = av_bprint_finalize(&dstbuf, dst)) < 0) | |
| 342 | ✗ | return ret; | |
| 343 | ✗ | return dstbuf.len; | |
| 344 | } | ||
| 345 | |||
| 346 | 8466762 | int av_match_name(const char *name, const char *names) | |
| 347 | { | ||
| 348 | const char *p; | ||
| 349 | size_t len, namelen; | ||
| 350 | |||
| 351 |
4/4✓ Branch 0 taken 5773233 times.
✓ Branch 1 taken 2693529 times.
✓ Branch 2 taken 2598107 times.
✓ Branch 3 taken 3175126 times.
|
8466762 | if (!name || !names) |
| 352 | 5291636 | return 0; | |
| 353 | |||
| 354 | 3175126 | namelen = strlen(name); | |
| 355 |
2/2✓ Branch 0 taken 3610436 times.
✓ Branch 1 taken 3158340 times.
|
6768776 | while (*names) { |
| 356 | 3610436 | int negate = '-' == *names; | |
| 357 | 3610436 | p = strchr(names, ','); | |
| 358 |
2/2✓ Branch 0 taken 3173689 times.
✓ Branch 1 taken 436747 times.
|
3610436 | if (!p) |
| 359 | 3173689 | p = names + strlen(names); | |
| 360 | 3610436 | names += negate; | |
| 361 | 3610436 | len = FFMAX(p - names, namelen); | |
| 362 |
3/4✓ Branch 1 taken 3593650 times.
✓ Branch 2 taken 16786 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 3593650 times.
|
3610436 | if (!av_strncasecmp(name, names, len) || !strncmp("ALL", names, FFMAX(3, p - names))) |
| 363 | 16786 | return !negate; | |
| 364 | 3593650 | names = p + (*p == ','); | |
| 365 | } | ||
| 366 | 3158340 | return 0; | |
| 367 | } | ||
| 368 | |||
| 369 | 226101 | int av_utf8_decode(int32_t *codep, const uint8_t **bufp, const uint8_t *buf_end, | |
| 370 | unsigned int flags) | ||
| 371 | { | ||
| 372 | 226101 | const uint8_t *p = *bufp; | |
| 373 | uint32_t top; | ||
| 374 | uint64_t code; | ||
| 375 | 226101 | int ret = 0, tail_len; | |
| 376 | 226101 | uint32_t overlong_encoding_mins[6] = { | |
| 377 | 0x00000000, 0x00000080, 0x00000800, 0x00010000, 0x00200000, 0x04000000, | ||
| 378 | }; | ||
| 379 | |||
| 380 |
1/2✗ Branch 0 not taken.
✓ Branch 1 taken 226101 times.
|
226101 | if (p >= buf_end) |
| 381 | ✗ | return 0; | |
| 382 | |||
| 383 | 226101 | code = *p++; | |
| 384 | |||
| 385 | /* first sequence byte starts with 10, or is 1111-1110 or 1111-1111, | ||
| 386 | which is not admitted */ | ||
| 387 |
2/4✓ Branch 0 taken 226101 times.
✗ Branch 1 not taken.
✗ Branch 2 not taken.
✓ Branch 3 taken 226101 times.
|
226101 | if ((code & 0xc0) == 0x80 || code >= 0xFE) { |
| 388 | ✗ | ret = AVERROR(EILSEQ); | |
| 389 | ✗ | goto end; | |
| 390 | } | ||
| 391 | 226101 | top = (code & 128) >> 1; | |
| 392 | |||
| 393 | 226101 | tail_len = 0; | |
| 394 |
2/2✓ Branch 0 taken 540 times.
✓ Branch 1 taken 226101 times.
|
226641 | while (code & top) { |
| 395 | int tmp; | ||
| 396 | 540 | tail_len++; | |
| 397 |
1/2✗ Branch 0 not taken.
✓ Branch 1 taken 540 times.
|
540 | if (p >= buf_end) { |
| 398 | ✗ | (*bufp) ++; | |
| 399 | ✗ | return AVERROR(EILSEQ); /* incomplete sequence */ | |
| 400 | } | ||
| 401 | |||
| 402 | /* we assume the byte to be in the form 10xx-xxxx */ | ||
| 403 | 540 | tmp = *p++ - 128; /* strip leading 1 */ | |
| 404 |
1/2✗ Branch 0 not taken.
✓ Branch 1 taken 540 times.
|
540 | if (tmp>>6) { |
| 405 | ✗ | (*bufp) ++; | |
| 406 | ✗ | return AVERROR(EILSEQ); | |
| 407 | } | ||
| 408 | 540 | code = (code<<6) + tmp; | |
| 409 | 540 | top <<= 5; | |
| 410 | } | ||
| 411 | 226101 | code &= (top << 1) - 1; | |
| 412 | |||
| 413 | /* check for overlong encodings */ | ||
| 414 |
1/2✗ Branch 0 not taken.
✓ Branch 1 taken 226101 times.
|
226101 | av_assert0(tail_len <= 5); |
| 415 |
1/2✗ Branch 0 not taken.
✓ Branch 1 taken 226101 times.
|
226101 | if (code < overlong_encoding_mins[tail_len]) { |
| 416 | ✗ | ret = AVERROR(EILSEQ); | |
| 417 | ✗ | goto end; | |
| 418 | } | ||
| 419 | |||
| 420 |
1/2✗ Branch 0 not taken.
✓ Branch 1 taken 226101 times.
|
226101 | if (code >= 1U<<31) { |
| 421 | ✗ | ret = AVERROR(EILSEQ); /* out-of-range value */ | |
| 422 | ✗ | goto end; | |
| 423 | } | ||
| 424 | |||
| 425 | 226101 | *codep = code; | |
| 426 | |||
| 427 |
1/2✗ Branch 0 not taken.
✓ Branch 1 taken 226101 times.
|
226101 | if (code > 0x10FFFF && |
| 428 | ✗ | !(flags & AV_UTF8_FLAG_ACCEPT_INVALID_BIG_CODES)) | |
| 429 | ✗ | ret = AVERROR(EILSEQ); | |
| 430 |
6/8✓ Branch 0 taken 2003 times.
✓ Branch 1 taken 224098 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.
|
226101 | if (code < 0x20 && code != 0x9 && code != 0xA && code != 0xD && |
| 431 | ✗ | flags & AV_UTF8_FLAG_EXCLUDE_XML_INVALID_CONTROL_CODES) | |
| 432 | ✗ | ret = AVERROR(EILSEQ); | |
| 433 |
3/4✓ Branch 0 taken 198 times.
✓ Branch 1 taken 225903 times.
✗ Branch 2 not taken.
✓ Branch 3 taken 198 times.
|
226101 | if (code >= 0xD800 && code <= 0xDFFF && |
| 434 | ✗ | !(flags & AV_UTF8_FLAG_ACCEPT_SURROGATES)) | |
| 435 | ✗ | ret = AVERROR(EILSEQ); | |
| 436 |
2/4✓ Branch 0 taken 226101 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 226101 times.
✗ Branch 3 not taken.
|
226101 | if ((code == 0xFFFE || code == 0xFFFF) && |
| 437 | ✗ | !(flags & AV_UTF8_FLAG_ACCEPT_NON_CHARACTERS)) | |
| 438 | ✗ | ret = AVERROR(EILSEQ); | |
| 439 | |||
| 440 | 226101 | end: | |
| 441 | 226101 | *bufp = p; | |
| 442 | 226101 | return ret; | |
| 443 | } | ||
| 444 | |||
| 445 | 145 | int av_match_list(const char *name, const char *list, char separator) | |
| 446 | { | ||
| 447 | const char *p, *q; | ||
| 448 | |||
| 449 |
2/4✓ Branch 0 taken 145 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 145 times.
✗ Branch 3 not taken.
|
290 | for (p = name; p && *p; ) { |
| 450 |
2/4✓ Branch 0 taken 151 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 151 times.
✗ Branch 3 not taken.
|
296 | for (q = list; q && *q; ) { |
| 451 | int k; | ||
| 452 |
5/6✓ Branch 0 taken 580 times.
✓ Branch 1 taken 151 times.
✓ Branch 2 taken 145 times.
✓ Branch 3 taken 6 times.
✓ Branch 4 taken 145 times.
✗ Branch 5 not taken.
|
731 | for (k = 0; p[k] == q[k] || (p[k]*q[k] == 0 && p[k]+q[k] == separator); k++) |
| 453 |
5/6✓ Branch 0 taken 580 times.
✓ Branch 1 taken 145 times.
✓ Branch 2 taken 435 times.
✓ Branch 3 taken 145 times.
✗ Branch 4 not taken.
✓ Branch 5 taken 435 times.
|
725 | if (k && (!p[k] || p[k] == separator)) |
| 454 | 145 | return 1; | |
| 455 | 6 | q = strchr(q, separator); | |
| 456 |
1/2✓ Branch 0 taken 6 times.
✗ Branch 1 not taken.
|
6 | if(q) |
| 457 | 6 | q++; | |
| 458 | } | ||
| 459 | ✗ | p = strchr(p, separator); | |
| 460 | ✗ | if (p) | |
| 461 | ✗ | p++; | |
| 462 | } | ||
| 463 | |||
| 464 | ✗ | return 0; | |
| 465 | } | ||
| 466 |