/* Top level stuff for GDB, the GNU debugger.
- Copyright 1986, 1987, 1988, 1989, 1990, 1991, 1992, 1993, 1994,
- 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005
+ Copyright (C) 1986, 1987, 1988, 1989, 1990, 1991, 1992, 1993, 1994, 1995,
+ 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2007
Free Software Foundation, Inc.
This file is part of GDB.
You should have received a copy of the GNU General Public License
along with this program; if not, write to the Free Software
- Foundation, Inc., 59 Temple Place - Suite 330,
- Boston, MA 02111-1307, USA. */
+ Foundation, Inc., 51 Franklin Street, Fifth Floor,
+ Boston, MA 02110-1301, USA. */
#include "defs.h"
#include "top.h"
static int print_version;
/* Pointers to all arguments of --command option. */
- char **cmdarg;
+ struct cmdarg {
+ enum {
+ CMDARG_FILE,
+ CMDARG_COMMAND
+ } type;
+ char *string;
+ } *cmdarg;
/* Allocated size of cmdarg. */
int cmdsize;
/* Number of elements of cmdarg used. */
#endif
cmdsize = 1;
- cmdarg = (char **) xmalloc (cmdsize * sizeof (*cmdarg));
+ cmdarg = (struct cmdarg *) xmalloc (cmdsize * sizeof (*cmdarg));
ncmd = 0;
dirsize = 1;
dirarg = (char **) xmalloc (dirsize * sizeof (*dirarg));
if (res == 0)
{
xfree (gdb_sysroot);
- gdb_sysroot = TARGET_SYSTEM_ROOT;
+ gdb_sysroot = xstrdup (TARGET_SYSTEM_ROOT);
}
}
else
- gdb_sysroot = TARGET_SYSTEM_ROOT;
-#else
-#if defined (TARGET_SYSTEM_ROOT)
- gdb_sysroot = TARGET_SYSTEM_ROOT;
+ gdb_sysroot = xstrdup (TARGET_SYSTEM_ROOT);
#else
- gdb_sysroot = "";
+ gdb_sysroot = xstrdup (TARGET_SYSTEM_ROOT);
#endif
+
+ /* Canonicalize the sysroot path. */
+ if (*gdb_sysroot)
+ {
+ char *canon_sysroot = lrealpath (gdb_sysroot);
+ if (canon_sysroot)
+ {
+ xfree (gdb_sysroot);
+ gdb_sysroot = canon_sysroot;
+ }
+ }
+
+#ifdef DEBUGDIR_RELOCATABLE
+ debug_file_directory = make_relative_prefix (argv[0], BINDIR, DEBUGDIR);
+ if (debug_file_directory)
+ {
+ struct stat s;
+ int res = 0;
+
+ if (stat (debug_file_directory, &s) == 0)
+ if (S_ISDIR (s.st_mode))
+ res = 1;
+
+ if (res == 0)
+ {
+ xfree (debug_file_directory);
+ debug_file_directory = xstrdup (DEBUGDIR);
+ }
+ }
+ else
+ debug_file_directory = xstrdup (DEBUGDIR);
+#else
+ debug_file_directory = xstrdup (DEBUGDIR);
#endif
+ /* Canonicalize the debugfile path. */
+ if (*debug_file_directory)
+ {
+ char *canon_debug = lrealpath (debug_file_directory);
+ if (canon_debug)
+ {
+ xfree (debug_file_directory);
+ debug_file_directory = canon_debug;
+ }
+ }
+
/* There will always be an interpreter. Either the one passed into
this captured main, or one specified by the user at start up, or
the console. Initialize the interpreter to the one requested by
};
static struct option long_options[] =
{
-#if defined(TUI)
{"tui", no_argument, 0, OPT_TUI},
-#endif
{"xdb", no_argument, &xdb_commands, 1},
{"dbx", no_argument, &dbx_commands, 1},
{"readnow", no_argument, &readnow_symbol_files, 1},
{"pid", required_argument, 0, 'p'},
{"p", required_argument, 0, 'p'},
{"command", required_argument, 0, 'x'},
+ {"eval-command", required_argument, 0, 'X'},
{"version", no_argument, &print_version, 1},
{"x", required_argument, 0, 'x'},
+ {"ex", required_argument, 0, 'X'},
#ifdef GDBTK
{"tclcommand", required_argument, 0, 'z'},
{"enable-external-editor", no_argument, 0, 'y'},
break;
case OPT_TUI:
/* --tui is equivalent to -i=tui. */
+#ifdef TUI
xfree (interpreter_p);
- interpreter_p = xstrdup ("tui");
+ interpreter_p = xstrdup (INTERP_TUI);
+#else
+ fprintf_unfiltered (gdb_stderr,
+ _("%s: TUI mode is not supported\n"),
+ argv[0]);
+ exit (1);
+#endif
break;
case OPT_WINDOWS:
/* FIXME: cagney/2003-03-01: Not sure if this option is
actually useful, and if it is, what it should do. */
+#ifdef GDBTK
+ /* --windows is equivalent to -i=insight. */
+ xfree (interpreter_p);
+ interpreter_p = xstrdup (INTERP_INSIGHT);
+#endif
use_windows = 1;
break;
case OPT_NOWINDOWS:
corearg = optarg;
break;
case 'x':
- cmdarg[ncmd++] = optarg;
+ cmdarg[ncmd].type = CMDARG_FILE;
+ cmdarg[ncmd++].string = optarg;
+ if (ncmd >= cmdsize)
+ {
+ cmdsize *= 2;
+ cmdarg = xrealloc ((char *) cmdarg,
+ cmdsize * sizeof (*cmdarg));
+ }
+ break;
+ case 'X':
+ cmdarg[ncmd].type = CMDARG_COMMAND;
+ cmdarg[ncmd++].string = optarg;
if (ncmd >= cmdsize)
{
cmdsize *= 2;
- cmdarg = (char **) xrealloc ((char *) cmdarg,
- cmdsize * sizeof (*cmdarg));
+ cmdarg = xrealloc ((char *) cmdarg,
+ cmdsize * sizeof (*cmdarg));
}
break;
case 'B':
if (symarg)
printf_filtered ("..");
wrap_here ("");
+ printf_filtered ("\n");
gdb_flush (gdb_stdout); /* Force to screen during slow operations */
}
if (symarg)
printf_filtered ("..");
wrap_here ("");
+ printf_filtered ("\n");
gdb_flush (gdb_stdout); /* Force to screen during slow operations */
}
- error_pre_print = "\n\n";
+ /* Set off error and warning messages with a blank line. */
+ error_pre_print = "\n";
quit_pre_print = error_pre_print;
-
- /* We may get more than one warning, don't double space all of them... */
warning_pre_print = _("\nwarning: ");
/* Read and execute $HOME/.gdbinit file, if it exists. This is done
if (!inhibit_gdbinit)
{
- catch_command_errors (source_command, homeinit, 0, RETURN_MASK_ALL);
+ catch_command_errors (source_script, homeinit, 0, RETURN_MASK_ALL);
}
/* Do stats; no need to do them elsewhere since we'll only
}
for (i = 0; i < ndir; i++)
- catch_command_errors (directory_command, dirarg[i], 0, RETURN_MASK_ALL);
+ catch_command_errors (directory_switch, dirarg[i], 0, RETURN_MASK_ALL);
xfree (dirarg);
if (execarg != NULL
catch_command_errors (symbol_file_add_main, symarg, 0, RETURN_MASK_ALL);
}
- /* After the symbol file has been read, print a newline to get us
- beyond the copyright line... But errors should still set off
- the error message with a (single) blank line. */
- if (!quiet)
- printf_filtered ("\n");
- error_pre_print = "\n";
- quit_pre_print = error_pre_print;
- warning_pre_print = _("\nwarning: ");
-
if (corearg != NULL)
{
/* corearg may be either a corefile or a pid.
|| memcmp ((char *) &homebuf, (char *) &cwdbuf, sizeof (struct stat)))
if (!inhibit_gdbinit)
{
- catch_command_errors (source_command, gdbinit, 0, RETURN_MASK_ALL);
+ catch_command_errors (source_script, gdbinit, 0, RETURN_MASK_ALL);
}
for (i = 0; i < ncmd; i++)
read_command_file (stdin);
else
#endif
- source_command (cmdarg[i], !batch);
+ source_script (cmdarg[i], !batch);
do_cleanups (ALL_CLEANUPS);
}
#endif
- catch_command_errors (source_command, cmdarg[i], !batch, RETURN_MASK_ALL);
+ if (cmdarg[i].type == CMDARG_FILE)
+ catch_command_errors (source_script, cmdarg[i].string,
+ !batch, RETURN_MASK_ALL);
+ else /* cmdarg[i].type == CMDARG_COMMAND */
+ catch_command_errors (execute_command, cmdarg[i].string,
+ !batch, RETURN_MASK_ALL);
}
xfree (cmdarg);
--return-child-result\n\
GDB exit code will be the child's exit code.\n\
--cd=DIR Change current directory to DIR.\n\
- --command=FILE Execute GDB commands from FILE.\n\
+ --command=FILE, -x Execute GDB commands from FILE.\n\
+ --eval-command=COMMAND, -ex\n\
+ Execute a single GDB command.\n\
+ May be used multiple times and in conjunction\n\
+ with --command.\n\
--core=COREFILE Analyze the core dump COREFILE.\n\
--pid=PID Attach to running process PID.\n\
"), stream);