From 68f6af6e769cd3022861c421a15a610b6227a301 Mon Sep 17 00:00:00 2001 From: =?utf8?q?R=C3=A9mi=20Denis-Courmont?= Date: Sun, 28 Feb 2010 16:10:34 +0200 Subject: [PATCH] getopt: remove optional argument support --- src/config/cmdline.c | 7 +++-- src/config/getopt.c | 59 +++++++++++++---------------------------- src/config/vlc_getopt.h | 15 +++-------- 3 files changed, 25 insertions(+), 56 deletions(-) diff --git a/src/config/cmdline.c b/src/config/cmdline.c index c721c456e8..73e51af30d 100644 --- a/src/config/cmdline.c +++ b/src/config/cmdline.c @@ -141,8 +141,7 @@ 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); p_longopts[i_index].flag = &flag; p_longopts[i_index].val = 0; i_index++; @@ -157,7 +156,7 @@ int config_LoadCmdLine( vlc_object_t *p_this, int *pi_argc, strcat( psz_name, p_item->psz_name ); p_longopts[i_index].name = psz_name; - p_longopts[i_index].has_arg = no_argument; + p_longopts[i_index].has_arg = false; p_longopts[i_index].flag = &flag; p_longopts[i_index].val = 1; i_index++; @@ -168,7 +167,7 @@ int config_LoadCmdLine( vlc_object_t *p_this, int *pi_argc, strcat( psz_name, p_item->psz_name ); p_longopts[i_index].name = psz_name; - p_longopts[i_index].has_arg = no_argument; + p_longopts[i_index].has_arg = false; p_longopts[i_index].flag = &flag; p_longopts[i_index].val = 1; i_index++; diff --git a/src/config/getopt.c b/src/config/getopt.c index 08753f71ba..e1db101c57 100644 --- a/src/config/getopt.c +++ b/src/config/getopt.c @@ -267,9 +267,7 @@ static const char * If a char in OPTSTRING is followed by a colon, that means it wants an arg, so the following text in the same ARGV-element, or the text of the following - ARGV-element, is returned in `optarg'. Two colons mean an option that - wants an optional arg; if there is text in the current ARGV-element, - it is returned in `optarg', otherwise `optarg' is set to zero. + ARGV-element, is returned in `optarg'. If OPTSTRING starts with `-' or `+', it requests different methods of handling the non-option ARGV-elements. @@ -447,8 +445,6 @@ int optind++; if (*nameend) { - /* Don't test has_arg with >, because some C compilers don't - allow it to be used on enums. */ if (pfound->has_arg) optarg = nameend + 1; else @@ -459,7 +455,7 @@ int return '?'; } } - else if (pfound->has_arg == 1) + else if (pfound->has_arg) { if (optind < argc) optarg = argv[optind++]; @@ -575,8 +571,6 @@ int option_index = indfound; if (*nameend) { - /* Don't test has_arg with >, because some C compilers don't - allow it to be used on enums. */ if (pfound->has_arg) optarg = nameend + 1; else @@ -585,7 +579,7 @@ int return '?'; } } - else if (pfound->has_arg == 1) + else if (pfound->has_arg) { if (optind < argc) optarg = argv[optind++]; @@ -610,42 +604,27 @@ int } if (temp[1] == ':') { - if (temp[2] == ':') + /* This is an option that requires an argument. */ + if (*nextchar != '\0') { - /* This is an option that accepts an argument optionally. */ - if (*nextchar != '\0') - { - optarg = nextchar; - optind++; - } - else - optarg = NULL; - nextchar = NULL; + optarg = nextchar; + /* If we end this ARGV-element by taking the rest as an arg, + we must advance to the next element now. */ + optind++; } - else + else if (optind == argc) { - /* This is an option that requires an argument. */ - if (*nextchar != '\0') - { - optarg = nextchar; - /* If we end this ARGV-element by taking the rest as an arg, - we must advance to the next element now. */ - optind++; - } - else if (optind == argc) - { - optopt = c; - if (optstring[0] == ':') - c = ':'; - else - c = '?'; - } + optopt = c; + if (optstring[0] == ':') + c = ':'; else - /* We already incremented `optind' once; - increment it again when taking next ARGV-elt as argument. */ - optarg = argv[optind++]; - nextchar = NULL; + c = '?'; } + else + /* We already incremented `optind' once; + increment it again when taking next ARGV-elt as argument. */ + optarg = argv[optind++]; + nextchar = NULL; } return c; } diff --git a/src/config/vlc_getopt.h b/src/config/vlc_getopt.h index e6bf78d86f..72b2341110 100644 --- a/src/config/vlc_getopt.h +++ b/src/config/vlc_getopt.h @@ -54,9 +54,8 @@ zero. The field `has_arg' is: - no_argument (or 0) if the option does not take an argument, - required_argument (or 1) if the option requires an argument, - optional_argument (or 2) if the option takes an optional argument. + false if the option does not take an argument, + true if the option requires an argument. If the field `flag' is not NULL, it points to a variable that is set to the value given in the field `val' when the option is found, but @@ -72,19 +71,11 @@ struct option { const char *name; - /* has_arg can't be an enum because some compilers complain about - type mismatches in all the code that assumes it is an int. */ - int has_arg; + bool has_arg; int *flag; int val; }; -/* Names for the values of the `has_arg' field of `struct option'. */ - -#define no_argument 0 -#define required_argument 1 -#define optional_argument 2 - extern int vlc_getopt_long(int argc, char *const *argv, const char *shortopts, const struct option *longopts, int *longind); -- 2.39.5