summaryrefslogtreecommitdiff
path: root/libavfilter/avfiltergraph.c
diff options
context:
space:
mode:
authorVitor Sessak <vitor1001@gmail.com>2008-04-04 20:09:20 +0000
committerVitor Sessak <vitor1001@gmail.com>2008-04-04 20:09:20 +0000
commit4f409baa066a41ac6854ce63a06884fbac903917 (patch)
treeb3321f750e85a2c0ec226324b0ea90daef8fde98 /libavfilter/avfiltergraph.c
parent398f12970f819f7c63ecc0df841edca7c2ed89fa (diff)
Add backslash '\' support to the parser
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
Diffstat (limited to 'libavfilter/avfiltergraph.c')
-rw-r--r--libavfilter/avfiltergraph.c45
1 files changed, 29 insertions, 16 deletions
diff --git a/libavfilter/avfiltergraph.c b/libavfilter/avfiltergraph.c
index aee2b1fb12..dfbf8ab665 100644
--- a/libavfilter/avfiltergraph.c
+++ b/libavfilter/avfiltergraph.c
@@ -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;
}