Commit 81c4815f authored by Laurent Aimar's avatar Laurent Aimar

Assert variable type in var_Set/GetXYZ.

It will allow detecting stupid typos.
parent 2ada5d84
...@@ -25,6 +25,8 @@ ...@@ -25,6 +25,8 @@
#ifndef VLC_VARIABLES_H #ifndef VLC_VARIABLES_H
#define VLC_VARIABLES_H 1 #define VLC_VARIABLES_H 1
#include <assert.h>
/** /**
* \file * \file
* This file defines functions and structures for dynamic variables in vlc * This file defines functions and structures for dynamic variables in vlc
...@@ -45,6 +47,7 @@ ...@@ -45,6 +47,7 @@
* Variable types - probably very incomplete * Variable types - probably very incomplete
*****************************************************************************/ *****************************************************************************/
#define VLC_VAR_TYPE 0x00ff #define VLC_VAR_TYPE 0x00ff
#define VLC_VAR_CLASS 0x00f0
#define VLC_VAR_FLAGS 0xff00 #define VLC_VAR_FLAGS 0xff00
/** \defgroup var_flags Additive flags /** \defgroup var_flags Additive flags
...@@ -208,6 +211,17 @@ VLC_EXPORT( int, __var_TriggerCallback, ( vlc_object_t *, const char * ) ); ...@@ -208,6 +211,17 @@ VLC_EXPORT( int, __var_TriggerCallback, ( vlc_object_t *, const char * ) );
* helpers functions * helpers functions
*****************************************************************************/ *****************************************************************************/
/**
* This function assert the variable is of the expected type or it
* is not defined
*/
static inline void __var_AssertType( vlc_object_t *p_obj, const char *psz_name,
int i_expected )
{
const int i_type = __var_Type( p_obj, psz_name ) & VLC_VAR_CLASS;
assert( i_type == 0 || i_type == (i_expected&VLC_VAR_CLASS) );
}
/** /**
* Set the value of an integer variable * Set the value of an integer variable
* *
...@@ -219,6 +233,7 @@ static inline int __var_SetInteger( vlc_object_t *p_obj, const char *psz_name, i ...@@ -219,6 +233,7 @@ static inline int __var_SetInteger( vlc_object_t *p_obj, const char *psz_name, i
{ {
vlc_value_t val; vlc_value_t val;
val.i_int = i; val.i_int = i;
__var_AssertType( p_obj, psz_name, VLC_VAR_INTEGER );
return __var_Set( p_obj, psz_name, val ); return __var_Set( p_obj, psz_name, val );
} }
#define var_SetInteger(a,b,c) __var_SetInteger( VLC_OBJECT(a),b,c) #define var_SetInteger(a,b,c) __var_SetInteger( VLC_OBJECT(a),b,c)
...@@ -233,6 +248,7 @@ static inline int __var_SetBool( vlc_object_t *p_obj, const char *psz_name, bool ...@@ -233,6 +248,7 @@ static inline int __var_SetBool( vlc_object_t *p_obj, const char *psz_name, bool
{ {
vlc_value_t val; vlc_value_t val;
val.b_bool = b; val.b_bool = b;
__var_AssertType( p_obj, psz_name, VLC_VAR_BOOL );
return __var_Set( p_obj, psz_name, val ); return __var_Set( p_obj, psz_name, val );
} }
...@@ -247,6 +263,7 @@ static inline int __var_SetTime( vlc_object_t *p_obj, const char *psz_name, int6 ...@@ -247,6 +263,7 @@ static inline int __var_SetTime( vlc_object_t *p_obj, const char *psz_name, int6
{ {
vlc_value_t val; vlc_value_t val;
val.i_time = i; val.i_time = i;
__var_AssertType( p_obj, psz_name, VLC_VAR_TIME );
return __var_Set( p_obj, psz_name, val ); return __var_Set( p_obj, psz_name, val );
} }
...@@ -261,6 +278,7 @@ static inline int __var_SetFloat( vlc_object_t *p_obj, const char *psz_name, flo ...@@ -261,6 +278,7 @@ static inline int __var_SetFloat( vlc_object_t *p_obj, const char *psz_name, flo
{ {
vlc_value_t val; vlc_value_t val;
val.f_float = f; val.f_float = f;
__var_AssertType( p_obj, psz_name, VLC_VAR_FLOAT );
return __var_Set( p_obj, psz_name, val ); return __var_Set( p_obj, psz_name, val );
} }
...@@ -275,6 +293,7 @@ static inline int __var_SetString( vlc_object_t *p_obj, const char *psz_name, co ...@@ -275,6 +293,7 @@ static inline int __var_SetString( vlc_object_t *p_obj, const char *psz_name, co
{ {
vlc_value_t val; vlc_value_t val;
val.psz_string = (char *)psz_string; val.psz_string = (char *)psz_string;
__var_AssertType( p_obj, psz_name, VLC_VAR_STRING );
return __var_Set( p_obj, psz_name, val ); return __var_Set( p_obj, psz_name, val );
} }
...@@ -288,6 +307,7 @@ static inline int __var_SetVoid( vlc_object_t *p_obj, const char *psz_name ) ...@@ -288,6 +307,7 @@ static inline int __var_SetVoid( vlc_object_t *p_obj, const char *psz_name )
{ {
vlc_value_t val; vlc_value_t val;
val.b_bool = true; val.b_bool = true;
__var_AssertType( p_obj, psz_name, VLC_VAR_VOID );
return __var_Set( p_obj, psz_name, val ); return __var_Set( p_obj, psz_name, val );
} }
#define var_SetVoid(a,b) __var_SetVoid( VLC_OBJECT(a),b) #define var_SetVoid(a,b) __var_SetVoid( VLC_OBJECT(a),b)
...@@ -320,6 +340,7 @@ LIBVLC_USED ...@@ -320,6 +340,7 @@ LIBVLC_USED
static inline int __var_GetInteger( vlc_object_t *p_obj, const char *psz_name ) static inline int __var_GetInteger( vlc_object_t *p_obj, const char *psz_name )
{ {
vlc_value_t val;val.i_int = 0; vlc_value_t val;val.i_int = 0;
__var_AssertType( p_obj, psz_name, VLC_VAR_INTEGER );
if( !__var_Get( p_obj, psz_name, &val ) ) if( !__var_Get( p_obj, psz_name, &val ) )
return val.i_int; return val.i_int;
else else
...@@ -336,6 +357,8 @@ LIBVLC_USED ...@@ -336,6 +357,8 @@ LIBVLC_USED
static inline int __var_GetBool( vlc_object_t *p_obj, const char *psz_name ) static inline int __var_GetBool( vlc_object_t *p_obj, const char *psz_name )
{ {
vlc_value_t val; val.b_bool = false; vlc_value_t val; val.b_bool = false;
__var_AssertType( p_obj, psz_name, VLC_VAR_BOOL );
if( !__var_Get( p_obj, psz_name, &val ) ) if( !__var_Get( p_obj, psz_name, &val ) )
return val.b_bool; return val.b_bool;
else else
...@@ -352,6 +375,7 @@ LIBVLC_USED ...@@ -352,6 +375,7 @@ LIBVLC_USED
static inline int64_t __var_GetTime( vlc_object_t *p_obj, const char *psz_name ) static inline int64_t __var_GetTime( vlc_object_t *p_obj, const char *psz_name )
{ {
vlc_value_t val; val.i_time = 0L; vlc_value_t val; val.i_time = 0L;
__var_AssertType( p_obj, psz_name, VLC_VAR_TIME );
if( !__var_Get( p_obj, psz_name, &val ) ) if( !__var_Get( p_obj, psz_name, &val ) )
return val.i_time; return val.i_time;
else else
...@@ -368,6 +392,7 @@ LIBVLC_USED ...@@ -368,6 +392,7 @@ LIBVLC_USED
static inline float __var_GetFloat( vlc_object_t *p_obj, const char *psz_name ) static inline float __var_GetFloat( vlc_object_t *p_obj, const char *psz_name )
{ {
vlc_value_t val; val.f_float = 0.0; vlc_value_t val; val.f_float = 0.0;
__var_AssertType( p_obj, psz_name, VLC_VAR_FLOAT );
if( !__var_Get( p_obj, psz_name, &val ) ) if( !__var_Get( p_obj, psz_name, &val ) )
return val.f_float; return val.f_float;
else else
...@@ -384,6 +409,7 @@ LIBVLC_USED ...@@ -384,6 +409,7 @@ LIBVLC_USED
static inline char *__var_GetString( vlc_object_t *p_obj, const char *psz_name ) static inline char *__var_GetString( vlc_object_t *p_obj, const char *psz_name )
{ {
vlc_value_t val; val.psz_string = NULL; vlc_value_t val; val.psz_string = NULL;
__var_AssertType( p_obj, psz_name, VLC_VAR_STRING );
if( __var_Get( p_obj, psz_name, &val ) ) if( __var_Get( p_obj, psz_name, &val ) )
return NULL; return NULL;
else else
...@@ -391,10 +417,11 @@ static inline char *__var_GetString( vlc_object_t *p_obj, const char *psz_name ) ...@@ -391,10 +417,11 @@ static inline char *__var_GetString( vlc_object_t *p_obj, const char *psz_name )
} }
LIBVLC_USED LIBVLC_USED
static inline char *__var_GetNonEmptyString( vlc_object_t *obj, const char *name ) static inline char *__var_GetNonEmptyString( vlc_object_t *p_obj, const char *psz_name )
{ {
vlc_value_t val; vlc_value_t val;
if( __var_Get( obj, name, &val ) ) __var_AssertType( p_obj, psz_name, VLC_VAR_STRING );
if( __var_Get( p_obj, psz_name, &val ) )
return NULL; return NULL;
if( *val.psz_string ) if( *val.psz_string )
return val.psz_string; return val.psz_string;
......
...@@ -1016,7 +1016,7 @@ static int DumpCommand( vlc_object_t *p_this, char const *psz_cmd, ...@@ -1016,7 +1016,7 @@ static int DumpCommand( vlc_object_t *p_this, char const *psz_cmd,
printf( ", command" ); printf( ", command" );
if( p_var->i_entries ) if( p_var->i_entries )
printf( ", %d callbacks", p_var->i_entries ); printf( ", %d callbacks", p_var->i_entries );
switch( p_var->i_type & 0x00f0 ) switch( p_var->i_type & VLC_VAR_CLASS )
{ {
case VLC_VAR_VOID: case VLC_VAR_VOID:
case VLC_VAR_MUTEX: case VLC_VAR_MUTEX:
......
...@@ -1573,7 +1573,7 @@ int __var_Command( vlc_object_t *p_this, const char *psz_name, ...@@ -1573,7 +1573,7 @@ int __var_Command( vlc_object_t *p_this, const char *psz_name,
return VLC_EGENERIC; return VLC_EGENERIC;
} }
i_type &= 0xf0; i_type &= VLC_VAR_CLASS;
switch( i_type ) switch( i_type )
{ {
case VLC_VAR_INTEGER: case VLC_VAR_INTEGER:
......
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