* NEWS: Update for --args.

* infcmd.c (construct_inferior_arguments): Moved from ...
	* fork-child.c: ... here.
This commit is contained in:
Tom Tromey 2001-11-27 03:09:44 +00:00
parent 756caa3d89
commit c2a727faa2
4 changed files with 82 additions and 71 deletions

View file

@ -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