[FFmpeg-cvslog] r12744 - trunk/libavfilter/avfiltergraph.c
vitor
subversion
Fri Apr 4 22:09:21 CEST 2008
Author: vitor
Date: Fri Apr 4 22:09:20 2008
New Revision: 12744
Log:
Add backslash '\' support to the parser
Commited in SoC by Vitor Sessak on 2008-03-29 16:26:47
Modified:
trunk/libavfilter/avfiltergraph.c
Modified: trunk/libavfilter/avfiltergraph.c
==============================================================================
--- trunk/libavfilter/avfiltergraph.c (original)
+++ trunk/libavfilter/avfiltergraph.c Fri Apr 4 22:09:20 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-cvslog
mailing list