X-Git-Url: https://git.sesse.net/?a=blobdiff_plain;f=src%2Fmisc%2Fvariables.c;h=c91cb4138c0457e8ea28bbff7b9c3466b90db8f8;hb=098df76ff5ea0cd087a36ec67021607de2e3a49c;hp=7f142f8911e692606e73443980457ee9ec5ec8f4;hpb=7e6c2325f169cfe06a8562b55a0832c26580c503;p=vlc diff --git a/src/misc/variables.c b/src/misc/variables.c index 7f142f8911..c91cb4138c 100644 --- a/src/misc/variables.c +++ b/src/misc/variables.c @@ -36,6 +36,8 @@ #include #include +#include +#include /***************************************************************************** * Private types @@ -49,12 +51,21 @@ struct callback_entry_t /***************************************************************************** * Local comparison functions, returns 0 if v == w, < 0 if v < w, > 0 if v > w *****************************************************************************/ -static int CmpBool( vlc_value_t v, vlc_value_t w ) { return v.b_bool ? w.b_bool ? 0 : 1 : w.b_bool ? -1 : 0; } -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 CmpBool( vlc_value_t v, vlc_value_t w ) +{ + return v.b_bool ? w.b_bool ? 0 : 1 : w.b_bool ? -1 : 0; +} + +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 ) { 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 ) { if( !v.psz_string ) @@ -74,41 +85,6 @@ static void DupString( vlc_value_t *p_val ) p_val->psz_string = strdup( p_val->psz_string ? p_val->psz_string : "" ); } -static void DupList( vlc_value_t *p_val ) -{ - int i; - vlc_list_t *p_list = malloc( sizeof(vlc_list_t) ); - - p_list->i_count = p_val->p_list->i_count; - if( p_val->p_list->i_count ) - { - p_list->p_values = malloc( p_list->i_count * sizeof(vlc_value_t) ); - p_list->pi_types = malloc( p_list->i_count * sizeof(int) ); - } - else - { - p_list->p_values = NULL; - p_list->pi_types = NULL; - } - - for( i = 0; i < p_list->i_count; i++ ) - { - p_list->p_values[i] = p_val->p_list->p_values[i]; - p_list->pi_types[i] = p_val->p_list->pi_types[i]; - switch( p_val->p_list->pi_types[i] & VLC_VAR_CLASS ) - { - case VLC_VAR_STRING: - - DupString( &p_list->p_values[i] ); - break; - default: - break; - } - } - - p_val->p_list = p_list; -} - static void FreeDummy( vlc_value_t *p_val ) { (void)p_val; /* unused */ } static void FreeString( vlc_value_t *p_val ) { free( p_val->psz_string ); } static void FreeMutex( vlc_value_t *p_val ) { vlc_mutex_destroy( (vlc_mutex_t*)p_val->p_address ); free( p_val->p_address ); } @@ -145,10 +121,10 @@ 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, }; +time_ops = { CmpTime, DupDummy, FreeDummy, }, +coords_ops = { NULL, DupDummy, FreeDummy, }; /***************************************************************************** * Local prototypes @@ -213,7 +189,6 @@ static void Destroy( variable_t *p_var ) */ int var_Create( vlc_object_t *p_this, const char *psz_name, int i_type ) { - static vlc_list_t dummy_null_list = {0, NULL, NULL}; assert( p_this ); variable_t *p_var = calloc( 1, sizeof( *p_var ) ); @@ -262,6 +237,10 @@ int var_Create( vlc_object_t *p_this, const char *psz_name, int i_type ) p_var->ops = &time_ops; p_var->val.i_time = 0; break; + case VLC_VAR_COORDS: + p_var->ops = &coords_ops; + p_var->val.coords.x = p_var->val.coords.y = 0; + break; case VLC_VAR_ADDRESS: p_var->ops = &addr_ops; p_var->val.p_address = NULL; @@ -271,10 +250,6 @@ int var_Create( vlc_object_t *p_this, const char *psz_name, int i_type ) 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->ops = &list_ops; - p_var->val.p_list = &dummy_null_list; - break; default: p_var->ops = &void_ops; #ifndef NDEBUG @@ -725,6 +700,7 @@ int var_Type( vlc_object_t *p_this, const char *psz_name ) return i_type; } +#undef var_SetChecked int var_SetChecked( vlc_object_t *p_this, const char *psz_name, int expected_type, vlc_value_t val ) { @@ -747,6 +723,12 @@ int var_SetChecked( vlc_object_t *p_this, const char *psz_name, assert( expected_type == 0 || (p_var->i_type & VLC_VAR_CLASS) == expected_type ); +#ifndef NDEBUG + /* Alert if the type is VLC_VAR_VOID */ + if( ( p_var->i_type & VLC_VAR_TYPE ) == VLC_VAR_VOID ) + msg_Warn( p_this, "Calling var_Set on the void variable '%s' (0x%04x)", psz_name, p_var->i_type ); +#endif + WaitUnused( p_this, p_var ); @@ -786,6 +768,7 @@ int var_Set( vlc_object_t *p_this, const char *psz_name, vlc_value_t val ) return var_SetChecked( p_this, psz_name, 0, val ); } +#undef var_GetChecked int var_GetChecked( vlc_object_t *p_this, const char *psz_name, int expected_type, vlc_value_t *p_val ) { @@ -809,7 +792,7 @@ int var_GetChecked( vlc_object_t *p_this, const char *psz_name, #ifndef NDEBUG /* Alert if the type is VLC_VAR_VOID */ if( ( p_var->i_type & VLC_VAR_TYPE ) == VLC_VAR_VOID ) - msg_Warn( p_this, "Calling var_GetVoid on the void variable '%s' (0x%04x)", psz_name, p_var->i_type ); + msg_Warn( p_this, "Calling var_Get on the void variable '%s' (0x%04x)", psz_name, p_var->i_type ); #endif /* Duplicate value if needed */ @@ -1024,12 +1007,7 @@ void var_OptionParse( vlc_object_t *p_obj, const char *psz_option, if( psz_value != NULL ) *psz_value++ = '\0'; - /* FIXME: :programs should be handled generically */ - if( !strcmp( psz_name, "programs" ) ) - i_type = VLC_VAR_LIST; - else - i_type = config_GetType( p_obj, psz_name ); - + i_type = config_GetType( p_obj, psz_name ); if( !i_type && !psz_value ) { /* check for "no-foo" or "nofoo" */ @@ -1076,7 +1054,7 @@ void var_OptionParse( vlc_object_t *p_obj, const char *psz_option, break; case VLC_VAR_INTEGER: - val.i_int = strtol( psz_value, NULL, 0 ); + val.i_int = strtoll( psz_value, NULL, 0 ); break; case VLC_VAR_FLOAT: @@ -1090,46 +1068,12 @@ void var_OptionParse( vlc_object_t *p_obj, const char *psz_option, val.psz_string = psz_value; break; - case VLC_VAR_LIST: - { - char *psz_orig, *psz_var; - vlc_list_t *p_list = malloc(sizeof(vlc_list_t)); - val.p_list = p_list; - p_list->i_count = 0; - - psz_var = psz_orig = strdup(psz_value); - while( psz_var && *psz_var ) - { - char *psz_item = psz_var; - vlc_value_t val2; - while( *psz_var && *psz_var != ',' ) psz_var++; - if( *psz_var == ',' ) - { - *psz_var = '\0'; - psz_var++; - } - val2.i_int = strtol( psz_item, NULL, 0 ); - INSERT_ELEM( p_list->p_values, p_list->i_count, - p_list->i_count, val2 ); - /* p_list->i_count is incremented twice by INSERT_ELEM */ - p_list->i_count--; - INSERT_ELEM( p_list->pi_types, p_list->i_count, - p_list->i_count, VLC_VAR_INTEGER ); - } - free( psz_orig ); - break; - } - default: goto cleanup; } var_Set( p_obj, psz_name, val ); - /* If that's a list, remove all elements allocated */ - if( i_type == VLC_VAR_LIST ) - FreeList( &val ); - cleanup: free( psz_name ); } @@ -1281,35 +1225,8 @@ int var_Inherit( vlc_object_t *p_this, const char *psz_name, int i_type, case VLC_VAR_BOOL: p_val->b_bool = config_GetInt( p_this, psz_name ); break; - case VLC_VAR_LIST: - { - char *psz_orig, *psz_var; - vlc_list_t *p_list = malloc(sizeof(vlc_list_t)); - p_val->p_list = p_list; - p_list->i_count = 0; - - psz_var = psz_orig = config_GetPsz( p_this, psz_name ); - while( psz_var && *psz_var ) - { - char *psz_item = psz_var; - vlc_value_t val; - while( *psz_var && *psz_var != ',' ) psz_var++; - if( *psz_var == ',' ) - { - *psz_var = '\0'; - psz_var++; - } - val.i_int = strtol( psz_item, NULL, 0 ); - INSERT_ELEM( p_list->p_values, p_list->i_count, - p_list->i_count, val ); - /* p_list->i_count is incremented twice by INSERT_ELEM */ - p_list->i_count--; - INSERT_ELEM( p_list->pi_types, p_list->i_count, - p_list->i_count, VLC_VAR_INTEGER ); - } - free( psz_orig ); - break; - } + case VLC_VAR_ADDRESS: + return VLC_ENOOBJ; default: msg_Warn( p_this, "Could not inherit value for var %s " "from config. Invalid Type", psz_name ); @@ -1320,6 +1237,57 @@ int var_Inherit( vlc_object_t *p_this, const char *psz_name, int i_type, } +/** + * It inherits a string as an unsigned rational number (it also accepts basic + * float number). + * + * It returns an error if the rational number cannot be parsed (0/0 is valid). + * The rational is already reduced. + */ +int (var_InheritURational)(vlc_object_t *object, + unsigned *num, unsigned *den, + const char *var) +{ + /* */ + *num = 0; + *den = 0; + + /* */ + char *tmp = var_InheritString(object, var); + if (!tmp) + goto error; + + char *next; + unsigned n = strtol(tmp, &next, 0); + unsigned d = strtol(*next ? &next[1] : "0", NULL, 0); + + if (*next == '.') { + /* Interpret as a float number */ + double r = us_atof(tmp); + double c = ceil(r); + if (c >= UINT_MAX) + goto error; + unsigned m = c; + if (m > 0) { + d = UINT_MAX / m; + n = r * d; + } else { + n = 0; + d = 0; + } + } + + if (n > 0 && d > 0) + vlc_ureduce(num, den, n, d, 0); + + free(tmp); + return VLC_SUCCESS; + +error: + free(tmp); + return VLC_EGENERIC; +} + /********************************************************************** * Trigger the callbacks. * Tell we're in a callback, release the lock, call stored functions,