plugins: add type strictness to plugin descriptor macros

I.e. check the type of the values provided, rather than just blindly
casting, and thus allow mistakes to get caught with compilation errors.

I once lost some hours tracking down the cause of a crash that this type
strictness would have prevented.

Note, now that `change_string_list()` and `change_integer_list()` use type
strictness for the value and label arrays to help make sure they're the
right types, we can more safely make use of `ARRAY_SIZE()` to more cleanly
get the length.

`set_callback[s]()` is excluded from this for obvious reasons.

I've taken the opportunity to ditch remaining use of Hungarian notation
and to fix a param name that should be singular rather than plural
(psz_caps on `add_module[_list]()`.

Re-implemented using compound literals upon excellent suggestion by
Alexandre Janniaux.
This commit is contained in:
Lyndon Brown 2019-04-02 10:40:18 +01:00 committed by Rémi Denis-Courmont
parent aa5a6aad69
commit e8f6a59569
1 changed files with 35 additions and 36 deletions

View File

@ -322,20 +322,20 @@ VLC_METADATA_EXPORTS
}
#define set_shortname( shortname ) \
if (vlc_module_set (VLC_MODULE_SHORTNAME, (const char *)(shortname))) \
if (vlc_module_set (VLC_MODULE_SHORTNAME, (const char *){ shortname })) \
goto error;
#define set_description( desc ) \
if (vlc_module_set (VLC_MODULE_DESCRIPTION, (const char *)(desc))) \
if (vlc_module_set (VLC_MODULE_DESCRIPTION, (const char *){ desc })) \
goto error;
#define set_help( help ) \
if (vlc_module_set (VLC_MODULE_HELP, (const char *)(help))) \
if (vlc_module_set (VLC_MODULE_HELP, (const char *){ help })) \
goto error;
#define set_capability( cap, score ) \
if (vlc_module_set (VLC_MODULE_CAPABILITY, (const char *)(cap)) \
|| vlc_module_set (VLC_MODULE_SCORE, (int)(score))) \
if (vlc_module_set (VLC_MODULE_CAPABILITY, (const char *){ cap }) \
|| vlc_module_set (VLC_MODULE_SCORE, (int){ score })) \
goto error;
#define set_callback(activate) \
@ -353,7 +353,7 @@ VLC_METADATA_EXPORTS
goto error;
#define set_text_domain( dom ) \
if (vlc_plugin_set (VLC_MODULE_TEXTDOMAIN, (dom))) \
if (vlc_plugin_set (VLC_MODULE_TEXTDOMAIN, (const char *){ dom })) \
goto error;
/*****************************************************************************
@ -374,25 +374,24 @@ VLC_METADATA_EXPORTS
#define add_typedesc_inner( type, text, longtext ) \
add_type_inner( type ) \
vlc_config_set (VLC_CONFIG_DESC, \
(const char *)(text), (const char *)(longtext));
vlc_config_set (VLC_CONFIG_DESC, (const char *){ text }, (const char *){ longtext });
#define add_typename_inner(type, name, text, longtext) \
add_typedesc_inner(type, text, longtext) \
vlc_config_set (VLC_CONFIG_NAME, (const char *)(name));
vlc_config_set (VLC_CONFIG_NAME, (const char *){ name });
#define add_string_inner(type, name, text, longtext, v) \
add_typename_inner(type, name, text, longtext) \
vlc_config_set (VLC_CONFIG_VALUE, (const char *)(v));
vlc_config_set (VLC_CONFIG_VALUE, (const char *){ v });
#define add_int_inner(type, name, text, longtext, v) \
add_typename_inner(type, name, text, longtext) \
vlc_config_set (VLC_CONFIG_VALUE, (int64_t)(v));
vlc_config_set (VLC_CONFIG_VALUE, (int64_t){ v });
#define set_subcategory( i_id ) \
#define set_subcategory( id ) \
add_type_inner( CONFIG_SUBCATEGORY ) \
vlc_config_set (VLC_CONFIG_VALUE, (int64_t)(i_id));
vlc_config_set (VLC_CONFIG_VALUE, (int64_t){ id });
#define set_section( text, longtext ) \
add_typedesc_inner( CONFIG_SECTION, text, longtext )
@ -420,23 +419,23 @@ VLC_METADATA_EXPORTS
#define add_font(name, value, text, longtext) \
add_string_inner(CONFIG_ITEM_FONT, name, text, longtext, value)
#define add_module(name, psz_caps, value, text, longtext) \
#define add_module(name, cap, value, text, longtext) \
add_string_inner(CONFIG_ITEM_MODULE, name, text, longtext, value) \
vlc_config_set (VLC_CONFIG_CAPABILITY, (const char *)(psz_caps));
vlc_config_set (VLC_CONFIG_CAPABILITY, (const char *){ cap });
#define add_module_list(name, psz_caps, value, text, longtext) \
#define add_module_list(name, cap, value, text, longtext) \
add_string_inner(CONFIG_ITEM_MODULE_LIST, name, text, longtext, value) \
vlc_config_set (VLC_CONFIG_CAPABILITY, (const char *)(psz_caps));
vlc_config_set (VLC_CONFIG_CAPABILITY, (const char *){ cap });
#ifndef __PLUGIN__
#define add_module_cat(name, i_subcategory, value, text, longtext) \
#define add_module_cat(name, subcategory, value, text, longtext) \
add_string_inner(CONFIG_ITEM_MODULE_CAT, name, text, longtext, value) \
change_integer_range (i_subcategory /* gruik */, 0);
change_integer_range (subcategory /* gruik */, 0);
#define add_module_list_cat(name, i_subcategory, value, text, longtext) \
#define add_module_list_cat(name, subcategory, value, text, longtext) \
add_string_inner(CONFIG_ITEM_MODULE_LIST_CAT, name, text, longtext, \
value) \
change_integer_range (i_subcategory /* gruik */, 0);
change_integer_range (subcategory /* gruik */, 0);
#endif
#define add_integer( name, value, text, longtext ) \
@ -451,17 +450,17 @@ VLC_METADATA_EXPORTS
KEY_UNSET) \
add_string_inner(CONFIG_ITEM_KEY, name, text, longtext, value)
#define add_integer_with_range( name, value, i_min, i_max, text, longtext ) \
#define add_integer_with_range( name, value, min, max, text, longtext ) \
add_integer( name, value, text, longtext ) \
change_integer_range( i_min, i_max )
change_integer_range( min, max )
#define add_float( name, v, text, longtext ) \
add_typename_inner(CONFIG_ITEM_FLOAT, name, text, longtext) \
vlc_config_set (VLC_CONFIG_VALUE, (double)(v));
vlc_config_set (VLC_CONFIG_VALUE, (double){ v });
#define add_float_with_range( name, value, f_min, f_max, text, longtext ) \
#define add_float_with_range( name, value, min, max, text, longtext ) \
add_float( name, value, text, longtext ) \
change_float_range( f_min, f_max )
change_float_range( min, max )
#define add_bool( name, v, text, longtext ) \
add_typename_inner(CONFIG_ITEM_BOOL, name, text, longtext) \
@ -470,7 +469,7 @@ VLC_METADATA_EXPORTS
/* For removed option */
#define add_obsolete_inner( name, type ) \
add_type_inner( type ) \
vlc_config_set (VLC_CONFIG_NAME, (const char *)(name)); \
vlc_config_set (VLC_CONFIG_NAME, (const char *){ name }); \
vlc_config_set (VLC_CONFIG_REMOVED);
#define add_obsolete_bool( name ) \
@ -488,25 +487,25 @@ VLC_METADATA_EXPORTS
/* Modifier macros for the config options (used for fine tuning) */
#define change_short( ch ) \
vlc_config_set (VLC_CONFIG_SHORTCUT, (int)(ch));
vlc_config_set (VLC_CONFIG_SHORTCUT, (char){ ch });
#define change_string_list( list, list_text ) \
vlc_config_set (VLC_CONFIG_LIST, \
(size_t)(sizeof (list) / sizeof (char *)), \
(const char *const *)(list), \
(const char *const *)(list_text));
ARRAY_SIZE(list), \
(const char *const *){ list }, \
(const char *const *){ list_text });
#define change_integer_list( list, list_text ) \
vlc_config_set (VLC_CONFIG_LIST, \
(size_t)(sizeof (list) / sizeof (int)), \
(const int *)(list), \
(const char *const *)(list_text));
ARRAY_SIZE(list), \
(const int *){ list }, \
(const char *const *){ list_text });
#define change_integer_range( minv, maxv ) \
vlc_config_set (VLC_CONFIG_RANGE, (int64_t)(minv), (int64_t)(maxv));
vlc_config_set (VLC_CONFIG_RANGE, (int64_t){ minv }, (int64_t){ maxv });
#define change_float_range( minv, maxv ) \
vlc_config_set (VLC_CONFIG_RANGE, (double)(minv), (double)(maxv));
vlc_config_set (VLC_CONFIG_RANGE, (double){ minv }, (double){ maxv });
/* For options that are saved but hidden from the preferences panel */
#define change_private() \