mikew@wyse.wyse.com (Mike Wexler) (03/15/89)
Submitted-by: po@volta.ece.utexas.edu (Po Ling Cheung) Posting-number: Volume 3, Issue 55 Archive-name: xdbx/part03 #! /bin/sh # This is a shell archive. Remove anything before this line, then unpack # it by saving it into a file and typing "sh file". To overwrite existing # files, type "sh file -c". You can also feed this as standard input via # unshar, or by typing "sh <file", e.g.. If this archive is complete, you # will see the following message at the end: # "End of archive 3 (of 3)." # Contents: AUTHOR Imakefile Makefile arrow.bits bsd_regex.h calldbx.c # dbx.c defs.h make.out parser.c signals.c stop.bits sun_regex.h # updown.bits utils.c windows.c xdbx.c # Wrapped by mikew@wyse on Tue Mar 14 13:59:01 1989 PATH=/bin:/usr/bin:/usr/ucb ; export PATH if test -f 'AUTHOR' -a "${1}" != "-c" ; then echo shar: Will not clobber existing file \"'AUTHOR'\" else echo shar: Extracting \"'AUTHOR'\" \(987 characters\) sed "s/^X//" >'AUTHOR' <<'END_OF_FILE' X(Message inbox:1270) XReturn-Path: po@volta.ece.utexas.edu XReceived: by wyse.wyse.com (5.58/Wyse master/5-13-88) X id AA17465; Sat, 11 Mar 89 14:04:16 PST XReceived: from cs.utexas.edu by uunet.UU.NET (5.61/1.14) with SMTP X id AA04684; Fri, 10 Mar 89 16:38:18 -0500 XPosted-Date: Fri, 10 Mar 89 15:35:42 CST XReceived: from volta.ece.utexas.edu by cs.utexas.edu (5.59/1.25) X id AA01288; Fri, 10 Mar 89 15:37:33 CST XReceived: by volta.ece.utexas.edu (3.2/9.4), X id AA11938; Fri, 10 Mar 89 15:35:42 CST XDate: Fri, 10 Mar 89 15:35:42 CST XFrom: po@volta.ece.utexas.edu (Po Ling Cheung) XMessage-Id: <8903102135.AA11938@volta.ece.utexas.edu> XTo: x-sources@wyse.com XSubject: xdbx - window interface to dbx (part 1 of 4) X X XEnclosed is the source for xdbx, an X Window System interface to the Xdbx debugger. XWould you please send me a note when you post the source in comp.sources.x X(because I will not be reading comp.sources.x everyday) ? X XThank you. X XPo Cheung XUniversity of Texas at Austin X X END_OF_FILE if test 987 -ne `wc -c <'AUTHOR'`; then echo shar: \"'AUTHOR'\" unpacked with wrong size! fi # end of 'AUTHOR' fi if test -f 'Imakefile' -a "${1}" != "-c" ; then echo shar: Will not clobber existing file \"'Imakefile'\" else echo shar: Extracting \"'Imakefile'\" \(457 characters\) sed "s/^X//" >'Imakefile' <<'END_OF_FILE' X#ifdef VaxArchitecture X DEFINES = -DBSD /* Berkeley dbx */ X#endif X XLOCAL_LIBRARIES = $(XAWLIB) $(XMULIB) $(XTOOLLIB) $(XLIB) X X SRCS = calldbx.c command.c dbx.c dialog.c handler.c parser.c \ X regex.c signs.c signals.c source.c utils.c windows.c xdbx.c X X OBJS = calldbx.o command.o dbx.o dialog.o handler.o parser.o \ X regex.o signs.o signals.o source.o utils.o windows.o xdbx.o X XComplexProgramTarget(xdbx) XInstallAppDefaults(XDbx) END_OF_FILE if test 457 -ne `wc -c <'Imakefile'`; then echo shar: \"'Imakefile'\" unpacked with wrong size! fi # end of 'Imakefile' fi if test -f 'Makefile' -a "${1}" != "-c" ; then echo shar: Will not clobber existing file \"'Makefile'\" else echo shar: Extracting \"'Makefile'\" \(6760 characters\) sed "s/^X//" >'Makefile' <<'END_OF_FILE' X# Makefile generated by imake - do not edit! X# $XConsortium: imake.c,v 1.37 88/10/08 20:08:30 jim Exp $ X# X# The cpp used on this machine replaces all newlines and multiple tabs and X# spaces in a macro expansion with a single space. Imake tries to compensate X# for this, but is not always successful. X# X X########################################################################### X# X Window System Makefile generated from template file Imake.tmpl X# $XConsortium: Imake.tmpl,v 1.91 88/10/23 22:37:10 jim Exp $ X# X# Do not change the body of the imake template file. Server-specific X# parameters may be set in the appropriate .macros file; site-specific X# parameters (but shared by all servers) may be set in site.def. If you X# make any changes, you'll need to rebuild the makefiles using X# "make World" (at best) or "make Makefile; make Makefiles" (at least) in X# the top level directory. X# X# If your C preprocessor doesn't define any unique symbols, you'll need X# to set BOOTSTRAPCFLAGS when rebuilding imake (usually when doing X# "make Makefile", "make Makefiles", or "make World"). X# X# If you absolutely can't get imake to work, you'll need to set the X# variables at the top of each Makefile as well as the dependencies at the X# bottom (makedepend will do this automatically). X# X X########################################################################### X# platform-specific configuration parameters - edit Sun.macros to change X X# platform: $XConsortium: Sun.macros,v 1.52 88/10/23 11:00:55 jim Exp $ X# operating system: SunOS 3.4 X XBOOTSTRAPCFLAGS = X AS = as X CC = cc X CPP = /lib/cpp X LD = ld X LINT = lint X INSTALL = install X TAGS = ctags X RM = rm -f X MV = mv X LN = ln -s X RANLIB = ranlib XRANLIBINSTFLAGS = -t X AR = ar clq X LS = ls X LINTOPTS = -xz X LINTLIBFLAG = -C X MAKE = make XSTD_CPP_DEFINES = X STD_DEFINES = X X########################################################################### X# site-specific configuration parameters - edit site.def to change X X# site: $XConsortium: site.def,v 1.16 88/10/12 10:30:24 jim Exp $ X X########################################################################### X# definitions common to all Makefiles - do not edit X X SHELL = /bin/sh X X DESTDIR = /global X USRLIBDIR = $(DESTDIR)/lib X BINDIR = $(DESTDIR)/bin/X11 X INCDIR = $(DESTDIR)/include X ADMDIR = $(DESTDIR)/usr/adm X LIBDIR = $(USRLIBDIR)/X11 X LINTLIBDIR = $(USRLIBDIR)/lint X FONTDIR = $(LIBDIR)/fonts X XINITDIR = $(LIBDIR)/xinit X XDMDIR = $(LIBDIR)/xdm X UWMDIR = $(LIBDIR)/uwm X AWMDIR = $(LIBDIR)/awm X TWMDIR = $(LIBDIR)/twm X DTDIR = $(LIBDIR)/dt X MANPATH = /usr/man X MANSOURCEPATH = $(MANPATH)/man X MANDIR = $(MANSOURCEPATH)n X LIBMANDIR = $(MANSOURCEPATH)n3 X XAPPLOADDIR = $(LIBDIR)/app-defaults X X INSTBINFLAGS = -m 0755 X INSTUIDFLAGS = -m 4755 X INSTLIBFLAGS = -m 0664 X INSTINCFLAGS = -m 0444 X INSTMANFLAGS = -m 0444 X INSTAPPFLAGS = -m 0444 X INSTKMEMFLAGS = -m 4755 X FCFLAGS = -t X CDEBUGFLAGS = -O X X PATHSEP = / X DEPEND = $(BINDIR)/makedepend X IMAKE = $(BINDIR)/imake X RGB = $(LIBDIR)/rgb X FC = $(BINDIR)/bdftosnf X MKFONTDIR = $(BINDIR)/mkfontdir X MKDIRHIER = $(BINDIR)/mkdirhier.sh X X CFLAGS = $(CDEBUGFLAGS) $(INCLUDES) $(STD_DEFINES) $(DEFINES) X LINTFLAGS = $(LINTOPTS) $(INCLUDES) $(STD_DEFINES) $(DEFINES) -DLINT X LDFLAGS = $(CDEBUGFLAGS) -L$(USRLIBDIR) $(SYS_LIBRARIES) $(SYSAUX_LIBRARIES) X X IRULESRC = $(LIBDIR)/imake.includes X X EXTENSIONLIB = $(USRLIBDIR)/libext.a X XLIB = $(USRLIBDIR)/libX11.a X XMULIB = $(USRLIBDIR)/libXmu.a X OLDXLIB = $(USRLIBDIR)/liboldX.a X XTOOLLIB = $(USRLIBDIR)/libXt.a X XAWLIB = $(USRLIBDIR)/libXaw.a X LINTXLIB = $(USRLIBDIR)/lint/llib-lX11.ln X LINTXMU = $(USRLIBDIR)/lint/llib-lXmu.ln X LINTXTOOL = $(USRLIBDIR)/lint/llib-lXt.ln X LINTXAW = $(USRLIBDIR)/lint/llib-lXaw.ln X INCLUDES = -I$(INCDIR) X MACROFILE = Sun.macros X ICONFIGFILES = $(IRULESRC)/Imake.tmpl \ X $(IRULESRC)/$(MACROFILE) $(IRULESRC)/site.def X IMAKE_DEFINES = X IMAKE_CMD = $(NEWTOP)$(IMAKE) -TImake.tmpl -I$(NEWTOP)$(IRULESRC) \ X -s Makefile $(IMAKE_DEFINES) X RM_CMD = $(RM) *.CKP *.ln *.BAK *.bak *.o core errs ,* *~ *.a \ X .emacs_* tags TAGS make.log MakeOut X X########################################################################### X# rules: $XConsortium: Imake.rules,v 1.71 88/10/23 22:46:34 jim Exp $ X X########################################################################### X# start of Imakefile X XLOCAL_LIBRARIES = $(XAWLIB) $(XMULIB) $(XTOOLLIB) $(XLIB) X X SRCS = calldbx.c command.c dbx.c dialog.c handler.c parser.c \ X regex.c signs.c signals.c source.c utils.c windows.c xdbx.c X X OBJS = calldbx.o command.o dbx.o dialog.o handler.o parser.o \ X regex.o signs.o signals.o source.o utils.o windows.o xdbx.o X X PROGRAM = xdbx X Xall:: xdbx X Xxdbx: $(OBJS) $(LOCAL_LIBRARIES) X $(RM) $@ X $(CC) -o $@ $(OBJS) $(LOCAL_LIBRARIES) $(LDFLAGS) $(SYSLAST_LIBRARIES) X Xrelink:: X $(RM) $(PROGRAM) X $(MAKE) $(MFLAGS) $(PROGRAM) X Xinstall:: xdbx X $(INSTALL) -c $(INSTALLFLAGS) xdbx $(BINDIR) X Xinstall.man:: xdbx.man X $(INSTALL) -c $(INSTMANFLAGS) xdbx.man $(MANDIR)/xdbx.n X Xdepend:: $(DEPEND) X Xdepend:: X $(DEPEND) -s "# DO NOT DELETE" -- $(CFLAGS) -- $(SRCS) X X$(DEPEND): X @echo "making $@"; \ X cd $(DEPENDSRC); $(MAKE) X Xclean:: X $(RM) $(PROGRAM) X Xinstall:: XDbx.ad X $(INSTALL) -c $(INSTAPPFLAGS) XDbx.ad $(XAPPLOADDIR)/XDbx X X########################################################################### X# Imake.tmpl common rules for all Makefiles - do not edit X Xemptyrule:: X Xclean:: X $(RM_CMD) \#* X XMakefile:: $(IMAKE) X XMakefile:: Imakefile \ X $(IRULESRC)/Imake.tmpl \ X $(IRULESRC)/Imake.rules \ X $(IRULESRC)/site.def \ X $(IRULESRC)/$(MACROFILE) X -@if [ -f Makefile ]; then \ X echo "$(RM) Makefile.bak; $(MV) Makefile Makefile.bak"; \ X $(RM) Makefile.bak; $(MV) Makefile Makefile.bak; \ X else exit 0; fi X $(IMAKE_CMD) -DTOPDIR=$(TOP) X X$(IMAKE): X @echo "making $@"; \ X cd $(IMAKESRC); $(MAKE) BOOTSTRAPCFLAGS=$(BOOTSTRAPCFLAGS) X Xtags:: X $(TAGS) -w *.[ch] X $(TAGS) -xw *.[ch] > TAGS X X########################################################################### X# empty rules for directories that do not have SUBDIRS - do not edit X Xinstall:: X @echo "install done" X Xinstall.man:: X @echo "install.man done" X XMakefiles:: X X########################################################################### X# dependencies generated by makedepend X END_OF_FILE if test 6760 -ne `wc -c <'Makefile'`; then echo shar: \"'Makefile'\" unpacked with wrong size! fi # end of 'Makefile' fi if test -f 'arrow.bits' -a "${1}" != "-c" ; then echo shar: Will not clobber existing file \"'arrow.bits'\" else echo shar: Extracting \"'arrow.bits'\" \(324 characters\) sed "s/^X//" >'arrow.bits' <<'END_OF_FILE' X#define arrow_width 16 X#define arrow_height 16 X#define arrow_x_hot -1 X#define arrow_y_hot -1 Xstatic char arrow_bits[] = { X 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x80, 0x01, 0x80, 0x03, X 0xff, 0x07, 0xff, 0x0f, 0xff, 0x0f, 0xff, 0x07, 0x80, 0x03, 0x80, 0x01, X 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}; END_OF_FILE if test 324 -ne `wc -c <'arrow.bits'`; then echo shar: \"'arrow.bits'\" unpacked with wrong size! fi # end of 'arrow.bits' fi if test -f 'bsd_regex.h' -a "${1}" != "-c" ; then echo shar: Will not clobber existing file \"'bsd_regex.h'\" else echo shar: Extracting \"'bsd_regex.h'\" \(3267 characters\) sed "s/^X//" >'bsd_regex.h' <<'END_OF_FILE' X/****************************************************************************** X * X * xdbx - X Window System interface to dbx X * X * Copyright 1989 The University of Texas at Austin X * X * Author: Po Cheung X * Date: March 10, 1989 X * X * Permission to use, copy, modify, and distribute this software and X * its documentation for any purpose and without fee is hereby granted, X * provided that the above copyright notice appear in all copies and that X * both that copyright notice and this permission notice appear in X * supporting documentation. The University of Texas at Austin makes no X * representations about the suitability of this software for any purpose. X * It is provided "as is" without express or implied warranty. X * X ******************************************************************************/ X X X/* X * Regular expression pattern matching X * X * The reg_token array indicates the register no. for each token type. X * reg_token[0] : message X * reg_token[1] : stop number X * reg_token[2] : function name X * reg_token[3] : line number X * reg_token[4] : file name X */ X X#define BRACKET "[%d]" X X#define TK_MESG 0 X#define TK_STOP 1 X#define TK_FUNC 2 X#define TK_LINE 3 X#define TK_FILE 4 X X#define O_EXEC 0 X#define O_DONE 1 X#define O_STOPAT 2 X#define O_STOPIN 3 X#define O_UPDOWN 4 X#define O_BELL 5 X#define O_LIST 6 X X#define C_EXEC 0 X#define C_STOPAT 1 X#define C_STOPIN 2 X#define C_UPDOWN 3 X#define C_DELETE 4 X#define C_FUNC 5 X#define C_FILE 6 X#define C_DEBUG 7 X#define C_CD 8 X X Xstatic PatternRec output_pattern[] = { X /* exec */ X {"\\(.*\n\\)*\\(\[[0-9]+\] \\)?\\(\\(stopped\\|Bus error\\|Segmentation \ Xfault\\|Interrupt\\) in \\([^ ]+\\) at line \ X\\([0-9]+\\)\\( in file \"\\([^ ]+\\)\"\\)?\\)\n", X NULL, X {3, -1, 5, 6, 8} X }, X /* done */ X {"\\(.*\n\\)*execution completed", X NULL, X {-1, -1, -1, -1, -1} X }, X /* stop at */ X {"\\[\\([0-9]+\\)\\] stop at \\(\"\\([^ ]+\\)\":\\)?\\([0-9]+\\)\n", X NULL, X {-1, 1, -1, 4, 3} X }, X /* stop in */ X {"\\[\\([0-9]+\\)\\] stop in \\([^ ]+\\)\n", X NULL, X {-1, 1, 2, -1, -1} X }, X /* updown */ X {"\\([^ ]+\\)(.*), line \\([0-9]+\\) in \"\\([^ ]+\\)\"\n", X NULL, X {-1, -1, 1, 2, 3} X }, X /* bell */ X {"\\(not that many levels\n\\|can't continue execution\n\\)", X NULL, X {-1, -1, -1, -1, -1} X }, X /* list */ X {"\\([ ]*[0-9]+.*\n\\)*[ ]+\\([0-9]+\\)[ ]+{.*\n", X NULL, X {-1, -1, -1, 2, -1} X }, X NULL X}; X Xstatic PatternRec command_pattern[] = { X {"[ ]*\\(run\\|cont\\|next\\|step\\).*\n", NULL, {-1, -1, -1, -1, -1}}, X {"[ ]*stop[ ]+at[ ]+[0-9]+.*\n", NULL, {-1, -1, -1, -1, -1}}, X {"[ ]*stop[ ]+in[ ]+.*\n", NULL, {-1, -1, -1, -1, -1}}, X {"[ ]*\\(up\\|down\\).*\n", NULL, {-1, -1, -1, -1, -1}}, X {"[ ]*delete.*\n", NULL, {-1, -1, -1, 1, -1}}, X {"[ ]*func[ ]*\\([^ ]+\\)[ ]*\n", NULL, {-1, -1, 1, -1, -1}}, X {"[ ]*file[ ]*\\([^ ]+\\)[ ]*\n", NULL, {-1, -1, -1, -1, 1}}, X NULL X}; END_OF_FILE if test 3267 -ne `wc -c <'bsd_regex.h'`; then echo shar: \"'bsd_regex.h'\" unpacked with wrong size! fi # end of 'bsd_regex.h' fi if test -f 'calldbx.c' -a "${1}" != "-c" ; then echo shar: Will not clobber existing file \"'calldbx.c'\" else echo shar: Extracting \"'calldbx.c'\" \(3261 characters\) sed "s/^X//" >'calldbx.c' <<'END_OF_FILE' X/****************************************************************************** X * X * xdbx - X Window System interface to dbx X * X * Copyright 1989 The University of Texas at Austin X * X * Author: Po Cheung X * Date: March 10, 1989 X * X * Permission to use, copy, modify, and distribute this software and X * its documentation for any purpose and without fee is hereby granted, X * provided that the above copyright notice appear in all copies and that X * both that copyright notice and this permission notice appear in X * supporting documentation. The University of Texas at Austin makes no X * representations about the suitability of this software for any purpose. X * It is provided "as is" without express or implied warranty. X * X ******************************************************************************/ X X X#include <sys/ioctl.h> X#include "global.h" X XFILE *dbxfp = NULL; /* file pointer to dbx */ Xint dbxpid; /* dbx process id */ Xint dbxInputId; /* dbx input id */ X Xstatic char *pty = "/dev/pty??"; /* master side of pseudo-terminal */ Xstatic char *tty = "/dev/tty??"; /* slave side of pseudo-terminal */ X X/* X * Xdbx talks to dbx through a pseudo terminal which is a pair of master X * and slave devices: /dev/pty?? and /dev/tty??, where ?? goes from p0 to X * qf (system dependent). The pty is opened for both read and write. X */ Xstatic int openMaster() X{ X int i, master; X char c; X X for (c='p'; c<='q'; c++) { X pty[8] = c; X for (i=0; i<16; i++) { X pty[9] = "0123456789abcdef"[i]; X if ((master = open(pty, O_RDWR)) != -1) X return (master); X } X } X fprintf(stderr, "xdbx: all ptys in use: ptyp0 - ptyqf\n"); X exit(1); X} X Xstatic int openSlave() X{ X int slave; X X tty[8] = pty[8]; X tty[9] = pty[9]; X if ((slave = open(tty, O_RDWR)) != -1) { X return (slave); X } X else { X fprintf(stderr, "open: cannot open slave pty %s", tty); X exit(1); X } X} X X/* ARGSUSED */ Xvoid calldbx(argc, argv) Xint argc; Xchar *argv[]; X{ X int master; /* file descriptor of master pty */ X int slave; /* file descriptor to slave pty */ X int n = 0; X X master = openMaster(); X slave = openSlave(); X X#ifndef BSD X ioctl(master, TIOCPKT, &n); /* disable packet mode */ X#endif X X dbxpid = fork(); X if (dbxpid == -1) { X perror("Cannot fork dbx process"); X exit(1); X } X else if (dbxpid) { X /* X * Parent : close the slave side of pty X * close stdin and stdout X * set the dbx file descriptor to nonblocking mode X * open file pointer with read/write access to dbx X * set unbuffered mode X * register dbx input with X X */ X close(slave); X close(0); X close(1); X fcntl(master, F_SETFL, FNDELAY); X dbxfp = fdopen(master, "r+"); X setbuf(dbxfp, NULL); X dbxInputId = XtAddInput(master, XtInputReadMask, readDbx, NULL); X } X else { X /* X * Child : close master side of pty X * redirect stdin, stdout, stderr of dbx to pty X * unbuffer output data from dbx X * exec dbx with arguments X */ X close(master); X dup2(slave, 0); X dup2(slave, 1); X dup2(slave, 2); X if (slave > 2) X close(slave); X fcntl(1, F_SETFL, FAPPEND); X setbuf(stdout, NULL); X argv[0] = "dbx"; X execvp("dbx", argv); X perror("Cannot call dbx"); X exit(1); X } X} END_OF_FILE if test 3261 -ne `wc -c <'calldbx.c'`; then echo shar: \"'calldbx.c'\" unpacked with wrong size! fi # end of 'calldbx.c' fi if test -f 'dbx.c' -a "${1}" != "-c" ; then echo shar: Will not clobber existing file \"'dbx.c'\" else echo shar: Extracting \"'dbx.c'\" \(3469 characters\) sed "s/^X//" >'dbx.c' <<'END_OF_FILE' X/****************************************************************************** X * X * xdbx - X Window System interface to dbx X * X * Copyright 1989 The University of Texas at Austin X * X * Author: Po Cheung X * Date: March 10, 1989 X * X * Permission to use, copy, modify, and distribute this software and X * its documentation for any purpose and without fee is hereby granted, X * provided that the above copyright notice appear in all copies and that X * both that copyright notice and this permission notice appear in X * supporting documentation. The University of Texas at Austin makes no X * representations about the suitability of this software for any purpose. X * It is provided "as is" without express or implied warranty. X * X ******************************************************************************/ X X X#include "global.h" X XBoolean EnterCommand; /* To differntiate between xdbx command X input and debugged program input */ Xstatic char *output = NULL; /* buffer for dbx output */ Xstatic int outputsize = 0; /* size of buffer */ Xstatic Boolean continueFlag; /* read flag for dbxinit commands */ X Xstatic void Dbxinit(fp) XFILE *fp; X{ X char s[LINESIZ]; X X while (fgets(s, LINESIZ, fp)) { X strcpy(Command, s); X AppendDialogText(Command); X writeDbx(Command); X continueFlag = TRUE; X while (continueFlag) X readDbx(); X } X close(fp); X} X X/* X * Called only once to display the source file, if any, right after X * xdbx is started up. X */ Xvoid DisplayInit() X{ X FILE *fp; X char *path; X X displayedFile = LoadFile(QueryFile()); X UpdateMessageWindow("Ready for execution"); X if (fp = fopen(xdbxinit, "r")) { X if (displayedFile) X Dbxinit(fp); X if (Homedir) X rename(xdbxinit, "~/.dbxinit"); X else X rename(xdbxinit, ".dbxinit"); X } X} X X/* X * This is a callback procedure invoked everytime input is pending X * on the file descriptor to dbx. X * It reads all the data available on the descriptor line by line X * into 'string', and write it to the dialog window. X * Once the dbx prompt is read in, it calls parse() to take appropriate X * action. X */ XXtInputCallbackProc readDbx(client_data, source, id) Xcaddr_t client_data; Xint *source; XXtInputId *id; X{ X char s[LINESIZ], *string; X int stringsize; X static Boolean initialFlag = TRUE, X displayFlag = FALSE; X X /* allocate one block to 'output' to begin with */ X if (outputsize == 0) { X outputsize = BUFSIZ; X output = XtMalloc(outputsize); X strcpy(output, ""); X } X stringsize = BUFSIZ; X string = XtMalloc(stringsize); X strcpy(string, ""); X while (fgets(s, LINESIZ, dbxfp)) { X /* if no echo mode, do not write output to dialog window */ X if (Echo == FALSE) continue; X EnterCommand = FALSE; X if (strcmp(s, "(dbx) ")) { X if (strlen(string) + strlen(s) > stringsize) { X string = XtRealloc(string, stringsize + BUFSIZ); X stringsize += BUFSIZ; X } X strcat(string, s); X if (strlen(output) + strlen(s) > outputsize) { X output = XtRealloc(output, outputsize + BUFSIZ); X outputsize += BUFSIZ; X } X strcat(output, s); X } X else { X parse(output); X strcpy(output, ""); X strcpy(s, ""); X strcat(string, PROMPT); X EnterCommand = TRUE; X continueFlag = FALSE; X if (initialFlag) { X initialFlag = FALSE; X displayFlag = TRUE; X } X } X } X filter(string); X AppendDialogText(string); X if (displayFlag) { X displayFlag = FALSE; X DisplayInit(); X } X} END_OF_FILE if test 3469 -ne `wc -c <'dbx.c'`; then echo shar: \"'dbx.c'\" unpacked with wrong size! fi # end of 'dbx.c' fi if test -f 'defs.h' -a "${1}" != "-c" ; then echo shar: Will not clobber existing file \"'defs.h'\" else echo shar: Extracting \"'defs.h'\" \(5435 characters\) sed "s/^X//" >'defs.h' <<'END_OF_FILE' X/****************************************************************************** X * X * xdbx - X Window System interface to dbx X * X * Copyright 1989 The University of Texas at Austin X * X * Author: Po Cheung X * Date: March 10, 1989 X * X * Permission to use, copy, modify, and distribute this software and X * its documentation for any purpose and without fee is hereby granted, X * provided that the above copyright notice appear in all copies and that X * both that copyright notice and this permission notice appear in X * supporting documentation. The University of Texas at Austin makes no X * representations about the suitability of this software for any purpose. X * It is provided "as is" without express or implied warranty. X * X ******************************************************************************/ X X X#include <stdio.h> X#include <X11/Xos.h> X#include <X11/IntrinsicP.h> X#include <X11/StringDefs.h> X#include <X11/Cardinals.h> X#include <X11/Xatom.h> X#include <X11/Shell.h> X#include <X11/VPaned.h> X#include <X11/Form.h> X#include <X11/AsciiText.h> X#include <X11/TextP.h> X#include <X11/Box.h> X#include <X11/List.h> X#include <X11/Command.h> X#include <X11/Label.h> X X#define MIN(a,b) ((a)<(b) ? (a) : (b)) X#define MAX(a,b) ((a)>(b) ? (a) : (b)) X X#define DIALOGSIZE 10000 /* max size of dialog window buffer */ X#define LINESIZ 200 /* input line length */ X#define MAXNAME 30 /* max identifier length */ X#define MAXARGS 10 /* max number of args */ X#define MAXFILES 256 /* max number of files in fileTable */ X#define MAXSTOPS 256 /* max number of stops */ X#define MAXSIGNS 100 /* max number of signs */ X#define OFFSET 2 /* offset for adjusting sign position */ X#define CHARS_PER_LINE 20 /* estimated number of chars per line */ X#define ADD_LINES 50 /* # of lines to be added in realloc */ X#define PROMPT "(xdbx) " /* xdbx prompt string */ X#define TITLE "xdbx 1.0" /* xdbx title string */ X#define CANCEL "<Cancel>" /* string for file menu */ X#define DELIMITERS " !%^&*()+=~|;:{},/#<?\"\n\t" X X Xtypedef int Line; X X#ifdef sparc Xtypedef struct dirent Directory; X#else Xtypedef struct direct Directory; X#endif X Xtypedef struct { X Dimension shellWidth; /* xdbx window width */ X Dimension lineLabelWidth; /* line label width */ X Dimension sourceHeight; /* source window height */ X Dimension leftMargin; /* left margin of source window */ X Dimension dialogHeight; /* dialog window height */ X Dimension dialogMinHeight; /* dialog window minimum height */ X Dimension messageHeight; /* message window height */ X Dimension buttonWidth; /* command button width */ X Dimension commandHSpace; /* command horizontal spacing */ X Dimension commandVSpace; /* command vertical spacing */ X Dimension commandMinHeight; /* source window height */ X Dimension commandMaxHeight; /* source window height */ X Dimension columnSpacing; /* file menu column spacing */ X int filesPerColumn; /* number of files per column in file menu */ X Boolean noTitleBar; /* xdbx option : title bar */ X Pixel stopForeground; /* foreground color of stop sign */ X Pixel arrowForeground; /* foreground color of arrow sign */ X Pixel updownForeground; /* foreground color of updown sign */ X X Boolean dbxopt_r; /* dbx option -r */ X Boolean dbxopt_i; /* dbx option -i */ X String includeDir; /* dbx option -I includeDir */ X Boolean dbxopt_k; /* dbx option -k */ X String cfile; /* Berkeley dbx option -c file */ X Boolean dbxopt_kbd; /* SunOS 3.4 dbx option -kbd */ X int fcount; /* SunOS 4.0 dbx option -f fcount */ X String startup; /* SunOS 4.0 dbx option -s startup */ X String tstartup; /* SunOS 4.0 dbx option -sr tstartup */ X} XdbxResources; X Xtypedef struct { X char *filename; /* name of file on display */ X char funcname[MAXNAME]; /* current function */ X char *buf; /* buffer holding source file */ X long filesize; /* size of file in bytes */ X Line lines; /* # of lines on display */ X Line currentline; /* line where caret is */ X Line topline; /* top line number in the window */ X Line bottomline; /* bottom line number in window */ X Line lastline; /* number of lines in source file */ X XtTextPosition topPosition; /* top display position of buffer */ X XtTextPosition *linepos; /* array of text pos for each newline */ X} FileRec, *FileRecPtr; X X Xtypedef struct { X char *mesg; /* part of matched string */ X unsigned stop; /* stop number */ X char *func; /* function name */ X unsigned line; /* line number */ X char *file; /* file name */ X} Tokens; X X#define NTOKENS 5 /* number of tokens */ X Xtypedef struct { X char *pat; /* regular expression */ X struct re_pattern_buffer *buf; /* buffer for compile regex */ X int reg_token[NTOKENS]; /* register number */ X} PatternRec, *PatternRecPtr; X X Xtypedef struct { X Cardinal i; /* index to arrowsign[] */ X char filename[MAXNAME]; /* filename associated with */ X Line line; /* line number */ X} Arrow; X Xtypedef struct { X Cardinal i; /* index to updownsign[] */ X char filename[MAXNAME]; /* filename associated with */ X Line line; /* line number */ X} Updown; X Xtypedef struct { X char *filename; /* filename associated with */ X Line line; /* line number of stop */ X unsigned tag; /* used in deleting stops */ X} Stops; END_OF_FILE if test 5435 -ne `wc -c <'defs.h'`; then echo shar: \"'defs.h'\" unpacked with wrong size! fi # end of 'defs.h' fi if test -f 'make.out' -a "${1}" != "-c" ; then echo shar: Will not clobber existing file \"'make.out'\" else echo shar: Extracting \"'make.out'\" \(37 characters\) sed "s/^X//" >'make.out' <<'END_OF_FILE' XMake: line 140: syntax error. Stop. END_OF_FILE if test 37 -ne `wc -c <'make.out'`; then echo shar: \"'make.out'\" unpacked with wrong size! fi # end of 'make.out' fi if test -f 'parser.c' -a "${1}" != "-c" ; then echo shar: Will not clobber existing file \"'parser.c'\" else echo shar: Extracting \"'parser.c'\" \(6748 characters\) sed "s/^X//" >'parser.c' <<'END_OF_FILE' X/****************************************************************************** X * X * xdbx - X Window System interface to dbx X * X * Copyright 1989 The University of Texas at Austin X * X * Author: Po Cheung X * Date: March 10, 1989 X * X * Permission to use, copy, modify, and distribute this software and X * its documentation for any purpose and without fee is hereby granted, X * provided that the above copyright notice appear in all copies and that X * both that copyright notice and this permission notice appear in X * supporting documentation. The University of Texas at Austin makes no X * representations about the suitability of this software for any purpose. X * It is provided "as is" without express or implied warranty. X * X ******************************************************************************/ X X X#include "global.h" X#include "regex.h" X X#ifdef BSD X#include "bsd_regex.h" X#else X#include "sun_regex.h" X#endif X X#define BYTEWIDTH 8 X#define RE_BUFFER 100 X XTokens token; /* token structure */ X X/* X * Compile all the regular expression patterns in a pattern table. X * A pattern table is an array of pattern records. X * Each pattern record consists of a regular X * expression, a buffer for the to-be-compiled regular expression, X * and an array to associate a given token with a matched register number. X */ Xstatic void compile(patternTable) XPatternRec *patternTable; X{ X PatternRec *p; X char fastmap[(1 << BYTEWIDTH)]; X int i; X X for (i=0; patternTable[i].pat; i++) { X p = &patternTable[i]; X p->buf = (struct re_pattern_buffer *) X XtMalloc (sizeof (struct re_pattern_buffer)); X p->buf->allocated = RE_BUFFER; X p->buf->buffer = (char *) XtMalloc (p->buf->allocated); X p->buf->fastmap = fastmap; X p->buf->translate = NULL; X re_compile_pattern(p->pat, strlen(p->pat), p->buf); X re_compile_fastmap(p->buf); X } X} X X/* X * This routine tries to match a given string with each regular X * expression in a given pattern table. The best match is found, and X * the function returns an index to the pattern table. X */ Xstatic int match(patternTable, string) X PatternRec *patternTable; X char *string; X{ X struct re_registers regs; X int m, bestmatch = -1, index = -1, i, j, r, start, n; X char *s; X X if (strcmp(string, "") == NULL) return -1; X for (i=0; patternTable[i].pat; i++) { X m = re_match(patternTable[i].buf, string, strlen(string), 0, ®s); X if (m > bestmatch) { X bestmatch = m; X index = i; X token.mesg = token.file = token.func = NULL; X token.line = token.stop = 0; X for (j=0; j<NTOKENS; j++) { X if ((r = patternTable[i].reg_token[j]) >= 0) { X start = regs.start[r]; X if ((n = regs.end[r] - start) > 0) { X s = (char *) XtMalloc ((n+1) * sizeof(char)); X strncpy(s, string+start, n); X s[n] = '\0'; X switch (j) { X case 0: token.mesg = s; break; X case 1: token.stop = atoi(s); XtFree(s); break; X case 2: token.func = s; break; X case 3: token.line = atoi(s); XtFree(s); break; X case 4: token.file = s; break; X } X } X } X } X } X } X return index; X} X X/* PUBLIC ROUTINES */ X X/* Compile the regular expressions in the output and command pattern tables. */ X Xvoid parser_init() X{ X compile(output_pattern); X compile(command_pattern); X} X X X/* This routine first parses the command string. X * If the command is one of run, cont, next, step, stop at, stop in, X * where, up, or down, it parses the dbx output to decide what action X * to take and dispatch it to one of the handlers. X * For other commands, the appropriate handler is called. X */ Xvoid parse(output) Xchar *output; X{ X int handler, command_flag; X X command_flag = match(command_pattern, Command); X switch (command_flag) { X case C_EXEC: X case C_STOPAT: X case C_STOPIN: X case C_UPDOWN: X handler = match(output_pattern, output); X switch (handler) { X case O_EXEC : exec_handler(&token, FALSE); break; X case O_DONE : exec_handler(&token, TRUE); break; X case O_STOPAT: stop_at_handler(&token); break; X case O_STOPIN: stop_in_handler(&token); break; X case O_UPDOWN: updown_handler(&token); break; X case O_BELL : Bell(0); break; X } X break; X case C_DELETE: X delete_handler(); X break; X case C_FUNC: X if (strcmp(output, "") == NULL) X func_handler(&token); X break; X case C_FILE: X file_handler(&token); X break; X case C_DEBUG: X debug_handler(); X break; X case C_CD: X if (strcmp(output, "") == NULL) X cd_handler(); X break; X } X} X X X/* This function edits the dbx output so that unnecessary information is X * not displayed on the dialog window. X * It filters away the information about the halted execution point, X * returned by the execution commands. X * On Sun dbx, it also filters away the output returned by the up and X * down commands. X */ Xvoid filter(s) Xchar *s; X{ X struct re_registers regs; X char *p, *q; X int r; X static Boolean DeleteNextLine = FALSE; X X if ((s && strcmp(s, "") == NULL) || strcmp(Command, "") == NULL) X return; X X#ifndef BSD /* for Sun dbx only */ X if (re_match(command_pattern[C_UPDOWN].buf, Command, strlen(Command), X 0, NULL) > 0) { X if (re_match(output_pattern[O_BELL].buf, s, strlen(s), 0, ®s) < 0) { X if (strcmp(s+strlen(s)-strlen(PROMPT), PROMPT) == NULL) X strcpy(s, PROMPT); X else X strcpy(s, ""); X } X return; X } X#endif X X if (re_match(command_pattern[C_EXEC].buf, Command, strlen(Command), X 0, NULL) > 0 X && re_match(output_pattern[O_EXEC].buf, s, strlen(s), 0, ®s) > 0) { X r = output_pattern[O_EXEC].reg_token[TK_MESG]; X for (p=s+regs.start[r]; p!=s && *(p-1) != '\n'; p--); X if (q = (char *) strchr(s+regs.end[r]+1, '\n')) X strcpy(p, q+1); X else { X DeleteNextLine = TRUE; X *p = '\0'; X } X return; X } X X if (DeleteNextLine) { X p = (char *) strchr(s, '\n'); X strcpy(s, p+1); X DeleteNextLine = FALSE; X } X} X X X/* Sends a command to dbx and read the corresponding output, bypassing the X * Xt input procedure, readDbx. X */ Xint QueryDbx(command, do_match) Xchar *command; XBoolean do_match; X{ X char s[LINESIZ], *output; X int outputsize; X X Echo = FALSE; X writeDbx(command); X /* allocate one block to 'output' to begin with */ X outputsize = BUFSIZ; X output = XtMalloc(outputsize); X strcpy(output, ""); X X while (fgets(s, LINESIZ, dbxfp) == NULL); X do { X if (strlen(output) + strlen(s) > outputsize) { X output = XtRealloc(output, outputsize + BUFSIZ); X outputsize += BUFSIZ; X } X strcat(output, s); X } while (fgets(s, LINESIZ, dbxfp)); X Echo = TRUE; X if (do_match) X return match(output_pattern, output); X else X return -1; X} END_OF_FILE if test 6748 -ne `wc -c <'parser.c'`; then echo shar: \"'parser.c'\" unpacked with wrong size! fi # end of 'parser.c' fi if test -f 'signals.c' -a "${1}" != "-c" ; then echo shar: Will not clobber existing file \"'signals.c'\" else echo shar: Extracting \"'signals.c'\" \(2792 characters\) sed "s/^X//" >'signals.c' <<'END_OF_FILE' X/****************************************************************************** X * X * xdbx - X Window System interface to dbx X * X * Copyright 1989 The University of Texas at Austin X * X * Author: Po Cheung X * Date: March 10, 1989 X * X * Permission to use, copy, modify, and distribute this software and X * its documentation for any purpose and without fee is hereby granted, X * provided that the above copyright notice appear in all copies and that X * both that copyright notice and this permission notice appear in X * supporting documentation. The University of Texas at Austin makes no X * representations about the suitability of this software for any purpose. X * It is provided "as is" without express or implied warranty. X * X ******************************************************************************/ X X X#include <stdio.h> X#include <signal.h> X#include <sys/wait.h> X Xextern int dbxpid; X X/* Kill the dbx child process and then exits. */ X/* ARGSUSED */ Xstatic void kill_handler(sig, code, scp, addr) X int sig, code; X struct sigcontext *scp; X char *addr; X{ X kill(dbxpid, SIGKILL); X switch (sig) { X case SIGINT : fprintf(stderr, "Interrupt\n"); break; X case SIGQUIT : fprintf(stderr, "Quit\n"); break; X case SIGILL : fprintf(stderr, "Illegal instruction\n"); break; X case SIGTRAP : fprintf(stderr, "Trace trap\n"); break; X case SIGFPE : fprintf(stderr, "Arithmetic exception\n"); break; X case SIGBUS : fprintf(stderr, "Bus error\n"); break; X case SIGSEGV : fprintf(stderr, "Segmentation violation\n"); break; X case SIGSYS : fprintf(stderr, "Bad argument to system call\n"); break; X } X exit(sig); X} X X Xstatic void quit_handler() X{ X union wait status; X X /* wait for the child to report its status; if the child has died, X * exit gracefully. X */ X wait3(&status, WNOHANG|WUNTRACED, NULL); X if (WIFEXITED(status) && !WIFSTOPPED(status)) { X exit(1); X } X} X X Xstatic void stop_handler() X{ X kill(dbxpid, SIGSTOP); /* stop dbx process */ X kill(0, SIGSTOP); /* stop own process */ X} X X Xstatic void cont_handler() X{ X kill(dbxpid, SIGCONT); /* continue dbx after stop */ X} X X X/* X * Trap signals to xdbx so that the child process can be handled properly. X */ Xvoid trap_signals() X{ X signal(SIGINT, kill_handler); X signal(SIGQUIT, kill_handler); X signal(SIGILL, kill_handler); X signal(SIGFPE, kill_handler); X signal(SIGBUS, kill_handler); X signal(SIGSEGV, kill_handler); X signal(SIGSYS, kill_handler); X X signal(SIGTSTP, stop_handler); /* stop signal from keyboard */ X signal(SIGCONT, cont_handler); /* continue after stop */ X signal(SIGCHLD, quit_handler); /* child status has changed */ X X signal(SIGTTOU, SIG_IGN); /* allow background write */ X} END_OF_FILE if test 2792 -ne `wc -c <'signals.c'`; then echo shar: \"'signals.c'\" unpacked with wrong size! fi # end of 'signals.c' fi if test -f 'stop.bits' -a "${1}" != "-c" ; then echo shar: Will not clobber existing file \"'stop.bits'\" else echo shar: Extracting \"'stop.bits'\" \(319 characters\) sed "s/^X//" >'stop.bits' <<'END_OF_FILE' X#define stop_width 16 X#define stop_height 16 X#define stop_x_hot -1 X#define stop_y_hot -1 Xstatic char stop_bits[] = { X 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x70, 0x00, 0xd0, 0x01, 0x5c, 0x07, X 0x54, 0x05, 0x54, 0x05, 0x14, 0x04, 0x0c, 0x04, 0x08, 0x04, 0x18, 0x06, X 0xf0, 0x03, 0xf0, 0x03, 0x00, 0x00, 0x00, 0x00}; END_OF_FILE if test 319 -ne `wc -c <'stop.bits'`; then echo shar: \"'stop.bits'\" unpacked with wrong size! fi # end of 'stop.bits' fi if test -f 'sun_regex.h' -a "${1}" != "-c" ; then echo shar: Will not clobber existing file \"'sun_regex.h'\" else echo shar: Extracting \"'sun_regex.h'\" \(3266 characters\) sed "s/^X//" >'sun_regex.h' <<'END_OF_FILE' X/****************************************************************************** X * X * xdbx - X Window System interface to dbx X * X * Copyright 1989 The University of Texas at Austin X * X * Author: Po Cheung X * Date: March 10, 1989 X * X * Permission to use, copy, modify, and distribute this software and X * its documentation for any purpose and without fee is hereby granted, X * provided that the above copyright notice appear in all copies and that X * both that copyright notice and this permission notice appear in X * supporting documentation. The University of Texas at Austin makes no X * representations about the suitability of this software for any purpose. X * It is provided "as is" without express or implied warranty. X * X ******************************************************************************/ X X X/* X * Regular expression pattern matching X * X * The reg_token array indicates the register no. for each token type. X * reg_token[0] : message X * reg_token[1] : stop number X * reg_token[2] : function name X * reg_token[3] : line number X * reg_token[4] : file name X */ X X#define BRACKET "(%d)" X X#define TK_MESG 0 X#define TK_STOP 1 X#define TK_FUNC 2 X#define TK_LINE 3 X#define TK_FILE 4 X X#define O_EXEC 0 X#define O_DONE 1 X#define O_STOPAT 2 X#define O_STOPIN 3 X#define O_UPDOWN 4 X#define O_BELL 5 X#define O_LIST 6 X X#define C_EXEC 0 X#define C_STOPAT 1 X#define C_STOPIN 2 X#define C_UPDOWN 3 X#define C_DELETE 4 X#define C_FUNC 5 X#define C_FILE 6 X#define C_DEBUG 7 X#define C_CD 8 X Xstatic PatternRec output_pattern[] = { X {"\\(.*\n\\)*\\(\\(stopped\\|Bus error\\|Segmentation fault\\|Interrupt\\|\ Xsignal.*\\) in \\([^ ]+\\) at line \\([0-9]+\\)\\( in file\ X \"\\([^ ]+\\)\"\\)?\\)\n", X NULL, X {2, -1, 4, 5, 7} X }, X {"\\(.*\n\\)*\\(execution completed\\|program exited with [0-9]+\\)", X NULL, X {-1, -1, -1, -1, -1} X }, X {"(\\([0-9]+\\)) stop at \\(\"\\([^ ]+\\)\":\\)?\\([0-9]+\\)\n", X NULL, X {-1, 1, -1, 4, 3} X }, X {"(\\([0-9]+\\)) stop in \\([^ ]+\\)\n", X NULL, X {-1, 1, 2, -1, -1} X }, X {"Current function is \\([^ ]+\\)\n[ ]*\\([0-9]+\\).*\n", X NULL, X {-1, -1, 1, 2, 3} X }, X {"\\(Already at the \\(top\\|bottom\\) call level\n\\|No active stack \ Xframes\n\\|no program to run\n\\|program is not active\n\\|can't continue \ Xexecution\n\\|.*\ncan't write to process.*\\)", X NULL, X {-1, -1, -1, -1, -1} X }, X {"[ ]*[0-9]+.*\n[ ]*[0-9]+.*\n[ ]*[0-9]+.*\n[ ]*[0-9]+.*\n[ ]*[0-9]+.*\n\ X[ ]*\\([0-9]+\\).*\n", X NULL, X {-1, -1, -1, 1, -1} X }, X NULL X}; X X Xstatic PatternRec command_pattern[] = { X {"[ ]*\\(run\\|cont\\|next\\|step\\).*\n", NULL, {-1, -1, -1, -1, -1}}, X {"[ ]*stop[ ]+at[ ]+[0-9]+.*\n", NULL, {-1, -1, -1, -1, -1}}, X {"[ ]*stop[ ]+in[ ]+.*\n", NULL, {-1, -1, -1, -1, -1}}, X {"[ ]*\\(up\\|down\\).*\n", NULL, {-1, -1, -1, -1, -1}}, X {"[ ]*delete.*\n", NULL, {-1, -1, -1, 1, -1}}, X {"[ ]*func[ ]*\\([^ ]+\\)[ ]*\n", NULL, {-1, -1, 1, -1, -1}}, X {"[ ]*file[ ]*\\([^ ]+\\)[ ]*\n", NULL, {-1, -1, -1, -1, 1}}, X {"[ ]*debug[ ]*\\([^ ]+\\)[ ]*\n", NULL, {-1, -1, -1, -1, 1}}, X {"[ ]*cd[ ]*\\([^ ]+\\)[ ]*\n", NULL, {-1, -1, -1, -1, 1}}, X NULL X}; END_OF_FILE if test 3266 -ne `wc -c <'sun_regex.h'`; then echo shar: \"'sun_regex.h'\" unpacked with wrong size! fi # end of 'sun_regex.h' fi if test -f 'updown.bits' -a "${1}" != "-c" ; then echo shar: Will not clobber existing file \"'updown.bits'\" else echo shar: Extracting \"'updown.bits'\" \(329 characters\) sed "s/^X//" >'updown.bits' <<'END_OF_FILE' X#define updown_width 16 X#define updown_height 16 X#define updown_x_hot -1 X#define updown_y_hot -1 Xstatic char updown_bits[] = { X 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x80, 0x01, 0x80, 0x03, X 0xff, 0x06, 0x01, 0x0c, 0x01, 0x0c, 0xff, 0x06, 0x80, 0x03, 0x80, 0x01, X 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}; END_OF_FILE if test 329 -ne `wc -c <'updown.bits'`; then echo shar: \"'updown.bits'\" unpacked with wrong size! fi # end of 'updown.bits' fi if test -f 'utils.c' -a "${1}" != "-c" ; then echo shar: Will not clobber existing file \"'utils.c'\" else echo shar: Extracting \"'utils.c'\" \(3281 characters\) sed "s/^X//" >'utils.c' <<'END_OF_FILE' X/****************************************************************************** X * X * xdbx - X Window System interface to dbx X * X * Copyright 1989 The University of Texas at Austin X * X * Author: Po Cheung X * Date: March 10, 1989 X * X * Permission to use, copy, modify, and distribute this software and X * its documentation for any purpose and without fee is hereby granted, X * provided that the above copyright notice appear in all copies and that X * both that copyright notice and this permission notice appear in X * supporting documentation. The University of Texas at Austin makes no X * representations about the suitability of this software for any purpose. X * It is provided "as is" without express or implied warranty. X * X ******************************************************************************/ X X X#include "global.h" X XXtTextPosition StartPos; /* starting position of input text */ X X/* Write s to dbx, and flush the output. */ X Xvoid writeDbx(s) Xchar *s; X{ X fputs(s, dbxfp); X fflush(dbxfp); X} X X/* Returns the working directory of dbx (for Sun dbx only). X */ Xchar *dbxpwd() X{ X char s[LINESIZ], *dir; X X#ifdef BSD X return NULL; X#else X if (dbxfp == NULL) return ("."); X Echo = FALSE; X writeDbx("pwd\n"); X while (fgets(s, LINESIZ, dbxfp) == NULL); X s[strlen(s)-1] = '\0'; X dir = XtNewString(s); X while (fgets(s, LINESIZ, dbxfp)); X Echo = TRUE; X return dir; X#endif X} X X XXtTextPosition TextGetLastPos(w) X Widget w; X{ X TextWidget ctx = (TextWidget) w; X return (ctx->text.lastPos); X} X X Xvoid AppendDialogText(s) X char *s; X{ X XtTextPosition i, lastPos; X XtTextBlock textblock; X X if (!s || !strcmp(s, "")) return; X X textblock.firstPos = 0; X textblock.length = strlen(s); X textblock.ptr = s; X X lastPos = TextGetLastPos(dialogWindow); X if (lastPos + textblock.length > DIALOGSIZE) { X for (i=lastPos/2; DialogText[i] != '\n'; i++); X strcpy(DialogText, &DialogText[i+1]); X lastPos = strlen(DialogText); X XtTextSetLastPos(dialogWindow, lastPos); X } X XtTextReplace(dialogWindow, lastPos, lastPos, &textblock); X StartPos = TextGetLastPos(dialogWindow); X XtTextSetInsertionPoint(dialogWindow, StartPos); X} X X/* X * Get the line number where the caret is. X */ XLine TextPositionToLine(pos) XXtTextPosition pos; X{ X Line line; X X if (displayedFile) { X for (line = displayedFile->topline; X pos >= displayedFile->linepos[line]; line++); X return (line-1); X } X else X return 0; X} X X/* X * Return the stop number associated with a given line number. X * Return 0 if stop number not found. X */ Xint LineToStop_no(line) XLine line; X{ X int i; X X for (i=1; i <= nstops; i++) X if (stops[i].line == line && stops[i].filename && displayedFile && X strcmp(stops[i].filename, displayedFile->filename) == NULL) { X return i; X } X return 0; X} X X Xvoid DisableWindowResize(w) XWidget w; X{ X Arg args[MAXARGS]; X Cardinal n; X Dimension height; X X n = 0; X XtSetArg(args[n], XtNheight, &height); n++; X XtGetValues(w, args, n); X XtPanedSetMinMax(w, height, height); X XtPanedAllowResize(w, False); X} X X Xvoid Bell(volume) Xint volume; X{ X XBell(XtDisplay(toplevel), volume); X} END_OF_FILE if test 3281 -ne `wc -c <'utils.c'`; then echo shar: \"'utils.c'\" unpacked with wrong size! fi # end of 'utils.c' fi if test -f 'windows.c' -a "${1}" != "-c" ; then echo shar: Will not clobber existing file \"'windows.c'\" else echo shar: Extracting \"'windows.c'\" \(5220 characters\) sed "s/^X//" >'windows.c' <<'END_OF_FILE' X/****************************************************************************** X * X * xdbx - X Window System interface to dbx X * X * Copyright 1989 The University of Texas at Austin X * X * Author: Po Cheung X * Date: March 10, 1989 X * X * Permission to use, copy, modify, and distribute this software and X * its documentation for any purpose and without fee is hereby granted, X * provided that the above copyright notice appear in all copies and that X * both that copyright notice and this permission notice appear in X * supporting documentation. The University of Texas at Austin makes no X * representations about the suitability of this software for any purpose. X * It is provided "as is" without express or implied warranty. X * X ******************************************************************************/ X X X#include "global.h" X X/* X * Private routines for creating various subwindows for xdbx. X */ X Xstatic void CreateTitleBar(parent) XWidget parent; X{ X Arg args[MAXARGS]; X Cardinal n; X X n = 0; X XtSetArg(args[n], XtNlabel, (XtArgVal) TITLE); n++; X XtSetArg(args[n], XtNwidth, (XtArgVal) app_resources.shellWidth); n++; X XtSetArg(args[n], XtNjustify, (XtArgVal) XtJustifyCenter); n++; X XtSetArg(args[n], XtNresize, (XtArgVal) False); n++; X titleBar = XtCreateManagedWidget("titleBar", labelWidgetClass, parent, X args, n); X} X Xstatic void CreateFileLabel(parent) XWidget parent; X{ X Arg args[MAXARGS]; X Cardinal n; X X n = 0; X XtSetArg(args[n], XtNlabel, (XtArgVal) "No Source File"); n++; X XtSetArg(args[n], XtNwidth, (XtArgVal) app_resources.shellWidth); n++; X XtSetArg(args[n], XtNborderWidth, (XtArgVal) 0); n++; X XtSetArg(args[n], XtNjustify, (XtArgVal) XtJustifyCenter); n++; X XtSetArg(args[n], XtNresizable, (XtArgVal) False); n++; X fileLabel = XtCreateManagedWidget("fileLabel", labelWidgetClass, X parent, args, n); X} X Xstatic void CreateLineLabel(parent) XWidget parent; X{ X Arg args[MAXARGS]; X Cardinal n; X int horizDistance; X X horizDistance = app_resources.shellWidth - app_resources.lineLabelWidth; X n = 0; X XtSetArg(args[n], XtNlabel, (XtArgVal) ""); n++; X XtSetArg(args[n], XtNwidth, (XtArgVal) app_resources.lineLabelWidth); n++; X XtSetArg(args[n], XtNborderWidth, (XtArgVal) 0); n++; X XtSetArg(args[n], XtNresizable, (XtArgVal) False); n++; X XtSetArg(args[n], XtNhorizDistance, (XtArgVal) horizDistance); n++; X lineLabel = XtCreateManagedWidget("lineLabel", labelWidgetClass, X parent, args, n); X} X Xstatic void CreateFileWindow(parent) XWidget parent; X{ X Arg args[MAXARGS]; X Cardinal n; X X n = 0; X XtSetArg(args[n], XtNdefaultDistance, 0); n++; X fileWindow = XtCreateManagedWidget("fileWindow", formWidgetClass, X parent, args, n); X CreateLineLabel(fileWindow); X CreateFileLabel(fileWindow); X} X Xstatic void CreateMessageWindow(parent) XWidget parent; X{ X Arg args[MAXARGS]; X Cardinal n; X X n = 0; X XtSetArg(args[n], XtNlabel, (XtArgVal) ""); n++; X XtSetArg(args[n], XtNwidth, (XtArgVal) app_resources.shellWidth); n++; X XtSetArg(args[n], XtNjustify, (XtArgVal) XtJustifyLeft); n++; X XtSetArg(args[n], XtNresize, (XtArgVal) False); n++; X XtSetArg(args[n], XtNmin, (XtArgVal) app_resources.messageHeight); n++; X XtSetArg(args[n], XtNmax, (XtArgVal) app_resources.messageHeight); n++; X XtSetArg(args[n], XtNallowResize, (XtArgVal) False); n++; X messageWindow = XtCreateManagedWidget("messageWindow", labelWidgetClass, X parent, args, n); X} X X/* X * Top level function for creating all the xdbx subwindows. X */ Xvoid CreateSubWindows(parent) XWidget parent; X{ X Arg args[MAXARGS]; X Cardinal n; X X n = 0; X XtSetArg(args[n], XtNwidth, (XtArgVal) app_resources.shellWidth); n++; X vpane = XtCreateManagedWidget("vpane", vPanedWidgetClass, parent, args, n); X X if (!app_resources.noTitleBar) CreateTitleBar(vpane); X CreateFileWindow(vpane); X CreateSourceWindow(vpane); X CreateMessageWindow(vpane); X CreateCommandPanel(vpane); X CreateDialogWindow(vpane); X} X X/* X * Public routines for updating fields for the filename and line number X * in the file window, and the execution status in the message window. X */ X Xvoid UpdateFileLabel(string) Xchar *string; X{ X Arg args[MAXARGS]; X Cardinal n; X X n = 0; X XtSetArg(args[n], XtNlabel, (XtArgVal) string); n++; X XtSetValues(fileLabel, args, n); X} X Xvoid UpdateLineLabel(line) XCardinal line; X{ X Arg args[MAXARGS]; X Cardinal n; X char string[10]; X X n = 0; X if (line > 0) X sprintf(string, "%d", line); X else X strcpy(string, ""); X XtSetArg(args[n], XtNlabel, (XtArgVal) string); n++; X XtSetValues(lineLabel, args, n); X} X Xvoid UpdateMessageWindow(message) Xchar *message; X{ X char string[LINESIZ]; X Arg args[MAXARGS]; X Cardinal n; X X strcpy(string, " "); X strcat(string, message); X n = 0; X XtSetArg(args[n], XtNlabel, (XtArgVal) string); n++; X XtSetValues(messageWindow, args, n); X} END_OF_FILE if test 5220 -ne `wc -c <'windows.c'`; then echo shar: \"'windows.c'\" unpacked with wrong size! fi # end of 'windows.c' fi if test -f 'xdbx.c' -a "${1}" != "-c" ; then echo shar: Will not clobber existing file \"'xdbx.c'\" else echo shar: Extracting \"'xdbx.c'\" \(6204 characters\) sed "s/^X//" >'xdbx.c' <<'END_OF_FILE' X/****************************************************************************** X * X * xdbx - X Window System interface to dbx X * X * Copyright 1989 The University of Texas at Austin X * X * Author: Po Cheung X * Date: March 10, 1989 X * X * Permission to use, copy, modify, and distribute this software and X * its documentation for any purpose and without fee is hereby granted, X * provided that the above copyright notice appear in all copies and that X * both that copyright notice and this permission notice appear in X * supporting documentation. The University of Texas at Austin makes no X * representations about the suitability of this software for any purpose. X * It is provided "as is" without express or implied warranty. X * X ******************************************************************************/ X X X#include "global.h" X X#define Offset(field) (XtOffset(XdbxResources *, field)) X XWidget toplevel, /* top level widget */ X vpane, /* parent of all subwindows */ X titleBar, /* label widget displaying title */ X fileWindow, /* form widget containing : */ X fileLabel, /* file name of displayed text */ X lineLabel, /* line number of caret */ X sourceWidget, /* form widget, parent of sourceWindow */ X sourceWindow, /* asciiString widget, source file */ X messageWindow, /* label widget, execution status */ X commandWindow, /* command panel, box widget */ X dialogWindow; /* dialog window, asciiString widget */ X XXdbxResources app_resources; /* application resources of xdbx */ Xchar *xdbxinit = "xdbx.XXXXXX"; XBoolean Homedir; X X Xstatic XtResource resources[] = { X {"shellWidth", "ShellWidth", XtRDimension, sizeof(Dimension), X Offset(shellWidth), XtRString, "550"}, X {"lineLabelWidth", "LineLabelWidth", XtRDimension, sizeof(Dimension), X Offset(lineLabelWidth), XtRString, "70"}, X {"sourceHeight", "SourceHeight", XtRDimension, sizeof(Dimension), X Offset(sourceHeight), XtRString, "320"}, X {"leftMargin", "LeftMargin", XtRDimension, sizeof(Dimension), X Offset(leftMargin), XtRString, "35"}, X {"dialogHeight", "DialogHeight", XtRDimension, sizeof(Dimension), X Offset(dialogHeight), XtRString, "200"}, X {"dialogMinHeight", "DialogMinHeight", XtRDimension, sizeof(Dimension), X Offset(dialogMinHeight), XtRString, "15"}, X {"messageHeight", "MessageHeight", XtRDimension, sizeof(Dimension), X Offset(messageHeight), XtRString, "30"}, X {"buttonWidth", "ButtonWidth", XtRDimension, sizeof(Dimension), X Offset(buttonWidth), XtRString, "50"}, X {"commandHSpace", "CommandHSpace", XtRDimension, sizeof(Dimension), X Offset(commandHSpace), XtRString, "14"}, X {"commandVSpace", "CommandVSpace", XtRDimension, sizeof(Dimension), X Offset(commandVSpace), XtRString, "10"}, X {"commandMinHeight", "CommmandMinHeight", XtRDimension, sizeof(Dimension), X Offset(commandMinHeight), XtRString, "70"}, X {"commandMaxHeight", "CommandMaxHeight", XtRDimension, sizeof(Dimension), X Offset(commandMaxHeight), XtRString, "120"}, X {"columnSpacing", "ColumnSpacing", XtRDimension, sizeof(Dimension), X Offset(columnSpacing), XtRString, "10"}, X {"filesPerColumn", "FilesPerColumn", XtRInt, sizeof(int), X Offset(filesPerColumn), XtRString, "10"}, X {"noTitleBar", "NoTitleBar", XtRBoolean, sizeof(Boolean), X Offset(noTitleBar), XtRImmediate, (caddr_t)False}, X {"stopForeground", "StopForeground", XtRPixel, sizeof(Pixel), X Offset(stopForeground), XtRString, "Red"}, X {"arrowForeground", "ArrowForeground", XtRPixel, sizeof(Pixel), X Offset(arrowForeground), XtRString, "Blue"}, X {"updownForeground", "UpdownForeground", XtRPixel, sizeof(Pixel), X Offset(updownForeground), XtRString, "Blue"}, X}; X Xstatic XrmOptionDescRec options[] = { X {"-r", "dbxopt_r", XrmoptionNoArg, "True"}, X {"-i", "dbxopt_i", XrmoptionNoArg, "True"}, X {"-I", "includeDir", XrmoptionSepArg, NULL}, X {"-k", "dbxopt_k", XrmoptionNoArg, "True"}, X#ifdef BSD /* Berkeley dbx */ X {"-c", "cfile", XrmoptionSepArg, NULL}, X#else /* Sun Release 3.2 or 3.4 dbx */ X {"-kbd", "dbxopt_kbd", XrmoptionNoArg, "True"}, X#endif X#ifdef sparc /* SunOS 4.0 dbx */ X {"-f", "fcount", XrmoptionSepArg, NULL}, X {"-s", "startup", XrmoptionSepArg, NULL}, X {"-sr", "tstartup", XrmoptionSepArg, NULL}, X#endif X}; X X Xstatic void Syntax(call) Xchar *call; X{ X fprintf(stderr, X "Usage: %s [-toolkitoptions] [-dbxoptions] [objfile [corefile]]\n", X call); X} X X Xstatic void Initialize() X{ X source_init(); X signs_init(); X parser_init(); X if (!app_resources.noTitleBar) DisableWindowResize(titleBar); X DisableWindowResize(fileWindow); X mktemp(xdbxinit); X Homedir = False; X if (rename(".dbxinit", xdbxinit) == -1) { X rename("~/.dbxinit", xdbxinit); X Homedir = True; X } X} X X Xint dbxoptions(argc, argv, app_resources) X int argc; X char **argv; X XdbxResources app_resources; X{ X if (app_resources.dbxopt_r) X argv[argc++] = "-r"; X if (app_resources.dbxopt_i) X argv[argc++] = "-i"; X if (app_resources.includeDir) { X argv[argc++] = "-I"; X strcpy(argv[argc++], app_resources.includeDir); X } X if (app_resources.dbxopt_k) X argv[argc++] = "-k"; X if (app_resources.cfile) { X argv[argc++] = "-c"; X strcpy(argv[argc++], app_resources.cfile); X } X if (app_resources.dbxopt_kbd) X argv[argc++] = "-kbd"; X if (app_resources.fcount) { X argv[argc++] = "-f"; X strcpy(argv[argc++], app_resources.fcount); X } X if (app_resources.startup) { X argv[argc++] = "-s"; X strcpy(argv[argc++], app_resources.startup); X } X if (app_resources.tstartup) { X argv[argc++] = "-sr"; X strcpy(argv[argc++], app_resources.tstartup); X } X argv[argc] = NULL; X return argc; X} X X Xvoid main(argc, argv) Xunsigned int argc; Xchar **argv; X{ X trap_signals(); X X toplevel = XtInitialize("toplevel", "XDbx", options, XtNumber(options), X &argc, argv); X X if (argc > 3) Syntax(argv[0]); X X XtGetApplicationResources(toplevel, &app_resources, resources, X XtNumber(resources), NULL, 0); X X CreateSubWindows(toplevel); X X XtRealizeWidget(toplevel); X X Initialize(); X argc = dbxoptions(argc, argv, app_resources); X calldbx(argc, argv); X X XtMainLoop(); X} END_OF_FILE if test 6204 -ne `wc -c <'xdbx.c'`; then echo shar: \"'xdbx.c'\" unpacked with wrong size! fi # end of 'xdbx.c' fi echo shar: End of archive 3 \(of 3\). cp /dev/null ark3isdone MISSING="" for I in 1 2 3 ; do if test ! -f ark${I}isdone ; then MISSING="${MISSING} ${I}" fi done if test "${MISSING}" = "" ; then echo You have unpacked all 3 archives. rm -f ark[1-9]isdone else echo You still need to unpack the following archives: echo " " ${MISSING} fi ## End of shell archive. exit 0 -- Mike Wexler(wyse!mikew) Phone: (408)433-1000 x1330 Moderator of comp.sources.x