* NEWS: Update for --args.
* infcmd.c (construct_inferior_arguments): Moved from ... * fork-child.c: ... here.
This commit is contained in:
parent
756caa3d89
commit
c2a727faa2
4 changed files with 82 additions and 71 deletions
71
gdb/infcmd.c
71
gdb/infcmd.c
|
@ -256,6 +256,77 @@ notice_args_read (struct cmd_list_element *c)
|
|||
get_inferior_args ();
|
||||
}
|
||||
|
||||
|
||||
/* Compute command-line string given argument vector. This does the
|
||||
same shell processing as fork_inferior. */
|
||||
/* ARGSUSED */
|
||||
char *
|
||||
construct_inferior_arguments (struct gdbarch *gdbarch, int argc, char **argv)
|
||||
{
|
||||
char *result;
|
||||
|
||||
if (STARTUP_WITH_SHELL)
|
||||
{
|
||||
/* This holds all the characters considered special to the
|
||||
typical Unix shells. We include `^' because the SunOS
|
||||
/bin/sh treats it as a synonym for `|'. */
|
||||
char *special = "\"!#$&*()\\|[]{}<>?'\"`~^; \t\n";
|
||||
int i;
|
||||
int length = 0;
|
||||
char *out, *cp;
|
||||
|
||||
/* We over-compute the size. It shouldn't matter. */
|
||||
for (i = 0; i < argc; ++i)
|
||||
length += 2 * strlen (argv[i]) + 1;
|
||||
|
||||
result = (char *) xmalloc (length);
|
||||
out = result;
|
||||
|
||||
for (i = 0; i < argc; ++i)
|
||||
{
|
||||
if (i > 0)
|
||||
*out++ = ' ';
|
||||
|
||||
for (cp = argv[i]; *cp; ++cp)
|
||||
{
|
||||
if (strchr (special, *cp) != NULL)
|
||||
*out++ = '\\';
|
||||
*out++ = *cp;
|
||||
}
|
||||
}
|
||||
*out = '\0';
|
||||
}
|
||||
else
|
||||
{
|
||||
/* In this case we can't handle arguments that contain spaces,
|
||||
tabs, or newlines -- see breakup_args(). */
|
||||
int i;
|
||||
int length = 0;
|
||||
|
||||
for (i = 0; i < argc; ++i)
|
||||
{
|
||||
char *cp = strchr (argv[i], ' ');
|
||||
if (cp == NULL)
|
||||
cp = strchr (argv[i], '\t');
|
||||
if (cp == NULL)
|
||||
cp = strchr (argv[i], '\n');
|
||||
if (cp != NULL)
|
||||
error ("can't handle command-line argument containing whitespace");
|
||||
length += strlen (argv[i]) + 1;
|
||||
}
|
||||
|
||||
result = (char *) xmalloc (length);
|
||||
result[0] = '\0';
|
||||
for (i = 0; i < argc; ++i)
|
||||
{
|
||||
if (i > 0)
|
||||
strcat (result, " ");
|
||||
strcat (result, argv[i]);
|
||||
}
|
||||
}
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
|
||||
/* This function detects whether or not a '&' character (indicating
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue