Add mi_getopt_allow_unknown

This patch is to add a new function mi_getopt_allow_unknown, which
returns -1 silently (without throwing error) when unknown option is
met, and use this function to parse options for command
'-stack-list-arguments'.

gdb/
	* mi/mi-cmd-stack.c (parse_no_frames_option): Remove.
	(mi_cmd_stack_list_args): Use mi_getopt_silent to handle
	options.
	* mi/mi-getopt.c (mi_getopt): Remove.
	(mi_getopt_1): Renamed from mi_getopt.  Add one parameter
	'error_on_unknown'.
	(mi_getopt): Call mi_getopt_1.
	(mi_getopt_silent): New.
	* mi/mi-getopt.h (mi_getopt_silent): Declare.
This commit is contained in:
Yao Qi 2013-08-27 03:04:45 +00:00
parent e5034e59e0
commit 242f1fd7ee
4 changed files with 78 additions and 27 deletions

View file

@ -1,3 +1,15 @@
2013-08-27 Yao Qi <yao@codesourcery.com>
* mi/mi-cmd-stack.c (parse_no_frames_option): Remove.
(mi_cmd_stack_list_args): Use mi_getopt_silent to handle
options.
* mi/mi-getopt.c (mi_getopt): Remove.
(mi_getopt_1): Renamed from mi_getopt. Add one parameter
'error_on_unknown'.
(mi_getopt): Call mi_getopt_1.
(mi_getopt_silent): New.
* mi/mi-getopt.h (mi_getopt_silent): Declare.
2013-08-26 Doug Evans <dje@google.com> 2013-08-26 Doug Evans <dje@google.com>
PR symtab/15885 PR symtab/15885

View file

@ -54,17 +54,6 @@ mi_cmd_enable_frame_filters (char *command, char **argv, int argc)
frame_filters = 1; frame_filters = 1;
} }
/* Parse the --no-frame-filters option in commands where we cannot use
mi_getopt. */
static int
parse_no_frames_option (const char *arg)
{
if (arg && (strcmp (arg, "--no-frame-filters") == 0))
return 1;
return 0;
}
/* Print a list of the stack frames. Args can be none, in which case /* Print a list of the stack frames. Args can be none, in which case
we want to print the whole backtrace, or a pair of numbers we want to print the whole backtrace, or a pair of numbers
specifying the frame numbers at which to start and stop the specifying the frame numbers at which to start and stop the
@ -284,19 +273,42 @@ mi_cmd_stack_list_args (char *command, char **argv, int argc)
enum print_values print_values; enum print_values print_values;
struct ui_out *uiout = current_uiout; struct ui_out *uiout = current_uiout;
int raw_arg = 0; int raw_arg = 0;
int oind = 0;
enum py_bt_status result = PY_BT_ERROR; enum py_bt_status result = PY_BT_ERROR;
enum opt
{
NO_FRAME_FILTERS,
};
static const struct mi_opt opts[] =
{
{"-no-frame-filters", NO_FRAME_FILTERS, 0},
{ 0, 0, 0 }
};
if (argc > 0) while (1)
raw_arg = parse_no_frames_option (argv[0]); {
char *oarg;
int opt = mi_getopt_allow_unknown ("-stack-list-args", argc, argv,
opts, &oind, &oarg);
if (argc < 1 || (argc > 3 && ! raw_arg) || (argc == 2 && ! raw_arg)) if (opt < 0)
break;
switch ((enum opt) opt)
{
case NO_FRAME_FILTERS:
raw_arg = oind;
break;
}
}
if (argc - oind != 1 && argc - oind != 3)
error (_("-stack-list-arguments: Usage: " \ error (_("-stack-list-arguments: Usage: " \
"[--no-frame-filters] PRINT_VALUES [FRAME_LOW FRAME_HIGH]")); "[--no-frame-filters] PRINT_VALUES [FRAME_LOW FRAME_HIGH]"));
if (argc >= 3) if (argc - oind == 3)
{ {
frame_low = atoi (argv[1 + raw_arg]); frame_low = atoi (argv[1 + oind]);
frame_high = atoi (argv[2 + raw_arg]); frame_high = atoi (argv[2 + oind]);
} }
else else
{ {
@ -306,7 +318,7 @@ mi_cmd_stack_list_args (char *command, char **argv, int argc)
frame_high = -1; frame_high = -1;
} }
print_values = mi_parse_print_values (argv[raw_arg]); print_values = mi_parse_print_values (argv[oind]);
/* Let's position fi on the frame at which to start the /* Let's position fi on the frame at which to start the
display. Could be the innermost frame if the whole stack needs display. Could be the innermost frame if the whole stack needs

View file

@ -21,11 +21,14 @@
#include "mi-getopt.h" #include "mi-getopt.h"
#include "gdb_string.h" #include "gdb_string.h"
int /* See comments about mi_getopt and mi_getopt_silent in mi-getopt.h.
mi_getopt (const char *prefix, When there is an unknown option, if ERROR_ON_UNKNOWN is true,
int argc, char **argv, throw an error, otherwise return -1. */
const struct mi_opt *opts,
int *oind, char **oarg) static int
mi_getopt_1 (const char *prefix, int argc, char **argv,
const struct mi_opt *opts, int *oind, char **oarg,
int error_on_unknown)
{ {
char *arg; char *arg;
const struct mi_opt *opt; const struct mi_opt *opt;
@ -71,7 +74,27 @@ mi_getopt (const char *prefix,
return opt->index; return opt->index;
} }
} }
if (error_on_unknown)
error (_("%s: Unknown option ``%s''"), prefix, arg + 1); error (_("%s: Unknown option ``%s''"), prefix, arg + 1);
else
return -1;
}
int
mi_getopt (const char *prefix,
int argc, char **argv,
const struct mi_opt *opts,
int *oind, char **oarg)
{
return mi_getopt_1 (prefix, argc, argv, opts, oind, oarg, 1);
}
int
mi_getopt_allow_unknown (const char *prefix, int argc, char **argv,
const struct mi_opt *opts, int *oind, char **oarg)
{
return mi_getopt_1 (prefix, argc, argv, opts, oind, oarg, 0);
} }
int int

View file

@ -46,11 +46,15 @@ struct mi_opt
If ARGV[OPTIND] is not an option, -1 is returned and OPTIND updated If ARGV[OPTIND] is not an option, -1 is returned and OPTIND updated
to specify the non-option argument. OPTARG is set to NULL. to specify the non-option argument. OPTARG is set to NULL.
mi_getopt() calls ``error("%s: Unknown option %c", prefix, If an unknown option is encountered, mi_getopt() calls
option)'' if an unknown option is encountered. */ ``error("%s: Unknown option %c", prefix, option)'' while
mi_getopt_allow_unknown returns -1. */
extern int mi_getopt (const char *prefix, int argc, char **argv, extern int mi_getopt (const char *prefix, int argc, char **argv,
const struct mi_opt *opt, int *optind, char **optarg); const struct mi_opt *opt, int *optind, char **optarg);
extern int mi_getopt_allow_unknown (const char *prefix, int argc,
char **argv, const struct mi_opt *opts,
int *oind, char **oarg);
/* mi_valid_noargs determines if ARGC/ARGV are a valid set of /* mi_valid_noargs determines if ARGC/ARGV are a valid set of
parameters to satisfy an MI function that is not supposed to parameters to satisfy an MI function that is not supposed to