Add backslash '\' support to the parser
authorVitor Sessak <vitor1001@gmail.com>
Fri, 4 Apr 2008 20:09:20 +0000 (20:09 +0000)
committerVitor Sessak <vitor1001@gmail.com>
Fri, 4 Apr 2008 20:09:20 +0000 (20:09 +0000)
Commited in SoC by Vitor Sessak on 2008-03-29 16:26:47

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

libavfilter/avfiltergraph.c

index aee2b1f..dfbf8ab 100644 (file)
@@ -232,19 +232,25 @@ static char consume_char(const char **buf)
 }
 
 /**
- * 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 **buf)
 
     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 **buf)
 
     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;
 }