From 4f409baa066a41ac6854ce63a06884fbac903917 Mon Sep 17 00:00:00 2001 From: Vitor Sessak Date: Fri, 4 Apr 2008 20:09:20 +0000 Subject: 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 --- libavfilter/avfiltergraph.c | 45 +++++++++++++++++++++++++++++---------------- 1 file changed, 29 insertions(+), 16 deletions(-) (limited to 'libavfilter/avfiltergraph.c') 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; } -- cgit v1.2.3