Commit 29e972f6 authored by Stefano Sabatini's avatar Stefano Sabatini

lavu/parseutils: add av_small_strptime()

Make internal small_strptime() function public, and use it in place of
strptime().
This allows to avoid a dependency on strptime() on systems which do not
support it.

In particular, fix trac ticket #992.
parent 79dcd58d
...@@ -1359,7 +1359,6 @@ HAVE_LIST=" ...@@ -1359,7 +1359,6 @@ HAVE_LIST="
socklen_t socklen_t
soundcard_h soundcard_h
strerror_r strerror_r
strptime
struct_addrinfo struct_addrinfo
struct_group_source_req struct_group_source_req
struct_ip_mreq_source struct_ip_mreq_source
...@@ -3423,7 +3422,6 @@ check_func_headers malloc.h _aligned_malloc && enable aligned_malloc ...@@ -3423,7 +3422,6 @@ check_func_headers malloc.h _aligned_malloc && enable aligned_malloc
check_func setrlimit check_func setrlimit
check_func snprintf check_func snprintf
check_func strerror_r check_func strerror_r
check_func strptime
check_func sched_getaffinity check_func sched_getaffinity
check_func sysconf check_func sysconf
check_func sysctl check_func sysctl
......
...@@ -15,6 +15,12 @@ libavutil: 2011-04-18 ...@@ -15,6 +15,12 @@ libavutil: 2011-04-18
API changes, most recent first: API changes, most recent first:
2012-09-01 - xxxxxxx - lavu 51.72.100 - parseutils.h
Add av_small_strptime() time parsing function.
Can be used as a stripped-down replacement for strptime(), on
systems which do not support it.
2012-08-13 - xxxxxxx - lavfi 3.8.100 - avfilter.h 2012-08-13 - xxxxxxx - lavfi 3.8.100 - avfilter.h
Add avfilter_get_class() function, and priv_class field to AVFilter Add avfilter_get_class() function, and priv_class field to AVFilter
struct. struct.
......
...@@ -4478,20 +4478,14 @@ void ff_make_absolute_url(char *buf, int size, const char *base, ...@@ -4478,20 +4478,14 @@ void ff_make_absolute_url(char *buf, int size, const char *base,
int64_t ff_iso8601_to_unix_time(const char *datestr) int64_t ff_iso8601_to_unix_time(const char *datestr)
{ {
#if HAVE_STRPTIME
struct tm time1 = {0}, time2 = {0}; struct tm time1 = {0}, time2 = {0};
char *ret1, *ret2; char *ret1, *ret2;
ret1 = strptime(datestr, "%Y - %m - %d %T", &time1); ret1 = av_small_strptime(datestr, "%Y - %m - %d %H:%M:%S", &time1);
ret2 = strptime(datestr, "%Y - %m - %dT%T", &time2); ret2 = av_small_strptime(datestr, "%Y - %m - %dT%H:%M:%S", &time2);
if (ret2 && !ret1) if (ret2 && !ret1)
return av_timegm(&time2); return av_timegm(&time2);
else else
return av_timegm(&time1); 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(AVOutputFormat *ofmt, enum AVCodecID codec_id, int std_compliance) int avformat_query_codec(AVOutputFormat *ofmt, enum AVCodecID codec_id, int std_compliance)
......
...@@ -31,7 +31,7 @@ ...@@ -31,7 +31,7 @@
#define LIBAVFORMAT_VERSION_MAJOR 54 #define LIBAVFORMAT_VERSION_MAJOR 54
#define LIBAVFORMAT_VERSION_MINOR 25 #define LIBAVFORMAT_VERSION_MINOR 25
#define LIBAVFORMAT_VERSION_MICRO 104 #define LIBAVFORMAT_VERSION_MICRO 105
#define LIBAVFORMAT_VERSION_INT AV_VERSION_INT(LIBAVFORMAT_VERSION_MAJOR, \ #define LIBAVFORMAT_VERSION_INT AV_VERSION_INT(LIBAVFORMAT_VERSION_MAJOR, \
LIBAVFORMAT_VERSION_MINOR, \ LIBAVFORMAT_VERSION_MINOR, \
......
...@@ -438,17 +438,7 @@ static int date_get_num(const char **pp, ...@@ -438,17 +438,7 @@ static int date_get_num(const char **pp,
return val; return val;
} }
/** char *av_small_strptime(const char *p, const char *fmt, struct tm *dt)
* Parse the input string p according to the format string fmt and
* store its results in the structure dt.
* This implementation supports only a subset of the formats supported
* by the standard strptime().
*
* @return a pointer to the first character not processed in this
* function call, or NULL in case the function fails to match all of
* the fmt string and therefore an error occurred
*/
static char *small_strptime(const char *p, const char *fmt, struct tm *dt)
{ {
int c, val; int c, val;
...@@ -558,7 +548,7 @@ int av_parse_time(int64_t *timeval, const char *timestr, int duration) ...@@ -558,7 +548,7 @@ int av_parse_time(int64_t *timeval, const char *timestr, int duration)
/* parse the year-month-day part */ /* parse the year-month-day part */
for (i = 0; i < FF_ARRAY_ELEMS(date_fmt); i++) { 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) if (q)
break; break;
} }
...@@ -576,7 +566,7 @@ int av_parse_time(int64_t *timeval, const char *timestr, int duration) ...@@ -576,7 +566,7 @@ int av_parse_time(int64_t *timeval, const char *timestr, int duration)
/* parse the hour-minute-second part */ /* parse the hour-minute-second part */
for (i = 0; i < FF_ARRAY_ELEMS(time_fmt); i++) { 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) if (q)
break; break;
} }
...@@ -587,7 +577,7 @@ int av_parse_time(int64_t *timeval, const char *timestr, int duration) ...@@ -587,7 +577,7 @@ int av_parse_time(int64_t *timeval, const char *timestr, int duration)
++p; ++p;
} }
/* parse timestr as HH:MM:SS */ /* 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) { if (!q) {
/* parse timestr as S+ */ /* parse timestr as S+ */
dt.tm_sec = strtol(p, (void *)&q, 10); dt.tm_sec = strtol(p, (void *)&q, 10);
......
...@@ -132,6 +132,31 @@ int av_parse_color(uint8_t *rgba_color, const char *color_string, int slen, ...@@ -132,6 +132,31 @@ int av_parse_color(uint8_t *rgba_color, const char *color_string, int slen,
*/ */
int av_parse_time(int64_t *timeval, const char *timestr, int duration); int av_parse_time(int64_t *timeval, const char *timestr, int duration);
/**
* Parse the input string p according to the format string fmt and
* store its results in the structure dt.
* This implementation supports only a subset of the formats supported
* by the standard strptime().
*
* In particular it actually supports the parameters:
* - %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'
* - %%: a literal '%'
*
* @return a pointer to the first character not processed in this
* function call, or NULL in case the function fails to match all of
* the fmt string and therefore an error occurred
*/
char *av_small_strptime(const char *p, const char *fmt, struct tm *dt);
/** /**
* Attempt to find a specific tag in a URL. * Attempt to find a specific tag in a URL.
* *
......
...@@ -39,8 +39,8 @@ ...@@ -39,8 +39,8 @@
*/ */
#define LIBAVUTIL_VERSION_MAJOR 51 #define LIBAVUTIL_VERSION_MAJOR 51
#define LIBAVUTIL_VERSION_MINOR 71 #define LIBAVUTIL_VERSION_MINOR 72
#define LIBAVUTIL_VERSION_MICRO 101 #define LIBAVUTIL_VERSION_MICRO 100
#define LIBAVUTIL_VERSION_INT AV_VERSION_INT(LIBAVUTIL_VERSION_MAJOR, \ #define LIBAVUTIL_VERSION_INT AV_VERSION_INT(LIBAVUTIL_VERSION_MAJOR, \
LIBAVUTIL_VERSION_MINOR, \ LIBAVUTIL_VERSION_MINOR, \
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment