diff options
author | Stefano Sabatini <stefano.sabatini-lala@poste.it> | 2010-09-27 16:23:43 +0000 |
---|---|---|
committer | Stefano Sabatini <stefano.sabatini-lala@poste.it> | 2010-09-27 16:23:43 +0000 |
commit | 372e2884089e6a17be6d0028386ea2099dd86268 (patch) | |
tree | d65753e450b0613788dde3e5f23a116a157cd1c7 /libavutil | |
parent | 4a94cfea02f4c3da43d2f2ed25f14ee461a1a315 (diff) | |
download | ffmpeg-372e2884089e6a17be6d0028386ea2099dd86268.tar.gz |
Move av_get_token() from libavfilter to libavutil.
Originally committed as revision 25225 to svn://svn.ffmpeg.org/ffmpeg/trunk
Diffstat (limited to 'libavutil')
-rw-r--r-- | libavutil/avstring.c | 88 | ||||
-rw-r--r-- | libavutil/avstring.h | 16 | ||||
-rw-r--r-- | libavutil/avutil.h | 2 |
3 files changed, 105 insertions, 1 deletions
diff --git a/libavutil/avstring.c b/libavutil/avstring.c index 4844e28db2..b573dd6761 100644 --- a/libavutil/avstring.c +++ b/libavutil/avstring.c @@ -97,3 +97,91 @@ char *av_d2str(double d) if(str) snprintf(str, 16, "%f", d); return str; } + +#define WHITESPACES " \n\t" + +char *av_get_token(const char **buf, const char *term) +{ + char *out = av_malloc(strlen(*buf) + 1); + char *ret= out, *end= out; + const char *p = *buf; + if (!out) return NULL; + p += strspn(p, WHITESPACES); + + while(*p && !strspn(p, term)) { + char c = *p++; + if(c == '\\' && *p){ + *out++ = *p++; + end= out; + }else if(c == '\''){ + while(*p && *p != '\'') + *out++ = *p++; + if(*p){ + p++; + end= out; + } + }else{ + *out++ = c; + } + } + + do{ + *out-- = 0; + }while(out >= end && strspn(out, WHITESPACES)); + + *buf = p; + + return ret; +} + +#ifdef TEST + +#undef printf + +int main(void) +{ + int i; + + printf("Testing av_get_token()\n"); + { + const char *strings[] = { + "''", + "", + ":", + "\\", + "'", + " '' :", + " '' '' :", + "foo '' :", + "'foo'", + "foo ", + " ' foo ' ", + "foo\\", + "foo': blah:blah", + "foo\\: blah:blah", + "foo\'", + "'foo : ' :blahblah", + "\\ :blah", + " foo", + " foo ", + " foo \\ ", + "foo ':blah", + " foo bar : blahblah", + "\\f\\o\\o", + "'foo : \\ \\ ' : blahblah", + "'\\fo\\o:': blahblah", + "\\'fo\\o\\:': foo ' :blahblah" + }; + + for (i=0; i < FF_ARRAY_ELEMS(strings); i++) { + const char *p= strings[i]; + printf("|%s|", p); + printf(" -> |%s|", av_get_token(&p, ":")); + printf(" + |%s|\n", p); + } + } + + return 0; +} + +#endif /* TEST */ diff --git a/libavutil/avstring.h b/libavutil/avstring.h index 01c2391b5f..04d1197386 100644 --- a/libavutil/avstring.h +++ b/libavutil/avstring.h @@ -114,4 +114,20 @@ size_t av_strlcatf(char *dst, size_t size, const char *fmt, ...); */ char *av_d2str(double d); +/** + * Unescape the given string until a non escaped terminating char, + * and return the token corresponding to the unescaped string. + * + * The normal \ and ' escaping is supported. Leading and trailing + * whitespaces are removed, unless they are escaped with '\' or are + * enclosed between ''. + * + * @param buf the buffer to parse, buf will be updated to point to the + * terminating char + * @param term a 0-terminated list of terminating chars + * @return the malloced unescaped string, which must be av_freed by + * the user, NULL in case of allocation failure + */ +char *av_get_token(const char **buf, const char *term); + #endif /* AVUTIL_AVSTRING_H */ diff --git a/libavutil/avutil.h b/libavutil/avutil.h index 470d30e765..c441023c4b 100644 --- a/libavutil/avutil.h +++ b/libavutil/avutil.h @@ -40,7 +40,7 @@ #define AV_VERSION(a, b, c) AV_VERSION_DOT(a, b, c) #define LIBAVUTIL_VERSION_MAJOR 50 -#define LIBAVUTIL_VERSION_MINOR 29 +#define LIBAVUTIL_VERSION_MINOR 30 #define LIBAVUTIL_VERSION_MICRO 0 #define LIBAVUTIL_VERSION_INT AV_VERSION_INT(LIBAVUTIL_VERSION_MAJOR, \ |