Introduce gdb_argv, a class wrapper for buildargv

This introduces gdb_argv, a class wrapping an "argv" pointer; that is,
a pointer to a NULL-terminated array of char*, where both the array
and each non-NULL element in the array are xmalloc'd.

This patch then changes most users of gdb_buildargv to use gdb_argv
instead.

ChangeLog
2017-08-03  Tom Tromey  <tom@tromey.com>

	* utils.h (struct gdb_argv_deleter): New.
	(gdb_argv): New class.
	* utils.c (gdb_argv::reset): New method.
	* tracepoint.c (delete_trace_variable_command): Use gdb_argv.
	* tracefile.c (tsave_command): Use gdb_argv.
	* top.c (new_ui_command): Use gdb_argv.
	* symmisc.c (maintenance_print_symbols)
	(maintenance_print_msymbols, maintenance_expand_symtabs): Use gdb_argv.
	* symfile.c (symbol_file_command, generic_load)
	(remove_symbol_file_command): Use gdb_argv.
	* stack.c (backtrace_command): Use gdb_argv.
	* source.c (add_path, show_substitute_path_command)
	(unset_substitute_path_command, set_substitute_path_command):
	Use gdb_argv.
	* skip.c (skip_command): Use gdb_argv.  Use gdb_buildargv.
	* ser-mingw.c (pipe_windows_open): Use gdb_argv.
	* remote.c (extended_remote_run, remote_put_command)
	(remote_get_command, remote_delete_command): Use gdb_argv.
	* remote-sim.c (gdbsim_load, gdbsim_create_inferior)
	(gdbsim_open): Use gdb_argv.
	* python/py-cmd.c (gdbpy_string_to_argv): Use gdb_argv.
	* psymtab.c (maintenance_print_psymbols): Use gdb_argv.
	* procfs.c (procfs_info_proc): Use gdb_argv.
	* interps.c (interpreter_exec_cmd): Use gdb_argv.
	* infrun.c (handle_command): Use gdb_argv.
	* inferior.c (add_inferior_command, clone_inferior_command):
	Use gdb_argv.
	* guile/scm-string.c (gdbscm_string_to_argv): Use gdb_argv.
	* exec.c (exec_file_command): Use gdb_argv.
	* cli/cli-cmds.c (alias_command): Use gdb_argv.
	* compile/compile.c (build_argc_argv): Use gdb_argv.
This commit is contained in:
Tom Tromey 2017-04-30 23:02:30 -06:00
parent 0d50bde32b
commit 773a1edcd1
24 changed files with 289 additions and 249 deletions

View file

@ -8512,14 +8512,12 @@ sig_print_info (enum gdb_signal oursig)
static void
handle_command (char *args, int from_tty)
{
char **argv;
int digits, wordlen;
int sigfirst, signum, siglast;
enum gdb_signal oursig;
int allsigs;
int nsigs;
unsigned char *sigs;
struct cleanup *old_chain;
if (args == NULL)
{
@ -8534,24 +8532,23 @@ handle_command (char *args, int from_tty)
/* Break the command line up into args. */
argv = gdb_buildargv (args);
old_chain = make_cleanup_freeargv (argv);
gdb_argv built_argv (args);
/* Walk through the args, looking for signal oursigs, signal names, and
actions. Signal numbers and signal names may be interspersed with
actions, with the actions being performed for all signals cumulatively
specified. Signal ranges can be specified as <LOW>-<HIGH>. */
while (*argv != NULL)
for (char *arg : built_argv)
{
wordlen = strlen (*argv);
for (digits = 0; isdigit ((*argv)[digits]); digits++)
wordlen = strlen (arg);
for (digits = 0; isdigit (arg[digits]); digits++)
{;
}
allsigs = 0;
sigfirst = siglast = -1;
if (wordlen >= 1 && !strncmp (*argv, "all", wordlen))
if (wordlen >= 1 && !strncmp (arg, "all", wordlen))
{
/* Apply action to all signals except those used by the
debugger. Silently skip those. */
@ -8559,37 +8556,37 @@ handle_command (char *args, int from_tty)
sigfirst = 0;
siglast = nsigs - 1;
}
else if (wordlen >= 1 && !strncmp (*argv, "stop", wordlen))
else if (wordlen >= 1 && !strncmp (arg, "stop", wordlen))
{
SET_SIGS (nsigs, sigs, signal_stop);
SET_SIGS (nsigs, sigs, signal_print);
}
else if (wordlen >= 1 && !strncmp (*argv, "ignore", wordlen))
else if (wordlen >= 1 && !strncmp (arg, "ignore", wordlen))
{
UNSET_SIGS (nsigs, sigs, signal_program);
}
else if (wordlen >= 2 && !strncmp (*argv, "print", wordlen))
else if (wordlen >= 2 && !strncmp (arg, "print", wordlen))
{
SET_SIGS (nsigs, sigs, signal_print);
}
else if (wordlen >= 2 && !strncmp (*argv, "pass", wordlen))
else if (wordlen >= 2 && !strncmp (arg, "pass", wordlen))
{
SET_SIGS (nsigs, sigs, signal_program);
}
else if (wordlen >= 3 && !strncmp (*argv, "nostop", wordlen))
else if (wordlen >= 3 && !strncmp (arg, "nostop", wordlen))
{
UNSET_SIGS (nsigs, sigs, signal_stop);
}
else if (wordlen >= 3 && !strncmp (*argv, "noignore", wordlen))
else if (wordlen >= 3 && !strncmp (arg, "noignore", wordlen))
{
SET_SIGS (nsigs, sigs, signal_program);
}
else if (wordlen >= 4 && !strncmp (*argv, "noprint", wordlen))
else if (wordlen >= 4 && !strncmp (arg, "noprint", wordlen))
{
UNSET_SIGS (nsigs, sigs, signal_print);
UNSET_SIGS (nsigs, sigs, signal_stop);
}
else if (wordlen >= 4 && !strncmp (*argv, "nopass", wordlen))
else if (wordlen >= 4 && !strncmp (arg, "nopass", wordlen))
{
UNSET_SIGS (nsigs, sigs, signal_program);
}
@ -8602,11 +8599,11 @@ handle_command (char *args, int from_tty)
SIGHUP, SIGINT, SIGALRM, etc. will work right anyway. */
sigfirst = siglast = (int)
gdb_signal_from_command (atoi (*argv));
if ((*argv)[digits] == '-')
gdb_signal_from_command (atoi (arg));
if (arg[digits] == '-')
{
siglast = (int)
gdb_signal_from_command (atoi ((*argv) + digits + 1));
gdb_signal_from_command (atoi (arg + digits + 1));
}
if (sigfirst > siglast)
{
@ -8618,7 +8615,7 @@ handle_command (char *args, int from_tty)
}
else
{
oursig = gdb_signal_from_name (*argv);
oursig = gdb_signal_from_name (arg);
if (oursig != GDB_SIGNAL_UNKNOWN)
{
sigfirst = siglast = (int) oursig;
@ -8626,7 +8623,7 @@ handle_command (char *args, int from_tty)
else
{
/* Not a number and not a recognized flag word => complain. */
error (_("Unrecognized or ambiguous flag word: \"%s\"."), *argv);
error (_("Unrecognized or ambiguous flag word: \"%s\"."), arg);
}
}
@ -8664,8 +8661,6 @@ Are you sure you want to change it? "),
break;
}
}
argv++;
}
for (signum = 0; signum < nsigs; signum++)
@ -8686,8 +8681,6 @@ Are you sure you want to change it? "),
break;
}
do_cleanups (old_chain);
}
/* Complete the "handle" command. */