free( p_val->p_list );
}
+static const struct variable_ops_t
+addr_ops = { CmpAddress, DupDummy, FreeDummy, },
+bool_ops = { CmpBool, DupDummy, FreeDummy, },
+float_ops = { CmpFloat, DupDummy, FreeDummy, },
+int_ops = { CmpInt, DupDummy, FreeDummy, },
+list_ops = { CmpAddress, DupList, FreeList, },
+mutex_ops = { CmpAddress, DupDummy, FreeMutex, },
+string_ops = { CmpString, DupString, FreeString, },
+time_ops = { CmpTime, DupDummy, FreeDummy, };
+
/*****************************************************************************
* Local prototypes
*****************************************************************************/
p_var->i_type = i_type & ~VLC_VAR_DOINHERIT;
memset( &p_var->val, 0, sizeof(vlc_value_t) );
- p_var->pf_dup = DupDummy;
- p_var->pf_free = FreeDummy;
-
p_var->i_usage = 1;
p_var->i_default = -1;
switch( i_type & VLC_VAR_CLASS )
{
case VLC_VAR_BOOL:
- p_var->pf_cmp = CmpBool;
+ p_var->ops = &bool_ops;
p_var->val.b_bool = false;
break;
case VLC_VAR_INTEGER:
- p_var->pf_cmp = CmpInt;
+ p_var->ops = &int_ops;
p_var->val.i_int = 0;
break;
case VLC_VAR_STRING:
- p_var->pf_cmp = CmpString;
- p_var->pf_dup = DupString;
- p_var->pf_free = FreeString;
+ p_var->ops = &string_ops;
p_var->val.psz_string = NULL;
break;
case VLC_VAR_FLOAT:
- p_var->pf_cmp = CmpFloat;
+ p_var->ops = &float_ops;
p_var->val.f_float = 0.0;
break;
case VLC_VAR_TIME:
- p_var->pf_cmp = CmpTime;
+ p_var->ops = &time_ops;
p_var->val.i_time = 0;
break;
case VLC_VAR_ADDRESS:
- p_var->pf_cmp = CmpAddress;
+ p_var->ops = &addr_ops;
p_var->val.p_address = NULL;
break;
case VLC_VAR_MUTEX:
- p_var->pf_cmp = CmpAddress;
- p_var->pf_free = FreeMutex;
+ p_var->ops = &mutex_ops;
p_var->val.p_address = malloc( sizeof(vlc_mutex_t) );
vlc_mutex_init( (vlc_mutex_t*)p_var->val.p_address );
break;
case VLC_VAR_LIST:
- p_var->pf_cmp = CmpAddress;
- p_var->pf_dup = DupList;
- p_var->pf_free = FreeList;
+ p_var->ops = &list_ops;
p_var->val.p_list = &dummy_null_list;
break;
}
/* Duplicate the default data we stored. */
- p_var->pf_dup( &p_var->val );
+ p_var->ops->pf_dup( &p_var->val );
if( i_type & VLC_VAR_DOINHERIT )
{
== VLC_SUCCESS )
{
/* Free data if needed */
- p_var->pf_free( &p_var->val );
+ p_var->ops->pf_free( &p_var->val );
/* Set the variable */
p_var->val = val;
0, val );
INSERT_ELEM( p_var->choices_text.p_values,
p_var->choices_text.i_count, 0, val );
- p_var->pf_dup( &p_var->choices.p_values[0] );
+ p_var->ops->pf_dup( &p_var->choices.p_values[0] );
p_var->choices_text.p_values[0].psz_string = NULL;
}
}
}
/* Free value if needed */
- p_var->pf_free( &p_var->val );
+ p_var->ops->pf_free( &p_var->val );
/* Free choice list if needed */
if( p_var->choices.i_count )
{
for( i = 0 ; i < p_var->choices.i_count ; i++ )
{
- p_var->pf_free( &p_var->choices.p_values[i] );
+ p_var->ops->pf_free( &p_var->choices.p_values[i] );
free( p_var->choices_text.p_values[i].psz_string );
}
free( p_var->choices.p_values );
case VLC_VAR_SETMIN:
if( p_var->i_type & VLC_VAR_HASMIN )
{
- p_var->pf_free( &p_var->min );
+ p_var->ops->pf_free( &p_var->min );
}
p_var->i_type |= VLC_VAR_HASMIN;
p_var->min = *p_val;
- p_var->pf_dup( &p_var->min );
+ p_var->ops->pf_dup( &p_var->min );
CheckValue( p_var, &p_var->val );
break;
case VLC_VAR_GETMIN:
case VLC_VAR_SETMAX:
if( p_var->i_type & VLC_VAR_HASMAX )
{
- p_var->pf_free( &p_var->max );
+ p_var->ops->pf_free( &p_var->max );
}
p_var->i_type |= VLC_VAR_HASMAX;
p_var->max = *p_val;
- p_var->pf_dup( &p_var->max );
+ p_var->ops->pf_dup( &p_var->max );
CheckValue( p_var, &p_var->val );
break;
case VLC_VAR_GETMAX:
case VLC_VAR_SETSTEP:
if( p_var->i_type & VLC_VAR_HASSTEP )
{
- p_var->pf_free( &p_var->step );
+ p_var->ops->pf_free( &p_var->step );
}
p_var->i_type |= VLC_VAR_HASSTEP;
p_var->step = *p_val;
- p_var->pf_dup( &p_var->step );
+ p_var->ops->pf_dup( &p_var->step );
CheckValue( p_var, &p_var->val );
break;
case VLC_VAR_GETSTEP:
i, *p_val );
INSERT_ELEM( p_var->choices_text.p_values,
p_var->choices_text.i_count, i, *p_val );
- p_var->pf_dup( &p_var->choices.p_values[i] );
+ p_var->ops->pf_dup( &p_var->choices.p_values[i] );
p_var->choices_text.p_values[i].psz_string =
( p_val2 && p_val2->psz_string ) ?
strdup( p_val2->psz_string ) : NULL;
case VLC_VAR_DELCHOICE:
for( i = 0 ; i < p_var->choices.i_count ; i++ )
{
- if( p_var->pf_cmp( p_var->choices.p_values[i], *p_val ) == 0 )
+ if( p_var->ops->pf_cmp( p_var->choices.p_values[i], *p_val ) == 0 )
{
break;
}
p_var->i_default = -1;
}
- p_var->pf_free( &p_var->choices.p_values[i] );
+ p_var->ops->pf_free( &p_var->choices.p_values[i] );
free( p_var->choices_text.p_values[i].psz_string );
REMOVE_ELEM( p_var->choices.p_values, p_var->choices.i_count, i );
REMOVE_ELEM( p_var->choices_text.p_values,
case VLC_VAR_CLEARCHOICES:
for( i = 0 ; i < p_var->choices.i_count ; i++ )
{
- p_var->pf_free( &p_var->choices.p_values[i] );
+ p_var->ops->pf_free( &p_var->choices.p_values[i] );
}
for( i = 0 ; i < p_var->choices_text.i_count ; i++ )
free( p_var->choices_text.p_values[i].psz_string );
/* FIXME: the list is sorted, dude. Use something cleverer. */
for( i = 0 ; i < p_var->choices.i_count ; i++ )
{
- if( p_var->pf_cmp( p_var->choices.p_values[i], *p_val ) == 0 )
+ if( p_var->ops->pf_cmp( p_var->choices.p_values[i], *p_val ) == 0 )
{
break;
}
break;
case VLC_VAR_SETVALUE:
/* Duplicate data if needed */
- p_var->pf_dup( p_val );
+ p_var->ops->pf_dup( p_val );
/* Backup needed stuff */
oldval = p_var->val;
/* Check boundaries and list */
/* Set the variable */
p_var->val = *p_val;
/* Free data if needed */
- p_var->pf_free( &oldval );
+ p_var->ops->pf_free( &oldval );
break;
case VLC_VAR_GETCHOICES:
case VLC_VAR_GETLIST:
{
p_val->p_list->p_values[i] = p_var->choices.p_values[i];
p_val->p_list->pi_types[i] = p_var->i_type;
- p_var->pf_dup( &p_val->p_list->p_values[i] );
+ p_var->ops->pf_dup( &p_val->p_list->p_values[i] );
if( p_val2 )
{
p_val2->p_list->p_values[i].psz_string =
/* Set the variable */
p_var->val = val;
/* Free data if needed */
- p_var->pf_free( &oldval );
+ p_var->ops->pf_free( &oldval );
}
if( p_val )
{
*p_val = p_var->val;
- p_var->pf_dup( p_val );
+ p_var->ops->pf_dup( p_val );
}
}
break;
p_var = &p_priv->p_vars[i_var];
/* Duplicate data if needed */
- p_var->pf_dup( &val );
+ p_var->ops->pf_dup( &val );
/* Backup needed stuff */
oldval = p_var->val;
}
/* Free data if needed */
- p_var->pf_free( &oldval );
+ p_var->ops->pf_free( &oldval );
vlc_mutex_unlock( &p_priv->var_lock );
*p_val = p_var->val;
/* Duplicate value if needed */
- p_var->pf_dup( p_val );
+ p_var->ops->pf_dup( p_val );
vlc_mutex_unlock( &p_priv->var_lock );
/* FIXME: the list is sorted, dude. Use something cleverer. */
for( i = p_var->choices.i_count ; i-- ; )
{
- if( p_var->pf_cmp( *p_val, p_var->choices.p_values[i] ) == 0 )
+ if( p_var->ops->pf_cmp( *p_val, p_var->choices.p_values[i] ) == 0 )
{
break;
}
if( i < 0 )
{
/* Free the old variable, get the new one, dup it */
- p_var->pf_free( p_val );
+ p_var->ops->pf_free( p_val );
*p_val = p_var->choices.p_values[p_var->i_default >= 0
? p_var->i_default : 0 ];
- p_var->pf_dup( p_val );
+ p_var->ops->pf_dup( p_val );
}
}
*p_val = p_var->val;
/* Duplicate value if needed */
- p_var->pf_dup( p_val );
+ p_var->ops->pf_dup( p_val );
vlc_mutex_unlock( &p_priv->var_lock );
return VLC_SUCCESS;