From 108f2f381acb93827fb4add0517eeae859afa3bf Mon Sep 17 00:00:00 2001 From: Luca Barbato Date: Mon, 6 Apr 2015 01:25:52 +0200 Subject: parseutils: Extend small_strptime to be used in avformat The strptime implementation is supposed to support whitespace and %T. --- libavutil/parseutils.c | 108 ++++++++++++++++++++++++++----------------------- 1 file changed, 58 insertions(+), 50 deletions(-) (limited to 'libavutil/parseutils.c') 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) -- cgit v1.2.3