From 93b7a0f68d772871c93ffb23a7d2524485b96a52 Mon Sep 17 00:00:00 2001 From: Vitor Sessak Date: Sat, 24 May 2008 20:39:12 +0000 Subject: [PATCH] Simplify consume_string() as Michael suggested Commited in SoC by Vitor Sessak on 2008-04-06 18:43:02 Originally committed as revision 13293 to svn://svn.ffmpeg.org/ffmpeg/trunk --- libavfilter/graphparser.c | 77 +++++++++++++-------------------------- 1 file changed, 25 insertions(+), 52 deletions(-) diff --git a/libavfilter/graphparser.c b/libavfilter/graphparser.c index abd88bac0..e784f8d3e 100644 --- a/libavfilter/graphparser.c +++ b/libavfilter/graphparser.c @@ -93,69 +93,42 @@ static void consume_whitespace(const char **buf) *buf += strspn(*buf, " \n\t"); } -/** - * 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 copy_unquoted(char *out, const char *in, int size) -{ - 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]; - } - *out=0; -} - /** * Consumes a string from *buf. * @return a copy of the consumed string, which should be free'd after use */ static char *consume_string(const char **buf) { - const char *start; - char *ret; - int size; + char *out = av_malloc(strlen(*buf)); + const char *in = *buf; + char *ret = out; consume_whitespace(buf); - if (!(**buf)) - return av_mallocz(1); - - start = *buf; - - while(1) { - *buf += strcspn(*buf, " ()=,'\\"); - if (**buf == '\\') - *buf+=2; - else + do{ + char c = *in++; + switch (c) { + case '\\': + *out++= *in++; break; - } - - if (**buf == '\'') { - const char *p = *buf; - do { - p++; - p = strchr(p, '\''); - } while (p && p[-1] == '\\'); - if (p) - *buf = p + 1; - else - *buf += strlen(*buf); // Move the pointer to the null end byte - } - - size = *buf - start + 1; - ret = av_malloc(size); - copy_unquoted(ret, start, size-1); + case '\'': + while(*in && *in != '\'') + *out++= *in++; + if(*in) in++; + break; + case 0: + case ')': + case '(': + case '=': + case ',': + *out++= 0; + break; + default: + *out++= c; + } + } while(out[-1]); + *buf = in-1; return ret; } -- 2.34.1