diff options
| author | svn2git <svn2git@FreeBSD.org> | 1994-05-01 08:00:00 +0000 | 
|---|---|---|
| committer | svn2git <svn2git@FreeBSD.org> | 1994-05-01 08:00:00 +0000 | 
| commit | a16f65c7d117419bd266c28a1901ef129a337569 (patch) | |
| tree | 2626602f66dc3551e7a7c7bc9ad763c3bc7ab40a /gnu/gdb/xgdb/xgdb.c | |
| parent | 8503f4f13f77abf7adc8f7e329c6f9c1d52b6a20 (diff) | |
Diffstat (limited to 'gnu/gdb/xgdb/xgdb.c')
| -rw-r--r-- | gnu/gdb/xgdb/xgdb.c | 700 | 
1 files changed, 0 insertions, 700 deletions
| diff --git a/gnu/gdb/xgdb/xgdb.c b/gnu/gdb/xgdb/xgdb.c deleted file mode 100644 index 2a08d1be61f7..000000000000 --- a/gnu/gdb/xgdb/xgdb.c +++ /dev/null @@ -1,700 +0,0 @@ -/*- - * This code is derived from software copyrighted by the Free Software - * Foundation. - * - * Modified 1991 by Donn Seeley at UUNET Technologies, Inc. - * Modified 1990 by Van Jacobson at Lawrence Berkeley Laboratory. - * - * static char rcsid[] = "$Header: /a/cvs/386BSD/src/gnu/gdb/xgdb/xgdb.c,v 1.1 1993/06/29 09:48:26 nate Exp $"; - */ - -#ifndef lint -static char sccsid[] = "@(#)xgdb.c	6.3 (Berkeley) 5/8/91"; -#endif /* not lint */ - -/* - * Interface from GDB to X windows. Copyright (C) 1987 Free Software - * Foundation, Inc. - *  - * GDB is distributed in the hope that it will be useful, but WITHOUT ANY - * WARRANTY.  No author or distributor accepts responsibility to anyone for - * the consequences of using it or for whether it serves any particular - * purpose or works at all, unless he says so in writing. Refer to the GDB - * General Public License for full details. - *  - * Everyone is granted permission to copy, modify and redistribute GDB, but only - * under the conditions described in the GDB General Public License.  A copy - * of this license is supposed to have been given to you along with GDB so - * you can know your rights and responsibilities.  It should be in a file - * named COPYING.  Among other things, the copyright notice and this notice - * must be preserved on all copies. - *  - * In other words, go ahead and share GDB, but don't try to stop anyone else - * from sharing it farther.  Help stamp out software hoarding! - */ - -/* - * Original version was contributed by Derek Beatty, 30 June 87. - * This version is essentially a re-write of the original by Van - * Jacobson (van@helios.ee.lbl.gov), Nov, 90. - */ - -#include "defs.h" -#include "param.h" -#include "symtab.h" -#include "frame.h" - -extern int stop_breakpoint; - -#include <X11/IntrinsicP.h> -#include <X11/StringDefs.h> -#include <X11/Xaw/AsciiSink.h> -#include <X11/Xaw/AsciiText.h> -#include <X11/Xaw/Box.h> -#include <X11/Xaw/Command.h> -#include <X11/Xaw/Label.h> -#include <X11/Xaw/Paned.h> -#include <X11/Xaw/Text.h> - -#include <stdio.h> -#include <ctype.h> -#include <sys/file.h> -#include <sys/errno.h> - -extern int errno; -extern char *getenv(); -extern char *malloc(); -extern void bcopy(); -extern int select(); - -extern int get_filename_and_charpos(); -extern int source_line_charpos(); -extern int source_charpos_line(); -extern void execute_command(); -extern void error_no_arg(); -extern void add_com(); - -/* The X display where the window appears.  */ - -static char *displayname; -static Display *display; - -static XtAppContext app_context; - -/* Windows manipulated by this package.  */ - -static Widget main_widget; -static Widget containing_widget; -static Widget source_name_widget; -static Widget source_text_widget; -static Widget button_box_widget; - -/* Source text display.  */ - -static struct frame_info *last_fi; -static CORE_ADDR last_pc; -static struct symtab *last_cur_symtab; -static int last_cur_line; - -static int source_window_line; -static char *source_window_file; -static struct symtab *source_window_symtab; - -static char version_label[64]; -extern char *version; - -/* Forward declarations */ - -static Widget create_text_widget(); - -static int -safe_strcmp(a, b) -	register char *a, *b; -{ -	register int i; - -	if (a == b) -		return (0); -	if (!a && b) -		return (1); -	if (a && !b) -		return (-1); -	return (strcmp(a, b)); -} - - -/* Display an appropriate piece of source code in the source window.  */ - -void -xgdb_display_source() -{ -	char *filename = NULL; -	struct symtab_and_line get_selected_frame_sal(); -	struct symtab_and_line sal; -	struct frame_info *fi; - -	/* Do nothing if called before we are initialized */ - -	if (!containing_widget) -		return; - -	/* -	 * Figure out what to display (the appropriate hooks to tell -	 * us don't exist so we guess):  If there's a current frame -	 * and it or its pc changed from the last time we were here, -	 * display appropriate source line.  Otherwise if the current -	 * source symtab or line is different, display that line. -	 * Otherwise nothing changed so leave the display alone. -	 */ -	fi = get_frame_info(selected_frame); -	if (fi && (fi != last_fi || fi->pc != last_pc)) { -		last_fi = fi; -		last_pc = fi->pc; -		sal = find_pc_line(fi->pc, fi->next_frame); -		if (sal.symtab == NULL) {	/* XXX */ -			sal.symtab = current_source_symtab; -			sal.line = current_source_line; -		} -		current_source_symtab = sal.symtab; -		current_source_line = sal.line; -	} else if (current_source_symtab != last_cur_symtab || -		   current_source_line != last_cur_line) { -		sal.symtab = last_cur_symtab = current_source_symtab; -		sal.line = last_cur_line = current_source_line; -	} else -		return; -	/* -	 * Do a path search and get the exact filename of this source file. -	 * Also scan it and find its source lines if not already done. -	 */ -	if (sal.symtab && filename == NULL) { -		if (get_filename_and_charpos(sal.symtab, sal.line, &filename)) -			/* line numbers may have changed - force highlight */ -			source_window_line = -1; -	} - -	/* -	 * If the source window is wrong, destroy it and make a new one. -	 */ -	if (safe_strcmp(filename, source_window_file)) { -		Arg args[1]; -		Widget src = XawTextGetSource(source_text_widget); - -		if (filename) { -			XtSetArg(args[0], XtNstring, filename); -			XtSetValues(src, args, XtNumber(args)); -			args[0].name = XtNlabel; -			XtSetValues(source_name_widget, args, XtNumber(args)); -		} else { -			XtSetArg(args[0], XtNstring, "/dev/null"); -			XtSetValues(src, args, XtNumber(args)); -			XtSetArg(args[0], XtNlabel, ""); -			XtSetValues(source_name_widget, args, XtNumber(args)); -		} -		if (source_window_file) -			free(source_window_file); -		source_window_file = filename; -		source_window_line = sal.line + 1;  /* force highlight */ -	} -	if (sal.symtab && source_window_line != sal.line) { -		/* -		 * Update display and cursor positions as necessary. -		 * Cursor should be placed on line sal.line. -		 */ -		XawTextPosition l, r; - -		source_window_symtab = sal.symtab; -		source_window_line = sal.line; -		l = source_line_charpos(source_window_symtab, sal.line); -		r = source_line_charpos(source_window_symtab, sal.line + 1); -		if (r < l) -			r = l + 1; -		XawTextSetSelection(source_text_widget, l, r); -		XawTextScrollToLine(source_text_widget, l, 10, 3); -		XawTextSetInsertionPoint(source_text_widget, l); -	} -} - - -/* - * Handlers for buttons. - */ - -static int -current_lineno() -{ -	XawTextPosition start, finish; - -	XawTextGetSelectionPos(source_text_widget, &start, &finish); -	if (start >= finish) -		start = XawTextGetInsertionPoint(source_text_widget); - -	return (source_charpos_line(source_window_symtab, start)); -} - -static char * -append_selection(cp) -	char *cp; -{ -	int len; -	XawTextPosition l, r; - -	XawTextGetSelectionPos(source_text_widget, &l, &r); -	if ((len = r - l) > 0) { -		Widget src = XawTextGetSource(source_text_widget); - -		while (len > 0) { -			XawTextBlock tb; - -			XawTextSourceRead(src, l, &tb, len); -			bcopy(tb.ptr, cp, tb.length); -			cp += tb.length; -			len -= tb.length; -		} -		if (cp[-1] == 0) -			--cp; -	} -	return (cp); -} - -static char * -append_selection_word(cp) -	register char *cp; -{ -	register int len; -	XawTextPosition l, r; -	XawTextBlock tb; -	register char c; -	register Widget src = XawTextGetSource(source_text_widget); - -	XawTextGetSelectionPos(source_text_widget, &l, &r); -	if ((len = r - l) <= 0) { -		l = XawTextGetInsertionPoint(source_text_widget); -		len = 128;	/* XXX */ - -		/* might have clicked in middle of word -- back up to start */ -		for ( ; l > 0; --l) { -			XawTextSourceRead(src, l - 1, &tb, 1); -			c = tb.ptr[0]; -			if (! isalnum(c) && c != '_' && c != '$') -				break; -		} -	} -	while (len > 0) { -		char *sp; -		int i; - -		XawTextSourceRead(src, l, &tb, len); -		for (sp = tb.ptr, i = tb.length; --i >= 0; ) { -			c = *sp++; -			if (!isalnum(c) && c != '_' && c != '$') -				return (cp); -			*cp++ = c; -		} -		len -= tb.length; -	} -	return (cp); -} - -static char * -append_selection_expr(cp) -	char *cp; -{ -	int len; -	XawTextPosition l, r; -	Widget src = XawTextGetSource(source_text_widget); -	XawTextBlock tb; -	char *sp; -	char c; - -	XawTextGetSelectionPos(source_text_widget, &l, &r); -	if (r > l) -		return (append_selection(cp)); - -	l = XawTextGetInsertionPoint(source_text_widget); - -	/* might have clicked in middle of word -- back up to start */ -	for ( ; l > 0; --l) { -		XawTextSourceRead(src, l - 1, &tb, 1); -		c = tb.ptr[0]; -		if (! isalnum(c) && c != '_' && c != '$') -			break; -	} - -	len = 128;	/* XXX */ -	while (len > 0) { -		int i; -		char pstack[64]; -		int pcnt = 0; - -		XawTextSourceRead(src, l, &tb, len); -		for (sp = tb.ptr, i = tb.length; --i >= 0; ) { -			switch (c = *sp++) { -			case '\n': -			case ';': -				return (cp); -			case '=': -				if (cp[-1] != '=') -					return (cp - 1); -				if (len == 128) -					return (cp); -				break; -			case ',': -				if (pcnt <= 0) -					return (cp); -				break; -			case '(': -				pstack[pcnt] = ')'; -				if (++pcnt >= sizeof(pstack)) -					return (cp); -				break; -			case '[': -				pstack[pcnt] = ']'; -				if (++pcnt >= sizeof(pstack)) -					return (cp); -				break; -			case ')': -			case ']': -				if (--pcnt < 0 || pstack[pcnt] != c) -					return (cp); -				break; -			} -			*cp++ = c; -		} -		len -= tb.length; -	} -	return (cp); -} - -static int input_avail;	/* XXX kluge: do_command sets this when command -			 * data from button is avaialble to force top level -			 * to break out of its loop. */ -/* - * Handle a button by running the command COMMAND. - */ -static void -do_command(w, command, call_data) -	Widget w; -	register char *command; -	caddr_t call_data; -{ -	char cmd_line[256]; -	char buf[256]; -	register char *out = cmd_line; -	char *cp; -	register char c; -	extern char *finish_command_input(); - -	while (c = *command++) { -		if (c == '%') { -			switch (*command++) { -			case 's':	/* current selection */ -				out = append_selection(out); -				break; -			case 'S':	/* 1st selected "word" at curor */ -				out = append_selection_word(out); -				break; -			case 'e':	/* echo cmd before executing */ -				break; -			case 'E':	/* 1st selected expression at curor */ -				out = append_selection_expr(out); -				break; -				 -			case 'l':	/* current line number */ -				(void) sprintf(buf, "%d", current_lineno()); -				for (cp = buf; c = *cp++; *out++ = c) -					; -				break; -			case 'L':	/* line we're stopped at */ -				(void) sprintf(buf, "%d", source_window_line); -				for (cp = buf; c = *cp++; *out++ = c) -					; -				break; -			case 'f':	/* current file name */ -				for (cp = source_window_symtab->filename; -				     c = *cp++; *out++ = c) -					; -				break; -			case 'b':	/* break # we're stopped at */ -				if (stop_breakpoint <= 0) -					/* if no breakpoint, don't do cmd */ -					return; - -				(void) sprintf(buf, "%d", stop_breakpoint); -				for (cp = buf; c = *cp++; *out++ = c) -					; -				break; -			} -		} else -			*out++ = c; -	} -	*out = 0; -	reinitialize_more_filter(); -	/* have to exit via readline or tty modes stay messed up */ -	for (cp = cmd_line; c = *cp++; ) -		rl_stuff_char(c); -	rl_stuff_char('\n'); -	input_avail = 1; -} - -/* - * Define and display all the buttons. - */ -static void -addbutton(parent, name, function, closure) -	Widget parent; -	char *name; -	void (*function) (); -	caddr_t closure; -{ -	static XtCallbackRec Callback[] = { -		{NULL, (caddr_t) NULL}, -		{NULL, (caddr_t) NULL}, -	}; -	static Arg commandArgs[] = { -		{XtNlabel, (XtArgVal) NULL}, -		{XtNcallback, (XtArgVal) Callback}, -	}; -	Widget w; -	char wname[128]; -	register char *cp; - -	strcpy(wname, name); -	while ((cp = index(wname, '*')) || (cp = index(wname, '.'))) -		*cp -= 0x10; - -	if (w = XtNameToWidget(parent, wname)) -		XtDestroyWidget(w); - -	Callback[0].callback = (XtCallbackProc) function; -	Callback[0].closure = (caddr_t) closure; -	commandArgs[0].value = (XtArgVal) name; -	XtCreateManagedWidget(wname, commandWidgetClass, parent, -			      commandArgs, XtNumber(commandArgs)); -} - -/* - * Create the button windows and store them in `buttons'. - */ -static void -create_buttons(parent) -	Widget parent; -{ -	addbutton(parent, "quit", do_command, "quit"); -} - -static void -button_command(arg) -	char *arg; -{ -	char *label; -	unsigned int len; -	 -	if (! arg) -		error_no_arg("button label and command"); - -	for (len = strlen(arg); len > 0 && isspace(arg[len - 1]); --len) -		; -	if (len == 0) -		error_no_arg("button label and command"); -	arg[len] = 0; - -	/* make a copy of button label & command for toolkit to use */ -	label = malloc(len + 1); -	strcpy(label, arg); - -	/* find the end of the label */ -	if (*label == '"') { -		if ((arg = index(++label, '"')) == 0) { -			printf("button label missing closing quote\n"); -			return; -		} -		*arg++ = 0; -	} else if (arg = index(label, ' ')) -		*arg++ = 0; -	else -		arg = label; - -	while (*arg && isspace(*arg)) -		++arg; -	 -	addbutton(button_box_widget, label, do_command, arg); -} - -static void -button_delete_command(arg) -	char *arg; -{ -	unsigned int len; -	Widget w; -	register char *cp; - -	if (! arg) -		error_no_arg("button name"); - -	for (len = strlen(arg); len > 0 && isspace(arg[len - 1]); --len) -		; -	if (len == 0) -		error_no_arg("button name"); -	arg[len] = 0; - -	/* find the end of the label */ -	if (*arg == '"') { -		if ((cp = index(++arg, '"')) == 0) { -			printf("button label missing closing quote\n"); -			return; -		} -		*cp++ = 0; -	} -	while ((cp = index(arg, '*')) || (cp = index(arg, '.'))) -		*cp -= 0x10; - -	if (w = XtNameToWidget(button_box_widget, arg)) -		XtDestroyWidget(w); -} - -/* - * Create a "label window" that just displays the string LABEL. - */ -static Widget -create_label(name, label) -	char *name, *label; -{ -	Arg args[1]; -	Widget w; - -	XtSetArg(args[0], XtNlabel, label); -	w = XtCreateManagedWidget(name, labelWidgetClass, containing_widget, -				  args, XtNumber(args)); -	return (w); -} - -/* - * Create a subwindow of PARENT that displays and scrolls the contents of - * file FILENAME. - */ -static Widget -create_text_widget(parent, filename) -	Widget parent; -	char *filename; -{ -	static Arg arg[] = { -		{XtNstring, NULL}, -		{XtNtype, XawAsciiFile}, -		{XtNcursor, None}, -	}; -	Widget text_widget; - -	arg[0].value = (XtArgVal)filename; -	text_widget = XtCreateManagedWidget("src", asciiTextWidgetClass, -					     parent, arg, XtNumber(arg)); -	return (text_widget); -} - -/* - * Entry point to create the widgets representing our display. - */ -void -xgdb_create_window() -{ -	/* initialize toolkit, setup defaults */ -#ifdef notyet -	main_widget = XtAppInitialize(&app_context, "Xgdb", NULL, 0,  -				      argcptr, argv, NULL, NULL, 0); -#else -	char *dummy_argv[] = { "xgdb", 0 }; -	int dummy_argc = 1; -	main_widget = XtAppInitialize(&app_context, "Xgdb", NULL, 0,  -				      &dummy_argc, dummy_argv, NULL, NULL, 0); -#endif -	display = XtDisplay(main_widget); -	containing_widget = XtCreateManagedWidget("frame", panedWidgetClass, -					          main_widget, NULL, 0); - -	sprintf(version_label, "XGDB %s", version); -	button_box_widget = XtCreateManagedWidget("buttons", boxWidgetClass, -						  containing_widget, NULL, 0); -	create_buttons(button_box_widget); -	source_name_widget = create_label("srcLabel", "No source file yet."); -	source_text_widget = create_text_widget(containing_widget, "/dev/null"); - -	XtRealizeWidget(main_widget); -	XFlush(display); -} - -/* - * If we use an X window, the readline input loop is told to call - * this function before reading a character from stdin. - */ -/*ARGSUSED*/ -static void -xgdb_window_hook() -{ -	register int inmask = 1 << fileno(stdin); -	register int xmask = 1 << ConnectionNumber(display); -	register int nfds, pend; -	int input_rfds; -	XEvent ev; - -	/* -	 * Display our current idea of the `interesting' source file then -	 * loop, dispatching window events until data is available on -	 * stdin. Then return so the input data can be processed. -	 */ -	input_avail = 0; -	xgdb_display_source(); - -	input_rfds = 0; -	while (input_avail == 0 && (input_rfds & inmask) == 0) { -		pend = XPending(display); -		if (!pend) { -			input_rfds = inmask | xmask; -			nfds = select(32, &input_rfds, 0, 0, -				      (struct timeval *)0); -			if (nfds == -1 && errno == EINTR) -				continue; -		} -		if (pend || (input_rfds & xmask)) { -			XNextEvent(display, &ev); -			XtDispatchEvent(&ev); -		} -	} -} - -void -_initialize_xgdb() -{ -	extern void (*window_hook) (); -	extern int inhibit_windows; -	extern struct cmd_list_element *deletelist; - -	if (inhibit_windows) -		return; - -	if (! displayname) { -		displayname = getenv("DISPLAY"); -		if (! displayname) { -			fprintf(stderr, "xgdb: no display name\n"); -			inhibit_windows = 1; -			return; -		} -	} -	xgdb_create_window(); -	window_hook = xgdb_window_hook; -	add_com("button", class_support, button_command, -"Add command button to xgdb window.  First argument is button\n\ -label, second is command associated with button.  Command can\n\ -include printf-like escapes:\n\ -   %s for current selection,\n\ -   %S for first 'word' of current selection,\n\ -   %e for current selection or expression at insertion pt,\n\ -   %E for current selection or expression at insertion pt,\n\ -   %l for current line number,\n\ -   %L for line program stopped at,\n\ -   %f for current file name,\n\ -   %b for current breakpoint number."); -	add_cmd("button", class_support, button_delete_command, -"Delete a button from the xgdb window.\n\ -Argument is name of button to be deleted.", -		&deletelist); -} | 
