diff options
Diffstat (limited to 'gdb/=xgdb.msg')
-rw-r--r-- | gdb/=xgdb.msg | 997 |
1 files changed, 997 insertions, 0 deletions
diff --git a/gdb/=xgdb.msg b/gdb/=xgdb.msg new file mode 100644 index 0000000..ac32300 --- /dev/null +++ b/gdb/=xgdb.msg @@ -0,0 +1,997 @@ +From beatty@unh.cs.cmu.edu Sat Jul 4 12:04:01 1987 +Received: by PREP.AI.MIT.EDU; Sat, 4 Jul 87 12:03:37 EDT +Message-Id: <8707041603.AA08600@prep.ai.mit.edu> +To: phr@prep.ai.mit.edu (Paul Rubin) +Date: Sat, 4 Jul 87 12:03:01 EDT +From: Derek Beatty <beatty@unh.cs.cmu.edu> +Subject: Re: gdb and X (msg 1 of 3) +Status: R + +This is part 1 of 3 parts. It consists of the cursor I used, and a message +I sent to Zalman Stern at Andrew regarding what I did, and why. The +code and context diffs will follow in other messages. + +#define gdb_width 16 +#define gdb_height 16 +#define gdb_x_hot 7 +#define gdb_y_hot 0 +static short gdb_bits[] = { + 0x0000, 0x0140, 0x0220, 0x0220, + 0x23e2, 0x13e4, 0x09c8, 0x0ff8, + 0x0220, 0x3ffe, 0x0630, 0x03e0, + 0x0220, 0x1ffc, 0x2632, 0x01c0}; + +#define gdb_mask_width 16 +#define gdb_mask_height 16 +#define gdb_mask_x_hot 7 +#define gdb_mask_y_hot 0 +static short gdb_mask_bits[] = { + 0x0360, 0x07f0, 0x07f0, 0x77f7, + 0x7fff, 0x7fff, 0x1ffc, 0x1ffc, + 0x7fff, 0x7fff, 0x7fff, 0x0ff8, + 0x3ffe, 0x7fff, 0x7fff, 0x7fff}; + +> +> The X support I added is minimal; it was inspired by Suntools' dbxtool, +> together with the availability of the V10 implementation of the X V11 +> toolkit specification. Design was guided by simplicity and the facilities +> of the toolkit. The debugger window provides a view into the code +> corresponding to the current stack frame, and several buttons for the +> breakpoint, print, step, next, continue, finish, up, and down commands. +> The standard gdb command interface remains available in the tty window from +> which gdb was started. The breakpoint and print buttons make use of the +> current selection, so you can do simple things like click at text in the +> source window, then click the "Go 'til" button to continue until that +> point. +> +> Such an interface is simple to program ( ~ 20 hours, about 700 lines), +> but it has some drawbacks. First, I didn't take the time to understand +> the longjmp's in gdb, and I'm not exactly happy with the idea of them +> jumping out of my callback procedures that were invoked by toolkit routines. +> There's one core dump bug (it shows up when gdb can't find a source +> file) that I haven't tracked down, and it may be related to this. Second, +> selection in the text window is not particularly graceful: double-clicking +> highlights one word of text, as the toolkit defines a word. It would +> be much more graceful were double-clicking to highlight a C identifier. +> Finally, and most seriously, most buttons operate by building textual +> command lines and passing them to gdb's execute_command function. This +> means that all selected expressions are evaluated and printed in the +> lexical scope corresponding to the current stack frame, although the +> selected text may be in a different lexical scope. This serious bug would +> require work to fix. +> +> I wrote the X support out of frustration at not having dbxtool available +> when I work on a vax. The hope of portability to V11 via the toolkit +> also helped motivate me to write V10 code at this late date. Finally, +> I'd never written any nontrivial code that ran on a windowing system +> (although that turns out still to be the case). Were I to make a more +> serious effort at this project, I would probably add a general "define-button" +> command akin to gdb's "define" command. +> +> Look in /usr/beatty/gnu/gdb on vlsi.cs.cmu.edu. All files I have modified +> are marked, and also have associated backups (.B extensions). Bennet +> Yee has a copy of the toolkit library; see /usr/bsy/Xtlib on f.gp.cs.cmu.edu. +> +> -- Derek +> + + -- Derek Beatty + +From beatty@unh.cs.cmu.edu Sat Jul 4 12:12:47 1987 +Received: by PREP.AI.MIT.EDU; Sat, 4 Jul 87 12:09:20 EDT +Message-Id: <8707041609.AA08643@prep.ai.mit.edu> +To: phr@PREP.AI.MIT.EDU (Paul Rubin) +Date: Sat, 4 Jul 87 12:07:25 EDT +From: Derek Beatty <beatty@unh.cs.cmu.edu> +Subject: Re: gdb and X (msg 2 of 3) +In-Reply-To: Message from "Paul Rubin" of Jul 4, 87 at 1:22 am +Status: R + +The following is "tool.c". I hereby grant permission to do anything you +like with it. + + -- Derek Beatty + +[nosave] +/* + * gdb tool for X V10R4 (using V11-compatible toolkit). + * Derek Beatty 30 June 87. + */ +#include <X/Xlib.h> +#include <X/Xt/Xtlib.h> +#include <stdio.h> + +#include "defs.h" +#include "symtab.h" + +#include "gdb.cursor" +#include "gdb_mask.cursor" + + + +/* forward refs */ + +static Window createFileText(); +/* + * Windows manipulated by this package. + */ + +static Window + icon, + frame, + srcLabelStrip, + srcText, + ctlPanel, + execLabelStrip; + +static Cursor curse; + +/* + * Source text display. + */ + +static struct symtab *displayedSymtab= 0; + +extern struct symtab *current_source_symtab; +extern int current_source_line; + +toolDisplaySource() +{ + char *fullName; + static Arg labelArgs[1]; + int linenumbers_changed= 0; + static int newWidget= 1; + + struct symtab_and_line get_selected_frame_sal(); + struct symtab_and_line sal; + + /* we could be called before we are initialized */ + if (!frame) return; + + sal= get_selected_frame_sal(); + + /* strictly this is wrong, but better than a blank display */ + if (sal.symtab==NULL) { + sal.symtab= current_source_symtab; + /* current_source_line may be off by a small number like 4 */ + sal.line= current_source_line; + } + + /* + * Switch to a new file if necessary. + */ + + if (sal.symtab) + linenumbers_changed= get_filename_and_charpos(sal.symtab, + sal.line, + &fullName); + if (!fullName) sal.symtab= NULL; + /* if the display may be wrong, destroy it */ + if (linenumbers_changed || displayedSymtab != sal.symtab) { + XtVPanedWindowDeletePane( srcText); + XtSendDestroyNotify( srcText); + XDestroyWindow( srcText); + srcText= 0; + } + /* if there's no display, create one */ + if (!srcText) { + newWidget= 1; + /* if there's no valid display, create a dummy display */ + if (!sal.symtab ) { + displayedSymtab= NULL; + srcText= createFileText(frame, "/dev/null"); + XtVPanedWindowAddPane(frame, srcText, 1, 20, 1000, 1); + /* create /dev/null text widget */ + XtSetArg(labelArgs[0], XtNlabel, "No source displayed."); + XtLabelSetValues(srcLabelStrip, labelArgs, XtNumber(labelArgs)); + } else { + displayedSymtab= sal.symtab; + srcText= createFileText(frame, fullName); + XtVPanedWindowAddPane(frame, srcText, 1, 20, 1000, 1); + XtSetArg(labelArgs[0], XtNlabel, fullName); + XtLabelSetValues(srcLabelStrip, labelArgs, XtNumber(labelArgs)); + /* free filename (maybe: check gdb code!) */ + } + } + + /* + * Update display and cursor positions as necessary. + * Cursor should be placed on line sal.line. + */ + + { + static int prevTop= 0, highWaterMark= 0; + int currentTop; + Arg textArgs[1]; + + /* get positions of start of display, and caret */ + XtSetArg(textArgs[0], XtNdisplayPosition, NULL); + XtTextGetValues(srcText, textArgs, XtNumber(textArgs)); + currentTop= cvtCharToLine(displayedSymtab, + (int) textArgs[0].value); + + highWaterMark += currentTop - prevTop; + + if ( sal.line < currentTop + || sal.line > highWaterMark + || newWidget) { + + /* warp the display */ + + newWidget= 0; + + /* yes, these magic numbers are ugly, but I don't know how + * to get the height of a text widget in a V11-portable way + */ + currentTop= (sal.line > 15) ? sal.line - 15 : 0; + highWaterMark= currentTop + 35; + + XtSetArg(textArgs[0], XtNdisplayPosition, + cvtLineToChar(displayedSymtab, currentTop)); + XtTextSetValues(srcText, textArgs, XtNumber(textArgs)); + } + XtSetArg(textArgs[0], XtNinsertPosition, + cvtLineToChar(displayedSymtab, sal.line)); + XtTextSetValues(srcText, textArgs, XtNumber(textArgs)); + + prevTop= currentTop; + } +} + +/* return the character position of a line */ +int +cvtLineToChar( s, line) + struct symtab *s; + int line; +{ + if (!s) return 0; + if (!s->line_charpos) return 0; + if (line < 0) line= 0; + if (line > s->nlines) line= s->nlines; + return *(s->line_charpos + line-1); +} + +/* return the line position of a character */ +int +cvtCharToLine( s, chr) + register struct symtab *s; + register int chr; +{ + register int lineNumber= 0; + register int *lnp; + + if (!s) return 0; + lnp= s->line_charpos; + /* files are usually short, so sequential search is Ok */ + while ( lineNumber < s->nlines && *lnp <= chr) { + lineNumber++; + lnp++; + } + if (lineNumber >= s->nlines) + lineNumber= s->nlines; + return lineNumber; +} + +/* + * title bar at bottom + */ + +static char *execFileName; + +toolSetExecFile(s) + char *s; +{ + execFileName= s; + if (execLabelStrip) { + static Arg labelArgs[1]; + + XtSetArg(labelArgs[0], XtNlabel, execFileName); + XtLabelSetValues(execLabelStrip, labelArgs, XtNumber(labelArgs)); + } +} + +/* + * Command line into which command are placed for execution. + * There's some ugly interaction between this and readline in main.c. + */ +extern char *line; +extern int linesize; + +/* + * Do any necessary prompting, etc. + */ +static char *gdbPrompt; + +static void +printPrompt() +{ + if (gdbPrompt) { + printf("%s", gdbPrompt); + fflush(stdout); + } +} + +/* + * Callback procedures for control panel. + */ + +/* used by "print" and "print*" buttons */ +static void printButnProc_1( starflag) + int starflag; +{ + int selnLen; + char *seln; + + char *cmd= starflag ? "print * " : "print "; + register int cmdlen= strlen(cmd); + + seln= XFetchBytes(&selnLen); + if (selnLen) { + if (selnLen+cmdlen >= linesize-1) { + linesize= (selnLen+cmdlen > linesize*2-1) ? selnLen+cmdlen+1 : linesize*2; + line= (char *) xrealloc(line, linesize); + } + strcpy(line, cmd); + strncpy(line+cmdlen, seln, selnLen); + *(line+cmdlen+selnLen)= '\0'; + execute_command(line, 0); + free(seln); + } + printPrompt(); +} + +static void printButnProc() +{ + printButnProc_1( 0); +} + +static void printStarButnProc() +{ + printButnProc_1( 1); +} + +static void nextButnProc() +{ + strcpy(line, "next"); + execute_command(line, 0); + toolDisplaySource(); + printPrompt(); +} + +static void stepButnProc() +{ + strcpy(line, "step"); + execute_command(line, 0); + toolDisplaySource(); + printPrompt(); +} + +static void contButnProc() +{ + strcpy(line, "cont"); + execute_command(line, 0); + toolDisplaySource(); + printPrompt(); +} + +static void finButnProc() +{ + strcpy(line, "finish"); + execute_command(line, 0); + toolDisplaySource(); + printPrompt(); +} + +/* used by "stop at" and "go till" buttons */ +static void stopAtButnProc_1( gotillFlag) + int gotillFlag; +{ + XtTextPosition start, finish; + static int lineNumber; + + XtTextGetSelectionPos(srcText, &start, &finish); + if (!displayedSymtab) + printf("No source file displayed.\n"); + else { + break_command_for_tool( displayedSymtab, + cvtCharToLine(displayedSymtab, start), + gotillFlag); + if (gotillFlag) { + strcpy(line, "cont"); + execute_command(line, 0); + toolDisplaySource(); + } + } + printPrompt(); +} + +static void stopAtButnProc() +{ + stopAtButnProc_1( 0); +} + +static void untilButnProc() +{ + stopAtButnProc_1( 1); +} + +/* decide if a character is trash */ +static int +garbage(c) + char c; +{ + if ('a' <= c && c <= 'z') return 0; + if ('A' <= c && c <= 'Z') return 0; + if ('0' <= c && c <= '9') return 0; + if (c == '_') return 0; + return 1; +} + +static void stopInButnProc() +{ + static int selnLen; + static char *seln; + char *sp, *selnp; + + seln= XFetchBytes(&selnLen); + if (selnLen) { + if (selnLen+6 >= linesize-1) { + linesize= (selnLen+6 > linesize*2-1) ? selnLen+7 : linesize*2; + line= (char *) xrealloc(line, linesize); + } + strcpy(line, "break "); + /* copy selection but not garbage */ + selnp= seln; + sp= line+strlen(line); + while (garbage(*selnp) && selnLen) selnp++, selnLen--; + while (!garbage(*selnp) && selnLen) { + *sp++= *selnp++; + selnLen--; + } + *sp= '\0'; + execute_command(line, 0); + free(seln); + } + printPrompt(); +} + +static void deIconifyButnProc() +{ + XUnmapWindow(icon); + XMapWindow(frame); +} + +static void iconifyButnProc() +{ + static Arg iconArgs[1]; + XtSetArg(iconArgs[0], XtNlabel, gdbPrompt); + XtCommandSetValues(icon, iconArgs, XtNumber(iconArgs)); + XUnmapWindow(frame); + XMapWindow(icon); +} + +static void upButnProc() +{ + strcpy(line, "up"); + execute_command(line, 0); + toolDisplaySource(); + printPrompt(); +} + +static void downButnProc() +{ + strcpy(line, "down"); + execute_command(line, 0); + toolDisplaySource(); + printPrompt(); +} + +#define addbutton(w) XtSetArg(buttons[buttoncount], XtNwindow, w); \ + buttoncount++; +static Arg buttons[20]; +static int buttoncount= 0; + +/* + * Create control panel buttons. + */ +static createButtons(parent) + Window parent; +{ + static Window button; + static Arg commandArgs[2]; + +#define crButn(label,fn) \ + XtSetArg(commandArgs[0], XtNlabel, label);\ + XtSetArg(commandArgs[1], XtNfunction, fn);\ + button= XtCommandCreate(parent, commandArgs, XtNumber(commandArgs));\ + addbutton(button); + + crButn("Brk At", stopAtButnProc); + crButn("Brk In", stopInButnProc); + crButn("Go 'til", untilButnProc); + + crButn("Print", printButnProc); + crButn("Print*", printStarButnProc); + + crButn("Next", nextButnProc); + crButn("Step", stepButnProc); + crButn("Cont", contButnProc); + crButn("Finish", finButnProc); + + crButn("Up", upButnProc); + crButn("Down", downButnProc); + + crButn("Iconify", iconifyButnProc); +#undef crButn +} + +static Window createLabel(parent, name, label) + Window parent; + char *name, *label; +{ + static Arg labelArgs[2]; + + XtSetArg(labelArgs[0], XtNname, name); + XtSetArg(labelArgs[1], XtNlabel, label); + return XtLabelCreate(frame, labelArgs, XtNumber(labelArgs)); +} + +static Window createFileText( parent, filename) + Window parent; + char *filename; +{ + static Arg fileArgs[2]; + + XtSetArg(fileArgs[0], XtNfile, filename); + XtSetArg(fileArgs[1], XtNtextOptions, scrollVertical); + return XtTextDiskCreate(parent, fileArgs, XtNumber(fileArgs)); +} + +/***************** Externally referenced routine **************/ +int createTool() +{ + static Arg frameArgs[]= { + {XtNwidth, (XtArgVal) 600}, + {XtNheight, (XtArgVal) 700}, + }; + + ResourceDataBase db; + FILE *rdbFile; + + /* + * init and database stuff... this is wrong but what the heck + */ + if (XOpenDisplay("") == NULL) + return 0; + printf("Initializing tool..."); fflush(stdout); + XtInitialize(); + /* should be checking .Xdefaults in $HOME */ + if ((rdbFile= fopen(".Xresources", "r")) != NULL) { + XtGetDataBase(rdbFile, &db); + XtSetCurrentDataBase(db); + fclose(rdbFile); + } + + /* + * create the frame + */ + frame= XtVPanedWindowCreate(RootWindow, frameArgs, XtNumber(frameArgs)); + + /* create source label strip and add to frame */ + srcLabelStrip= createLabel(frame, "Source File", "No source file yet."); + XtVPanedWindowAddPane(frame, srcLabelStrip, 0, 15, 15, 0); + + /* create text widget and add to frame */ + srcText= createFileText(frame, "/dev/null"); + XtVPanedWindowAddPane(frame, srcText, 1, 20, 1000, 1); + + /* create button box */ + ctlPanel= XtButtonBoxCreate(frame, NULL, 0); + createButtons( ctlPanel); + XtButtonBoxAddButton(ctlPanel, buttons, buttoncount); + XtVPanedWindowAddPane(frame, ctlPanel, 2, 30, 30, 0); + + /* create exec label strip and add */ + execLabelStrip= createLabel(frame, "Executable", + execFileName ? execFileName : "No executable specified."); + XtVPanedWindowAddPane(frame, execLabelStrip, 3, 15, 15, 0); + + + /* create icon */ + { + static Arg iconArgs[2]; + XtSetArg(iconArgs[0], XtNlabel, "(gdb)"); + XtSetArg(iconArgs[1], XtNfunction, deIconifyButnProc); + icon= XtCommandCreate(RootWindow, iconArgs, XtNumber(iconArgs)); + XMoveWindow(icon, 100, 100); /* HACK */ + XSetIconWindow(frame, icon); + } + + /* throw it onto the display */ + curse= XCreateCursor(gdb_width, gdb_height, gdb_bits, gdb_mask_bits, + gdb_x_hot, gdb_y_hot, + BlackPixel, WhitePixel, GXcopy); + XDefineCursor(frame, curse); + XDefineCursor(icon, curse); + XMapWindow(frame); + XMapSubwindows(frame); + XFlush(); + printf("done\n"); + return 1; +} + +/**************** Externally referenced routine. ***********/ +/* toolDispatcher -- dispatch events until data is available on fp */ +toolDispatcher(fp, prompt) + FILE *fp; + char *prompt; +{ + int inMask= 1 << fileno(fp); + int xMask= 1 << dpyno(); + int rfds= 0; + int nfds; + XEvent ev; + int pend; + + gdbPrompt= prompt; + + while (! (rfds & inMask)) { + pend= XPending(); + if (!pend) { + rfds= inMask | xMask; + /* this isn't right for 4.3 but it works 'cuz of 4.2 compatibility */ + nfds= select( 32, &rfds, 0, 0, (struct timeval *) 0); + } + if (pend || rfds & xMask) { + XNextEvent(&ev); + XtDispatchEvent(&ev); + } + } +} + +From beatty@unh.cs.cmu.edu Sat Jul 4 12:17:44 1987 +Received: by PREP.AI.MIT.EDU; Sat, 4 Jul 87 12:15:18 EDT +Message-Id: <8707041615.AA08691@prep.ai.mit.edu> +To: phr@PREP.AI.MIT.EDU (Paul Rubin) +Date: Sat, 4 Jul 87 12:14:08 EDT +From: Derek Beatty <beatty@unh.cs.cmu.edu> +Subject: Re: gdb and X (msg 3 of 3) +In-Reply-To: Message from "Paul Rubin" of Jul 4, 87 at 1:22 am +Status: R + +Context diffs follow. The original files are from GDB 2.1 (emacs distribution +18.40). + + -- Derek Beatty +[nosave] +*** /usr/misc/.gdb/src/core.c Fri Mar 27 12:20:14 1987 +--- core.c Sat Jul 4 11:12:16 1987 +*************** +*** 1,3 + /* Work with core dump and executable files, for GDB. + Copyright (C) 1986, 1987 Free Software Foundation, Inc. + + +--- 1,5 ----- ++ /* modified by Beatty 1 Jul 87 for gdb tool. */ ++ + /* Work with core dump and executable files, for GDB. + Copyright (C) 1986, 1987 Free Software Foundation, Inc. + +*************** +*** 257,262 + } + else if (from_tty) + printf ("No exec file now.\n"); + } + + /* If we have both a core file and an exec file, + +--- 259,267 ----- + } + else if (from_tty) + printf ("No exec file now.\n"); ++ #ifdef TOOL ++ toolSetExecFile( filename ? filename : "No executable specified.\n"); ++ #endif /* def TOOL */ + } + + /* If we have both a core file and an exec file, +*** /usr/misc/.gdb/src/breakpoint.c Fri Mar 27 12:20:11 1987 +--- breakpoint.c Wed Jul 1 11:27:31 1987 +*************** +*** 1,3 + /* Everything about breakpoints, for GDB. + Copyright (C) 1986, 1987 Free Software Foundation, Inc. + + +--- 1,5 ----- ++ /* modified by Beatty 1 Jul 87 for gdbtool */ ++ + /* Everything about breakpoints, for GDB. + Copyright (C) 1986, 1987 Free Software Foundation, Inc. + +*************** +*** 513,518 + break; + } + } + + /* Set a breakpoint according to ARG (function, linenum or *address) + and make it temporary if TEMPFLAG is nonzero. */ + +--- 515,571 ----- + break; + } + } ++ ++ #ifdef TOOL ++ /* set a breakpoint from a symtab and line */ ++ void break_command_for_tool( s, line, tempflag) ++ struct symtab *s; ++ int line; ++ int tempflag; ++ { ++ register struct breakpoint *b; ++ struct symtab_and_line sal; ++ ++ sal.symtab= s; ++ sal.line= line; ++ sal.pc= find_line_pc( sal.symtab, sal.line); ++ if (sal.pc==0) { ++ error("No line %d in file \"%s\".\n", sal.line, sal.symtab->filename); ++ } else { ++ b= set_raw_breakpoint( sal); ++ b->number= ++breakpoint_count; ++ b->cond= 0; ++ if (tempflag) ++ b->enable= temporary; ++ ++ printf ("Breakpoint %d at 0x%x", b->number, b->address); ++ if (b->symtab) ++ printf (": file %s, line %d.", b->symtab->filename, b->line_number); ++ printf ("\n"); ++ ++ { ++ int others = 0; ++ ALL_BREAKPOINTS (b) ++ if (b->address == sal.pc && b->number != breakpoint_count) ++ others++; ++ if (others > 0) ++ { ++ printf ("Note: breakpoint%s ", (others > 1) ? "s" : ""); ++ ALL_BREAKPOINTS (b) ++ if (b->address == sal.pc && b->number != breakpoint_count) ++ { ++ others--; ++ printf ("%d%s%s ", ++ b->number, ++ (b->enable == disabled) ? " (disabled)" : "", ++ (others > 1) ? "," : ((others == 1) ? " and" : "")); ++ } ++ printf (" also set at pc 0x%x\n", sal.pc); ++ } ++ } ++ } ++ } ++ #endif /* def TOOL */ + + /* Set a breakpoint according to ARG (function, linenum or *address) + and make it temporary if TEMPFLAG is nonzero. */ +*** /usr/misc/.gdb/src/main.c Fri Mar 27 12:20:45 1987 +--- main.c Sat Jul 4 11:13:32 1987 +*************** +*** 1,3 + /* Top level for GDB, the GNU debugger. + Copyright (C) 1986, 1987 Free Software Foundation, Inc. + + +--- 1,5 ----- ++ /* modified by Beatty 30 june 87 for gdb tool */ ++ + /* Top level for GDB, the GNU debugger. + Copyright (C) 1986, 1987 Free Software Foundation, Inc. + +*************** +*** 42,47 + + FILE *instream; + + void free_command_lines (); + char *read_line (); + static void initialize_main (); + +--- 44,54 ----- + + FILE *instream; + ++ #ifdef TOOL ++ /* flag indicating whether we are running in a window system */ ++ int isaTool= 0; ++ #endif /* def TOOL */ ++ + void free_command_lines (); + char *read_line (); + static void initialize_main (); +*************** +*** 214,219 + + while (1) + { + if (!setjmp (to_top_level)) + command_loop (); + clearerr (stdin); /* Don't get hung if C-d is typed. */ + +--- 221,232 ----- + + while (1) + { ++ ++ #ifdef TOOL ++ if (!isaTool) ++ isaTool= createTool(); ++ #endif /* def TOOL */ ++ + if (!setjmp (to_top_level)) + command_loop (); + clearerr (stdin); /* Don't get hung if C-d is typed. */ +*************** +*** 270,275 + printf ("%s", prompt); + fflush (stdout); + + quit_flag = 0; + execute_command (read_line (instream == stdin), instream == stdin); + /* Do any commands attached to breakpoint we stopped at. */ + +--- 283,294 ----- + printf ("%s", prompt); + fflush (stdout); + ++ #ifdef TOOL ++ toolDisplaySource(); ++ if (isaTool) toolDispatcher(instream, ++ instream==stdin ? prompt : NULL); ++ #endif /* def TOOL */ ++ + quit_flag = 0; + execute_command (read_line (instream == stdin), instream == stdin); + /* Do any commands attached to breakpoint we stopped at. */ +*************** +*** 320,325 + + while (1) + { + c = fgetc (instream); + if (c == -1 || c == '\n') + break; + +--- 339,345 ----- + + while (1) + { ++ + c = fgetc (instream); + if (c == -1 || c == '\n') + break; +*************** +*** 765,770 + GDB is free software and you are welcome to distribute copies of it\n\ + under certain conditions; type \"info copying\" to see the conditions.\n", + version); + } + + static void + +--- 785,793 ----- + GDB is free software and you are welcome to distribute copies of it\n\ + under certain conditions; type \"info copying\" to see the conditions.\n", + version); ++ #ifdef TOOL ++ printf( "(CMU X support is available in this version.)\n"); ++ #endif + } + + static void +*** /usr/misc/.gdb/src/source.c Fri Mar 27 12:20:50 1987 +--- source.c Wed Jul 1 17:56:58 1987 +*************** +*** 1,3 + /* List lines of source files for GDB, the GNU debugger. + Copyright (C) 1986, 1987 Free Software Foundation, Inc. + + +--- 1,5 ----- ++ /* modified 1 July 87 by Beatty for gdbtool */ ++ + /* List lines of source files for GDB, the GNU debugger. + Copyright (C) 1986, 1987 Free Software Foundation, Inc. + +*************** +*** 295,300 + s->nlines = nlines; + s->line_charpos = (int *) xrealloc (line_charpos, nlines * sizeof (int)); + } + + /* Print source lines from the file of symtab S, + starting with line number LINE and stopping before line number STOPLINE. */ + +--- 297,328 ----- + s->nlines = nlines; + s->line_charpos = (int *) xrealloc (line_charpos, nlines * sizeof (int)); + } ++ ++ #ifdef TOOL ++ /* Get full pathname and line number positions for a symtab ++ * return nonzero if line numbers may have changed ++ * set full pathname to NULL if no file found ++ */ ++ int ++ get_filename_and_charpos(s, line, fullname) ++ struct symtab *s; ++ int line; ++ char **fullname; ++ { ++ register int desc, linenums_changed= 0; ++ ++ desc= openp(source_path, 0, s->filename, O_RDONLY, 0, fullname); ++ if (desc < 0) { ++ *fullname= NULL; ++ return 0; ++ } ++ if (s->line_charpos==0) linenums_changed= 1; ++ if (linenums_changed) find_source_lines(s, desc); ++ close(desc); ++ return linenums_changed; ++ } ++ #endif /* def TOOL */ ++ + + /* Print source lines from the file of symtab S, + starting with line number LINE and stopping before line number STOPLINE. */ +*** /usr/misc/.gdb/src/stack.c Fri Mar 27 12:20:51 1987 +--- stack.c Wed Jul 1 17:27:34 1987 +*************** +*** 1,3 + /* Print and select stack frames for GDB, the GNU debugger. + Copyright (C) 1986, 1987 Free Software Foundation, Inc. + + +--- 1,5 ----- ++ /* modified by Beatty 1 Jul 87 for gdbtool */ ++ + /* Print and select stack frames for GDB, the GNU debugger. + Copyright (C) 1986, 1987 Free Software Foundation, Inc. + +*************** +*** 42,47 + static void select_calling_frame (); + + void print_frame_info (); + + /* Print a stack frame briefly. FRAME should be the frame address + and LEVEL should be its level in the stack (or -1 for level not defined). + +--- 44,62 ----- + static void select_calling_frame (); + + void print_frame_info (); ++ ++ #ifdef TOOL ++ /* get symtab and line of selected frame, for tool display */ ++ struct symtab_and_line ++ get_selected_frame_sal() ++ { ++ struct frame_info fi; ++ ++ fi= get_frame_info( selected_frame); ++ return find_pc_line(fi.pc, fi.next_frame); ++ } ++ ++ #endif /* TOOL */ + + /* Print a stack frame briefly. FRAME should be the frame address + and LEVEL should be its level in the stack (or -1 for level not defined). +End of context diffs. The presence of this line verifies that this message +has not been truncated. + |