+Thu May 12 17:04:58 1994 Stan Shebs (shebs@andros.cygnus.com)
+
+ * mpw-make.in (INCLUDE_CFLAGS): Add readline source dir.
+ (READLINE_CFLAGS, READLINE_SRC, READLINE_DIR): Uncomment.
+ (TSOBS): Don't compile inflow.c.
+ (all, install): Add MacGDB.
+ * main.c (main): Do Mac-specific init and command loop if a
+ standalone app, skip full option help message if compiling
+ with MPW C.
+ (gdb_readline): If MPW, add a newline after the (gdb) prompt.
+ * utils.c (_initialize_utils): If MPW, don't try to use termcap to
+ compute the window size.
+ * config/m68k/xm-mpw.h (printf, fprintf, fputs, fputc, putc,
+ fflush): Define as macros that expand into hacked_... versions.
+ (StandAlone, mac_app): Declare.
+ * macgdb.r (SIZE): Set the default partition to 4000K.
+ * mac-xdep.c (readline.h, history.h): Include.
+ (terminal.h): Don't include.
+ (mac_app): Define.
+ (gdb_has_a_terminal): Define Mac-specific version.
+ (do_keyboard_command): Simplify search for command string.
+ (readline): Define as gdb_readline.
+ Add other history/readline stubs to make main gdb link.
+ (hacked_fprintf, hacked_printf, hacked_vfprintf, hacked_fputs,
+ hacked_fputc, hacked_fflush): New functions, intercept output to
+ stdout and stderr, send to console window.
+
Tue Apr 26 17:44:27 1994 Stan Shebs (shebs@andros.cygnus.com)
* mpw-make.in (MacGDB): New target, standalone Mac-hosted gdb.
#define fseek mpw_fseek
#define abort mpw_abort
+#define printf hacked_printf
+#define fprintf hacked_fprintf
+#define vprintf hacked_vfprintf
+#define fputs hacked_fputs
+#define fputc hacked_fputc
+#undef putc
+#define putc hacked_putc
+#define fflush hacked_fflush
+
/* Define as macros so as to mask the previous enum. */
#ifndef BFD_TRUE_FALSE
#ifndef R_OK
#define R_OK 4
#endif
+
+extern int StandAlone;
+
+extern int mac_app;
#include "defs.h"
+#include "readline.h"
+#include "history.h"
+
#include <Values.h>
#include <Types.h>
#include <Resources.h>
#include "gdbtypes.h"
#include "expression.h"
#include "language.h"
-#include "terminal.h" /* For job_control. */
#include "mac-defs.h"
+int mac_app;
+
int useWNE;
int hasColorQD;
Rect console_text_rect;
+/* This will go away eventually. */
+gdb_has_a_terminal () { return 1; }
+
+
mac_init ()
{
SysEnvRec se;
else
console_window = GetNewWindow (wConsole, NULL, (WindowPtr) -1L);
- if (1) DebugStr("\pnear beginning");
+ if (0) DebugStr("\pnear beginning");
SetPort (console_window);
console_text_rect = console_window->portRect;
console_text_rect.bottom -= sbarwid - 1;
char key;
{
int startpos, endpos, i;
+ char *last_newline;
char buf[10], *text_str, *command;
CharsHandle text;
}
else
{
- for (i = startpos; i > 0; --i)
+ DebugStr("\plooking for command");
+ last_newline = strrchr(*text+startpos, '\n');
+ if (last_newline)
{
- strncpy (buf, *text + i, 5);
- buf[5] = 0;
- if (strncmp (buf, "(gdb)") == 0)
- break;
- }
- if (i > 0)
- {
- strncpy (commandbuf + 1, *text + i + 5, startpos - i);
- commandbuf[1 + startpos - i] = '\0';
+ strncpy (commandbuf + 1,
+ last_newline,
+ last_newline - (*text+startpos));
+ commandbuf[1 + last_newline - (*text+startpos)] = 0;
+ command = commandbuf + 1;
}
else
{
- SysBeep (20);
- commandbuf[1] = '\0';
+ command = "help";
}
- command = commandbuf + 1;
}
HUnlock ((Handle) text);
commandbuf[0] = strlen(command);
newmax = lines - (((*console_text)->viewRect.bottom - (*console_text)->viewRect.top)
/ (*console_text)->lineHeight);
if (newmax < 0) newmax = 0;
- SetCtlMax(console_v_scrollbar, newmax);
+ SetCtlMax (console_v_scrollbar, newmax);
value = ((*console_text)->viewRect.top - (*console_text)->destRect.top)
/ (*console_text)->lineHeight;
- SetCtlValue(console_v_scrollbar, value);
+ SetCtlValue (console_v_scrollbar, value);
}
+
+/* Readline substitute. */
+
+char *
+readline (char *prrompt)
+{
+ return gdb_readline (prrompt);
+}
+
+char *rl_completer_word_break_characters;
+
+char *rl_completer_quote_characters;
+
+int (*rl_completion_entry_function) ();
+
+int rl_point;
+
+char *rl_line_buffer;
+
+char *rl_readline_name;
+
+/* History substitute. */
+
+void
+add_history (char *buf)
+{
+}
+
+void
+stifle_history (int n)
+{
+}
+
+int
+unstifle_history ()
+{
+}
+
+int
+read_history (char *name)
+{
+}
+
+int
+write_history (char *name)
+{
+}
+
+int
+history_expand (char *x, char **y)
+{
+}
+
+extern HIST_ENTRY *
+history_get (int xxx)
+{
+ return NULL;
+}
+
+int history_base;
+
+char *
+filename_completion_function (char *text, char *name)
+{
+ return "?";
+}
+
+char *
+tilde_expand (char *str)
+{
+ return strsave (str);
+}
+
+/* Modified versions of standard I/O. */
+
+#include <stdarg.h>
+
+#undef fprintf
+
+int
+hacked_fprintf (FILE *fp, const char *fmt, ...)
+{
+ int ret;
+ va_list ap;
+
+ va_start (ap, fmt);
+ if (mac_app && (fp == stdout || fp == stderr))
+ {
+ char buf[1000];
+
+ ret = vsprintf(buf, fmt, ap);
+ TEInsert (buf, strlen(buf), console_text);
+ TESetSelect (100000, 100000, console_text);
+ draw_console ();
+ }
+ else
+ ret = vfprintf (fp, fmt, ap);
+ va_end (ap);
+ return ret;
+}
+
+#undef printf
+
+int
+hacked_printf (const char *fmt, ...)
+{
+ int ret;
+ va_list ap;
+
+ va_start (ap, fmt);
+ if (mac_app)
+ {
+ ret = hacked_vfprintf(stdout, fmt, ap);
+ }
+ else
+ ret = vfprintf (stdout, fmt, ap);
+ va_end (ap);
+ return ret;
+}
+
+#undef vfprintf
+
+int
+hacked_vfprintf (FILE *fp, const char *format, va_list args)
+{
+ if (mac_app && (fp == stdout || fp == stderr))
+ {
+ char buf[1000];
+ int ret;
+
+ ret = vsprintf(buf, format, args);
+ TEInsert (buf, strlen(buf), console_text);
+ TESetSelect (100000, 100000, console_text);
+ draw_console ();
+ return ret;
+ }
+ else
+ return vfprintf (fp, format, args);
+}
+
+#undef fputs
+
+hacked_fputs (const char *s, FILE *fp)
+{
+ if (mac_app && (fp == stdout || fp == stderr))
+ {
+ TEInsert (s, strlen(s), console_text);
+ TESetSelect (100000, 100000, console_text);
+ draw_console ();
+ return 0;
+ }
+ else
+ return fputs (s, fp);
+}
+
+#undef fputc
+
+hacked_fputc (const char c, FILE *fp)
+{
+ if (mac_app && (fp == stdout || fp == stderr))
+ {
+ char buf[2];
+
+ buf[0] = c;
+ TEInsert (buf, 1, console_text);
+ TESetSelect (100000, 100000, console_text);
+ draw_console ();
+ return 0;
+ }
+ else
+ return fputc (c, fp);
+}
+
+#undef putc
+
+hacked_putc (const char c, FILE *fp)
+{
+ if (mac_app && (fp == stdout || fp == stderr))
+ {
+ char buf[2];
+
+ buf[0] = c;
+ TEInsert (buf, 1, console_text);
+ TESetSelect (100000, 100000, console_text);
+ draw_console ();
+ }
+ else
+ return fputc (c, fp);
+}
+
+#undef fflush
+
+hacked_fflush (FILE *fp)
+{
+ if (mac_app && (fp == stdout || fp == stderr))
+ return 0;
+ return fflush (fp);
+}
+
reserved,
reserved,
reserved,
- 50000,
- 50000
+ 4000*1024,
+ 4000*1024
};
resource 'DLOG' (128) {
disable_current_display ();
do_cleanups (ALL_CLEANUPS);
+
+ if (annotation_level > 1)
+ switch (reason)
+ {
+ case RETURN_QUIT:
+ printf_unfiltered ("\n\032\032quit\n");
+ break;
+ case RETURN_ERROR:
+ printf_unfiltered ("\n\032\032error\n");
+ break;
+ }
+
(NORETURN void) longjmp
(reason == RETURN_ERROR ? error_return : quit_return, 1);
}
register int i;
+/* start-sanitize-mpw */
+#ifdef MPW
+ /* Drop into MacsBug, but only if the executable is specially named. */
+ if (strcmp(argv[0], "DEBUGGDB") == 0)
+ DebugStr("\pat start of GDB main");
+
+ if (StandAlone)
+ mac_app = mac_init ();
+#endif /* MPW */
+/* end-sanitize-mpw */
/* This needs to happen before the first use of malloc. */
init_malloc ((PTR) NULL);
/* 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. */
+/* start-sanitize-mpw */
+/* For reasons too ugly to describe... */
+#ifdef MPW_C
+ fputs_unfiltered ("This is the GNU debugger.\n", gdb_stdout);
+#else
+/* end-sanitize-mpw */
fputs_unfiltered ("\
This is the GNU debugger. Usage:\n\
gdb [options] [executable-file [core-file or process-id]]\n\
--mapped Use mapped symbol files if supported on this system.\n\
--readnow Fully read symbol files on first access.\n\
", gdb_stdout);
+/* start-sanitize-mpw */
+#endif /* MPW_C */
+/* end-sanitize-mpw */
#ifdef ADDITIONAL_OPTION_HELP
fputs_unfiltered (ADDITIONAL_OPTION_HELP, gdb_stdout);
#endif
if (!SET_TOP_LEVEL ())
{
do_cleanups (ALL_CLEANUPS); /* Do complete cleanup */
+/* start-sanitize-mpw */
+#ifdef MPW
+ /* If we're being a Mac application, go into a Mac-specific
+ event-handling loop instead. We still want to be inside
+ the outer loop, because that will catch longjmps resulting
+ from some command executions. */
+ if (mac_app)
+ mac_command_loop ();
+ else
+#endif /* MPW */
+/* start-sanitize-mpw */
command_loop ();
quit_command ((char *)0, instream == stdin);
}
reinitialize_more_filter ();
old_chain = make_cleanup (command_loop_marker, 0);
command = command_line_input (instream == stdin ? prompt : (char *) NULL,
- instream == stdin);
+ instream == stdin, "prompt");
if (command == 0)
return;
execute_command (command, instream == stdin);
character position to be off, since the newline we read from
the user is not accounted for. */
fputs_unfiltered (prrompt, gdb_stdout);
+/* start-sanitize-mpw */
+#ifdef MPW
+ /* Move to a new line so the entered line doesn't have a prompt
+ on the front of it. */
+ fputs_unfiltered ("\n", gdb_stdout);
+#endif /* MPW */
+/* end-sanitize-mpw */
gdb_flush (gdb_stdout);
}
simple input as the user has requested. */
char *
-command_line_input (prrompt, repeat)
+command_line_input (prrompt, repeat, annotation_suffix)
char *prrompt;
int repeat;
+ char *annotation_suffix;
{
static char *linebuffer = 0;
static unsigned linelength = 0;
char *nline;
char got_eof = 0;
- if (annotation_level > 1 && prrompt != NULL)
+ if (annotation_level > 1 && instream == stdin)
{
- local_prompt = alloca (strlen (prrompt) + 20);
- strcpy (local_prompt, prrompt);
- strcat (local_prompt, "\n\032\032prompt\n");
+ local_prompt = alloca ((prrompt == NULL ? 0 : strlen (prrompt))
+ + strlen (annotation_suffix) + 40);
+ if (prrompt == NULL)
+ local_prompt[0] = '\0';
+ else
+ strcpy (local_prompt, prrompt);
+ strcat (local_prompt, "\n\032\032");
+ strcat (local_prompt, annotation_suffix);
+ strcat (local_prompt, "\n");
}
if (linebuffer == 0)
}
if (annotation_level > 1 && instream == stdin)
- printf_unfiltered ("\n\032\032pre-prompt\n");
+ {
+ printf_unfiltered ("\n\032\032pre-");
+ printf_unfiltered (annotation_suffix);
+ printf_unfiltered ("\n");
+ }
/* Don't use fancy stuff if not talking to stdin. */
if (command_editing_p && instream == stdin
rl = gdb_readline (local_prompt);
if (annotation_level > 1 && instream == stdin)
- printf_unfiltered ("\n\032\032post-prompt\n");
+ {
+ printf_unfiltered ("\n\032\032post-");
+ printf_unfiltered (annotation_suffix);
+ printf_unfiltered ("\n");
+ }
if (!rl || rl == (char *) EOF)
{
if (expanded < 0)
{
free (history_value);
- return command_line_input (prrompt, repeat);
+ return command_line_input (prrompt, repeat, annotation_suffix);
}
if (strlen (history_value) > linelength)
{
&& ISATTY (stdin) && *linebuffer)
add_history (linebuffer);
- /* Note: lines consisting soley of comments are added to the command
+ /* Note: lines consisting solely of comments are added to the command
history. This is useful when you type a command, and then
realize you don't want to execute it quite yet. You can comment
out the command and then later fetch it from the value history
while (1)
{
dont_repeat ();
- p = command_line_input ((char *) NULL, instream == stdin);
+ p = command_line_input ((char *) NULL, instream == stdin, "commands");
if (p == NULL)
/* Treat end of file like "end". */
break;
# This is essentially the header file directory for the library
# routines in libiberty.
INCLUDE_DIR = "{srcroot}"include
-INCLUDE_CFLAGS = -i {INCLUDE_DIR} -i {INCLUDE_DIR}:mpw -i ::extra-include -i "{srcroot}"bfd
+INCLUDE_CFLAGS = -i {INCLUDE_DIR} -i {INCLUDE_DIR}:mpw -i ::extra-include -i "{srcroot}"bfd -i "{srcroot}"readline
# Where is the "-liberty" library, containing getopt and obstack?
LIBIBERTY = ::libiberty:libiberty.o
BFD_CFLAGS = -i {BFD_DIR} -i {BFD_SRC}
# Where is the READLINE library? Typically in ::readline.
-#READLINE_DIR = ::readline
+READLINE_DIR = ::readline
READLINE = {READLINE_DIR}:libreadline.o
-READLINE_DISABLE = -d NO_READLINE
-#READLINE_SRC = "{srcdir}"{READLINE_DIR}
-#READLINE_CFLAGS = -i {READLINE_SRC}
-READLINE_CFLAGS = {READLINE_DISABLE}
+#READLINE_DISABLE = -d NO_READLINE
+READLINE_SRC = "{srcdir}"{READLINE_DIR}
+READLINE_CFLAGS = -i {READLINE_SRC}
+#READLINE_CFLAGS = {READLINE_DISABLE}
# Opcodes currently live in one of two places. Either they are in the
# opcode library, typically ::opcodes, or they are in a header file
"{o}"c-valprint.c.o "{o}"cp-valprint.c.o "{o}"ch-valprint.c.o "{o}"m2-valprint.c.o "{o}"nlmread.c.o \Option-d
"{o}"serial.c.o "{o}"mdebugread.c.o
-TSOBS = "{o}"inflow.c.o
+TSOBS =
NTSOBS = "{o}"standalone.c.o
# .c.o \Option-f
# {CC} -c {INTERNAL_CFLAGS} $<
-all \Option-f gdb
+all \Option-f gdb MacGDB
# @{MAKE} {FLAGS_TO_PASS} DO=all "DODIRS=`echo {SUBDIRS} | sed 's:testsuite::'`" subdir_do
# The check target can not use subdir_do, because subdir_do does not
# install-only is intended to address that need.
install \Option-f all install-only
install-only \Option-f
- Duplicate -i -y gdb "{bindir}"gdb
+ Duplicate -y gdb "{bindir}":gdb
+ Duplicate -y MacGDB "{bindir}":MacGDB
uninstall \Option-f force
Delete -i -y {bindir}:gdb {man1dir}:gdb.1
}
/* Start the printing of an error message. Way to use this is to call
- this, output the error message, and then call
+ this, output the error message (use filtered output), and then call
return_to_top_level (RETURN_ERROR). error() provides a convenient way to
do this for the special case that the error message can be formatted with
a single printf call, but this is more general. */
#else
lines_per_page = 24;
chars_per_line = 80;
+/* start-sanitize-mpw */
+#ifndef MPW
+ /* No termcap under MPW, although might be cool to do something
+ by looking at worksheet or console window sizes. */
+/* end-sanitize-mpw */
/* Initialize the screen height and width from termcap. */
{
char *termtype = getenv ("TERM");
}
}
}
+/* start-sanitize-mpw */
+#endif /* MPW */
+/* end-sanitize-mpw */
#if defined(SIGWINCH) && defined(SIGWINCH_HANDLER)