diff options
author | Vitor Sessak <vitor1001@gmail.com> | 2008-04-04 20:09:20 +0000 |
---|---|---|
committer | Vitor Sessak <vitor1001@gmail.com> | 2008-04-04 20:09:20 +0000 |
commit | 4f409baa066a41ac6854ce63a06884fbac903917 (patch) | |
tree | b3321f750e85a2c0ec226324b0ea90daef8fde98 /libavfilter | |
parent | 398f12970f819f7c63ecc0df841edca7c2ed89fa (diff) | |
download | ffmpeg-4f409baa066a41ac6854ce63a06884fbac903917.tar.gz |
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')
-rw-r--r-- | libavfilter/avfiltergraph.c | 45 |
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; } |