| 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 | 199560212 | int av_strstart(const char *str, const char *pfx, const char **ptr) | |
| 37 | { | ||
| 38 |
4/4✓ Branch 0 taken 217378738 times.
✓ Branch 1 taken 1372134 times.
✓ Branch 2 taken 19190660 times.
✓ Branch 3 taken 198188078 times.
|
218750872 | while (*pfx && *pfx == *str) { |
| 39 | 19190660 | pfx++; | |
| 40 | 19190660 | str++; | |
| 41 | } | ||
| 42 |
4/4✓ Branch 0 taken 1372134 times.
✓ Branch 1 taken 198188078 times.
✓ Branch 2 taken 1368990 times.
✓ Branch 3 taken 3144 times.
|
199560212 | if (!*pfx && ptr) |
| 43 | 1368990 | *ptr = str; | |
| 44 | 199560212 | return !*pfx; | |
| 45 | } | ||
| 46 | |||
| 47 | 10767 | int av_stristart(const char *str, const char *pfx, const char **ptr) | |
| 48 | { | ||
| 49 |
4/4✓ Branch 0 taken 11223 times.
✓ Branch 1 taken 188 times.
✓ Branch 2 taken 644 times.
✓ Branch 3 taken 10579 times.
|
11411 | while (*pfx && av_toupper((unsigned)*pfx) == av_toupper((unsigned)*str)) { |
| 50 | 644 | pfx++; | |
| 51 | 644 | str++; | |
| 52 | } | ||
| 53 |
4/4✓ Branch 0 taken 188 times.
✓ Branch 1 taken 10579 times.
✓ Branch 2 taken 4 times.
✓ Branch 3 taken 184 times.
|
10767 | if (!*pfx && ptr) |
| 54 | 4 | *ptr = str; | |
| 55 | 10767 | return !*pfx; | |
| 56 | } | ||
| 57 | |||
| 58 | 666 | char *av_stristr(const char *s1, const char *s2) | |
| 59 | { | ||
| 60 |
1/2✗ Branch 0 not taken.
✓ Branch 1 taken 666 times.
|
666 | if (!*s2) |
| 61 | ✗ | return (char*)(intptr_t)s1; | |
| 62 | |||
| 63 | do | ||
| 64 |
2/2✓ Branch 1 taken 184 times.
✓ Branch 2 taken 10564 times.
|
10748 | if (av_stristart(s1, s2, NULL)) |
| 65 | 184 | return (char*)(intptr_t)s1; | |
| 66 |
2/2✓ Branch 0 taken 10082 times.
✓ Branch 1 taken 482 times.
|
10564 | while (*s1++); |
| 67 | |||
| 68 | 482 | 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 | 401649 | size_t av_strlcpy(char *dst, const char *src, size_t size) | |
| 86 | { | ||
| 87 | 401649 | size_t len = 0; | |
| 88 |
4/4✓ Branch 0 taken 2448171 times.
✓ Branch 1 taken 132437 times.
✓ Branch 2 taken 2178959 times.
✓ Branch 3 taken 269212 times.
|
2580608 | while (++len < size && *src) |
| 89 | 2178959 | *dst++ = *src++; | |
| 90 |
1/2✓ Branch 0 taken 401649 times.
✗ Branch 1 not taken.
|
401649 | if (len <= size) |
| 91 | 401649 | *dst = 0; | |
| 92 | 401649 | return len + strlen(src) - 1; | |
| 93 | } | ||
| 94 | |||
| 95 | 65164 | size_t av_strlcat(char *dst, const char *src, size_t size) | |
| 96 | { | ||
| 97 | 65164 | size_t len = strlen(dst); | |
| 98 |
1/2✗ Branch 0 not taken.
✓ Branch 1 taken 65164 times.
|
65164 | if (size <= len + 1) |
| 99 | ✗ | return len + strlen(src); | |
| 100 | 65164 | return len + av_strlcpy(dst + len, src, size - len); | |
| 101 | } | ||
| 102 | |||
| 103 | 149211 | size_t av_strlcatf(char *dst, size_t size, const char *fmt, ...) | |
| 104 | { | ||
| 105 | 149211 | size_t len = strlen(dst); | |
| 106 | va_list vl; | ||
| 107 | |||
| 108 | 149211 | va_start(vl, fmt); | |
| 109 |
1/2✓ Branch 0 taken 149211 times.
✗ Branch 1 not taken.
|
149211 | len += vsnprintf(dst + len, size > len ? size - len : 0, fmt, vl); |
| 110 | 149211 | va_end(vl); | |
| 111 | |||
| 112 | 149211 | return len; | |
| 113 | } | ||
| 114 | |||
| 115 | 17498 | char *av_asprintf(const char *fmt, ...) | |
| 116 | { | ||
| 117 | 17498 | char *p = NULL; | |
| 118 | va_list va; | ||
| 119 | int len; | ||
| 120 | |||
| 121 | 17498 | va_start(va, fmt); | |
| 122 | 17498 | len = vsnprintf(NULL, 0, fmt, va); | |
| 123 | 17498 | va_end(va); | |
| 124 |
1/2✗ Branch 0 not taken.
✓ Branch 1 taken 17498 times.
|
17498 | if (len < 0) |
| 125 | ✗ | goto end; | |
| 126 | |||
| 127 | 17498 | p = av_malloc(len + 1); | |
| 128 |
1/2✗ Branch 0 not taken.
✓ Branch 1 taken 17498 times.
|
17498 | if (!p) |
| 129 | ✗ | goto end; | |
| 130 | |||
| 131 | 17498 | va_start(va, fmt); | |
| 132 | 17498 | len = vsnprintf(p, len + 1, fmt, va); | |
| 133 | 17498 | va_end(va); | |
| 134 |
1/2✓ Branch 0 taken 17498 times.
✗ Branch 1 not taken.
|
17498 | if (len < 0) |
| 135 | ✗ | av_freep(&p); | |
| 136 | |||
| 137 | 17498 | end: | |
| 138 | 17498 | return p; | |
| 139 | } | ||
| 140 | |||
| 141 | #define WHITESPACES " \n\t\r" | ||
| 142 | |||
| 143 | 125667 | char *av_get_token(const char **buf, const char *term) | |
| 144 | { | ||
| 145 | 125667 | char *out = av_realloc(NULL, strlen(*buf) + 1); | |
| 146 | 125667 | char *ret = out, *end = out; | |
| 147 | 125667 | const char *p = *buf; | |
| 148 |
1/2✗ Branch 0 not taken.
✓ Branch 1 taken 125667 times.
|
125667 | if (!out) |
| 149 | ✗ | return NULL; | |
| 150 | 125667 | p += strspn(p, WHITESPACES); | |
| 151 | |||
| 152 |
4/4✓ Branch 0 taken 1282765 times.
✓ Branch 1 taken 46621 times.
✓ Branch 2 taken 1203719 times.
✓ Branch 3 taken 79046 times.
|
1329386 | while (*p && !strspn(p, term)) { |
| 153 | 1203719 | char c = *p++; | |
| 154 |
4/4✓ Branch 0 taken 160 times.
✓ Branch 1 taken 1203559 times.
✓ Branch 2 taken 158 times.
✓ Branch 3 taken 2 times.
|
1203719 | if (c == '\\' && *p) { |
| 155 | 158 | *out++ = *p++; | |
| 156 | 158 | end = out; | |
| 157 |
2/2✓ Branch 0 taken 48 times.
✓ Branch 1 taken 1203513 times.
|
1203561 | } 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 | 1203513 | *out++ = c; | |
| 166 | } | ||
| 167 | } | ||
| 168 | |||
| 169 | do | ||
| 170 | 126133 | *out-- = 0; | |
| 171 |
4/4✓ Branch 0 taken 124141 times.
✓ Branch 1 taken 1992 times.
✓ Branch 2 taken 466 times.
✓ Branch 3 taken 123675 times.
|
126133 | while (out >= end && strspn(out, WHITESPACES)); |
| 172 | |||
| 173 | 125667 | *buf = p; | |
| 174 | |||
| 175 | 125667 | char *small_ret = av_realloc(ret, out - ret + 2); | |
| 176 |
1/2✓ Branch 0 taken 125667 times.
✗ Branch 1 not taken.
|
125667 | return small_ret ? small_ret : ret; |
| 177 | } | ||
| 178 | |||
| 179 | 10462 | char *av_strtok(char *s, const char *delim, char **saveptr) | |
| 180 | { | ||
| 181 | char *tok; | ||
| 182 | |||
| 183 |
4/4✓ Branch 0 taken 8950 times.
✓ Branch 1 taken 1512 times.
✓ Branch 2 taken 479 times.
✓ Branch 3 taken 8471 times.
|
10462 | if (!s && !(s = *saveptr)) |
| 184 | 479 | return NULL; | |
| 185 | |||
| 186 | /* skip leading delimiters */ | ||
| 187 | 9983 | 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 24 times.
✓ Branch 1 taken 9959 times.
|
9983 | if (!*s) { |
| 191 | 24 | *saveptr = NULL; | |
| 192 | 24 | return NULL; | |
| 193 | } | ||
| 194 | 9959 | tok = s++; | |
| 195 | |||
| 196 | /* skip non delimiters */ | ||
| 197 | 9959 | s += strcspn(s, delim); | |
| 198 |
2/2✓ Branch 0 taken 8692 times.
✓ Branch 1 taken 1267 times.
|
9959 | if (*s) { |
| 199 | 8692 | *s = 0; | |
| 200 | 8692 | *saveptr = s+1; | |
| 201 | } else { | ||
| 202 | 1267 | *saveptr = NULL; | |
| 203 | } | ||
| 204 | |||
| 205 | 9959 | return tok; | |
| 206 | } | ||
| 207 | |||
| 208 | 600625 | int av_strcasecmp(const char *a, const char *b) | |
| 209 | { | ||
| 210 | uint8_t c1, c2; | ||
| 211 | do { | ||
| 212 | 661964 | c1 = av_tolower(*a++); | |
| 213 | 661964 | c2 = av_tolower(*b++); | |
| 214 |
4/4✓ Branch 0 taken 657027 times.
✓ Branch 1 taken 4937 times.
✓ Branch 2 taken 61339 times.
✓ Branch 3 taken 595688 times.
|
661964 | } while (c1 && c1 == c2); |
| 215 | 600625 | return c1 - c2; | |
| 216 | } | ||
| 217 | |||
| 218 | 3636643 | 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 3636643 times.
|
3636643 | if (n <= 0) |
| 222 | ✗ | return 0; | |
| 223 | do { | ||
| 224 | 3980517 | c1 = av_tolower(*a++); | |
| 225 | 3980517 | c2 = av_tolower(*b++); | |
| 226 |
6/6✓ Branch 0 taken 3938489 times.
✓ Branch 1 taken 42028 times.
✓ Branch 2 taken 3936540 times.
✓ Branch 3 taken 1949 times.
✓ Branch 4 taken 343874 times.
✓ Branch 5 taken 3592666 times.
|
3980517 | } while (--n && c1 && c1 == c2); |
| 227 | 3636643 | 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 | 125 | 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 125 times.
✗ Branch 1 not taken.
✗ Branch 2 not taken.
✓ Branch 3 taken 125 times.
|
125 | if (!path || *path == '\0') |
| 261 | ✗ | return "."; | |
| 262 | |||
| 263 | 125 | 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 120 times.
|
125 | if (!p) |
| 271 | 5 | return path; | |
| 272 | |||
| 273 | 120 | return p + 1; | |
| 274 | } | ||
| 275 | |||
| 276 | 25 | const char *av_dirname(char *path) | |
| 277 | { | ||
| 278 |
1/2✓ Branch 0 taken 25 times.
✗ Branch 1 not taken.
|
25 | 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 22 times.
|
25 | if (!p) |
| 290 | 3 | return "."; | |
| 291 | |||
| 292 | 22 | *p = '\0'; | |
| 293 | |||
| 294 | 22 | 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 | 8512769 | 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 5892851 times.
✓ Branch 1 taken 2619918 times.
✓ Branch 2 taken 2701021 times.
✓ Branch 3 taken 3191830 times.
|
8512769 | if (!name || !names) |
| 352 | 5320939 | return 0; | |
| 353 | |||
| 354 | 3191830 | namelen = strlen(name); | |
| 355 |
2/2✓ Branch 0 taken 3619060 times.
✓ Branch 1 taken 3174984 times.
|
6794044 | while (*names) { |
| 356 | 3619060 | int negate = '-' == *names; | |
| 357 | 3619060 | p = strchr(names, ','); | |
| 358 |
2/2✓ Branch 0 taken 3190465 times.
✓ Branch 1 taken 428595 times.
|
3619060 | if (!p) |
| 359 | 3190465 | p = names + strlen(names); | |
| 360 | 3619060 | names += negate; | |
| 361 | 3619060 | len = FFMAX(p - names, namelen); | |
| 362 |
3/4✓ Branch 1 taken 3602214 times.
✓ Branch 2 taken 16846 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 3602214 times.
|
3619060 | if (!av_strncasecmp(name, names, len) || !strncmp("ALL", names, FFMAX(3, p - names))) |
| 363 | 16846 | return !negate; | |
| 364 | 3602214 | names = p + (*p == ','); | |
| 365 | } | ||
| 366 | 3174984 | return 0; | |
| 367 | } | ||
| 368 | |||
| 369 | 225398 | int av_utf8_decode(int32_t *codep, const uint8_t **bufp, const uint8_t *buf_end, | |
| 370 | unsigned int flags) | ||
| 371 | { | ||
| 372 | 225398 | const uint8_t *p = *bufp; | |
| 373 | uint32_t top; | ||
| 374 | uint64_t code; | ||
| 375 | 225398 | int ret = 0, tail_len; | |
| 376 | 225398 | 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 225398 times.
|
225398 | if (p >= buf_end) |
| 381 | ✗ | return 0; | |
| 382 | |||
| 383 | 225398 | 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 225398 times.
✗ Branch 1 not taken.
✗ Branch 2 not taken.
✓ Branch 3 taken 225398 times.
|
225398 | if ((code & 0xc0) == 0x80 || code >= 0xFE) { |
| 388 | ✗ | ret = AVERROR(EILSEQ); | |
| 389 | ✗ | goto end; | |
| 390 | } | ||
| 391 | 225398 | top = (code & 128) >> 1; | |
| 392 | |||
| 393 | 225398 | tail_len = 0; | |
| 394 |
2/2✓ Branch 0 taken 478 times.
✓ Branch 1 taken 225398 times.
|
225876 | while (code & top) { |
| 395 | int tmp; | ||
| 396 | 478 | tail_len++; | |
| 397 |
1/2✗ Branch 0 not taken.
✓ Branch 1 taken 478 times.
|
478 | 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 | 478 | tmp = *p++ - 128; /* strip leading 1 */ | |
| 404 |
1/2✗ Branch 0 not taken.
✓ Branch 1 taken 478 times.
|
478 | if (tmp>>6) { |
| 405 | ✗ | (*bufp) ++; | |
| 406 | ✗ | return AVERROR(EILSEQ); | |
| 407 | } | ||
| 408 | 478 | code = (code<<6) + tmp; | |
| 409 | 478 | top <<= 5; | |
| 410 | } | ||
| 411 | 225398 | code &= (top << 1) - 1; | |
| 412 | |||
| 413 | /* check for overlong encodings */ | ||
| 414 |
1/2✗ Branch 0 not taken.
✓ Branch 1 taken 225398 times.
|
225398 | av_assert0(tail_len <= 5); |
| 415 |
1/2✗ Branch 0 not taken.
✓ Branch 1 taken 225398 times.
|
225398 | 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 225398 times.
|
225398 | if (code >= 1U<<31) { |
| 421 | ✗ | ret = AVERROR(EILSEQ); /* out-of-range value */ | |
| 422 | ✗ | goto end; | |
| 423 | } | ||
| 424 | |||
| 425 | 225398 | *codep = code; | |
| 426 | |||
| 427 |
1/2✗ Branch 0 not taken.
✓ Branch 1 taken 225398 times.
|
225398 | 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 223395 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.
|
225398 | 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 167 times.
✓ Branch 1 taken 225231 times.
✗ Branch 2 not taken.
✓ Branch 3 taken 167 times.
|
225398 | if (code >= 0xD800 && code <= 0xDFFF && |
| 434 | ✗ | !(flags & AV_UTF8_FLAG_ACCEPT_SURROGATES)) | |
| 435 | ✗ | ret = AVERROR(EILSEQ); | |
| 436 |
2/4✓ Branch 0 taken 225398 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 225398 times.
✗ Branch 3 not taken.
|
225398 | if ((code == 0xFFFE || code == 0xFFFF) && |
| 437 | ✗ | !(flags & AV_UTF8_FLAG_ACCEPT_NON_CHARACTERS)) | |
| 438 | ✗ | ret = AVERROR(EILSEQ); | |
| 439 | |||
| 440 | 225398 | end: | |
| 441 | 225398 | *bufp = p; | |
| 442 | 225398 | return ret; | |
| 443 | } | ||
| 444 | |||
| 445 | 139 | 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 139 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 139 times.
✗ Branch 3 not taken.
|
278 | for (p = name; p && *p; ) { |
| 450 |
2/4✓ Branch 0 taken 143 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 143 times.
✗ Branch 3 not taken.
|
282 | for (q = list; q && *q; ) { |
| 451 | int k; | ||
| 452 |
5/6✓ Branch 0 taken 556 times.
✓ Branch 1 taken 143 times.
✓ Branch 2 taken 139 times.
✓ Branch 3 taken 4 times.
✓ Branch 4 taken 139 times.
✗ Branch 5 not taken.
|
699 | for (k = 0; p[k] == q[k] || (p[k]*q[k] == 0 && p[k]+q[k] == separator); k++) |
| 453 |
5/6✓ Branch 0 taken 556 times.
✓ Branch 1 taken 139 times.
✓ Branch 2 taken 417 times.
✓ Branch 3 taken 139 times.
✗ Branch 4 not taken.
✓ Branch 5 taken 417 times.
|
695 | if (k && (!p[k] || p[k] == separator)) |
| 454 | 139 | return 1; | |
| 455 | 4 | q = strchr(q, separator); | |
| 456 |
1/2✓ Branch 0 taken 4 times.
✗ Branch 1 not taken.
|
4 | if(q) |
| 457 | 4 | q++; | |
| 458 | } | ||
| 459 | ✗ | p = strchr(p, separator); | |
| 460 | ✗ | if (p) | |
| 461 | ✗ | p++; | |
| 462 | } | ||
| 463 | |||
| 464 | ✗ | return 0; | |
| 465 | } | ||
| 466 |