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"
33
35 {
36 while (*pfx && *pfx == *
str) {
37 pfx++;
39 }
40 if (!*pfx && ptr)
42 return !*pfx;
43 }
44
46 {
48 pfx++;
50 }
51 if (!*pfx && ptr)
53 return !*pfx;
54 }
55
57 {
59 return (
char*)(intptr_t)
s1;
60
61 do
63 return (
char*)(intptr_t)
s1;
65
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 }
81 }
82
84 {
89 *dst = 0;
90 return len + strlen(
src) - 1;
91 }
92
94 {
95 size_t len = strlen(dst);
99 }
100
102 {
103 size_t len = strlen(dst);
104 va_list vl;
105
106 va_start(vl, fmt);
108 va_end(vl);
109
111 }
112
114 {
116 va_list va;
118
119 va_start(va, fmt);
121 va_end(va);
123 goto end;
124
126 if (!p)
127 goto end;
128
129 va_start(va, fmt);
131 va_end(va);
134
135 end:
136 return p;
137 }
138
139 #if FF_API_D2STR
141 {
146 }
147 #endif
148
149 #define WHITESPACES " \n\t\r"
150
152 {
155 const char *p = *
buf;
159
160 while (*p && !strspn(p, term)) {
162 if (
c ==
'\\' && *p) {
165 }
else if (
c ==
'\'') {
166 while (*p && *p != '\'')
168 if (*p) {
169 p++;
171 }
172 } else {
174 }
175 }
176
177 do
180
182
184 }
185
187 {
188 char *tok;
189
190 if (!
s && !(
s = *saveptr))
192
193 /* skip leading delimiters */
194 s += strspn(
s, delim);
195
196 /* s now points to the first non delimiter char, or to the end of the string */
200 }
202
203 /* skip non delimiters */
204 s += strcspn(
s, delim);
208 } else {
210 }
211
212 return tok;
213 }
214
216 {
218 do {
223 }
224
226 {
228 if (n <= 0)
229 return 0;
230 do {
233 }
while (--n &&
c1 &&
c1 ==
c2);
235 }
236
238 {
240 const char *pstr2, *pstr =
str;
241 size_t tolen = strlen(
to), fromlen = strlen(
from);
242 AVBPrint pbuf;
243
247 pstr = pstr2 + fromlen;
249 }
253 } else {
255 }
256
258 }
259
261 {
262 char *p;
263 #if HAVE_DOS_PATHS
265 #endif
266
267 if (!path || *path == '0円')
268 return ".";
269
270 p = strrchr(path, '/');
271 #if HAVE_DOS_PATHS
272 q = strrchr(path, '\\');
273 d = strchr(path,
':');
275 #endif
276
277 if (!p)
278 return path;
279
280 return p + 1;
281 }
282
284 {
285 char *p = path ? strrchr(path,
'/') :
NULL;
286
287 #if HAVE_DOS_PATHS
288 char *q = path ? strrchr(path,
'\\') :
NULL;
289 char *
d = path ? strchr(path,
':') :
NULL;
290
292
294 #endif
295
296 if (!p)
297 return ".";
298
299 *p = '0円';
300
301 return path;
302 }
303
305 {
306 size_t p_len, c_len;
307 char *fullpath;
308
309 if (!path)
311 if (!component)
313
314 p_len = strlen(path);
315 c_len = strlen(component);
316 if (p_len > SIZE_MAX - c_len || p_len + c_len > SIZE_MAX - 2)
319 if (fullpath) {
320 if (p_len) {
322 if (c_len) {
323 if (fullpath[p_len - 1] != '/' && component[0] != '/')
324 fullpath[p_len++] = '/';
325 else if (fullpath[p_len - 1] == '/' && component[0] == '/')
326 p_len--;
327 }
328 }
329 av_strlcpy(&fullpath[p_len], component, c_len + 1);
330 fullpath[p_len + c_len] = 0;
331 }
332 return fullpath;
333 }
334
337 {
338 AVBPrint dstbuf;
340
341 av_bprint_init(&dstbuf, 1, INT_MAX);
/* (int)dstbuf.len must be >= 0 */
343
347 }
350 return dstbuf.len;
351 }
352
354 {
355 const char *p;
357
359 return 0;
360
361 namelen = strlen(
name);
362 while (*names) {
363 int negate = '-' == *names;
364 p = strchr(names, ',');
365 if (!p)
366 p = names + strlen(names);
367 names += negate;
370 return !negate;
371 names = p + (*p == ',');
372 }
373 return 0;
374 }
375
378 {
379 const uint8_t *p = *bufp;
380 uint32_t top;
382 int ret = 0, tail_len;
383 uint32_t overlong_encoding_mins[6] = {
384 0x00000000, 0x00000080, 0x00000800, 0x00010000, 0x00200000, 0x04000000,
385 };
386
387 if (p >= buf_end)
388 return 0;
389
391
392 /* first sequence byte starts with 10, or is 1111-1110 or 1111-1111,
393 which is not admitted */
394 if ((
code & 0xc0) == 0x80 ||
code >= 0xFE) {
396 goto end;
397 }
398 top = (
code & 128) >> 1;
399
400 tail_len = 0;
403 tail_len++;
404 if (p >= buf_end) {
405 (*bufp) ++;
406 return AVERROR(EILSEQ);
/* incomplete sequence */
407 }
408
409 /* we assume the byte to be in the form 10xx-xxxx */
410 tmp = *p++ - 128;
/* strip leading 1 */
412 (*bufp) ++;
414 }
416 top <<= 5;
417 }
418 code &= (top << 1) - 1;
419
420 /* check for overlong encodings */
422 if (
code < overlong_encoding_mins[tail_len]) {
424 goto end;
425 }
426
427 if (
code >= 1
U<<31) {
428 ret =
AVERROR(EILSEQ);
/* out-of-range value */
429 goto end;
430 }
431
433
434 if (
code > 0x10FFFF &&
440 if (
code >= 0xD800 &&
code <= 0xDFFF &&
443 if ((
code == 0xFFFE ||
code == 0xFFFF) &&
446
447 end:
448 *bufp = p;
450 }
451
453 {
454 const char *p, *q;
455
456 for (p =
name; p && *p; ) {
457 for (q =
list; q && *q; ) {
458 int k;
459 for (k = 0; p[k] == q[k] || (p[k]*q[k] == 0 && p[k]+q[k] == separator); k++)
460 if (k && (!p[k] || p[k] == separator))
461 return 1;
462 q = strchr(q, separator);
463 q += !!q;
464 }
465 p = strchr(p, separator);
466 p += !!p;
467 }
468
469 return 0;
470 }