X-Git-Url: https://git.sesse.net/?a=blobdiff_plain;f=src%2Fconfig%2Fcmdline.c;h=98da1ad3df6683d3c5d4e7e9b33c29a00dce9f13;hb=d601e4ed290edf58e9ace5c28f06c77ebf072004;hp=4899129088da9d81ebc40fc33b1c3af1e1ae9c0e;hpb=d666030b2349e8a710fcba4d2cabb912cc700580;p=vlc diff --git a/src/config/cmdline.c b/src/config/cmdline.c index 4899129088..98da1ad3df 100644 --- a/src/config/cmdline.c +++ b/src/config/cmdline.c @@ -27,7 +27,8 @@ #include #include "../libvlc.h" -#include "vlc_keys.h" +#include +#include #ifdef HAVE_GETOPT_LONG # ifdef HAVE_GETOPT_H @@ -42,6 +43,7 @@ #include +#undef config_LoadCmdLine /***************************************************************************** * config_LoadCmdLine: parse command line ***************************************************************************** @@ -51,63 +53,36 @@ * because we don't know (and don't want to know) in advance the configuration * options used (ie. exported) by each module. *****************************************************************************/ -int __config_LoadCmdLine( vlc_object_t *p_this, int *pi_argc, - const char *ppsz_argv[], - bool b_ignore_errors ) +int config_LoadCmdLine( vlc_object_t *p_this, int *pi_argc, + const char *ppsz_argv[], bool b_ignore_errors ) { 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; /* Short options */ module_config_t *pp_shortopts[256]; char *psz_shortopts; -#ifdef __APPLE__ - /* When VLC.app is run by double clicking in Mac OS X, the 2nd arg - * is the PSN - process serial number (a unique PID-ish thingie) - * still ok for real Darwin & when run from command line */ - if ( (*pi_argc > 1) && (strncmp( ppsz_argv[ 1 ] , "-psn" , 4 ) == 0) ) - /* for example -psn_0_9306113 */ - { - /* GDMF!... I can't do this or else the MacOSX window server will - * not pick up the PSN and not register the app and we crash... - * hence the following kludge otherwise we'll get confused w/ argv[1] - * being an input file name. - * As there won't be any more args to parse, just exit. */ - assert( *pi_argc == 2 ); - *pi_argc = 1; - return 0; - } -#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 +90,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 +104,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 +119,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; @@ -165,8 +138,14 @@ int __config_LoadCmdLine( vlc_object_t *p_this, int *pi_argc, p_longopts[i_index].name = strdup( p_item->psz_name ); if( p_longopts[i_index].name == NULL ) continue; p_longopts[i_index].has_arg = - (p_item->i_type == CONFIG_ITEM_BOOL)? - no_argument : required_argument; + (p_item->i_type == CONFIG_ITEM_BOOL) ? no_argument : +#ifndef __APPLE__ + required_argument; +#else +/* It seems that required_argument is broken on Darwin. + * Radar ticket #6113829 */ + optional_argument; +#endif p_longopts[i_index].flag = &flag; p_longopts[i_index].val = 0; i_index++; @@ -220,7 +199,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) ); @@ -238,7 +217,7 @@ int __config_LoadCmdLine( vlc_object_t *p_this, int *pi_argc, if( i_cmd == 0 ) { module_config_t *p_conf; - char *psz_name = (char *)p_longopts[i_index].name; + const char *psz_name = p_longopts[i_index].name; /* Check if we deal with a --nofoo or --no-foo long option */ if( flag ) psz_name += psz_name[2] == '-' ? 3 : 2; @@ -276,7 +255,14 @@ int __config_LoadCmdLine( vlc_object_t *p_this, int *pi_argc, psz_name = p_conf->psz_name; } - +#ifdef __APPLE__ + if( p_conf->i_type != CONFIG_ITEM_BOOL && !optarg ) + { + fprintf( stderr, "Warning: missing argument for option --%s\n", p_conf->psz_name ); + fprintf( stderr, "Try specifying options as '--optionname=value' instead of '--optionname value'\n" ); + continue; + } +#endif switch( p_conf->i_type ) { case CONFIG_ITEM_STRING: @@ -287,19 +273,26 @@ int __config_LoadCmdLine( vlc_object_t *p_this, int *pi_argc, case CONFIG_ITEM_MODULE_LIST: case CONFIG_ITEM_MODULE_LIST_CAT: case CONFIG_ITEM_MODULE_CAT: - config_PutPsz( p_this, psz_name, optarg ); + var_Create( p_this, psz_name, VLC_VAR_STRING ); + var_SetString( p_this, psz_name, optarg ); break; case CONFIG_ITEM_INTEGER: - config_PutInt( p_this, psz_name, strtol(optarg, 0, 0)); + var_Create( p_this, psz_name, VLC_VAR_INTEGER ); + var_SetInteger( p_this, psz_name, + strtol(optarg, NULL, 0)); break; case CONFIG_ITEM_FLOAT: - config_PutFloat( p_this, psz_name, (float)atof(optarg) ); + var_Create( p_this, psz_name, VLC_VAR_FLOAT ); + var_SetFloat( p_this, psz_name, us_atof(optarg) ); break; case CONFIG_ITEM_KEY: - config_PutInt( p_this, psz_name, ConfigStringToKey( optarg ) ); + var_Create( p_this, psz_name, VLC_VAR_INTEGER ); + var_SetInteger( p_this, psz_name, + ConfigStringToKey( optarg ) ); break; case CONFIG_ITEM_BOOL: - config_PutInt( p_this, psz_name, !flag ); + var_Create( p_this, psz_name, VLC_VAR_BOOL ); + var_SetBool( p_this, psz_name, !flag ); break; } continue; @@ -309,6 +302,7 @@ int __config_LoadCmdLine( vlc_object_t *p_this, int *pi_argc, /* A short option has been recognized */ if( pp_shortopts[i_cmd] != NULL ) { + const char *name = pp_shortopts[i_cmd]->psz_name; switch( pp_shortopts[i_cmd]->i_type ) { case CONFIG_ITEM_STRING: @@ -319,9 +313,11 @@ int __config_LoadCmdLine( vlc_object_t *p_this, int *pi_argc, case CONFIG_ITEM_MODULE_CAT: case CONFIG_ITEM_MODULE_LIST: case CONFIG_ITEM_MODULE_LIST_CAT: - config_PutPsz( p_this, pp_shortopts[i_cmd]->psz_name, optarg ); + var_Create( p_this, name, VLC_VAR_STRING ); + var_SetString( p_this, name, optarg ); break; case CONFIG_ITEM_INTEGER: + var_Create( p_this, name, VLC_VAR_INTEGER ); if( i_cmd == 'v' ) { if( optarg ) @@ -344,17 +340,17 @@ int __config_LoadCmdLine( vlc_object_t *p_this, int *pi_argc, { i_verbose++; /* -v */ } - config_PutInt( p_this, pp_shortopts[i_cmd]->psz_name, - i_verbose ); + var_SetInteger( p_this, name, i_verbose ); } else { - config_PutInt( p_this, pp_shortopts[i_cmd]->psz_name, - strtol(optarg, 0, 0) ); + var_SetInteger( p_this, name, + strtol(optarg, NULL, 0) ); } break; case CONFIG_ITEM_BOOL: - config_PutInt( p_this, pp_shortopts[i_cmd]->psz_name, 1 ); + var_Create( p_this, name, VLC_VAR_BOOL ); + var_SetBool( p_this, name, true ); break; } @@ -364,9 +360,8 @@ int __config_LoadCmdLine( vlc_object_t *p_this, int *pi_argc, /* Internal error: unknown option */ if( !b_ignore_errors ) { - fprintf( stderr, "%s: unknown option" - " or missing mandatory argument ", - p_this->p_libvlc->psz_object_name ); + fputs( "vlc: unknown option" + " or missing mandatory argument ", stderr ); if( optopt ) { fprintf( stderr, "`-%c'\n", optopt ); @@ -375,8 +370,7 @@ int __config_LoadCmdLine( vlc_object_t *p_this, int *pi_argc, { fprintf( stderr, "`%s'\n", ppsz_argv[optind-1] ); } - fprintf( stderr, "Try `%s --help' for more information.\n", - p_this->p_libvlc->psz_object_name ); + fputs( "Try `vlc --help' for more information.\n", stderr ); for( i_index = 0; p_longopts[i_index].name; i_index++ ) free( (char *)p_longopts[i_index].name );