[FFmpeg-soc] [soc]: r2059 - libavfilter/avfiltergraph.c

vitor subversion at mplayerhq.hu
Sat Mar 29 17:26:47 CET 2008


Author: vitor
Date: Sat Mar 29 17:26:47 2008
New Revision: 2059

Log:
Add backslash '\' support to the parser

Modified:
   libavfilter/avfiltergraph.c

Modified: libavfilter/avfiltergraph.c
==============================================================================
--- libavfilter/avfiltergraph.c	(original)
+++ libavfilter/avfiltergraph.c	Sat Mar 29 17:26:47 2008
@@ -232,19 +232,25 @@ static char consume_char(const char **bu
 }
 
 /**
- * remove the quotation marks from a string. Ex: "aaa'bb'cc" -> "aaabbcc"
+ * Copy the first size bytes of input string to a null-terminated string,
+ * removing any control character. Ex: "aaa'bb'c\'c\\" -> "aaabbc'c\"
  */
-static void unquote(char *str)
+static void copy_unquoted(char *out, const char *in, int size)
 {
-    char *p1, *p2;
-    p1=p2=str;
-    while (*p1 != 0) {
-        if (*p1 != '\'')
-            *p2++ = *p1;
-        p1++;
+    int i;
+    for (i=0; i < size; i++) {
+        if (in[i] == '\'')
+            continue;
+        else if (in[i] == '\\') {
+            if (i+1 == size) {
+                *out = 0;
+                return;
+            }
+            i++;
+        }
+        *out++ = in[i];
     }
-
-    *p2 = 0;
+    *out=0;
 }
 
 /**
@@ -264,10 +270,20 @@ static char *consume_string(const char *
 
     start = *buf;
 
-    *buf += strcspn(*buf, " ()=,'");
+    while(1) {
+        *buf += strcspn(*buf, " ()=,'\\");
+        if (**buf == '\\')
+            *buf+=2;
+        else
+            break;
+    }
 
     if (**buf == '\'') {
-        char *p = strchr(*buf + 1, '\'');
+        const char *p = *buf;
+        do {
+            p++;
+            p = strchr(p, '\'');
+        } while (p && p[-1] == '\\');
         if (p)
             *buf = p + 1;
         else
@@ -276,10 +292,7 @@ static char *consume_string(const char *
 
     size = *buf - start + 1;
     ret = av_malloc(size);
-    memcpy(ret, start, size - 1);
-    ret[size-1] = 0;
-
-    unquote(ret);
+    copy_unquoted(ret, start, size-1);
 
     return ret;
 }



More information about the FFmpeg-soc mailing list