#include <search.h>
#include <assert.h>
+#include <math.h>
+#include <limits.h>
/*****************************************************************************
* Private types
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
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;
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 )
{
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 );
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 )
{
#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 */
}
+/**
+ * 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,