}
/**
- * 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;
}
/**
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
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;
}