|
|
|
@ -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; |
|
|
|
} |
|
|
|
|