ugly if it had to use catch_errors each time. */
#define SET_TOP_LEVEL() \
- (((top_level_val = setjmp (error_return)) \
- ? (PTR) 0 : (PTR) memcpy (quit_return, error_return, sizeof (jmp_buf))) \
+ (((top_level_val = SIGSETJMP (error_return)) \
+ ? (PTR) 0 : (PTR) memcpy (quit_return, error_return, sizeof (SIGJMP_BUF))) \
, top_level_val)
/* If nonzero, display time usage both at startup and for each command. */
int display_space;
-extern void gdb_init PARAMS ((void));
+static void print_gdb_help PARAMS ((GDB_FILE *));
+extern void gdb_init PARAMS ((char *));
+#ifdef __CYGWIN32__
+#include <windows.h> /* for MAX_PATH */
+extern void cygwin32_conv_to_posix_path (const char *, char *);
+#endif
int
main (argc, argv)
quiet = 1;
}
- gdb_init ();
+ gdb_init (argv[0]);
/* Do these (and anything which might call wrap_here or *_filtered)
after initialize_all_files. */
if (print_help)
{
- /* --version is intentionally not documented here, because we
- are printing the version here, and the help is long enough
- already. */
-
- print_gdb_version (gdb_stdout);
- /* Make sure the output gets printed. */
- wrap_here ("");
- printf_filtered ("\n");
-
- /* But don't use *_filtered here. We don't want to prompt for continue
- no matter how small the screen or how much we're going to print. */
- fputs_unfiltered ("\
-This is the GNU debugger. Usage:\n\
- gdb [options] [executable-file [core-file or process-id]]\n\
-Options:\n\
- --help Print this message.\n\
- --quiet Do not print version number on startup.\n\
- --fullname Output information used by emacs-GDB interface.\n\
- --epoch Output information used by epoch emacs-GDB interface.\n\
-", gdb_stdout);
- fputs_unfiltered ("\
- --batch Exit after processing options.\n\
- --nx Do not read .gdbinit file.\n\
- --tty=TTY Use TTY for input/output by the program being debugged.\n\
- --cd=DIR Change current directory to DIR.\n\
- --directory=DIR Search for source files in DIR.\n\
-", gdb_stdout);
- fputs_unfiltered ("\
- --command=FILE Execute GDB commands from FILE.\n\
- --symbols=SYMFILE Read symbols from SYMFILE.\n\
- --exec=EXECFILE Use EXECFILE as the executable.\n\
- --se=FILE Use FILE as symbol file and executable file.\n\
-", gdb_stdout);
- fputs_unfiltered ("\
- --core=COREFILE Analyze the core dump COREFILE.\n\
- -b BAUDRATE Set serial port baud rate used for remote debugging.\n\
- --mapped Use mapped symbol files if supported on this system.\n\
- --readnow Fully read symbol files on first access.\n\
- --nw Do not use a window interface.\n\
-", gdb_stdout);
-#ifdef ADDITIONAL_OPTION_HELP
- fputs_unfiltered (ADDITIONAL_OPTION_HELP, gdb_stdout);
-#endif
- fputs_unfiltered ("\n\
-For more information, type \"help\" from within GDB, or consult the\n\
-GDB manual (available as on-line info or a printed manual).\n", gdb_stdout);
+ print_gdb_help (gdb_stdout);
+ fputs_unfiltered ("\n", gdb_stdout);
exit (0);
}
{
/* Print all the junk at the top, with trailing "..." if we are about
to read a symbol file (possibly slowly). */
- print_gnu_advertisement ();
print_gdb_version (gdb_stdout);
if (symarg)
printf_filtered ("..");
*before* all the command line arguments are processed; it sets
global parameters, which are independent of what file you are
debugging or what directory you are in. */
- homedir = getenv ("HOME");
+#ifdef __CYGWIN32__
+ {
+ char * tmp = getenv ("HOME");
+
+ if (tmp != NULL)
+ {
+ homedir = (char *) alloca (MAX_PATH+1);
+ cygwin32_conv_to_posix_path (tmp, homedir);
+ } else {
+ homedir = NULL;
+ }
+ }
+#else
+ homedir = getenv ("HOME");
+#endif
if (homedir)
{
- homeinit = (char *) alloca (strlen (getenv ("HOME")) +
+ homeinit = (char *) alloca (strlen (homedir) +
strlen (gdbinit) + 10);
- strcpy (homeinit, getenv ("HOME"));
+ strcpy (homeinit, homedir);
strcat (homeinit, "/");
strcat (homeinit, gdbinit);
/* The default command loop.
The WIN32 Gui calls this main to set up gdb's state, and
has its own command loop. */
-#ifndef _WIN32
+#if !defined _WIN32 || defined __GNUC__
while (1)
{
if (!SET_TOP_LEVEL ())
#endif
}
+
+/* Don't use *_filtered for printing help. We don't want to prompt
+ for continue no matter how small the screen or how much we're going
+ to print. */
+
+static void
+print_gdb_help (stream)
+ GDB_FILE *stream;
+{
+ fputs_unfiltered ("\
+This is the GNU debugger. Usage:\n\n\
+ gdb [options] [executable-file [core-file or process-id]]\n\n\
+Options:\n\n\
+", stream);
+ fputs_unfiltered ("\
+ -b BAUDRATE Set serial port baud rate used for remote debugging.\n\
+ --batch Exit after processing options.\n\
+ --cd=DIR Change current directory to DIR.\n\
+ --command=FILE Execute GDB commands from FILE.\n\
+ --core=COREFILE Analyze the core dump COREFILE.\n\
+", stream);
+ fputs_unfiltered ("\
+ --directory=DIR Search for source files in DIR.\n\
+ --epoch Output information used by epoch emacs-GDB interface.\n\
+ --exec=EXECFILE Use EXECFILE as the executable.\n\
+ --fullname Output information used by emacs-GDB interface.\n\
+ --help Print this message.\n\
+", stream);
+ fputs_unfiltered ("\
+ --mapped Use mapped symbol files if supported on this system.\n\
+ --nw Do not use a window interface.\n\
+ --nx Do not read .gdbinit file.\n\
+ --quiet Do not print version number on startup.\n\
+ --readnow Fully read symbol files on first access.\n\
+", stream);
+ fputs_unfiltered ("\
+ --se=FILE Use FILE as symbol file and executable file.\n\
+ --symbols=SYMFILE Read symbols from SYMFILE.\n\
+ --tty=TTY Use TTY for input/output by the program being debugged.\n\
+ --version Print version information and then exit.\n\
+", stream);
+#ifdef ADDITIONAL_OPTION_HELP
+ fputs_unfiltered (ADDITIONAL_OPTION_HELP, stream);
+#endif
+ fputs_unfiltered ("\n\
+For more information, type \"help\" from within GDB, or consult the\n\
+GDB manual (available as on-line info or a printed manual).\n\
+Report bugs to \"bug-gdb@prep.ai.mit.edu\".\
+", stream);
+}
+
\f
void
init_proc ()
{
}
+/* All I/O sent to the *_filtered and *_unfiltered functions eventually ends up
+ here. The fputs_unfiltered_hook is primarily used by GUIs to collect all
+ output and send it to the GUI, instead of the controlling terminal. Only
+ output to gdb_stdout and gdb_stderr are sent to the hook. Everything else
+ is sent on to fputs to allow file I/O to be handled appropriately. */
+
void
fputs_unfiltered (linebuffer, stream)
const char *linebuffer;
FILE *stream;
{
- if (fputs_unfiltered_hook)
- {
- /* FIXME: I think we should only be doing this for stdout or stderr.
- Either that or we should be passing stream to the hook so it can
- deal with it. If that is cleaned up, this function can go back
- into utils.c and the fputs_unfiltered_hook can replace the current
- ability to avoid this function by not linking with main.c. */
- fputs_unfiltered_hook (linebuffer, stream);
- return;
- }
-
- fputs (linebuffer, stream);
+ if (fputs_unfiltered_hook
+ && (stream == gdb_stdout
+ || stream == gdb_stderr))
+ fputs_unfiltered_hook (linebuffer, stream);
+ else
+ fputs (linebuffer, stream);
}