History

av_get_token() based on a patch by Stefano Sabatini

Originally committed as revision 18725 to svn://svn.ffmpeg.org/ffmpeg/trunk

Michael Niedermayer committed 17 years ago

Commit d11dbf01 parent 71412782 files · +153 −0Browse files

Unified · Split

2 files
  1. libavfilter/parseutils.c +110 −0
  2. libavfilter/parseutils.h +43 −0
libavfilter/parseutils.c+110−0
@@ -0,0 +1,110 @@
1/*
2 * copyright (c) 2009 Stefano Sabatini
3 * This file is part of FFmpeg.
4 *
5 * FFmpeg is free software; you can redistribute it and/or
6 * modify it under the terms of the GNU Lesser General Public
7 * License as published by the Free Software Foundation; either
8 * version 2.1 of the License, or (at your option) any later version.
9 *
10 * FFmpeg is distributed in the hope that it will be useful,
11 * but WITHOUT ANY WARRANTY; without even the implied warranty of
12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
13 * Lesser General Public License for more details.
14 *
15 * You should have received a copy of the GNU Lesser General Public
16 * License along with FFmpeg; if not, write to the Free Software
17 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
18 */
19
20/**
21 * @file libavfilter/parseutils.c
22 * parsing utils
23 */
24
25#include <string.h>
26#include "libavutil/avutil.h"
27#include "parseutils.h"
28
29#define WHITESPACES " \n\t"
30
31char *av_get_token(const char **buf, const char *term)
32{
33 char *out = av_malloc(strlen(*buf) + 1);
34 char *ret= out, *end= out;
35 const char *p = *buf;
36 p += strspn(p, WHITESPACES);
37
38 while(*p && !strspn(p, term)) {
39 char c = *p++;
40 if(c == '\\' && *p){
41 *out++ = *p++;
42 end= out;
43 }else if(c == '\''){
44 while(*p && *p != '\'')
45 *out++ = *p++;
46 if(*p){
47 p++;
48 end= out;
49 }
50 }else{
51 *out++ = c;
52 }
53 }
54
55 do{
56 *out-- = 0;
57 }while(out >= end && strspn(out, WHITESPACES));
58
59 *buf = p;
60
61 return ret;
62}
63
64#ifdef TEST
65
66#undef printf
67
68int main()
69{
70 int i;
71
72 const char *strings[] = {
73 "''",
74 "",
75 ":",
76 "\\",
77 "'",
78 " '' :",
79 " '' '' :",
80 "foo '' :",
81 "'foo'",
82 "foo ",
83 "foo\\",
84 "foo': blah:blah",
85 "foo\\: blah:blah",
86 "foo\'",
87 "'foo : ' :blahblah",
88 "\\ :blah",
89 " foo",
90 " foo ",
91 " foo \\ ",
92 "foo ':blah",
93 " foo bar : blahblah",
94 "\\f\\o\\o",
95 "'foo : \\ \\ ' : blahblah",
96 "'\\fo\\o:': blahblah",
97 "\\'fo\\o\\:': foo ' :blahblah"
98 };
99
100 for (i=0; i < FF_ARRAY_ELEMS(strings); i++) {
101 const char *p= strings[i];
102 printf("|%s|", p);
103 printf(" -> |%s|", av_get_token(&p, ":"));
104 printf(" + |%s|\n", p);
105 }
106
107 return 0;
108}
109
110#endif
libavfilter/parseutils.h+43−0
@@ -0,0 +1,43 @@
1/*
2 * copyright (c) 2009 Stefano Sabatini
3 * This file is part of FFmpeg.
4 *
5 * FFmpeg is free software; you can redistribute it and/or
6 * modify it under the terms of the GNU Lesser General Public
7 * License as published by the Free Software Foundation; either
8 * version 2.1 of the License, or (at your option) any later version.
9 *
10 * FFmpeg is distributed in the hope that it will be useful,
11 * but WITHOUT ANY WARRANTY; without even the implied warranty of
12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
13 * Lesser General Public License for more details.
14 *
15 * You should have received a copy of the GNU Lesser General Public
16 * License along with FFmpeg; if not, write to the Free Software
17 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
18 */
19
20/**
21 * @file libavfilter/parseutils.h
22 * parsing utils
23 */
24
25#ifndef AVFILTER_PARSEUTILS_H
26#define AVFILTER_PARSEUTILS_H
27
28/**
29 * Unescapes the given string until a non escaped terminating char,
30 * and returns the token corresponding to the unescaped string.
31 *
32 * The normal \ and ' escaping is supported. Leading and trailing
33 * whitespaces are removed.
34 *
35 * @param term a 0-terminated list of terminating chars
36 * @param buf the buffer to parse, buf will be updated to point to the
37 * terminating char
38 * @return the malloced unescaped string, which must be av_freed by
39 * the user
40 */
41char *av_get_token(const char **buf, const char *term);
42
43#endif /* AVFILTER_PARSEUTILS_H */

Keyboard shortcuts

General

Show keyboard shortcuts
?
Focus the current search
/

Issues and pull requests

Open filters
f

Issues, pull requests and Inbox

Select next item
j↓
Select previous item
k↑
Open selected item
Enter
Dismiss filters or clear selection
Esc

Repository code

Go to file
t