]> git.sesse.net Git - vlc/blobdiff - src/misc/variables.c
* src/video_output/video_output.c : do not use FIND_ANYWHERE to catch
[vlc] / src / misc / variables.c
index eacd6a02ffa236cd13b605f0ca4c7b764ad105de..847638c59e726b27614df39a045605a0ec8ac877 100644 (file)
@@ -2,7 +2,7 @@
  * variables.c: routines for object variables handling
  *****************************************************************************
  * Copyright (C) 2002 VideoLAN
- * $Id: variables.c,v 1.25 2003/05/24 23:40:11 gbazin Exp $
+ * $Id: variables.c,v 1.30 2003/09/07 22:51:11 fenrir Exp $
  *
  * Authors: Samuel Hocevar <sam@zoy.org>
  *
@@ -46,10 +46,7 @@ static int CmpBool( vlc_value_t v, vlc_value_t w ) { return v.b_bool ? w.b_bool
 static int CmpInt( vlc_value_t v, vlc_value_t w ) { return v.i_int == w.i_int ? 0 : v.i_int > w.i_int ? 1 : -1; }
 static int CmpTime( vlc_value_t v, vlc_value_t w )
 {
-    mtime_t v_time,w_time;
-    v_time = ( (mtime_t)v.time.i_high << 32 ) + v.time.i_low;
-    w_time = ( (mtime_t)w.time.i_high << 32 ) + w.time.i_low;
-    return v_time == w_time ? 0 : v_time > w_time ? 1 : -1;
+    return v.i_time == w.i_time ? 0 : v.i_time > w.i_time ? 1 : -1;
 }
 static int CmpString( vlc_value_t v, vlc_value_t w ) { return strcmp( v.psz_string, w.psz_string ); }
 static int CmpFloat( vlc_value_t v, vlc_value_t w ) { return v.f_float == w.f_float ? 0 : v.f_float > w.f_float ? 1 : -1; }
@@ -159,7 +156,7 @@ int __var_Create( vlc_object_t *p_this, const char *psz_name, int i_type )
     if( i_new >= 0 )
     {
         /* If the types differ, variable creation failed. */
-        if( i_type != p_this->p_vars[i_new].i_type )
+        if( (i_type & ~VLC_VAR_DOINHERIT) != p_this->p_vars[i_new].i_type )
         {
             vlc_mutex_unlock( &p_this->var_lock );
             return VLC_EBADVAR;
@@ -190,7 +187,7 @@ int __var_Create( vlc_object_t *p_this, const char *psz_name, int i_type )
     p_var->psz_name = strdup( psz_name );
     p_var->psz_text = NULL;
 
-    p_var->i_type = i_type;
+    p_var->i_type = i_type & ~VLC_VAR_DOINHERIT;
     memset( &p_var->val, 0, sizeof(vlc_value_t) );
 
     p_var->pf_dup = DupDummy;
@@ -237,8 +234,7 @@ int __var_Create( vlc_object_t *p_this, const char *psz_name, int i_type )
             break;
         case VLC_VAR_TIME:
             p_var->pf_cmp = CmpTime;
-            p_var->val.time.i_low = 0;
-            p_var->val.time.i_high = 0;
+            p_var->val.i_time = 0;
             break;
         case VLC_VAR_ADDRESS:
             p_var->pf_cmp = CmpAddress;
@@ -261,6 +257,22 @@ int __var_Create( vlc_object_t *p_this, const char *psz_name, int i_type )
     /* Duplicate the default data we stored. */
     p_var->pf_dup( &p_var->val );
 
+    if( i_type & VLC_VAR_DOINHERIT )
+    {
+        vlc_value_t val;
+
+        if( InheritValue( p_this, psz_name, &val, p_var->i_type )
+            == VLC_SUCCESS );
+        {
+            /* Free data if needed */
+            p_var->pf_free( &p_var->val );
+            /* Check boundaries and list */
+            CheckValue( p_var, &val );
+            /* Set the variable */
+            p_var->val = val;
+        }
+    }
+
     vlc_mutex_unlock( &p_this->var_lock );
 
     return VLC_SUCCESS;
@@ -304,8 +316,11 @@ int __var_Destroy( vlc_object_t *p_this, const char *psz_name )
         for( i = 0 ; i < p_var->choices.i_count ; i++ )
         {
             p_var->pf_free( &p_var->choices.p_values[i] );
+            if( p_var->choices_text.p_values[i].psz_string )
+                free( p_var->choices_text.p_values[i].psz_string );
         }
         free( p_var->choices.p_values );
+        free( p_var->choices_text.p_values );
     }
 
     /* Free callbacks if needed */
@@ -567,6 +582,12 @@ int __var_Change( vlc_object_t *p_this, const char *psz_name,
                     /* Free data if needed */
                     p_var->pf_free( &oldval );
                 }
+
+                if( p_val )
+                {
+                    *p_val = p_var->val;
+                    p_var->pf_dup( p_val );
+                }
             }
             break;
 
@@ -1093,6 +1114,8 @@ static int InheritValue( vlc_object_t *p_this, const char *psz_name,
     {
         switch( i_type & VLC_VAR_TYPE )
         {
+        case VLC_VAR_FILE:
+        case VLC_VAR_DIRECTORY:
         case VLC_VAR_STRING:
             p_val->psz_string = config_GetPsz( p_this, psz_name );
             if( !p_val->psz_string ) p_val->psz_string = strdup("");
@@ -1133,7 +1156,6 @@ static int InheritValue( vlc_object_t *p_this, const char *psz_name,
         p_var->pf_dup( p_val );
 
         vlc_mutex_unlock( &p_this->p_parent->var_lock );
-
         return VLC_SUCCESS;
     }