diff options
author | Alexander Strasser <eclipse7@gmx.net> | 2012-03-11 15:24:51 +0100 |
---|---|---|
committer | Michael Niedermayer <michaelni@gmx.at> | 2012-03-30 00:04:16 +0200 |
commit | 3e1ff8eb27e547c330af72ec87ca75a951d64c24 (patch) | |
tree | a9ea493ac99464c0a1846319666677ee1123f500 | |
parent | 0be130e37bfafd6022edd27833f04a0b6cee2f02 (diff) | |
download | ffmpeg-3e1ff8eb27e547c330af72ec87ca75a951d64c24.tar.gz |
img2dec: Recognize glob meta chars only if prefixed by %
This changes globbing support to only be used if the character
contains at least one glob meta character that is preceded by
an unescaped %. To escape a literal % one would use %% which is
identical to the way to match a % with image2 sequence generation
feature.
* Makes it possible to have patterns like %04d-[720p].jpg work
again with sequence number generation. Previously this would
always be detected as a glob pattern and was interpreted by
the image2 glob code instead.
* Makes it possible to use %*-[720p].jpg to match above pattern
without having to double escape it to be not interpreted by most
shells and not by the image2 glob code (previously one would
need to use \*-\\\[720p\\\].jpg to achieve the same)
Signed-off-by: Alexander Strasser <eclipse7@gmx.net>
Signed-off-by: Michael Niedermayer <michaelni@gmx.at>
-rw-r--r-- | libavformat/img2dec.c | 30 |
1 files changed, 28 insertions, 2 deletions
diff --git a/libavformat/img2dec.c b/libavformat/img2dec.c index d10a7a4b6a..155f9fc325 100644 --- a/libavformat/img2dec.c +++ b/libavformat/img2dec.c @@ -95,9 +95,19 @@ static int infer_size(int *width_ptr, int *height_ptr, int size) static int is_glob(const char *path) { #if HAVE_GLOB - size_t span = strcspn(path, "*?[]{}\\"); + size_t span = 0; + const char *p = path; + + while (p = strchr(p, '%')) { + if (*(++p) == '%') { + ++p; + continue; + } + if (span = strspn(p, "*?[]{}")) + break; + } /* Did we hit a glob char or get to the end? */ - return path[span] != '\0'; + return span != 0; #else return 0; #endif @@ -222,7 +232,23 @@ static int read_header(AVFormatContext *s1) s->use_glob = is_glob(s->path); if (s->use_glob) { #if HAVE_GLOB + char *p = s->path, *q, *dup; int gerr; + + dup = q = av_strdup(p); + while (*q) { + /* Do we have room for the next char and a \ insertion? */ + if ((p - s->path) >= (sizeof(s->path) - 2)) + break; + if (*q == '%' && strspn(q + 1, "%*?[]{}")) + ++q; + else if (strspn(q, "\\*?[]{}")) + *p++ = '\\'; + *p++ = *q++; + } + *p = 0; + av_free(dup); + gerr = glob(s->path, GLOB_NOCHECK|GLOB_BRACE|GLOB_NOMAGIC|GLOB_TILDE_CHECK, NULL, &s->globstate); if (gerr != 0) { return AVERROR(ENOENT); |