diff options
author | Luca Barbato <lu_zero@gentoo.org> | 2015-04-06 01:25:52 +0200 |
---|---|---|
committer | Luca Barbato <lu_zero@gentoo.org> | 2015-04-06 18:09:03 +0200 |
commit | 108f2f381acb93827fb4add0517eeae859afa3bf (patch) | |
tree | a5b656ce6f0fabe7cdaa4252a4b4f0a6149cceef /libavutil | |
parent | 249796e2560c2cce1add722c3e873de96b17be74 (diff) | |
download | ffmpeg-108f2f381acb93827fb4add0517eeae859afa3bf.tar.gz |
parseutils: Extend small_strptime to be used in avformat
The strptime implementation is supposed to support whitespace and %T.
Diffstat (limited to 'libavutil')
-rw-r--r-- | libavutil/parseutils.c | 108 |
1 files changed, 58 insertions, 50 deletions
diff --git a/libavutil/parseutils.c b/libavutil/parseutils.c index 4ae47ee250..0e07b4a4b1 100644 --- a/libavutil/parseutils.c +++ b/libavutil/parseutils.c @@ -404,61 +404,69 @@ static const char *small_strptime(const char *p, const char *fmt, struct tm *dt) { int c, val; - for(;;) { + while((c = *fmt++)) { + if (c != '%') { + if (av_isspace(c)) + for (; *p && av_isspace(*p); p++); + else if (*p != c) + return NULL; + else p++; + continue; + } + c = *fmt++; - if (c == '\0') { - return p; - } else if (c == '%') { - c = *fmt++; - switch(c) { - case 'H': - val = date_get_num(&p, 0, 23, 2); - if (val == -1) - return NULL; - dt->tm_hour = val; - break; - case 'M': - val = date_get_num(&p, 0, 59, 2); - if (val == -1) - return NULL; - dt->tm_min = val; - break; - case 'S': - val = date_get_num(&p, 0, 59, 2); - if (val == -1) - return NULL; - dt->tm_sec = val; - break; - case 'Y': - val = date_get_num(&p, 0, 9999, 4); - if (val == -1) - return NULL; - dt->tm_year = val - 1900; - break; - case 'm': - val = date_get_num(&p, 1, 12, 2); - if (val == -1) - return NULL; - dt->tm_mon = val - 1; - break; - case 'd': - val = date_get_num(&p, 1, 31, 2); - if (val == -1) - return NULL; - dt->tm_mday = val; - break; - case '%': - goto match; - default: + switch(c) { + case 'H': + val = date_get_num(&p, 0, 23, 2); + if (val == -1) return NULL; - } - } else { - match: - if (c != *p) + dt->tm_hour = val; + break; + case 'M': + val = date_get_num(&p, 0, 59, 2); + if (val == -1) return NULL; - p++; + dt->tm_min = val; + break; + case 'S': + val = date_get_num(&p, 0, 59, 2); + if (val == -1) + return NULL; + dt->tm_sec = val; + break; + case 'Y': + val = date_get_num(&p, 0, 9999, 4); + if (val == -1) + return NULL; + dt->tm_year = val - 1900; + break; + case 'm': + val = date_get_num(&p, 1, 12, 2); + if (val == -1) + return NULL; + dt->tm_mon = val - 1; + break; + case 'd': + val = date_get_num(&p, 1, 31, 2); + if (val == -1) + return NULL; + dt->tm_mday = val; + break; + case 'T': + p = small_strptime(p, "%H:%M:%S", dt); + if (!p) + return NULL; + break; + case '%': + if (*p++ != '%') + return NULL; + break; + default: + return NULL; } } + + return p; } time_t av_timegm(struct tm *tm) |