av_get_token()
authorMichael Niedermayer <michaelni@gmx.at>
Fri, 1 May 2009 14:38:07 +0000 (14:38 +0000)
committerMichael Niedermayer <michaelni@gmx.at>
Fri, 1 May 2009 14:38:07 +0000 (14:38 +0000)
based on a patch by Stefano Sabatini

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

libavfilter/parseutils.c [new file with mode: 0644]
libavfilter/parseutils.h [new file with mode: 0644]

diff --git a/libavfilter/parseutils.c b/libavfilter/parseutils.c
new file mode 100644 (file)
index 0000000..b74533b
--- /dev/null
@@ -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 (file)
index 0000000..60092cc
--- /dev/null
@@ -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 */