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
23 #include <stdarg.h>
24 #include <stdint.h>
25 #include <stdio.h>
26 #include <string.h>
27
28 #include "config.h"
35
36 int av_strstart(
const char *str,
const char *pfx,
const char **ptr)
37 {
38 while (*pfx && *pfx == *str) {
39 pfx++;
40 str++;
41 }
42 if (!*pfx && ptr)
43 *ptr = str;
44 return !*pfx;
45 }
46
47 int av_stristart(
const char *str,
const char *pfx,
const char **ptr)
48 {
50 pfx++;
51 str++;
52 }
53 if (!*pfx && ptr)
54 *ptr = str;
55 return !*pfx;
56 }
57
59 {
61 return (
char*)(intptr_t)
s1;
62
63 do
65 return (
char*)(intptr_t)
s1;
67
69 }
70
71 char *
av_strnstr(
const char *haystack,
const char *needle,
size_t hay_length)
72 {
73 size_t needle_len = strlen(needle);
74 if (!needle_len)
75 return (char*)haystack;
76 while (hay_length >= needle_len) {
77 hay_length--;
78 if (!memcmp(haystack, needle, needle_len))
79 return (char*)haystack;
80 haystack++;
81 }
83 }
84
86 {
91 *dst = 0;
92 return len + strlen(
src) - 1;
93 }
94
96 {
97 size_t len = strlen(dst);
101 }
102
104 {
105 size_t len = strlen(dst);
106 va_list vl;
107
108 va_start(vl, fmt);
110 va_end(vl);
111
113 }
114
116 {
118 va_list va;
120
121 va_start(va, fmt);
123 va_end(va);
125 goto end;
126
128 if (!p)
129 goto end;
130
131 va_start(va, fmt);
133 va_end(va);
136
137 end:
138 return p;
139 }
140
141 #define WHITESPACES " \n\t\r"
142
144 {
147 const char *p = *
buf;
151
152 while (*p && !strspn(p, term)) {
154 if (
c ==
'\\' && *p) {
157 }
else if (
c ==
'\'') {
158 while (*p && *p != '\'')
160 if (*p) {
161 p++;
163 }
164 } else {
166 }
167 }
168
169 do
172
174
176 }
177
179 {
180 char *tok;
181
182 if (!
s && !(
s = *saveptr))
184
185 /* skip leading delimiters */
186 s += strspn(
s, delim);
187
188 /* s now points to the first non delimiter char, or to the end of the string */
192 }
194
195 /* skip non delimiters */
196 s += strcspn(
s, delim);
200 } else {
202 }
203
204 return tok;
205 }
206
208 {
210 do {
215 }
216
218 {
220 if (n <= 0)
221 return 0;
222 do {
225 }
while (--n &&
c1 &&
c1 ==
c2);
227 }
228
230 {
232 const char *pstr2, *pstr = str;
233 size_t tolen = strlen(
to), fromlen = strlen(
from);
234 AVBPrint pbuf;
235
239 pstr = pstr2 + fromlen;
241 }
245 } else {
247 }
248
250 }
251
253 {
254 char *p;
255 #if HAVE_DOS_PATHS
257 #endif
258
259 if (!path || *path == '0円')
260 return ".";
261
262 p = strrchr(path, '/');
263 #if HAVE_DOS_PATHS
264 q = strrchr(path, '\\');
265 d = strchr(path,
':');
267 #endif
268
269 if (!p)
270 return path;
271
272 return p + 1;
273 }
274
276 {
277 char *p = path ? strrchr(path,
'/') :
NULL;
278
279 #if HAVE_DOS_PATHS
280 char *q = path ? strrchr(path,
'\\') :
NULL;
281 char *
d = path ? strchr(path,
':') :
NULL;
282
284
286 #endif
287
288 if (!p)
289 return ".";
290
291 *p = '0円';
292
293 return path;
294 }
295
297 {
298 size_t p_len, c_len;
299 char *fullpath;
300
301 if (!path)
303 if (!component)
305
306 p_len = strlen(path);
307 c_len = strlen(component);
308 if (p_len > SIZE_MAX - c_len || p_len + c_len > SIZE_MAX - 2)
311 if (fullpath) {
312 if (p_len) {
314 if (c_len) {
315 if (fullpath[p_len - 1] != '/' && component[0] != '/')
316 fullpath[p_len++] = '/';
317 else if (fullpath[p_len - 1] == '/' && component[0] == '/')
318 p_len--;
319 }
320 }
321 av_strlcpy(&fullpath[p_len], component, c_len + 1);
322 fullpath[p_len + c_len] = 0;
323 }
324 return fullpath;
325 }
326
329 {
330 AVBPrint dstbuf;
332
333 av_bprint_init(&dstbuf, 1, INT_MAX);
/* (int)dstbuf.len must be >= 0 */
335
339 }
342 return dstbuf.len;
343 }
344
346 {
347 const char *p;
349
351 return 0;
352
353 namelen = strlen(
name);
354 while (*names) {
355 int negate = '-' == *names;
356 p = strchr(names, ',');
357 if (!p)
358 p = names + strlen(names);
359 names += negate;
362 return !negate;
363 names = p + (*p == ',');
364 }
365 return 0;
366 }
367
370 {
371 const uint8_t *p = *bufp;
372 uint32_t top;
374 int ret = 0, tail_len;
375 uint32_t overlong_encoding_mins[6] = {
376 0x00000000, 0x00000080, 0x00000800, 0x00010000, 0x00200000, 0x04000000,
377 };
378
379 if (p >= buf_end)
380 return 0;
381
383
384 /* first sequence byte starts with 10, or is 1111-1110 or 1111-1111,
385 which is not admitted */
386 if ((
code & 0xc0) == 0x80 ||
code >= 0xFE) {
388 goto end;
389 }
390 top = (
code & 128) >> 1;
391
392 tail_len = 0;
395 tail_len++;
396 if (p >= buf_end) {
397 (*bufp) ++;
398 return AVERROR(EILSEQ);
/* incomplete sequence */
399 }
400
401 /* we assume the byte to be in the form 10xx-xxxx */
402 tmp = *p++ - 128;
/* strip leading 1 */
404 (*bufp) ++;
406 }
408 top <<= 5;
409 }
410 code &= (top << 1) - 1;
411
412 /* check for overlong encodings */
414 if (
code < overlong_encoding_mins[tail_len]) {
416 goto end;
417 }
418
419 if (
code >= 1
U<<31) {
420 ret =
AVERROR(EILSEQ);
/* out-of-range value */
421 goto end;
422 }
423
425
426 if (
code > 0x10FFFF &&
432 if (
code >= 0xD800 &&
code <= 0xDFFF &&
435 if ((
code == 0xFFFE ||
code == 0xFFFF) &&
438
439 end:
440 *bufp = p;
442 }
443
445 {
446 const char *p, *q;
447
448 for (p =
name; p && *p; ) {
449 for (q =
list; q && *q; ) {
450 int k;
451 for (k = 0; p[k] == q[k] || (p[k]*q[k] == 0 && p[k]+q[k] == separator); k++)
452 if (k && (!p[k] || p[k] == separator))
453 return 1;
454 q = strchr(q, separator);
455 q += !!q;
456 }
457 p = strchr(p, separator);
458 p += !!p;
459 }
460
461 return 0;
462 }