[vlc-devel] commit: Assert variable type in var_Set/GetXYZ. (Laurent Aimar )
git version control
git at videolan.org
Wed Sep 17 23:26:04 CEST 2008
vlc | branch: master | Laurent Aimar <fenrir at videolan.org> | Wed Sep 17 21:35:47 2008 +0200| [81c4815f512c93bd8cf7d9b9468940b689c29940] | committer: Laurent Aimar
Assert variable type in var_Set/GetXYZ.
It will allow detecting stupid typos.
> http://git.videolan.org/gitweb.cgi/vlc.git/?a=commit;h=81c4815f512c93bd8cf7d9b9468940b689c29940
---
include/vlc_variables.h | 31 +++++++++++++++++++++++++++++--
src/misc/objects.c | 2 +-
src/misc/variables.c | 2 +-
3 files changed, 31 insertions(+), 4 deletions(-)
diff --git a/include/vlc_variables.h b/include/vlc_variables.h
index f8a542f..9015b0b 100644
--- a/include/vlc_variables.h
+++ b/include/vlc_variables.h
@@ -25,6 +25,8 @@
#ifndef VLC_VARIABLES_H
#define VLC_VARIABLES_H 1
+#include <assert.h>
+
/**
* \file
* This file defines functions and structures for dynamic variables in vlc
@@ -45,6 +47,7 @@
* Variable types - probably very incomplete
*****************************************************************************/
#define VLC_VAR_TYPE 0x00ff
+#define VLC_VAR_CLASS 0x00f0
#define VLC_VAR_FLAGS 0xff00
/** \defgroup var_flags Additive flags
@@ -209,6 +212,17 @@ VLC_EXPORT( int, __var_TriggerCallback, ( vlc_object_t *, const char * ) );
*****************************************************************************/
/**
+ * 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
*
* \param p_obj The object that holds the variable
@@ -219,6 +233,7 @@ static inline int __var_SetInteger( vlc_object_t *p_obj, const char *psz_name, i
{
vlc_value_t val;
val.i_int = i;
+ __var_AssertType( p_obj, psz_name, VLC_VAR_INTEGER );
return __var_Set( p_obj, psz_name, val );
}
#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
{
vlc_value_t val;
val.b_bool = b;
+ __var_AssertType( p_obj, psz_name, VLC_VAR_BOOL );
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
{
vlc_value_t val;
val.i_time = i;
+ __var_AssertType( p_obj, psz_name, VLC_VAR_TIME );
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
{
vlc_value_t val;
val.f_float = f;
+ __var_AssertType( p_obj, psz_name, VLC_VAR_FLOAT );
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
{
vlc_value_t val;
val.psz_string = (char *)psz_string;
+ __var_AssertType( p_obj, psz_name, VLC_VAR_STRING );
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 )
{
vlc_value_t val;
val.b_bool = true;
+ __var_AssertType( p_obj, psz_name, VLC_VAR_VOID );
return __var_Set( p_obj, psz_name, val );
}
#define var_SetVoid(a,b) __var_SetVoid( VLC_OBJECT(a),b)
@@ -320,6 +340,7 @@ LIBVLC_USED
static inline int __var_GetInteger( vlc_object_t *p_obj, const char *psz_name )
{
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 ) )
return val.i_int;
else
@@ -336,6 +357,8 @@ LIBVLC_USED
static inline int __var_GetBool( vlc_object_t *p_obj, const char *psz_name )
{
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 ) )
return val.b_bool;
else
@@ -352,6 +375,7 @@ LIBVLC_USED
static inline int64_t __var_GetTime( vlc_object_t *p_obj, const char *psz_name )
{
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 ) )
return val.i_time;
else
@@ -368,6 +392,7 @@ LIBVLC_USED
static inline float __var_GetFloat( vlc_object_t *p_obj, const char *psz_name )
{
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 ) )
return val.f_float;
else
@@ -384,6 +409,7 @@ LIBVLC_USED
static inline char *__var_GetString( vlc_object_t *p_obj, const char *psz_name )
{
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 ) )
return NULL;
else
@@ -391,10 +417,11 @@ static inline char *__var_GetString( vlc_object_t *p_obj, const char *psz_name )
}
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;
- 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;
if( *val.psz_string )
return val.psz_string;
diff --git a/src/misc/objects.c b/src/misc/objects.c
index b6fc4ff..35301a9 100644
--- a/src/misc/objects.c
+++ b/src/misc/objects.c
@@ -1016,7 +1016,7 @@ static int DumpCommand( vlc_object_t *p_this, char const *psz_cmd,
printf( ", command" );
if( 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_MUTEX:
diff --git a/src/misc/variables.c b/src/misc/variables.c
index 315d6f1..3efa7fc 100644
--- a/src/misc/variables.c
+++ b/src/misc/variables.c
@@ -1573,7 +1573,7 @@ int __var_Command( vlc_object_t *p_this, const char *psz_name,
return VLC_EGENERIC;
}
- i_type &= 0xf0;
+ i_type &= VLC_VAR_CLASS;
switch( i_type )
{
case VLC_VAR_INTEGER:
More information about the vlc-devel
mailing list