diff options
author | Michael Niedermayer <michaelni@gmx.at> | 2009-05-01 14:38:07 +0000 |
---|---|---|
committer | Michael Niedermayer <michaelni@gmx.at> | 2009-05-01 14:38:07 +0000 |
commit | d11dbf092c759bd050a7d22e2c2a7171fd4ad36f (patch) | |
tree | f84fa37b686395736ed032d3db4ee659599bac06 | |
parent | 714127812c7194126c8b466e8ac9fe5e02c44d58 (diff) | |
download | ffmpeg-d11dbf092c759bd050a7d22e2c2a7171fd4ad36f.tar.gz |
av_get_token()
based on a patch by Stefano Sabatini
Originally committed as revision 18725 to svn://svn.ffmpeg.org/ffmpeg/trunk
-rw-r--r-- | libavfilter/parseutils.c | 110 | ||||
-rw-r--r-- | libavfilter/parseutils.h | 43 |
2 files changed, 153 insertions, 0 deletions
diff --git a/libavfilter/parseutils.c b/libavfilter/parseutils.c new file mode 100644 index 0000000000..b74533b40c --- /dev/null +++ b/libavfilter/parseutils.c @@ -0,0 +1,110 @@ +/* + * copyright (c) 2009 Stefano Sabatini + * This file is part of FFmpeg. + * + * FFmpeg is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * FFmpeg is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with FFmpeg; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + */ + +/** + * @file libavfilter/parseutils.c + * parsing utils + */ + +#include <string.h> +#include "libavutil/avutil.h" +#include "parseutils.h" + +#define WHITESPACES " \n\t" + +char *av_get_token(const char **buf, const char *term) +{ + char *out = av_malloc(strlen(*buf) + 1); + char *ret= out, *end= out; + const char *p = *buf; + p += strspn(p, WHITESPACES); + + while(*p && !strspn(p, term)) { + char c = *p++; + if(c == '\\' && *p){ + *out++ = *p++; + end= out; + }else if(c == '\''){ + while(*p && *p != '\'') + *out++ = *p++; + if(*p){ + p++; + end= out; + } + }else{ + *out++ = c; + } + } + + do{ + *out-- = 0; + }while(out >= end && strspn(out, WHITESPACES)); + + *buf = p; + + return ret; +} + +#ifdef TEST + +#undef printf + +int main() +{ + int i; + + const char *strings[] = { + "''", + "", + ":", + "\\", + "'", + " '' :", + " '' '' :", + "foo '' :", + "'foo'", + "foo ", + "foo\\", + "foo': blah:blah", + "foo\\: blah:blah", + "foo\'", + "'foo : ' :blahblah", + "\\ :blah", + " foo", + " foo ", + " foo \\ ", + "foo ':blah", + " foo bar : blahblah", + "\\f\\o\\o", + "'foo : \\ \\ ' : blahblah", + "'\\fo\\o:': blahblah", + "\\'fo\\o\\:': foo ' :blahblah" + }; + + for (i=0; i < FF_ARRAY_ELEMS(strings); i++) { + const char *p= strings[i]; + printf("|%s|", p); + printf(" -> |%s|", av_get_token(&p, ":")); + printf(" + |%s|\n", p); + } + + return 0; +} + +#endif diff --git a/libavfilter/parseutils.h b/libavfilter/parseutils.h new file mode 100644 index 0000000000..60092cc845 --- /dev/null +++ b/libavfilter/parseutils.h @@ -0,0 +1,43 @@ +/* + * copyright (c) 2009 Stefano Sabatini + * This file is part of FFmpeg. + * + * FFmpeg is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * FFmpeg is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with FFmpeg; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + */ + +/** + * @file libavfilter/parseutils.h + * parsing utils + */ + +#ifndef AVFILTER_PARSEUTILS_H +#define AVFILTER_PARSEUTILS_H + +/** + * Unescapes the given string until a non escaped terminating char, + * and returns the token corresponding to the unescaped string. + * + * The normal \ and ' escaping is supported. Leading and trailing + * whitespaces are removed. + * + * @param term a 0-terminated list of terminating chars + * @param buf the buffer to parse, buf will be updated to point to the + * terminating char + * @return the malloced unescaped string, which must be av_freed by + * the user + */ +char *av_get_token(const char **buf, const char *term); + +#endif /* AVFILTER_PARSEUTILS_H */ |