From: Michael Weghorn Date: Mon, 25 May 2020 15:37:44 +0000 (-0400) Subject: gdb: Move construct_inferior_arguments to gdbsupport X-Git-Url: https://git.libre-soc.org/?a=commitdiff_plain;h=92651b1d91a124b8c14e45adc8d007b659cc92c2;p=binutils-gdb.git gdb: Move construct_inferior_arguments to gdbsupport This moves the function construct_inferior_arguments from gdb/inferior.h and gdb/infcmd.c to gdbsupport/common-inferior.{h,cc}. While at it, also move the function's comment to the header file to align with current standards. The intention is to use it from gdbserver in a follow-up commit. gdb/ChangeLog: * infcmd.c, inferior.h: (construct_inferior_arguments): Moved function from here to gdbsupport/common-inferior.{h,cc} gdbsupport/ChangeLog: * common-inferior.h, common-inferior.cc: (construct_inferior_arguments): Move function here from gdb/infcmd.c, gdb/inferior.h Change-Id: Ib9290464ce8c0872f605d8829f88352d064c30d6 --- diff --git a/gdb/ChangeLog b/gdb/ChangeLog index 79995c93be0..a43ab08dd6c 100644 --- a/gdb/ChangeLog +++ b/gdb/ChangeLog @@ -1,3 +1,8 @@ +2020-05-25 Michael Weghorn + + * infcmd.c, inferior.h: (construct_inferior_arguments): + Moved function from here to gdbsupport/common-inferior.{h,cc} + 2020-05-23 Tom Tromey Revert commit eca1f90c: diff --git a/gdb/infcmd.c b/gdb/infcmd.c index 32905a7b591..cf6e540e795 100644 --- a/gdb/infcmd.c +++ b/gdb/infcmd.c @@ -259,130 +259,6 @@ server's cwd if remote debugging.\n")); "when starting the inferior is \"%s\".\n"), cwd); } - -/* Compute command-line string given argument vector. This does the - same shell processing as fork_inferior. */ - -char * -construct_inferior_arguments (int argc, char **argv) -{ - char *result; - - /* ARGC should always be at least 1, but we double check this - here. This is also needed to silence -Werror-stringop - warnings. */ - gdb_assert (argc > 0); - - if (startup_with_shell) - { -#ifdef __MINGW32__ - /* This holds all the characters considered special to the - Windows shells. */ - static const char special[] = "\"!&*|[]{}<>?`~^=;, \t\n"; - static const char quote = '"'; -#else - /* 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 `|'. */ - static const char special[] = "\"!#$&*()\\|[]{}<>?'`~^; \t\n"; - static const char quote = '\''; -#endif - int i; - int length = 0; - char *out, *cp; - - /* We over-compute the size. It shouldn't matter. */ - for (i = 0; i < argc; ++i) - length += 3 * strlen (argv[i]) + 1 + 2 * (argv[i][0] == '\0'); - - result = (char *) xmalloc (length); - out = result; - - for (i = 0; i < argc; ++i) - { - if (i > 0) - *out++ = ' '; - - /* Need to handle empty arguments specially. */ - if (argv[i][0] == '\0') - { - *out++ = quote; - *out++ = quote; - } - else - { -#ifdef __MINGW32__ - int quoted = 0; - - if (strpbrk (argv[i], special)) - { - quoted = 1; - *out++ = quote; - } -#endif - for (cp = argv[i]; *cp; ++cp) - { - if (*cp == '\n') - { - /* A newline cannot be quoted with a backslash (it - just disappears), only by putting it inside - quotes. */ - *out++ = quote; - *out++ = '\n'; - *out++ = quote; - } - else - { -#ifdef __MINGW32__ - if (*cp == quote) -#else - if (strchr (special, *cp) != NULL) -#endif - *out++ = '\\'; - *out++ = *cp; - } - } -#ifdef __MINGW32__ - if (quoted) - *out++ = quote; -#endif - } - } - *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 strips the '&' character (indicating background execution) that is added as *the last* of the arguments ARGS of a diff --git a/gdb/inferior.h b/gdb/inferior.h index 1ac51369dff..95af474eede 100644 --- a/gdb/inferior.h +++ b/gdb/inferior.h @@ -184,8 +184,6 @@ extern void child_interrupt (struct target_ops *self); STARTUP_INFERIOR. */ extern ptid_t gdb_startup_inferior (pid_t pid, int num_traps); -extern char *construct_inferior_arguments (int, char **); - /* From infcmd.c */ /* Initial inferior setup. Determines the exec file is not yet known, diff --git a/gdbsupport/ChangeLog b/gdbsupport/ChangeLog index e7374abfc26..4f72c7dd15c 100644 --- a/gdbsupport/ChangeLog +++ b/gdbsupport/ChangeLog @@ -1,3 +1,8 @@ +2020-05-25 Michael Weghorn + + * common-inferior.h, common-inferior.cc: (construct_inferior_arguments): + Move function here from gdb/infcmd.c, gdb/inferior.h + 2020-05-14 Kevin Buettner * btrace-common.h (btrace_cpu_vendor): Add CV_AMD. diff --git a/gdbsupport/common-inferior.cc b/gdbsupport/common-inferior.cc index ed16e89a520..a7d631f3574 100644 --- a/gdbsupport/common-inferior.cc +++ b/gdbsupport/common-inferior.cc @@ -24,3 +24,125 @@ /* See common-inferior.h. */ bool startup_with_shell = true; + +/* See common-inferior.h. */ + +char * +construct_inferior_arguments (int argc, char **argv) +{ + char *result; + + /* ARGC should always be at least 1, but we double check this + here. This is also needed to silence -Werror-stringop + warnings. */ + gdb_assert (argc > 0); + + if (startup_with_shell) + { +#ifdef __MINGW32__ + /* This holds all the characters considered special to the + Windows shells. */ + static const char special[] = "\"!&*|[]{}<>?`~^=;, \t\n"; + static const char quote = '"'; +#else + /* 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 `|'. */ + static const char special[] = "\"!#$&*()\\|[]{}<>?'`~^; \t\n"; + static const char quote = '\''; +#endif + int i; + int length = 0; + char *out, *cp; + + /* We over-compute the size. It shouldn't matter. */ + for (i = 0; i < argc; ++i) + length += 3 * strlen (argv[i]) + 1 + 2 * (argv[i][0] == '\0'); + + result = (char *) xmalloc (length); + out = result; + + for (i = 0; i < argc; ++i) + { + if (i > 0) + *out++ = ' '; + + /* Need to handle empty arguments specially. */ + if (argv[i][0] == '\0') + { + *out++ = quote; + *out++ = quote; + } + else + { +#ifdef __MINGW32__ + int quoted = 0; + + if (strpbrk (argv[i], special)) + { + quoted = 1; + *out++ = quote; + } +#endif + for (cp = argv[i]; *cp; ++cp) + { + if (*cp == '\n') + { + /* A newline cannot be quoted with a backslash (it + just disappears), only by putting it inside + quotes. */ + *out++ = quote; + *out++ = '\n'; + *out++ = quote; + } + else + { +#ifdef __MINGW32__ + if (*cp == quote) +#else + if (strchr (special, *cp) != NULL) +#endif + *out++ = '\\'; + *out++ = *cp; + } + } +#ifdef __MINGW32__ + if (quoted) + *out++ = quote; +#endif + } + } + *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; +} diff --git a/gdbsupport/common-inferior.h b/gdbsupport/common-inferior.h index 3c8e87aee62..ee87bc75a3f 100644 --- a/gdbsupport/common-inferior.h +++ b/gdbsupport/common-inferior.h @@ -58,4 +58,8 @@ extern void set_inferior_cwd (const char *cwd); the target is started up with a shell. */ extern bool startup_with_shell; +/* Compute command-line string given argument vector. This does the + same shell processing as fork_inferior. */ +extern char *construct_inferior_arguments (int, char **); + #endif /* COMMON_COMMON_INFERIOR_H */