]> git.sesse.net Git - vlc/commitdiff
strings: Adding an helper to convert iso8601 durations
authorHugo Beauzée-Luyssen <beauze.h@gmail.com>
Wed, 14 Dec 2011 17:21:46 +0000 (18:21 +0100)
committerJean-Baptiste Kempf <jb@videolan.org>
Fri, 30 Dec 2011 16:59:00 +0000 (17:59 +0100)
Signed-off-by: Jean-Baptiste Kempf <jb@videolan.org>
include/vlc_strings.h
src/libvlccore.sym
src/text/strings.c

index 92e43a266c0f5b1b4ebc6519ee4bcdbb36536ec1..9b4d0944cf94b6c4208fe26f2d92caee8fb7459c 100644 (file)
@@ -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 * );
+
 /**
  * @}
  */
index d0fa5d964602bd3a1569af2d01e38f080da0be19..2a876f37d671f50d92f0739354aac297ba214590 100644 (file)
@@ -419,6 +419,7 @@ stream_vaControl
 str_format
 str_format_meta
 str_format_time
+str_duration
 subpicture_Delete
 subpicture_New
 subpicture_NewFromPicture
index a1df0bbda2580525b8f06622c8998fb5d93a24ae..4b51a6bcad01843e393d9408747f4048a3e7e6ca 100644 (file)
@@ -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;
+}