av_get_token()
[ffmpeg.git] / libavfilter / parseutils.c
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
31 char *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
68 int 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