Commit 0b396ef1 authored by Hugo Beauzée-Luyssen's avatar Hugo Beauzée-Luyssen Committed by Jean-Baptiste Kempf

strings: Adding an helper to convert iso8601 durations

Signed-off-by: Jean-Baptiste Kempf's avatarJean-Baptiste Kempf <jb@videolan.org>
parent fb10d756
......@@ -53,6 +53,8 @@ VLC_API char * str_format( vlc_object_t *, const char * );
VLC_API void filename_sanitize( char * );
VLC_API void path_sanitize( char * );
VLC_API time_t str_duration( const char * );
/**
* @}
*/
......
......@@ -419,6 +419,7 @@ stream_vaControl
str_format
str_format_meta
str_format_time
str_duration
subpicture_Delete
subpicture_New
subpicture_NewFromPicture
......
......@@ -1275,3 +1275,62 @@ out:
free (path);
return ret; /* unknown scheme */
}
/*
Decodes a duration as defined by ISO 8601
http://en.wikipedia.org/wiki/ISO_8601#Durations
@param str A null-terminated string to convert
@return: The duration in seconds. -1 if an error occured.
Exemple input string: "PT0H9M56.46S"
*/
time_t str_duration( const char *psz_duration )
{
bool timeDesignatorReached = false;
time_t res = 0;
char* end_ptr;
if ( psz_duration == NULL )
return -1;
if ( ( *(psz_duration++) ) != 'P' )
return -1;
do
{
double number = strtod( psz_duration, &end_ptr );
double mul = 0;
if ( psz_duration != end_ptr )
psz_duration = end_ptr;
switch( *psz_duration )
{
case 'M':
{
//M can mean month or minutes, if the 'T' flag has been reached.
//We don't handle months though.
if ( timeDesignatorReached == true )
mul = 60.0;
break ;
}
case 'Y':
case 'W':
break ; //Don't handle this duration.
case 'D':
mul = 86400.0;
break ;
case 'T':
timeDesignatorReached = true;
break ;
case 'H':
mul = 3600.0;
break ;
case 'S':
mul = 1.0;
break ;
default:
break ;
}
res += (time_t)(mul * number);
if ( *psz_duration )
psz_duration++;
} while ( *psz_duration );
return res;
}
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