From 27f274628234c1f934b9a6a6380ed567c1b4ceae Mon Sep 17 00:00:00 2001 From: Luca Barbato Date: Mon, 6 Apr 2015 01:45:37 +0200 Subject: [PATCH] parseutils: Make av_small_strptime public And use it in libavformat. Based on a similar patch by Stefano Sabatini . --- configure | 2 -- doc/APIchanges | 3 +++ libavformat/utils.c | 11 ++--------- libavutil/parseutils.c | 10 +++++----- libavutil/parseutils.h | 31 +++++++++++++++++++++++++++++++ libavutil/version.h | 2 +- 6 files changed, 42 insertions(+), 17 deletions(-) diff --git a/configure b/configure index 6ad813b714..8821cbc331 100755 --- a/configure +++ b/configure @@ -1487,7 +1487,6 @@ SYSTEM_FUNCS=" setrlimit Sleep strerror_r - strptime sysconf sysctl usleep @@ -4133,7 +4132,6 @@ check_func_headers time.h nanosleep || { check_func_headers time.h nanosleep -lr check_func sched_getaffinity check_func setrlimit check_func strerror_r -check_func strptime check_func sysconf check_func sysctl check_func usleep diff --git a/doc/APIchanges b/doc/APIchanges index 75eb66b4d1..35830f8278 100644 --- a/doc/APIchanges +++ b/doc/APIchanges @@ -13,6 +13,9 @@ libavutil: 2014-08-09 API changes, most recent first: +2015-xx-xx - xxxxxxx - lavu 54.11.0 + Add av_small_strptime(). + 2015-xx-xx - xxxxxxx - lavc 56.22.0 Add FF_PROFILE_DTS_EXPRESS. diff --git a/libavformat/utils.c b/libavformat/utils.c index 6248c1e5cb..c275d06df4 100644 --- a/libavformat/utils.c +++ b/libavformat/utils.c @@ -2902,21 +2902,14 @@ int ff_find_stream_index(AVFormatContext *s, int id) int64_t ff_iso8601_to_unix_time(const char *datestr) { -#if HAVE_STRPTIME struct tm time1 = { 0 }, time2 = { 0 }; char *ret1, *ret2; - ret1 = strptime(datestr, "%Y - %m - %d %T", &time1); - ret2 = strptime(datestr, "%Y - %m - %dT%T", &time2); + ret1 = av_small_strptime(datestr, "%Y - %m - %d %T", &time1); + ret2 = av_small_strptime(datestr, "%Y - %m - %dT%T", &time2); if (ret2 && !ret1) return av_timegm(&time2); else return av_timegm(&time1); -#else - av_log(NULL, AV_LOG_WARNING, - "strptime() unavailable on this system, cannot convert " - "the date string.\n"); - return 0; -#endif } int avformat_query_codec(const AVOutputFormat *ofmt, enum AVCodecID codec_id, diff --git a/libavutil/parseutils.c b/libavutil/parseutils.c index 0e07b4a4b1..be238f0dde 100644 --- a/libavutil/parseutils.c +++ b/libavutil/parseutils.c @@ -400,7 +400,7 @@ static int date_get_num(const char **pp, return val; } -static const char *small_strptime(const char *p, const char *fmt, struct tm *dt) +const char *av_small_strptime(const char *p, const char *fmt, struct tm *dt) { int c, val; @@ -453,7 +453,7 @@ static const char *small_strptime(const char *p, const char *fmt, struct tm *dt) dt->tm_mday = val; break; case 'T': - p = small_strptime(p, "%H:%M:%S", dt); + p = av_small_strptime(p, "%H:%M:%S", dt); if (!p) return NULL; break; @@ -526,7 +526,7 @@ int av_parse_time(int64_t *timeval, const char *timestr, int duration) /* parse the year-month-day part */ for (i = 0; i < FF_ARRAY_ELEMS(date_fmt); i++) { - q = small_strptime(p, date_fmt[i], &dt); + q = av_small_strptime(p, date_fmt[i], &dt); if (q) { break; } @@ -550,7 +550,7 @@ int av_parse_time(int64_t *timeval, const char *timestr, int duration) /* parse the hour-minute-second part */ for (i = 0; i < FF_ARRAY_ELEMS(time_fmt); i++) { - q = small_strptime(p, time_fmt[i], &dt); + q = av_small_strptime(p, time_fmt[i], &dt); if (q) { break; } @@ -562,7 +562,7 @@ int av_parse_time(int64_t *timeval, const char *timestr, int duration) ++p; } /* parse timestr as HH:MM:SS */ - q = small_strptime(p, time_fmt[0], &dt); + q = av_small_strptime(p, time_fmt[0], &dt); if (!q) { char *o; /* parse timestr as S+ */ diff --git a/libavutil/parseutils.h b/libavutil/parseutils.h index 0844abb2f0..8e99634773 100644 --- a/libavutil/parseutils.h +++ b/libavutil/parseutils.h @@ -116,6 +116,37 @@ int av_parse_time(int64_t *timeval, const char *timestr, int duration); */ int av_find_info_tag(char *arg, int arg_size, const char *tag1, const char *info); +/** + * Simplified version of strptime + * + * Parse the input string p according to the format string fmt and + * store its results in the structure dt. + * + * Neither text and locale's alternative representation are supported. + * + * The supported input field descriptors are listed below. + * - %H: the hour as a decimal number, using a 24-hour clock, in the + * range '00' through '23' + * - %M: the minute as a decimal number, using a 24-hour clock, in the + * range '00' through '59' + * - %S: the second as a decimal number, using a 24-hour clock, in the + * range '00' through '59' + * - %Y: the year as a decimal number, using the Gregorian calendar + * - %m: the month as a decimal number, in the range '1' through '12' + * - %d: the day of the month as a decimal number, in the range '1' + * through '31' + * - %T: alias for '%H:%M:%S' + * - %%: a literal '%' + * + * @return a pointer to the first character not processed in this function + * call. In case the input string contains more characters than + * required by the format string the return value points right after + * the last consumed input character. In case the whole input string + * is consumed the return value points to the null byte at the end of + * the string. On failure NULL is returned. + */ +const char *av_small_strptime(const char *p, const char *fmt, struct tm *dt); + /** * Convert the decomposed UTC time in tm to a time_t value. */ diff --git a/libavutil/version.h b/libavutil/version.h index b94db74d2c..14a406e7da 100644 --- a/libavutil/version.h +++ b/libavutil/version.h @@ -54,7 +54,7 @@ */ #define LIBAVUTIL_VERSION_MAJOR 54 -#define LIBAVUTIL_VERSION_MINOR 10 +#define LIBAVUTIL_VERSION_MINOR 11 #define LIBAVUTIL_VERSION_MICRO 0 #define LIBAVUTIL_VERSION_INT AV_VERSION_INT(LIBAVUTIL_VERSION_MAJOR, \