From 460a78baf1f189de5d4178df31dc229ac1e366ca Mon Sep 17 00:00:00 2001 From: =?utf8?q?R=C3=A9mi=20Denis-Courmont?= Date: Sun, 21 Sep 2008 13:07:28 +0300 Subject: [PATCH] New type-safe API for modules listing module_list_get(): gets the list of modules module_list_free(): releases the list --- include/vlc_modules.h | 3 +++ src/config/cmdline.c | 25 ++++++++----------------- src/config/core.c | 23 ++++++++++------------- src/config/file.c | 42 ++++++++++++++++++------------------------ src/libvlc.c | 25 ++++++++++--------------- src/libvlccore.sym | 2 ++ 6 files changed, 51 insertions(+), 69 deletions(-) diff --git a/include/vlc_modules.h b/include/vlc_modules.h index 9702397297..7d96a35d33 100644 --- a/include/vlc_modules.h +++ b/include/vlc_modules.h @@ -44,6 +44,9 @@ VLC_EXPORT( void, module_Put, ( module_t *module ) ); VLC_EXPORT( module_config_t *, module_GetConfig, ( const module_t *, unsigned * ) ); VLC_EXPORT( void, module_PutConfig, ( module_config_t * ) ); +VLC_EXPORT( void, module_list_free, (module_t **) ); +VLC_EXPORT( module_t **, module_list_get, (size_t *n) ); + /* Return a NULL terminated array with the names of the modules that have a * certain capability. * Free after uses both the string and the table. */ diff --git a/src/config/cmdline.c b/src/config/cmdline.c index 7860e42613..ad5f2ca4e8 100644 --- a/src/config/cmdline.c +++ b/src/config/cmdline.c @@ -57,7 +57,6 @@ int __config_LoadCmdLine( vlc_object_t *p_this, int *pi_argc, { int i_cmd, i_index, i_opts, i_shortopts, flag, i_verbose = 0; module_t *p_parser; - vlc_list_t *p_list; struct option *p_longopts; int i_modules_index; const char **argv_copy = NULL; @@ -85,29 +84,23 @@ int __config_LoadCmdLine( vlc_object_t *p_this, int *pi_argc, #endif /* List all modules */ - p_list = vlc_list_find( p_this, VLC_OBJECT_MODULE, FIND_ANYWHERE ); + module_t **list = module_list_get (NULL); /* * Generate the longopts and shortopts structures used by getopt_long */ i_opts = 0; - for( i_modules_index = 0; i_modules_index < p_list->i_count; - i_modules_index++ ) - { - p_parser = (module_t *)p_list->p_values[i_modules_index].p_object ; - + for (size_t i = 0; (p_parser = list[i]) != NULL; i++) /* count the number of exported configuration options (to allocate * longopts). We also need to allocate space for two options when * dealing with boolean to allow for --foo and --no-foo */ - i_opts += p_parser->i_config_items - + 2 * p_parser->i_bool_items; - } + i_opts += p_parser->i_config_items + 2 * p_parser->i_bool_items; p_longopts = malloc( sizeof(struct option) * (i_opts + 1) ); if( p_longopts == NULL ) { - vlc_list_release( p_list ); + module_list_free (list); return -1; } @@ -115,7 +108,7 @@ int __config_LoadCmdLine( vlc_object_t *p_this, int *pi_argc, if( psz_shortopts == NULL ) { free( p_longopts ); - vlc_list_release( p_list ); + module_list_free (list); return -1; } @@ -129,7 +122,7 @@ int __config_LoadCmdLine( vlc_object_t *p_this, int *pi_argc, { free( psz_shortopts ); free( p_longopts ); - vlc_list_release( p_list ); + module_list_free (list); return -1; } memcpy( argv_copy, ppsz_argv, *pi_argc * sizeof(char *) ); @@ -144,11 +137,9 @@ int __config_LoadCmdLine( vlc_object_t *p_this, int *pi_argc, /* Fill the p_longopts and psz_shortopts structures */ i_index = 0; - for( i_modules_index = 0; i_modules_index < p_list->i_count; - i_modules_index++ ) + for (size_t i = 0; (p_parser = list[i]) != NULL; i++) { module_config_t *p_item, *p_end; - p_parser = (module_t *)p_list->p_values[i_modules_index].p_object ; if( !p_parser->i_config_items ) continue; @@ -226,7 +217,7 @@ int __config_LoadCmdLine( vlc_object_t *p_this, int *pi_argc, } /* We don't need the module list anymore */ - vlc_list_release( p_list ); + module_list_free( list ); /* Close the longopts and shortopts structures */ memset( &p_longopts[i_index], 0, sizeof(struct option) ); diff --git a/src/config/core.c b/src/config/core.c index 3f6110e2ba..9768e7fe1a 100644 --- a/src/config/core.c +++ b/src/config/core.c @@ -409,17 +409,17 @@ void __config_PutFloat( vlc_object_t *p_this, *****************************************************************************/ module_config_t *config_FindConfig( vlc_object_t *p_this, const char *psz_name ) { - vlc_list_t *p_list; - int i_index; + module_t *p_parser; if( !psz_name ) return NULL; - p_list = vlc_list_find( p_this, VLC_OBJECT_MODULE, FIND_ANYWHERE ); + module_t **list = module_list_get (NULL); + if (list == NULL) + return NULL; - for( i_index = 0; i_index < p_list->i_count; i_index++ ) + for (size_t i = 0; (p_parser = list[i]) != NULL; i++) { module_config_t *p_item, *p_end; - module_t *p_parser = (module_t *)p_list->p_values[i_index].p_object; if( !p_parser->i_config_items ) continue; @@ -435,14 +435,13 @@ module_config_t *config_FindConfig( vlc_object_t *p_this, const char *psz_name ) || ( p_item->psz_oldname && !strcmp( psz_name, p_item->psz_oldname ) ) ) { - vlc_list_release( p_list ); + module_list_free (list); return p_item; } } } - vlc_list_release( p_list ); - + module_list_free (list); return NULL; } @@ -536,17 +535,15 @@ void __config_ResetAll( vlc_object_t *p_this ) { libvlc_priv_t *priv = libvlc_priv (p_this->p_libvlc); int i_index; - vlc_list_t *p_list; module_t *p_module; + module_t **list = module_list_get (NULL); /* Acquire config file lock */ vlc_mutex_lock( &priv->config_lock ); - p_list = vlc_list_find( p_this, VLC_OBJECT_MODULE, FIND_ANYWHERE ); - for( i_index = 0; i_index < p_list->i_count; i_index++ ) + for (size_t j = 0; (p_module = list[j]) != NULL; j++) { - p_module = (module_t *)p_list->p_values[i_index].p_object ; if( p_module->b_submodule ) continue; for (size_t i = 0; i < p_module->confsize; i++ ) @@ -566,6 +563,6 @@ void __config_ResetAll( vlc_object_t *p_this ) } } - vlc_list_release( p_list ); + module_list_free (list); vlc_mutex_unlock( &priv->config_lock ); } diff --git a/src/config/file.c b/src/config/file.c index 4952fcb3db..d6cc24e75a 100644 --- a/src/config/file.c +++ b/src/config/file.c @@ -158,7 +158,6 @@ static int strtoi (const char *str) int __config_LoadConfigFile( vlc_object_t *p_this, const char *psz_module_name ) { libvlc_priv_t *priv = libvlc_priv (p_this->p_libvlc); - vlc_list_t *p_list; FILE *file; file = config_OpenConfigFile (p_this, "rt"); @@ -169,7 +168,7 @@ int __config_LoadConfigFile( vlc_object_t *p_this, const char *psz_module_name ) vlc_mutex_lock( &priv->config_lock ); /* Look for the selected module, if NULL then save everything */ - p_list = vlc_list_find( p_this, VLC_OBJECT_MODULE, FIND_ANYWHERE ); + module_t **list = module_list_get (NULL); /* Look for UTF-8 Byte Order Mark */ char * (*convert) (const char *) = strdupnull; @@ -215,9 +214,9 @@ int __config_LoadConfigFile( vlc_object_t *p_this, const char *psz_module_name ) if ((psz_module_name == NULL) || (strcmp (psz_module_name, section) == 0)) { - for (int i = 0; i < p_list->i_count; i++) + for (int i = 0; list[i]; i++) { - module_t *m = (module_t *)p_list->p_values[i].p_object; + module_t *m = list[i]; if ((strcmp (section, m->psz_object_name) == 0) && (m->i_config_items > 0)) /* ignore config-less modules */ @@ -317,7 +316,7 @@ int __config_LoadConfigFile( vlc_object_t *p_this, const char *psz_module_name ) } fclose (file); - vlc_list_release( p_list ); + module_list_free (list); if (loc != (locale_t)0) { uselocale (baseloc); @@ -416,7 +415,6 @@ static int SaveConfigFile( vlc_object_t *p_this, const char *psz_module_name, { libvlc_priv_t *priv = libvlc_priv (p_this->p_libvlc); module_t *p_parser; - vlc_list_t *p_list; FILE *file; char p_line[1024], *p_index2; int i_sizebuf = 0; @@ -460,7 +458,7 @@ static int SaveConfigFile( vlc_object_t *p_this, const char *psz_module_name, p_bigbuffer[0] = 0; /* List all available modules */ - p_list = vlc_list_find( p_this, VLC_OBJECT_MODULE, FIND_ANYWHERE ); + module_t **list = module_list_get (NULL); /* backup file into memory, we only need to backup the sections we won't * save later on */ @@ -471,10 +469,8 @@ static int SaveConfigFile( vlc_object_t *p_this, const char *psz_module_name, { /* we found a section, check if we need to do a backup */ - for( i_index = 0; i_index < p_list->i_count; i_index++ ) + for( i_index = 0; (p_parser = list[i_index]) != NULL; i_index++ ) { - p_parser = (module_t *)p_list->p_values[i_index].p_object ; - if( ((p_index2 - &p_line[1]) == (int)strlen(p_parser->psz_object_name) ) && !memcmp( &p_line[1], p_parser->psz_object_name, @@ -488,7 +484,7 @@ static int SaveConfigFile( vlc_object_t *p_this, const char *psz_module_name, } } - if( i_index == p_list->i_count ) + if( list[i_index] == NULL ) { /* we don't have this section in our list so we need to back * it up */ @@ -526,7 +522,7 @@ static int SaveConfigFile( vlc_object_t *p_this, const char *psz_module_name, file = config_OpenConfigFile (p_this, "wt"); if( !file ) { - vlc_list_release( p_list ); + module_list_free (list); free( p_bigbuffer ); vlc_mutex_unlock( &priv->config_lock ); return -1; @@ -540,10 +536,9 @@ static int SaveConfigFile( vlc_object_t *p_this, const char *psz_module_name, locale_t baseloc = uselocale (loc); /* Look for the selected module, if NULL then save everything */ - for( i_index = 0; i_index < p_list->i_count; i_index++ ) + for( i_index = 0; (p_parser = list[i_index]) != NULL; i_index++ ) { module_config_t *p_item, *p_end; - p_parser = (module_t *)p_list->p_values[i_index].p_object ; if( psz_module_name && strcmp( psz_module_name, p_parser->psz_object_name ) ) @@ -644,7 +639,7 @@ static int SaveConfigFile( vlc_object_t *p_this, const char *psz_module_name, } } - vlc_list_release( p_list ); + module_list_free (list); if (loc != (locale_t)0) { uselocale (baseloc); @@ -666,18 +661,17 @@ static int SaveConfigFile( vlc_object_t *p_this, const char *psz_module_name, int config_AutoSaveConfigFile( vlc_object_t *p_this ) { libvlc_priv_t *priv = libvlc_priv (p_this->p_libvlc); - vlc_list_t *p_list; - int i_index, i_count; + size_t i_index; + bool done; assert( p_this ); /* Check if there's anything to save */ vlc_mutex_lock( &priv->config_lock ); - p_list = vlc_list_find( p_this, VLC_OBJECT_MODULE, FIND_ANYWHERE ); - i_count = p_list->i_count; - for( i_index = 0; i_index < i_count; i_index++ ) + module_t **list = module_list_get (NULL); + for( i_index = 0; list[i_index]; i_index++ ) { - module_t *p_parser = (module_t *)p_list->p_values[i_index].p_object ; + module_t *p_parser = list[i_index]; module_config_t *p_item, *p_end; if( !p_parser->i_config_items ) continue; @@ -690,11 +684,11 @@ int config_AutoSaveConfigFile( vlc_object_t *p_this ) } if( p_item < p_end ) break; } - vlc_list_release( p_list ); + done = list[i_index] == NULL; + module_list_free (list); vlc_mutex_unlock( &priv->config_lock ); - if( i_index == i_count ) return VLC_SUCCESS; - return SaveConfigFile( p_this, NULL, true ); + return done ? VLC_SUCCESS : SaveConfigFile( p_this, NULL, true ); } int __config_SaveConfigFile( vlc_object_t *p_this, const char *psz_module_name ) diff --git a/src/libvlc.c b/src/libvlc.c index 3a7c4079d3..8b1a2027f8 100644 --- a/src/libvlc.c +++ b/src/libvlc.c @@ -1424,14 +1424,12 @@ static void Usage( libvlc_int_t *p_this, char const *psz_search ) #else # define OPTION_VALUE_SEP " " #endif - vlc_list_t *p_list = NULL; char psz_spaces_text[PADDING_SPACES+LINE_START+1]; char psz_spaces_longtext[LINE_START+3]; char psz_format[sizeof(COLOR_FORMAT_STRING)]; char psz_format_bool[sizeof(COLOR_FORMAT_STRING_BOOL)]; char psz_buffer[10000]; char psz_short[4]; - int i_index; int i_width = ConsoleWidth() - (PADDING_SPACES+LINE_START+1); int i_width_description = i_width + PADDING_SPACES - 1; bool b_advanced = config_GetInt( p_this, "advanced" ) > 0; @@ -1466,7 +1464,9 @@ static void Usage( libvlc_int_t *p_this, char const *psz_search ) } /* List all modules */ - p_list = vlc_list_find( p_this, VLC_OBJECT_MODULE, FIND_ANYWHERE ); + module_t **list = module_list_get (NULL); + if (!list) + return; /* Ugly hack to make sure that the help options always come first * (part 1) */ @@ -1474,10 +1474,10 @@ static void Usage( libvlc_int_t *p_this, char const *psz_search ) Usage( p_this, "help" ); /* Enumerate the config for each module */ - for( i_index = 0; i_index < p_list->i_count; i_index++ ) + for (size_t i = 0; list[i]; i++) { bool b_help_module; - module_t *p_parser = (module_t *)p_list->p_values[i_index].p_object; + module_t *p_parser = list[i]; module_config_t *p_item = NULL; module_config_t *p_section = NULL; module_config_t *p_end = p_parser->p_config + p_parser->confsize; @@ -1870,7 +1870,7 @@ static void Usage( libvlc_int_t *p_this, char const *psz_search ) } /* Release the module list */ - vlc_list_release( p_list ); + module_list_free (list); } /***************************************************************************** @@ -1881,10 +1881,8 @@ static void Usage( libvlc_int_t *p_this, char const *psz_search ) *****************************************************************************/ static void ListModules( libvlc_int_t *p_this, bool b_verbose ) { - vlc_list_t *p_list = NULL; - module_t *p_parser = NULL; + module_t *p_parser; char psz_spaces[22]; - int i_index; bool b_color = config_GetInt( p_this, "color" ) > 0; @@ -1895,15 +1893,13 @@ static void ListModules( libvlc_int_t *p_this, bool b_verbose ) #endif /* List all modules */ - p_list = vlc_list_find( p_this, VLC_OBJECT_MODULE, FIND_ANYWHERE ); + module_t **list = module_list_get (NULL); /* Enumerate each module */ - for( i_index = 0; i_index < p_list->i_count; i_index++ ) + for (size_t j = 0; (p_parser = list[j]) != NULL; j++) { int i; - p_parser = (module_t *)p_list->p_values[i_index].p_object ; - /* Nasty hack, but right now I'm too tired to think about a nice * solution */ i = 22 - strlen( p_parser->psz_object_name ) - 1; @@ -1951,8 +1947,7 @@ static void ListModules( libvlc_int_t *p_this, bool b_verbose ) psz_spaces[i] = ' '; } - - vlc_list_release( p_list ); + module_list_free (list); #ifdef WIN32 /* Pause the console because it's destroyed when we exit */ PauseConsole(); diff --git a/src/libvlccore.sym b/src/libvlccore.sym index 12a9e2e9a9..466adfb751 100644 --- a/src/libvlccore.sym +++ b/src/libvlccore.sym @@ -212,6 +212,8 @@ __module_GetModulesNamesForCapability module_GetName module_GetObjName module_IsCapable +module_list_free +module_list_get __module_Need module_Put module_PutConfig -- 2.39.2