v03i066: Patches to xdbx, Part02/03
Dan Heller
argv at island.uu.net
Thu Apr 6 17:05:17 AEST 1989
Submitted-by: Ps Cheung <po at volta.ece.utexas.edu>
Posting-number: Volume 3, Issue 66
Archive-name: xdbx.patch/part02
#!/bin/sh
echo x - xdbx.patch.2
sed 's/^X//' > xdbx.patch.2 <<'+END+OF+xdbx.patch.2'
Xdiff -c xdbx1.0/Imakefile xdbx1.1/Imakefile
X*** xdbx1.0/Imakefile Fri Mar 24 01:18:40 1989
X--- xdbx1.1/Imakefile Fri Mar 24 00:49:04 1989
X***************
X*** 1,14 ****
X #ifdef VaxArchitecture
X! DEFINES = -DBSD /* Berkeley dbx */
X #endif
X
X LOCAL_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 ComplexProgramTarget(xdbx)
X InstallAppDefaults(XDbx)
X--- 1,19 ----
X #ifdef VaxArchitecture
X! DEFINES = -DBSD /* Berkeley dbx */
X #endif
X+ /*
X+ DEFINES = -DSUNOS4_0
X+ */
X
X LOCAL_LIBRARIES = $(XAWLIB) $(XMULIB) $(XTOOLLIB) $(XLIB)
X
X! SRCS = calldbx.c command.c dbx.c dialog.c filemenu.c handler.c \
X! parser.c regex.c signs.c signals.c source.c utils.c \
X! windows.c xdbx.c
X
X! OBJS = calldbx.o command.o dbx.o dialog.o filemenu.o handler.o \
X! parser.o regex.o signs.o signals.o source.o utils.o \
X! windows.o xdbx.o
X
X ComplexProgramTarget(xdbx)
X InstallAppDefaults(XDbx)
Xdiff -c xdbx1.0/Makefile xdbx1.1/Makefile
X*** xdbx1.0/Makefile Fri Mar 24 01:18:40 1989
X--- xdbx1.1/Makefile Fri Mar 24 00:47:51 1989
X***************
X*** 135,145 ****
X
X LOCAL_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
X--- 135,147 ----
X
X LOCAL_LIBRARIES = $(XAWLIB) $(XMULIB) $(XTOOLLIB) $(XLIB)
X
X! SRCS = calldbx.c command.c dbx.c dialog.c filemenu.c handler.c \
X! parser.c regex.c signs.c signals.c source.c utils.c \
X! windows.c xdbx.c
X
X! OBJS = calldbx.o command.o dbx.o dialog.o filemenu.o handler.o \
X! parser.o regex.o signs.o signals.o source.o utils.o \
X! windows.o xdbx.o
X
X PROGRAM = xdbx
X
Xdiff -c xdbx1.0/bsd_regex.h xdbx1.1/bsd_regex.h
X*** xdbx1.0/bsd_regex.h Fri Mar 24 01:18:41 1989
X--- xdbx1.1/bsd_regex.h Fri Mar 31 05:05:19 1989
X***************
X*** 54,64 ****
X #define C_FILE 6
X #define C_DEBUG 7
X #define C_CD 8
X
X
X static PatternRec output_pattern[] = {
X /* exec */
X! {"\\(.*\n\\)*\\(\[[0-9]+\] \\)?\\(\\(stopped\\|Bus error\\|Segmentation \
X fault\\|Interrupt\\) in \\([^ ]+\\) at line \
X \\([0-9]+\\)\\( in file \"\\([^ ]+\\)\"\\)?\\)\n",
X NULL,
X--- 54,65 ----
X #define C_FILE 6
X #define C_DEBUG 7
X #define C_CD 8
X+ #define C_USE 9
X
X
X static PatternRec output_pattern[] = {
X /* exec */
X! {"\\(.*\n\\)*.*\\(\[[0-9]+\] \\)?\\(\\(stopped\\|Bus error\\|Segmentation \
X fault\\|Interrupt\\) in \\([^ ]+\\) at line \
X \\([0-9]+\\)\\( in file \"\\([^ ]+\\)\"\\)?\\)\n",
X NULL,
X***************
X*** 98,109 ****
X };
X
X static 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 };
X--- 99,112 ----
X };
X
X static PatternRec command_pattern[] = {
X! {"[ ]*\\(run\\|r\\|cont\\|c\\|next\\|n\\|step\\|s\\|return\\|r\\).*\n",
X! NULL, {-1, -1, -1, -1, -1}},
X! {"[ ]*\\(stop\\|st\\)[ ]+at[ ]+[0-9]+.*\n", NULL, {-1, -1, -1, -1, -1}},
X! {"[ ]*\\(stop\\|st\\)[ ]+in[ ]+.*\n", NULL, {-1, -1, -1, -1, -1}},
X {"[ ]*\\(up\\|down\\).*\n", NULL, {-1, -1, -1, -1, -1}},
X! {"[ ]*\\(delete\\|d\\).*\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+ {"[ ]*use[ ]*.*\n", NULL, {-1, -1, -1, -1, 1}},
X NULL
X };
Xdiff -c xdbx1.0/calldbx.c xdbx1.1/calldbx.c
X*** xdbx1.0/calldbx.c Fri Mar 24 01:18:41 1989
X--- xdbx1.1/calldbx.c Thu Mar 30 21:27:16 1989
X***************
X*** 18,24 ****
X ******************************************************************************/
X
X
X! #include <sys/ioctl.h>
X #include "global.h"
X
X FILE *dbxfp = NULL; /* file pointer to dbx */
X--- 18,24 ----
X ******************************************************************************/
X
X
X! #include <sgtty.h>
X #include "global.h"
X
X FILE *dbxfp = NULL; /* file pointer to dbx */
X***************
X*** 38,44 ****
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--- 38,44 ----
X int i, master;
X char c;
X
X! for (c='p'; c<='s'; c++) {
X pty[8] = c;
X for (i=0; i<16; i++) {
X pty[9] = "0123456789abcdef"[i];
X***************
X*** 46,52 ****
X return (master);
X }
X }
X! fprintf(stderr, "xdbx: all ptys in use: ptyp0 - ptyqf\n");
X exit(1);
X }
X
X--- 46,52 ----
X return (master);
X }
X }
X! fprintf(stderr, "xdbx: all ptys in use\n");
X exit(1);
X }
X
X***************
X*** 70,85 ****
X int argc;
X char *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--- 70,91 ----
X int argc;
X char *argv[];
X {
X! struct sgttyb Sgtty;
X! int master; /* file descriptor of master pty */
X! int slave; /* file descriptor to slave pty */
X! char *debugger, /* name of executable debugger */
X! errmsg[LINESIZ];
X
X+ debugger = (char *) getenv("DEBUGGER"); /* first looks up env var */
X+ if (debugger == NULL)
X+ debugger = XtNewString(DEBUGGER);
X+
X master = openMaster();
X slave = openSlave();
X
X! ioctl(slave, TIOCGETP, &Sgtty);
X! Sgtty.sg_flags &= ~(ECHO|CRMOD); /* no echo, no NL to CR */
X! ioctl(slave, TIOCSETP, &Sgtty);
X
X dbxpid = fork();
X if (dbxpid == -1) {
X***************
X*** 118,126 ****
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 }
X--- 124,133 ----
X close(slave);
X fcntl(1, F_SETFL, FAPPEND);
X setbuf(stdout, NULL);
X! argv[0] = debugger;
X! execvp(debugger, argv);
X! sprintf(errmsg, "Cannot call %s", debugger);
X! perror(errmsg);
X exit(1);
X }
X }
Xdiff -c xdbx1.0/command.c xdbx1.1/command.c
X*** xdbx1.0/command.c Fri Mar 24 01:18:37 1989
X--- xdbx1.1/command.c Fri Mar 24 01:03:04 1989
X***************
X*** 18,43 ****
X ******************************************************************************/
X
X
X #include <signal.h>
X #include <ctype.h>
X- #include <X11/Xos.h>
X- #include <sys/stat.h>
X #include <sys/wait.h>
X- #ifdef sparc
X- #include <dirent.h>
X- #else
X- #include <sys/dir.h>
X- #endif
X #include "global.h"
X
X char Command[LINESIZ] = ""; /* xdbx command string */
X
X! static String filelist[MAXFILES]; /* list of file names in fileMenu */
X! static int nfiles = 0; /* number of files in filelist */
X! static Widget fileMenu = NULL, /* list widget as file menu */
X! popupshell; /* parent of fileMenu */
X
X-
X /* ARGSUSED */
X static void DoIt (w, client_data, call_data)
X Widget w;
X--- 18,41 ----
X ******************************************************************************/
X
X
X+ /* Command.c
X+ *
X+ * This file contains
X+ * CreateCommandPanel() : create a window with command buttons.
X+ * AddButton() : Add a command button into the command window.
X+ * command callbacks for the command buttons.
X+ */
X+
X #include <signal.h>
X #include <ctype.h>
X #include <sys/wait.h>
X #include "global.h"
X
X char Command[LINESIZ] = ""; /* xdbx command string */
X
X! extern void File();
X! extern void SetUpFileMenu();
X
X /* ARGSUSED */
X static void DoIt (w, client_data, call_data)
X Widget w;
X***************
X*** 51,56 ****
X--- 49,71 ----
X }
X
X /* ARGSUSED */
X+ #ifdef BSD
X+ static void Return (w, client_data, call_data)
X+ Widget w;
X+ caddr_t client_data;
X+ caddr_t call_data;
X+ {
X+ char *funcname;
X+ int nbytes;
X+
X+ funcname = XFetchBytes(XtDisplay(w), &nbytes); /* from CUT_BUFFER0 */
X+ sprintf(Command, "return %s\n", funcname);
X+ AppendDialogText(Command);
X+ writeDbx(Command);
X+ }
X+ #endif
X+
X+ /* ARGSUSED */
X static void Stop_at(w, client_data, call_data)
X Widget w;
X caddr_t client_data;
X***************
X*** 156,293 ****
X writeDbx(Command);
X }
X
X- /* ARGSUSED */
X- /* Callback for the fileMenu list widget, display the file selected in the
X- * menu on the source window.
X- */
X- static void DisplayMenuFile(w, client_data, call_data)
X- Widget w;
X- Widget client_data;
X- XtListReturnStruct *call_data;
X- {
X- XtPopdown(client_data);
X- if (call_data->string == NULL ||
X- strcmp(call_data->string, CANCEL) == NULL) return;
X- displayedFile = LoadFile(call_data->string);
X- sprintf(Command, "file %s\n", call_data->string);
X- AppendDialogText(Command);
X- writeDbx(Command);
X- }
X
X-
X- /* A directory entry is included in the display list if it is a regular
X- * file but not an executable file.
X- */
X- static int InList(entry)
X- Directory *entry;
X- {
X- char buffer[16];
X- int i, n;
X- FILE *fp;
X-
X- if ((fp = fopen(entry->d_name, "r")) == NULL)
X- return False;
X- if (n = fread(buffer, sizeof(char), sizeof(buffer), fp)) {
X- fclose(fp);
X- for (i=0; i<n && (isprint(buffer[i]) || isspace(buffer[i])); i++);
X- return ((i-sizeof(buffer)) ? False : True);
X- }
X- fclose(fp);
X- return False;
X- }
X-
X- /* Scans the working directory for files selected by InList(), sorted
X- * alphabetically, and stored in an array of pointers to directory
X- * entries called namelist.
X- * The names of the selected files are stored in filelist.
X- */
X- static void ScanDir()
X- {
X- extern alphasort();
X- Directory **namelist;
X- char *dir, message[LINESIZ];
X- int i;
X-
X- i = 0;
X- filelist[i++] = "";
X- dir = dbxpwd();
X- nfiles = scandir(dir, &namelist, InList, alphasort);
X- for (i=1; i<nfiles; i++) {
X- filelist[i] = XtNewString(namelist[i]->d_name);
X- }
X- filelist[0] = CANCEL;
X- filelist[i] = NULL;
X- return;
X- }
X-
X- /* Creates a popup shell with its child being a list widget containing
X- * file names returned from ScanDir().
X- * When an item in the list is selected, DisplayMenuFile will be called.
X- */
X- static void SetUpFileMenu()
X- {
X- Arg args[MAXARGS];
X- Cardinal n;
X- int ncolumns;
X-
X- static String translations = "\
X- <Btn1Down>,<Btn1Up>: Set() Notify() Unset()";
X-
X- n = 0;
X- popupshell = XtCreatePopupShell("popup", overrideShellWidgetClass,
X- toplevel, args, n);
X-
X- ScanDir();
X- n = 0;
X- ncolumns = nfiles/app_resources.filesPerColumn + 1;
X- XtSetArg(args[n], XtNlist, filelist); n++;
X- XtSetArg(args[n], XtNverticalList, True); n++;
X- XtSetArg(args[n], XtNcolumnSpacing, app_resources.columnSpacing); n++;
X- XtSetArg(args[n], XtNdefaultColumns, (XtArgVal) ncolumns); n++;
X- XtSetArg(args[n], XtNtranslations, XtParseTranslationTable(translations));
X- n++;
X- fileMenu = XtCreateManagedWidget("fileMenu", listWidgetClass,
X- popupshell, args, n);
X- XtAddCallback(fileMenu, XtNcallback, DisplayMenuFile, popupshell);
X- }
X-
X- /* Destroy the existing popup shell and creates another one. */
X- void UpdateFileMenu()
X- {
X- XtDestroyWidget(popupshell);
X- SetUpFileMenu();
X- }
X-
X /* ARGSUSED */
X- static void File(w, client_data, call_data)
X- Widget w;
X- caddr_t client_data;
X- caddr_t call_data;
X- {
X- Arg args[MAXARGS];
X- Cardinal n;
X- Position x, y, x_offset;
X- Dimension fileMenu_width, border_width, source_width;
X-
X- n = 0;
X- XtSetArg(args[n], XtNwidth, &fileMenu_width); n++;
X- XtSetArg(args[n], XtNborderWidth, &border_width); n++;
X- XtGetValues(fileMenu, args, n);
X-
X- n = 0;
X- XtSetArg(args[n], XtNwidth, &source_width); n++;
X- XtGetValues(sourceWindow, args, n);
X-
X- x_offset = (Position) (source_width - fileMenu_width - 2*border_width);
X- XtTranslateCoords(sourceWindow, x_offset, 0, &x, &y);
X- x = MAX(0, x);
X- y = MAX(0, y);
X- XtMoveWidget(popupshell, x, y);
X- XtPopup(popupshell, XtGrabNonexclusive);
X- }
X-
X-
X- /* ARGSUSED */
X static void Quit(w, client_data, call_data)
X Widget w;
X caddr_t client_data;
X--- 171,178 ----
X***************
X*** 297,306 ****
X--- 182,193 ----
X
X writeDbx("quit\n");
X XtDestroyWidget(toplevel);
X+ kill(dbxpid, SIGKILL);
X wait3(&status, WNOHANG, NULL);
X exit(0);
X }
X
X+
X static void AddButton (parent, name, function, client_data)
X Widget parent;
X char *name;
X***************
X*** 318,323 ****
X--- 205,211 ----
X XtAddCallback(button, XtNcallback, function, client_data);
X }
X
X+
X static void CreateButtons (parent)
X Widget parent;
X {
X***************
X*** 325,335 ****
X--- 213,229 ----
X AddButton (parent, "cont", DoIt, "cont\n");
X AddButton (parent, "next", DoIt, "next\n");
X AddButton (parent, "step", DoIt, "step\n");
X+ #ifdef BSD
X+ AddButton (parent, "return", Return, "return\n");
X+ #endif
X
X AddButton (parent, "stop at", Stop_at, NULL);
X AddButton (parent, "stop in", Stop_in, NULL);
X AddButton (parent, "delete", Delete, NULL);
X+
X+ #ifndef BSD
X AddButton (parent, "status", DoIt, "status\n");
X+ #endif
X
X AddButton (parent, "where", DoIt, "where\n");
X AddButton (parent, "up", DoIt, "up\n");
X***************
X*** 360,364 ****
X commandWindow = XtCreateManagedWidget("commandWindow", boxWidgetClass,
X parent, args, n);
X CreateButtons(commandWindow);
X! SetUpFileMenu();
X }
X--- 254,258 ----
X commandWindow = XtCreateManagedWidget("commandWindow", boxWidgetClass,
X parent, args, n);
X CreateButtons(commandWindow);
X! SetUpFileMenu(dbxpwd());
X }
Xdiff -c xdbx1.0/dbx.c xdbx1.1/dbx.c
X*** xdbx1.0/dbx.c Fri Mar 24 01:18:42 1989
X--- xdbx1.1/dbx.c Sun Apr 2 17:45:09 1989
X***************
X*** 26,32 ****
X static int outputsize = 0; /* size of buffer */
X static Boolean continueFlag; /* read flag for dbxinit commands */
X
X! static void Dbxinit(fp)
X FILE *fp;
X {
X char s[LINESIZ];
X--- 26,39 ----
X static int outputsize = 0; /* size of buffer */
X static Boolean continueFlag; /* read flag for dbxinit commands */
X
X!
X! /* Given a file pointer to xdbx.XXXXXX, this routine executes each dbx
X! * command in the file. It sends the command to dbx, and calls readDbx()
X! * directly to process output returned from dbx.
X! * The continueFlag is there to make sure it reads everything from dbx
X! * before issuing another command.
X! */
X! static void dbx_init(fp)
X FILE *fp;
X {
X char s[LINESIZ];
X***************
X*** 43,75 ****
X }
X
X /*
X! * Called only once to display the source file, if any, right after
X! * xdbx is started up.
X */
X! void 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 */
X XtInputCallbackProc readDbx(client_data, source, id)
X caddr_t client_data;
X--- 50,94 ----
X }
X
X /*
X! * This routine is called after getting the first dbx prompt.
X! * In Sun dbx, DebugInit() is also called after each 'debug' command.
X! *
X! * > check the use list to create a list of directories for searching
X! * source files.
X! * > ask dbx for the source file and display it if it exists.
X! * > if the temporary file in xdbxinit exists, call dbx_init only if
X! * the source file has been displayed. Then rename the temporary
X! * file back to the original file.
X */
X! void DebugInit()
X {
X FILE *fp;
X
X! MakeDirList(QueryDbx("use\n", FALSE));
X! if (LoadFile(QueryFile()) == 0)
X! UpdateMessageWindow("Ready for execution");
X if (fp = fopen(xdbxinit, "r")) {
X if (displayedFile)
X! dbx_init(fp);
X! if (Homedir == 0)
X rename(xdbxinit, ".dbxinit");
X+ else if (Homedir == 1)
X+ rename(xdbxinit, "~/.dbxinit");
X }
X }
X
X /*
X! * This is a callback procedure invoked everytime when input is pending
X * on the file descriptor to dbx.
X! * > reads all the data available on the file descriptor line by line
X! * into local variable 'string' and global variable 'output'.
X! * 'output' records the entire dbx output whereas 'string' records
X! * only the data read in this invocation of readDbx().
X! * > in Echo mode, the contents in 'string' is edited by filter()
X! * before it gets displayed on the dialog window.
X! * > once the dbx prompt is read, calls parse() to analyse the dbx output
X! * and take appropriate action.
X! * > After the very first dbx prompt is read, calls DebugInit().
X */
X XtInputCallbackProc readDbx(client_data, source, id)
X caddr_t client_data;
X***************
X*** 78,128 ****
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 }
X--- 97,147 ----
X {
X char s[LINESIZ], *string;
X int stringsize;
X! static Boolean firstTime = TRUE, /* ensure DebugInit() only get */
X! debugFlag = FALSE; /* called once */
X
X! if (outputsize == 0) { /* allocate output buffer */
X outputsize = BUFSIZ;
X output = XtMalloc(outputsize);
X strcpy(output, "");
X }
X! stringsize = BUFSIZ; /* allocate string buffer */
X string = XtMalloc(stringsize);
X strcpy(string, "");
X+
X while (fgets(s, LINESIZ, dbxfp)) {
X! if (Echo) {
X! EnterCommand = FALSE;
X! if (strcmp(s, PROMPT)) {
X! if (strlen(string) + strlen(s) > stringsize) {
X! string = XtRealloc(string, stringsize + BUFSIZ);
X! stringsize += BUFSIZ;
X! }
X! if (strlen(output) + strlen(s) > outputsize) {
X! output = XtRealloc(output, outputsize + BUFSIZ);
X! outputsize += BUFSIZ;
X! }
X! strcat(string, s);
X! strcat(output, s);
X }
X! else { /* dbx prompt arrives */
X! parse(output);
X! strcpy(output, "");
X! strcpy(s, "");
X! strcat(string, XPROMPT);
X! EnterCommand = TRUE; /* next input should be a command */
X! continueFlag = FALSE; /* signal end to dbx_init() */
X! if (firstTime) {
X! firstTime = FALSE;
X! debugFlag = TRUE;
X! }
X }
X }
X }
X filter(string);
X AppendDialogText(string);
X! if (debugFlag) {
X! debugFlag = FALSE;
X! DebugInit(); /* must be called here, after string has */
X! } /* been appended to the dialog window */
X }
Xdiff -c xdbx1.0/defs.h xdbx1.1/defs.h
X*** xdbx1.0/defs.h Fri Mar 24 01:18:42 1989
X--- xdbx1.1/defs.h Sat Apr 1 15:10:19 1989
X***************
X*** 19,24 ****
X--- 19,25 ----
X
X
X #include <stdio.h>
X+ #include <sys/param.h>
X #include <X11/Xos.h>
X #include <X11/IntrinsicP.h>
X #include <X11/StringDefs.h>
X***************
X*** 34,61 ****
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
X typedef int Line;
X
X! #ifdef sparc
X typedef struct dirent Directory;
X #else
X typedef struct direct Directory;
X--- 35,65 ----
X #include <X11/Command.h>
X #include <X11/Label.h>
X
X
X #define DIALOGSIZE 10000 /* max size of dialog window buffer */
X! #define LINESIZ 512 /* input line length */
X! #define MAXNAME 256 /* max identifier length */
X! #define MAXARGS 20 /* max number of args */
X! #define FILETABLESIZE 32 /* initial fileTable size */
X! #define ADD_FILES 16 /* # of files added during Realloc */
X! #define MAXDIRS 256 /* max number of dirs in DirList */
X #define MAXSTOPS 256 /* max number of stops */
X! #define MAXSIGNS 256 /* max number of signs */
X! #define MAXCOLUMNS 8 /* max number of columns in file menu */
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 DEBUGGER "dbx" /* name of executable */
X! #define PROMPT "(dbx) " /* dbx prompt string */
X! #define XPROMPT "(xdbx) " /* xdbx prompt string */
X! #define TITLE "xdbx 1.1" /* xdbx title string */
X #define DELIMITERS " !%^&*()+=~|;:{},/#<?\"\n\t"
X
X+ #define LASTCH(s) (s[strlen(s)-1])
X
X typedef int Line;
X
X! #ifdef SUNOS4_0
X typedef struct dirent Directory;
X #else
X typedef struct direct Directory;
X***************
X*** 80,85 ****
X--- 84,93 ----
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+ /* Translation tables for : */
X+ XtTranslations sourceTranslTable; /* source window text widget */
X+ XtTranslations sbarTranslTable; /* source window text scrollbar */
X+ XtTranslations dialogTranslTable; /* dialog window text widget */
X
X Boolean dbxopt_r; /* dbx option -r */
X Boolean dbxopt_i; /* dbx option -i */
X***************
X*** 87,99 ****
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
X typedef 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--- 95,108 ----
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! String 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
X typedef struct {
X! char *filename; /* name of file */
X! char *pathname; /* full path name of file */
X char funcname[MAXNAME]; /* current function */
X char *buf; /* buffer holding source file */
X long filesize; /* size of file in bytes */
X***************
X*** 126,143 ****
X
X typedef struct {
X Cardinal i; /* index to arrowsign[] */
X! char filename[MAXNAME]; /* filename associated with */
X Line line; /* line number */
X } Arrow;
X
X typedef struct {
X Cardinal i; /* index to updownsign[] */
X! char filename[MAXNAME]; /* filename associated with */
X Line line; /* line number */
X } Updown;
X
X typedef struct {
X! char *filename; /* filename associated with */
X Line line; /* line number of stop */
X unsigned tag; /* used in deleting stops */
X } Stops;
X--- 135,154 ----
X
X typedef struct {
X Cardinal i; /* index to arrowsign[] */
X! char file[MAXNAME]; /* file associated with */
X Line line; /* line number */
X+ char func[MAXNAME]; /* function name associated with */
X } Arrow;
X
X typedef struct {
X Cardinal i; /* index to updownsign[] */
X! char file[MAXNAME]; /* file associated with */
X Line line; /* line number */
X+ char func[MAXNAME]; /* function name associated with */
X } Updown;
X
X typedef struct {
X! char *file; /* file associated with */
X Line line; /* line number of stop */
X unsigned tag; /* used in deleting stops */
X } Stops;
Xdiff -c xdbx1.0/dialog.c xdbx1.1/dialog.c
X*** xdbx1.0/dialog.c Fri Mar 24 01:18:38 1989
X--- xdbx1.1/dialog.c Sun Apr 2 15:36:09 1989
X***************
X*** 22,27 ****
X--- 22,29 ----
X #include "global.h"
X
X char DialogText[DIALOGSIZE]; /* text buffer for widget */
X+ Boolean FalseSignal = FALSE; /* set to TRUE before self-generated
X+ interrupt/quit signals */
X
X /* This is my own select word routine to replace the standard action
X * procedure provided by the Text widget.
X***************
X*** 72,78 ****
X
X
X /* Clicking the left mouse button in the source or dialog window
X! * invokes this action procedure to clear the cut buffer0 contenst.
X */
X /* ARGSUSED */
X static XtActionProc ClearCutBuffer0(w, event, params, num_params)
X--- 74,80 ----
X
X
X /* Clicking the left mouse button in the source or dialog window
X! * invokes this action procedure to clear the cut buffer0 contents.
X */
X /* ARGSUSED */
X static XtActionProc ClearCutBuffer0(w, event, params, num_params)
X***************
X*** 85,95 ****
X }
X
X
X! /* This is a special character delete procedure that will not
X! * delete past StartPos set by AppendDialogText.
X */
X /* ARGSUSED */
X! static XtActionProc MyDelete(w, event, params, num_params)
X Widget w;
X XEvent *event;
X String *params;
X--- 87,100 ----
X }
X
X
X! /* This procedure prevents the user from deleting past the prompt, or
X! * any text appended by AppendDialogText() to the dialog window.
X! * It checks the last position of text, if it matches StartPos, set
X! * by AppendDialogText(), it inserts a space so that delete-previous-
X! * character() can only delete the space character.
X */
X /* ARGSUSED */
X! static XtActionProc InsertSpace(w, event, params, num_params)
X Widget w;
X XEvent *event;
X String *params;
X***************
X*** 108,140 ****
X }
X }
X
X! /* Dispatch() is invoked on every <CR>.
X! * It collects text from the dialog window and sends it to dbx.
X! * If the string is a command to dbx (EnterCommand would be TRUE),
X! * it is stored in the global variable, Command.
X */
X /* ARGSUSED */
X! static XtActionProc Dispatch(w, event, params, num_params)
X Widget w;
X XEvent *event;
X String *params;
X! Cardinal *num_params;
X {
X! char *s;
X
X! s = DialogText + StartPos;
X! if (EnterCommand) {
X! strcpy(Command, s);
X! writeDbx(Command);
X! }
X! else {
X! writeDbx(XtNewString(s));
X! }
X }
X
X
X! /* This action procedure is called when the user hits Ctrl-U. It does
X! * what Ctrl-U ususally does in a terminal.
X /* ARGSUSED */
X static XtActionProc DeleteLine(w, event, params, num_params)
X Widget w;
X--- 113,148 ----
X }
X }
X
X! /* Erases the preceding word.
X! * Simulates the action of the WERASE character (ctrl-W).
X */
X /* ARGSUSED */
X! static XtActionProc DeleteWord(w, event, params, num_params)
X Widget w;
X XEvent *event;
X String *params;
X! Cardinal *num_params;
X {
X! XtTextBlock textblock;
X! XtTextPosition lastPos;
X! Cardinal i, j;
X
X! textblock.firstPos = 0;
X! textblock.length = 0;
X! textblock.ptr = "";
X!
X! lastPos = TextGetLastPos(w);
X! for (i=lastPos; i > StartPos && DialogText[i-1] == ' '; i--);
X! for (j=i; i > StartPos && DialogText[i-1] != ' '; i--);
X! XtTextReplace(dialogWindow, i, lastPos, &textblock);
X! lastPos = TextGetLastPos(w);
X! XtTextSetInsertionPoint(w, lastPos);
X }
X
X
X! /* Deletes the entire current input line.
X! * simulates the action of the KILL character (ctrl-U).
X! */
X /* ARGSUSED */
X static XtActionProc DeleteLine(w, event, params, num_params)
X Widget w;
X***************
X*** 158,165 ****
X }
X
X
X! /* Sends an interrupt signal, Ctrl-C, to dbx. */
X /* ARGSUSED */
X static XtActionProc SigInt(w, event, params, num_params)
X Widget w;
X XEvent *event;
X--- 166,204 ----
X }
X
X
X! /* Dispatch() is invoked on every <CR>.
X! * It collects text from the dialog window and sends it to dbx.
X! * If the string is a command to dbx (EnterCommand would be TRUE),
X! * it is stored in the global variable, Command.
X! */
X /* ARGSUSED */
X+ static XtActionProc Dispatch(w, event, params, num_params)
X+ Widget w;
X+ XEvent *event;
X+ String *params;
X+ Cardinal *num_params;
X+ {
X+ char *s;
X+
X+ s = DialogText + StartPos;
X+ if (EnterCommand) {
X+ #ifdef BSD /* do not clobber Command if blank input */
X+ if (strcspn(s, " \n"))
X+ #endif
X+ strcpy(Command, s);
X+ writeDbx(Command);
X+ }
X+ else {
X+ writeDbx(XtNewString(s));
X+ }
X+ }
X+
X+
X+
X+ /* Sends an interrupt signal, SIGINT, to dbx.
X+ * Simulates the action of the INTR character (ctrl-C).
X+ */
X+ /* ARGSUSED */
X static XtActionProc SigInt(w, event, params, num_params)
X Widget w;
X XEvent *event;
X***************
X*** 166,177 ****
X String *params;
X Cardinal *num_params;
X {
X! writeDbx("\03");
X! kill(dbxpid, SIGINT);
X }
X
X
X! /* Sends an EOF signal, Ctrl-D, to dbx. */
X /* ARGSUSED */
X static XtActionProc SigEof(w, event, params, num_params)
X Widget w;
X--- 205,216 ----
X String *params;
X Cardinal *num_params;
X {
X! FalseSignal = TRUE;
X! kill(0, SIGINT);
X }
X
X
X! /* Sends an EOF signal to dbx. (ctrl-D) */
X /* ARGSUSED */
X static XtActionProc SigEof(w, event, params, num_params)
X Widget w;
X***************
X*** 183,189 ****
X }
X
X
X! /* Sends a QUIT signal, Ctrl-\, to dbx. */
X /* ARGSUSED */
X static XtActionProc SigQuit(w, event, params, num_params)
X Widget w;
X--- 222,230 ----
X }
X
X
X! /* Sends a QUIT signal, SIGQUIT, to dbx.
X! * Simulates the action of the QUIT character (ctrl-\)
X! */
X /* ARGSUSED */
X static XtActionProc SigQuit(w, event, params, num_params)
X Widget w;
X***************
X*** 191,197 ****
X String *params;
X Cardinal *num_params;
X {
X! kill(dbxpid, SIGQUIT);
X }
X
X
X--- 232,239 ----
X String *params;
X Cardinal *num_params;
X {
X! FalseSignal = TRUE;
X! kill(0, SIGQUIT);
X }
X
X
X***************
X*** 207,231 ****
X Cardinal n;
X
X static XtActionsRec actionTable[] = {
X {"DeleteLine", (XtActionProc) DeleteLine},
X! {"MyDelete", (XtActionProc) MyDelete},
X {"Dispatch", (XtActionProc) Dispatch},
X {"MySelectWord", (XtActionProc) MySelectWord},
X {"ClearCutBuffer0", (XtActionProc) ClearCutBuffer0},
X- {"SigInt", (XtActionProc) SigInt},
X- {"SigEof", (XtActionProc) SigEof},
X- {"SigQuit", (XtActionProc) SigQuit},
X {NULL, NULL}
X };
X
X static String translations = "\
X- Ctrl<Key>U: DeleteLine()\n\
X Ctrl<Key>C: SigInt()\n\
X Ctrl<Key>D: SigEof()\n\
X Ctrl<Key>|: SigQuit()\n\
X! Ctrl<Key>H: MyDelete() delete-previous-character()\n\
X! <Key>Delete: MyDelete() delete-previous-character()\n\
X! <Key>BackSpace: MyDelete() delete-previous-character()\n\
X <Key>Return: end-of-file() newline() Dispatch()\n\
X <Key>: end-of-file() insert-char()\n\
X <FocusIn>: focus-in()\n\
X--- 249,275 ----
X Cardinal n;
X
X static XtActionsRec actionTable[] = {
X+ {"SigInt", (XtActionProc) SigInt},
X+ {"SigEof", (XtActionProc) SigEof},
X+ {"SigQuit", (XtActionProc) SigQuit},
X+ {"DeleteWord", (XtActionProc) DeleteWord},
X {"DeleteLine", (XtActionProc) DeleteLine},
X! {"InsertSpace", (XtActionProc) InsertSpace},
X {"Dispatch", (XtActionProc) Dispatch},
X {"MySelectWord", (XtActionProc) MySelectWord},
X {"ClearCutBuffer0", (XtActionProc) ClearCutBuffer0},
X {NULL, NULL}
X };
X
X static String translations = "\
X Ctrl<Key>C: SigInt()\n\
X Ctrl<Key>D: SigEof()\n\
X Ctrl<Key>|: SigQuit()\n\
X! Ctrl<Key>W: DeleteWord()\n\
X! Ctrl<Key>U: DeleteLine()\n\
X! Ctrl<Key>H: InsertSpace() delete-previous-character()\n\
X! <Key>Delete: InsertSpace() delete-previous-character()\n\
X! <Key>BackSpace: InsertSpace() delete-previous-character()\n\
X <Key>Return: end-of-file() newline() Dispatch()\n\
X <Key>: end-of-file() insert-char()\n\
X <FocusIn>: focus-in()\n\
X***************
X*** 239,258 ****
X <Btn3Up>: extend-end(PRIMARY, CUT_BUFFER0)\n\
X <Btn1Up>(2): MySelectWord()";
X
X-
X n = 0;
X XtSetArg(args[n], XtNmin, app_resources.dialogMinHeight); n++;
X XtSetArg(args[n], XtNheight, app_resources.dialogHeight); n++;
X- XtSetArg(args[n], XtNtranslations, XtParseTranslationTable(translations));
X- n++;
X XtSetArg(args[n], XtNstring, (XtArgVal) DialogText); n++;
X XtSetArg(args[n], XtNlength, (XtArgVal) DIALOGSIZE); n++;
X XtSetArg(args[n], XtNeditType, (XtArgVal) XttextEdit); n++;
X XtSetArg(args[n], XtNtextOptions, scrollVertical | wordBreak); n++;
X!
X! dialogWindow = XtCreateManagedWidget("dialogWindow",
X! asciiStringWidgetClass,
X parent, args, n );
X!
X XtAddActions(actionTable, XtNumber(actionTable));
X }
X--- 283,304 ----
X <Btn3Up>: extend-end(PRIMARY, CUT_BUFFER0)\n\
X <Btn1Up>(2): MySelectWord()";
X
X n = 0;
X XtSetArg(args[n], XtNmin, app_resources.dialogMinHeight); n++;
X XtSetArg(args[n], XtNheight, app_resources.dialogHeight); n++;
X XtSetArg(args[n], XtNstring, (XtArgVal) DialogText); n++;
X XtSetArg(args[n], XtNlength, (XtArgVal) DIALOGSIZE); n++;
X XtSetArg(args[n], XtNeditType, (XtArgVal) XttextEdit); n++;
X XtSetArg(args[n], XtNtextOptions, scrollVertical | wordBreak); n++;
X! XtSetArg(args[n], XtNtranslations, XtParseTranslationTable(translations));
X! n++;
X! dialogWindow = XtCreateManagedWidget("dialogWindow", asciiStringWidgetClass,
X parent, args, n );
X! if (app_resources.dialogTranslTable) {
X! n = 0;
X! XtSetArg(args[n], XtNtranslations, app_resources.dialogTranslTable);
X! n++;
X! XtSetValues(dialogWindow, args, n);
X! }
X XtAddActions(actionTable, XtNumber(actionTable));
X }
+END+OF+xdbx.patch.2
echo '-rw-r--r-- 1 argv 37156 Apr 5 23:56 xdbx.patch.2 (as sent)'
chmod u=rw,g=r,o=r xdbx.patch.2
ls -l xdbx.patch.2
exit 0
More information about the Comp.sources.x
mailing list