cheung%SW.MCC.COM@MCC.COM (Po Cheung) (08/28/90)
Submitted-by: cheung%SW.MCC.COM@MCC.COM (Po Cheung) Posting-number: Volume 8, Issue 108 Archive-name: xdbx/part04 #! /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 4 (of 7)." # Contents: handler.c signs.c xdbx.c # Wrapped by cheung@espresso.sw.mcc.com on Fri Aug 24 03:24:50 1990 PATH=/bin:/usr/bin:/usr/ucb ; export PATH if test -f 'handler.c' -a "${1}" != "-c" ; then echo shar: Will not clobber existing file \"'handler.c'\" else echo shar: Extracting \"'handler.c'\" \(13092 characters\) sed "s/^X//" >'handler.c' <<'END_OF_FILE' X/***************************************************************************** X * X * xdbx - X Window System interface to the dbx debugger X * X * Copyright 1989 The University of Texas at Austin X * Copyright 1990 Microelectronics and Computer Technology Corporation X * X * Permission to use, copy, modify, and distribute this software and its X * 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, and that the name of The University of Texas X * and Microelectronics and Computer Technology Corporation (MCC) not be X * used in advertising or publicity pertaining to distribution of X * the software without specific, written prior permission. The X * University of Texas and MCC makes no representations about the X * suitability of this software for any purpose. It is provided "as is" X * without express or implied warranty. X * X * THE UNIVERSITY OF TEXAS AND MCC DISCLAIMS ALL WARRANTIES WITH REGARD TO X * THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND X * FITNESS, IN NO EVENT SHALL THE UNIVERSITY OF TEXAS OR MCC BE LIABLE FOR X * ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER X * RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF X * CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN X * CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. X * X * Author: Po Cheung X * Created: March 10, 1989 X * X *****************************************************************************/ X X/* handler.c X * X * Contain action handlers for the parser to invoke upon a dbx command. X * X * TextSetTopPosition(): Set the top character position of text displayed X * AdjustText(): Adjust the portion of text displayed. X * exec_handler(): Update file, line label, arrow position. X * done_handler(): Progrm execution completed, clear breakpoints X * stop_at_handler(): Place stop sign on line specified. X * stop_in_handler(): Place stop sign on function specified. X * updown_handler(): Update file, line label, updown arrow position. X * delete_handler(): Remove stop sign. X * func_handler(): Display function, if specified. X * file_handler(): Display file, if specified. X * debug_handler(): Check directory use list, display source file. X * cd_handler(): Record current working directory. X * use_handler(): Record directory paths. X * search_handler(): Adjust source file to display matched line. X * list_handler(); Adjust source file to display result. X * display_handler(): Display results in display window. X */ X X#include <ctype.h> X#include "global.h" X#ifdef BSD X#define BRACKET "[%d]" X#else X#define BRACKET "(%d)" X#endif X XBoolean Echo = True; /* display dbx output if true */ Xstatic Boolean Skip_func_handler = False; X X/* Display text starting from the top position specified by pos */ X Xvoid TextSetTopPosition(w, pos) X Widget w; X XawTextPosition pos; X{ X Arg args[MAXARGS]; X Cardinal n; X X n = 0; X XtSetArg(args[n], XtNdisplayPosition, (XtArgVal) pos); n++; X XtSetValues(w, args, n); X} X X/* X * Adjust text so that 'line' will fall into the viewable part of the X * source window. X * Arrows, stop signs, and line label are updated accordingly. X */ Xvoid AdjustText(line) X int line; X{ X FileRec *file; X int nlines = 0; X int i; X XawTextPosition pos; X X if ((file = displayedFile) == NULL || line <= 0) return; X file->currentline = line; X X if (line < file->topline || line > file->bottomline ) { X /* Position line about 30% from the top */ X nlines = file->lines*0.3; X if (line < nlines) /* near top */ X file->topline = 1; X else if (line > file->lastline - nlines) /* near bottom */ X file->topline = MAX(file->lastline - file->lines + 1, 1); X else X file->topline = line - nlines; X file->bottomline = MIN(file->topline + file->lines - 1, file->lastline); X TextSetTopPosition(sourceWindow, file->linepos[file->topline]); X file->topPosition = file->linepos[file->topline]; X } X XawTextSetInsertionPoint(sourceWindow, file->linepos[line]); X X /* Text window might have scrolled, check topline & bottomline */ X pos = XawTextTopPosition(sourceWindow); X for (i=1; pos >= file->linepos[i]; i++); X if (file->topline != i-1) { X file->topline = i-1; X file->bottomline = MIN (file->topline + file->lines - 1, X file->lastline); X } X UpdateLineLabel(line); X UpdateStops(file); X UpdateArrow(file); X UpdateUpdown(file); X UpdateBomb(file); X} X X X/* Handle dbx output of run, cont, next, step, return commands. X * Result of output parsing is returned in a set of tokens. X */ Xvoid exec_handler() X{ X int line, status; X char *func, *mesg; X char *segv = "signal SEGV"; X char *segfault = "Segmentation fault"; X X /* Print "stopped in ..." line in message window X * Adjust text displayed X */ X if (Token.func == NULL || Token.line == 0) X return; X UpdateMessageWindow(Token.mesg); X line = Token.line; X func = XtNewString(Token.func); X mesg = XtNewString(Token.mesg); X#ifdef MIPS X status = LoadCurrentFile(); X#else X if (Token.file) X status = LoadFile(Token.file); X#endif X arrow.line = line; /* update arrow sign position */ X strcpy(arrow.func, func); X updown.line = 0; /* remove updown, if any */ X if (displayedFile) { X strcpy(arrow.file, displayedFile->pathname); X } X /* Display bomb sign if segmentation fault occurs in source code */ X if (status != -1 && (strncmp(mesg, segv, strlen(segv)) == NULL || X strncmp(mesg, segfault, strlen(segfault)) == NULL)) { X arrow.line = 0; X bomb.line = line; X strcpy(bomb.func, func); X if (displayedFile) strcpy(bomb.file, displayedFile->pathname); X } X else X bomb.line = 0; X X AdjustText(line); X#ifndef BSD X display_handler(); X#endif X XtFree(func); X XtFree(mesg); X} X X X/* Remove all the arrow and updown signs, print message, then X * change the file variable to the file name displayed. X */ Xvoid done_handler() X{ X char command[LINESIZ]; X X arrow.line = 0; X updown.line = 0; X UpdateArrow(displayedFile); X UpdateUpdown(displayedFile); X UpdateMessageWindow("Ready for execution"); X if (displayedFile == NULL) return; X#ifdef MIPS X sprintf(command, "file %s\n", displayedFile->filename); X#else X sprintf(command, "file %s\n", displayedFile->pathname); X#endif X Parse = False; X query_dbx(command); X} X X X/* Place a stop sign next to the line specified on the source file window X * if it is to be viewable. X */ Xvoid stop_at_handler() X{ X if (Token.stop == 0 || Token.line == 0 || displayedFile == NULL) X return; X if (Token.file == NULL) X stops[Token.stop].file = displayedFile->pathname; X else X stops[Token.stop].file = GetPathname(Token.file); X DisplayStop(displayedFile, Token.line); X stops[Token.stop].line = Token.line; X stops[Token.stop].tag = 0; X nstops = Token.stop; X} X X X/* X * Place a stop sign next to the function routine, getting the line number X * by "list <func>", (or "func <func>" on a MIPS), and resetting the file X * variable properly. X */ Xvoid stop_in_handler() X{ X char command[LINESIZ], *file; X int stop; X int line; X X if (Token.stop == 0 || Token.func == NULL || displayedFile == NULL) X return; X stop = Token.stop; X#ifdef MIPS X /* For mips dbx, need to use func command to locate the function */ X Skip_func_handler = True; X sprintf(command, "func %s\n", Token.func); X query_dbx(command); X#else X#ifdef BSD X sprintf(command, "list %s\n", Token.func); X query_dbx(command); X#else X sprintf(command, "list %s\n", Token.func); X query_dbx(command); X if (Token.line <= 0) X return; X else X Token.line += 5; X#endif X#endif X X stops[stop].line = Token.line; X nstops = stop; X line = Token.line; X X /* Check the name of the file containing Token.func */ X query_dbx("file\n"); X if ((file = GetPathname(CurrentFile)) && X strcmp(file, displayedFile->pathname)) { /* new file, record stop */ X stops[nstops].file = file; X#ifdef MIPS X sprintf(command, "file %s\n", displayedFile->filename); X#else X sprintf(command, "file %s\n", displayedFile->pathname); X#endif X Parse = False; X query_dbx(command); X } X else { /* same file, display stop */ X stops[nstops].file = displayedFile->pathname; X DisplayStop(displayedFile, line); X } X} X X X/* X * Display an outlined arrow to locate the calling routine in a stack X * frame. BSD and SUN dbx have slightly different output semantics here. X * The appropriate file with the calling routine is displayed and the X * file variable is set accordingly. X */ Xvoid updown_handler() X{ X char command[LINESIZ], *func, *file; X int line; X X line = Token.line; X func = XtNewString(Token.func); X#ifdef MIPS X LoadCurrentFile(); X#endif X#ifdef BSD X file = GetPathname(Token.file); X#else X if (line <= 0) line = 1; X LoadCurrentFile(); X if (displayedFile) X file = displayedFile->pathname; X#endif X X if (line <= 0 || func == NULL || file == NULL) X return; X if (displayedFile && strcmp(file, displayedFile->pathname)) { X LoadFile(file); X /* set dbx file variable to file */ X#ifdef MIPS X sprintf(command, "file %s\n", displayedFile->filename); X#else X sprintf(command, "file %s\n", displayedFile->pathname); X#endif X Parse = False; X query_dbx(command); X } X updown.line = line; X strcpy(updown.func, func); X if (displayedFile) X strcpy(updown.file, displayedFile->pathname); X AdjustText(line); X XtFree(func); X} X X X/* X * Delete handler remove the stop specified and undisplayed the stopsign X * if it's visible. X * It calls the dbx status command to find out what stops are left, and X * then update the array of stops accordingly. X */ X/* ARGSUSED */ Xvoid delete_handler() X{ X char s[LINESIZ]; X int i; X int line; X X write_dbx("status\n"); X while (fgets(s, LINESIZ, dbxfp) == NULL); X do { X if (strcmp(s, dbxprompt) || strcmp(s, "")) { X sscanf(s, BRACKET, &i); X if (i > 0 && i <= nstops && stops[i].line > 0) X stops[i].tag = 1; X } X } while (fgets(s, LINESIZ, dbxfp)); X X for (i=1; i<=nstops; i++) X if (stops[i].line > 0) { X if (stops[i].tag) X stops[i].tag = 0; X else { X line = stops[i].line; X stops[i].line = 0; X stops[i].file = NULL; X if (LineToStop_no(line) == 0) X RemoveStop(line); X } X } X} X X/* X * This handler displays the function routine on the source window. X * It locates the function by sending the dbx command "list <func>", X * and loads the appropriate file accordingly. X */ Xvoid func_handler() X{ X int line; X char command[LINESIZ]; X X if (Token.func && !Skip_func_handler) { X#ifdef MIPS X line = Token.line; X#else X sprintf(command, "list %s\n", Token.func); X query_dbx(command); X line = Token.line + 5; X#endif X LoadCurrentFile(); X AdjustText(line); X } X Skip_func_handler = False; X} X X X/* File handler first queries the current file set by the user command, X * and then loads the file. X */ X/* ARGSUSED */ Xvoid file_handler() /* Command was 'file' */ X{ X if (Token.file) X strcpy(CurrentFile, Token.file); X else X strcpy(CurrentFile, ""); X} X X/* ARGSUSED */ Xvoid debug_handler() X{ X query_dbx("use\n"); X displayedFile = NULL; /* force reloading of source file */ X if (LoadCurrentFile() == 0) { X arrow.line = 0; /* clear arrow sign */ X updown.line = 0; /* clear updown sign */ X bomb.line = 0; /* clear bomb sign */ X UpdateArrow(displayedFile); X UpdateUpdown(displayedFile); X UpdateBomb(displayedFile); X ClearStops(); X UpdateStops(displayedFile); X UpdateMessageWindow("Ready for execution"); X query_dbx("func main\n"); X#ifndef BSD X query_dbx("display\n"); /* clear display window */ X#endif X } X} X X/* ARGSUSED */ Xvoid cd_handler() X{ X query_dbx("pwd\n"); X} X X/* ARGSUSED */ Xvoid pwd_handler(s) Xchar *s; X{ X strcpy(cwd, (char *)strtok(s, "\n")); X} X X/* ARGSUSED */ Xvoid use_handler(output) Xchar *output; X{ X if (strcmp(output, "") == NULL) X query_dbx("use\n"); X else X MakeDirList(output); X} X X/* ARGSUSED */ Xvoid search_handler() X{ X AdjustText(Token.line); X} X X/* ARGSUSED */ Xvoid list_handler() X{ X int line; X X if (Echo) { X line = Token.line; X LoadCurrentFile(); X AdjustText(line); X } X} X X X/* ARGSUSED */ X/* Show output on the display window. X * If output is null but the display window is managed, replace contents of X * the display window with the null string. X */ Xvoid display_handler() X{ X Arg args[MAXARGS]; X Cardinal n; X X if (!Token.display || strcmp(Token.display, "") == NULL) { X if (!XtIsManaged(displayWindow)) X return; X else { X XtFree(Token.display); X Token.display = XtNewString(""); X } X } X if (!XtIsManaged(displayWindow)) { X XtManageChild(separator); X XtManageChild(displayWindow); X } X n = 0; X XtSetArg(args[n], XtNstring, (XtArgVal) Token.display); n++; X XtSetValues(displayWindow, args, n); X XtFree(Token.display); X} END_OF_FILE if test 13092 -ne `wc -c <'handler.c'`; then echo shar: \"'handler.c'\" unpacked with wrong size! fi # end of 'handler.c' fi if test -f 'signs.c' -a "${1}" != "-c" ; then echo shar: Will not clobber existing file \"'signs.c'\" else echo shar: Extracting \"'signs.c'\" \(11423 characters\) sed "s/^X//" >'signs.c' <<'END_OF_FILE' X/***************************************************************************** X * X * xdbx - X Window System interface to the dbx debugger X * X * Copyright 1989 The University of Texas at Austin X * Copyright 1990 Microelectronics and Computer Technology Corporation X * X * Permission to use, copy, modify, and distribute this software and its X * 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, and that the name of The University of Texas X * and Microelectronics and Computer Technology Corporation (MCC) not be X * used in advertising or publicity pertaining to distribution of X * the software without specific, written prior permission. The X * University of Texas and MCC makes no representations about the X * suitability of this software for any purpose. It is provided "as is" X * without express or implied warranty. X * X * THE UNIVERSITY OF TEXAS AND MCC DISCLAIMS ALL WARRANTIES WITH REGARD TO X * THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND X * FITNESS, IN NO EVENT SHALL THE UNIVERSITY OF TEXAS OR MCC BE LIABLE FOR X * ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER X * RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF X * CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN X * CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. X * X * Author: Po Cheung X * Created: March 10, 1989 X * X *****************************************************************************/ X X/* signs.c X * X * This file contains all the routines for the creation and manipulation of X * symbols used in xdbx. There are 3 different signs: X * arrow - a solid right arrow to indicate the current execution point. X * updown - an outlined right arrow to indicate position in stack trace. X * stop - a stop hand symbol to indicate a breakpoint is set. X * bomb - a bomb symbol to indicate the point of segmentation fault. X * X * To display a sign on a given line in the source window, it is first X * created and mapped. To undisplay it, the sign is unmapped. It can X * be mapped again when the sign is needed. Note that the sign is never X * moved, so that there can be as many signs created (but not mapped) as X * the number of lines in the source window. X * For arrow and updown, there can be at most one of each mapped at a time. X * For stop, there can be more than one mapped at the same time. X */ X X#include "global.h" X#include "bitmaps.h" X X#define MAXSTOPS 256 /* max number of stops */ X#define MAXSIGNS 256 /* max number of signs */ X#define OFFSET 2 /* offset for displaying signs */ X Xtypedef struct { X Widget w; X Boolean mapped; X} ArrowSign; X Xtypedef struct { X Widget w; X Boolean mapped; X} UpdownSign; X Xtypedef struct { X Widget w; X Boolean mapped; X} StopSign; X Xtypedef struct { X Widget w; X Boolean mapped; X} BombSign; X Xstatic ArrowSign arrowsign[MAXSIGNS]; Xstatic UpdownSign updownsign[MAXSIGNS]; Xstatic StopSign stopsign[MAXSIGNS]; Xstatic BombSign bombsign[MAXSIGNS]; X XArrow arrow; XUpdown updown; XStops stops[MAXSTOPS]; /* array of stops */ XBomb bomb; XCardinal nstops; /* number of stops */ X X/* Initialize data structures */ X Xvoid signs_init() X{ X int i; X X for (i=0; i<MAXSIGNS; i++) { X arrowsign[i].w = NULL; X arrowsign[i].mapped = FALSE; X } X for (i=0; i<MAXSIGNS; i++) { X stopsign[i].w = NULL; X stopsign[i].mapped = FALSE; X } X arrow.i = 0; X arrow.line = 0; X strcpy(arrow.file, ""); X updown.i = 0; X updown.line = 0; X strcpy(updown.file, ""); X nstops = 0; X bomb.i = 0; X bomb.line = 0; X strcpy(bomb.file, ""); X} X X X/* Create an arrow symbol, updown symbol or stop symbol: X * calculate the position of the symbol based on i, the number of lines X * from the top line. X * create the pixmap of the symbol X * display the symbol as a bitmap in a label widget. X */ Xstatic Widget CreateSign(parent, sign, i) X Widget parent; X char *sign; X Cardinal i; X{ X TextWidget ctx = (TextWidget) sourceWindow; X Arg args[15]; X Cardinal n; X Dimension source_height, height, width; X char *bits; X Pixel fg, bg; X int horizDistance, vertDistance, height_per_line; X int screen; X Dimension vbar_width = 0; X Dimension border_width = 0; X X if (displayedFile == NULL) return NULL; X X /* Get height and background pixel values of parent window */ X n = 0; X XtSetArg(args[n], XtNheight, &source_height); n++; X XtSetArg(args[n], XtNbackground, &bg); n++; X XtGetValues(parent, args, n); X X height_per_line = source_height/displayedFile->lines; X vertDistance = OFFSET + (i * height_per_line); X X screen = DefaultScreen(display); X X if (sign && !strcmp(sign, "arrow")) { X bits = arrow_bits; X width = arrow_width; X height = arrow_height; X horizDistance = 0; X fg = app_resources.arrow_color; X } X else if (sign && !strcmp(sign, "updown")) { X bits = updown_bits; X width = updown_width; X height = updown_height; X horizDistance = 0; X fg = app_resources.updown_color; X } X else if (sign && !strcmp(sign, "stop")) { X bits = stop_bits; X width = stop_width; X height = stop_height; X horizDistance = arrow_width; X fg = app_resources.stop_color; X } X else if (sign && !strcmp(sign, "bomb")) { X bits = bomb_bits; X width = bomb_width; X height = bomb_height; X horizDistance = 0; X fg = app_resources.bomb_color; X }; X X if( ctx->text.vbar != NULL ) X { X n = 0; X XtSetArg(args[n], XtNwidth, &vbar_width); n++; X XtSetArg(args[n], XtNborderWidth, &border_width); n++; X XtGetValues(ctx->text.vbar, args, n); X vbar_width += (border_width * 2); X } X X n = 0; X XtSetArg(args[n], XtNborderWidth, 0); n++; X XtSetArg(args[n], XtNwidth, (XtArgVal) width); n++; X XtSetArg(args[n], XtNheight, (XtArgVal) height); n++; X XtSetArg(args[n], XtNresize, (XtArgVal) False); n++; X XtSetArg(args[n], XtNmappedWhenManaged, (XtArgVal) False); n++; X XtSetArg(args[n], XtNbitmap, XCreatePixmapFromBitmapData ( X display, DefaultRootWindow(display), bits, width, height, X fg, bg, DefaultDepth(display, screen))); n++; X X XtSetArg(args[n], XtNfromVert, (XtArgVal) NULL); n++; X XtSetArg(args[n], XtNfromHoriz, (XtArgVal) NULL); n++; X XtSetArg(args[n], XtNhorizDistance, (XtArgVal) horizDistance+vbar_width); X n++; X XtSetArg(args[n], XtNvertDistance, (XtArgVal) vertDistance); n++; X XtSetArg(args[n], XtNtop, (XtArgVal) XawChainTop); n++; X XtSetArg(args[n], XtNleft, (XtArgVal) XawChainLeft); n++; X XtSetArg(args[n], XtNbottom, (XtArgVal) XawChainTop); n++; X XtSetArg(args[n], XtNright, (XtArgVal) XawChainLeft); n++; X X return XtCreateManagedWidget(sign, labelWidgetClass, parent, args, n); X} X X/* X * Given a line number, displays a stop sign if that line is viewable. X * If the stop widget for that line does not exist, create one and map it. X * If the stop widget exists but not mapped, map it. X */ Xvoid DisplayStop(file, line) XFileRec *file; Xint line; X{ X Cardinal i; X X if (line >= file->topline && line <= file->bottomline) { X i = line - file->topline; X if (stopsign[i].w == NULL) { /* widget does not exist */ X stopsign[i].w = CreateSign(sourceForm, "stop", i); X XtMapWidget(stopsign[i].w); X stopsign[i].mapped = 1; X } X else if (!stopsign[i].mapped) { /* widget not mapped */ X XtMapWidget(stopsign[i].w); X stopsign[i].mapped = 1; X } X } X} X X/* X * Unmap all stop signs and then display only those stops that are viewable. X */ Xvoid UpdateStops(file) XFileRec *file; X{ X Cardinal i; X int line; X X if (file == NULL) return; X for (i=0; i<file->lines; i++) X if (stopsign[i].w && stopsign[i].mapped) { X XtUnmapWidget(stopsign[i].w); X stopsign[i].mapped = 0; X } X X for (i=1; i<=nstops; i++) X if (stops[i].file && !strcmp(stops[i].file, file->pathname) && X (line=stops[i].line) && line >= file->topline && X line <= file->bottomline) { X DisplayStop(file, line); X } X} X X/* X * Given a line number, unmap the stop sign associated with that line. X */ Xvoid RemoveStop(line) Xint line; X{ X Cardinal i; X X if (displayedFile && line >= displayedFile->topline && X line <= displayedFile->bottomline) { X i = line - displayedFile->topline; X if (stopsign[i].w && stopsign[i].mapped) { X XtUnmapWidget(stopsign[i].w); X stopsign[i].mapped = 0; X } X } X} X Xvoid ClearStops() X{ X int i; X X for (i=1; i<=nstops; i++) { X stops[i].file = NULL; X stops[i].line = 0; X } X} X X/* Unmap the current arrow sign. X * Display a new arrow sign if it is viewable. X */ Xvoid UpdateArrow(file) XFileRec *file; X{ X Cardinal i; X int line; X X if (file == NULL) return; X i = arrow.i; X if (i>=0 && i<file->lines) X if (arrowsign[i].w && arrowsign[i].mapped) { X XtUnmapWidget(arrowsign[i].w); X arrowsign[i].mapped = 0; X } X line = arrow.line; X if (arrow.file && !strcmp(arrow.file, file->pathname) && X line >= file->topline && line <= file->bottomline) { X i = line - file->topline; X arrow.i = i; X if (arrowsign[i].w == NULL) { X arrowsign[i].w = CreateSign(sourceForm, "arrow", i); X XtMapWidget(arrowsign[i].w); X arrowsign[i].mapped = TRUE; X } X else if (!arrowsign[i].mapped) { X XtMapWidget(arrowsign[i].w); X arrowsign[i].mapped = TRUE; X } X } X} X X X/* If the new updown is on the same line as the arrow, remove the updown. X * Unmap current updown sign. X * Display the updown if it is viewable. X */ Xvoid UpdateUpdown(file) XFileRec *file; X{ X Cardinal i; X int line; X X if (file == NULL) return; X if (updown.file && !strcmp(updown.file, arrow.file) && X !strcmp(updown.func, arrow.func)) { X updown.line = 0; X strcpy(updown.file, ""); X } X i = updown.i; X if (i>=0 && i<file->lines) X if (updownsign[i].w && updownsign[i].mapped) { X XtUnmapWidget(updownsign[i].w); X updownsign[i].mapped = 0; X } X line = updown.line; X if (updown.file && !strcmp(updown.file, file->pathname) && X line >= file->topline && line <= file->bottomline) { X i = line - file->topline; X updown.i = i; X if (updownsign[i].w == NULL) { X updownsign[i].w = CreateSign(sourceForm, "updown", i); X XtMapWidget(updownsign[i].w); X updownsign[i].mapped = TRUE; X } X else if (!updownsign[i].mapped) { X XtMapWidget(updownsign[i].w); X updownsign[i].mapped = TRUE; X } X } X} X X/* Unmap the current bomb sign, if any. X * Display a new bomb sign. X */ Xvoid UpdateBomb(file) XFileRec *file; X{ X Cardinal i; X int line; X X if (file == NULL) return; X i = bomb.i; X if (i>=0 && i<file->lines) X if (bombsign[i].w && bombsign[i].mapped) { X XtUnmapWidget(bombsign[i].w); X bombsign[i].mapped = 0; X } X line = bomb.line; X if (bomb.file && !strcmp(bomb.file, file->pathname) && X line >= file->topline && line <= file->bottomline) { X i = line - file->topline; X bomb.i = i; X if (bombsign[i].w == NULL) { X bombsign[i].w = CreateSign(sourceForm, "bomb", i); X XtMapWidget(bombsign[i].w); X bombsign[i].mapped = TRUE; X } X else if (!bombsign[i].mapped) { X XtMapWidget(bombsign[i].w); X bombsign[i].mapped = TRUE; X } X } X} END_OF_FILE if test 11423 -ne `wc -c <'signs.c'`; then echo shar: \"'signs.c'\" unpacked with wrong size! fi # end of 'signs.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'\" \(12215 characters\) sed "s/^X//" >'xdbx.c' <<'END_OF_FILE' X/***************************************************************************** X * X * xdbx - X Window System interface to the dbx debugger X * X * Copyright 1989 The University of Texas at Austin X * Copyright 1990 Microelectronics and Computer Technology Corporation X * X * Permission to use, copy, modify, and distribute this software and its X * 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, and that the name of The University of Texas X * and Microelectronics and Computer Technology Corporation (MCC) not be X * used in advertising or publicity pertaining to distribution of X * the software without specific, written prior permission. The X * University of Texas and MCC makes no representations about the X * suitability of this software for any purpose. It is provided "as is" X * without express or implied warranty. X * X * THE UNIVERSITY OF TEXAS AND MCC DISCLAIMS ALL WARRANTIES WITH REGARD TO X * THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND X * FITNESS, IN NO EVENT SHALL THE UNIVERSITY OF TEXAS OR MCC BE LIABLE FOR X * ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER X * RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF X * CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN X * CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. X * X * Author: Po Cheung X * Created: March 10, 1989 X * X *****************************************************************************/ X X/* xdbx.c X * X * Contain main program and initialization, command line options handling, X * and resource database management. X * X * Syntax(): Print an error message if xdbx is invoked with an X * incorrect number of arguments. X * main_init(): Initialization routine. X * dbxoptions(): Construct command line arguments for dbx. X * main(): Main program. X */ X X#include "global.h" X#include "bitmaps.h" X#include "patchlevel.h" X X#define VERSION "2.1" X#define Offset(field) (XtOffset(XdbxResources *, field)) X XXtAppContext app_context; /* application context */ XWidget toplevel; /* top level widget */ XDisplay *display; /* connection to X server */ XCursor watch; /* XC_watch cursor */ XXdbxResources app_resources; /* application resources of xdbx */ Xchar xdbxinit[LINESIZ]; /* initialization file name */ XBoolean Tstartup = False; /* if True, remove xdbxinit */ XBoolean debug = False; /* debug mode for xdbx */ X X Xstatic XtResource resources[] = { X {"bell", "Bell", XtRBoolean, sizeof(Boolean), X Offset(bell), XtRImmediate, (caddr_t)False}, X {"displayWindow", "DisplayWindow", XtRBoolean, sizeof(Boolean), X Offset(displayWindow), XtRImmediate, (caddr_t)False}, X {"prompt", "Prompt", XtRString, sizeof(char *), X Offset(prompt), XtRImmediate, (caddr_t)NULL}, X {"delimiters", "Delimiters", XtRString, sizeof(char *), X Offset(delimiters), XtRImmediate, (caddr_t)NULL}, X {"stop_color", "StopColor", XtRPixel, sizeof(Pixel), X Offset(stop_color), XtRString, "Red"}, X {"arrow_color", "ArrowColor", XtRPixel, sizeof(Pixel), X Offset(arrow_color), XtRString, "Blue"}, X {"updown_color", "UpdownColor", XtRPixel, sizeof(Pixel), X Offset(updown_color), XtRString, "Blue"}, X {"bomb_color", "bombColor", XtRPixel, sizeof(Pixel), X Offset(bomb_color), XtRString, "Red"}, X {"dataDpyMaxHeight", "DataDpyMaxHeight", XtRDimension, sizeof(Dimension), X Offset(dataDpyMaxHeight), XtRString, "300"}, X {"dataDpyMaxWidth", "DataDpyMaxWidth", XtRDimension, sizeof(Dimension), X Offset(dataDpyMaxWidth), XtRString, "600"}, X {"bigicon", "Xdbxoptions", XtRBoolean, sizeof(Boolean), X Offset(bigicon), XtRImmediate, (caddr_t)False}, X {"debug", "Xdbxoptions", XtRBoolean, sizeof(Boolean), X Offset(debug), XtRImmediate, (caddr_t)False}, X {"dbxopt_r", "Dbxoptions", XtRBoolean, sizeof(Boolean), X Offset(dbxopt_r), XtRImmediate, (caddr_t)False}, X {"dbxopt_i", "Dbxoptions", XtRBoolean, sizeof(Boolean), X Offset(dbxopt_i), XtRImmediate, (caddr_t)False}, X {"includeDir", "Dbxoptions", XtRString, sizeof(char *), X Offset(includeDir), XtRImmediate, (caddr_t)NULL}, X {"dbxopt_k", "Dbxoptions", XtRBoolean, sizeof(Boolean), X Offset(dbxopt_k), XtRImmediate, (caddr_t)False}, X {"cfile", "Dbxoptions", XtRString, sizeof(char *), X Offset(cfile), XtRImmediate, (caddr_t)NULL}, X {"dbxopt_kbd", "Dbxoptions", XtRBoolean, sizeof(Boolean), X Offset(dbxopt_kbd), XtRImmediate, (caddr_t)False}, X {"fcount", "Dbxoptions", XtRString, sizeof(char *), X Offset(fcount), XtRImmediate, (caddr_t)NULL}, X {"startup", "Dbxoptions", XtRString, sizeof(char *), X Offset(startup), XtRImmediate, (caddr_t)NULL}, X {"tstartup", "Dbxoptions", XtRString, sizeof(char *), X Offset(tstartup), XtRImmediate, (caddr_t)NULL}, X}; X X XString fallback_resources[] = { X "*allowShellResize: True", X "*borderWidth: 1", X "*font: fixed", X "*vpane.width: 550", X "*fileWindow*font: variable", X "*fileLabel.width: 500", X "*lineLabel.width: 50", X "*sourceForm.preferredPaneSize: 320", X "*sourceWindow.leftMargin: 35", X "*sourceWindow.scrollHorizontal: whenNeeded", X "*sourceWindow.translations: #override \\n\ X <Btn1Down>: SelectStart() SelectWord() \\n\ X Shift<Btn1Up>: Update() SelectEnd() PrintSelection() \\n\ X <Btn1Up>: Update() SelectEnd() \\n", X "*messageWindow*font: variable", X "*messageWindow.min: 30", X "*messageWindow.max: 30", X "*dialogWindow.preferredPaneSize: 200", X "*dialogWindow.resizeToPreferred: True", X "*dialogWindow.translations: #override \\n\ X <Btn1Down>: SelectStart() SelectWord() \\n\ X Shift<Btn1Up>: SelectEnd() PrintSelection() \\n\ X <Btn1Up>: SelectEnd() \\n", X "*commandWindow.preferredPaneSize: 106", X "*commandWindow.skipAdjust: True", X "*commandWindow.hSpace: 14", X "*commandWindow.vSpace: 10", X "*Command.height: 20", X "*Command.width: 60", X "*List.columnSpacing: 10", X "*displayWindow.preferredPaneSize: 50", X "*displayWindow.skipAdjust: True", X "*displayWindow.scrollVertical: whenNeeded", X "*displayWindow.scrollHorizontal: whenNeeded", X "*displayWindow.translations: #override \\n\ X <Btn1Down>: SelectStart() SelectWord() \\n\ X Shift<Btn1Up>: SelectEnd() PrintSelection() \\n\ X <Btn1Up>: SelectEnd() \\n", X "*popup*showGrip: False", X NULL, X}; X Xstatic XrmOptionDescRec options[] = { X {"-bigicon","bigicon", XrmoptionNoArg, "True"}, X {"-debug", "debug", XrmoptionNoArg, "True"}, 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 dbx */ X {"-kbd", "dbxopt_kbd", XrmoptionNoArg, "True"}, X {"-f", "fcount", XrmoptionSepArg, NULL}, X {"-s", "startup", XrmoptionSepArg, NULL}, X {"-sr", "tstartup", XrmoptionSepArg, NULL}, X#endif X#ifdef MIPS /* Mips dbx */ X {"-pixie", "pixie", XrmoptionNoArg, "True"}, X#endif X}; X XXtActionsRec xdbx_actions[] = { X {"SelectStart", (XtActionProc) SelectStart}, X {"SelectEnd", (XtActionProc) SelectEnd}, X {"SelectWord", (XtActionProc) SelectWord}, X {"PrintSelection", (XtActionProc) PrintSelection}, X {"Update", (XtActionProc) Update}, X {"DeleteWord", (XtActionProc) DeleteWord}, X {"DeleteLine", (XtActionProc) DeleteLine}, X {NULL, NULL} X}; X Xstatic void Syntax(call) Xchar *call; X{ X fprintf(stderr, X "Usage: %s [-toolkitoptions] [-dbxoptions] [objfile [corefile]]\n", X call); X exit(1); X} X X/* Set window manager hints to indicate display accepts input. X * Initialize routines in source.c, signs.c and parser.c. X * Disable window resize of fileWindow. X * Get the name of the dbx command initialization file. X */ Xstatic void main_init() X{ X XWMHints wmhints; X char title[100]; X X display = XtDisplay(toplevel); X watch = XCreateFontCursor(display, XC_watch); X X sprintf(title, "xdbx %s (patch level %d)", VERSION, PATCHLEVEL); X XStoreName(display, XtWindow(toplevel), title); X XSetIconName(display, XtWindow(toplevel), "xdbx"); X wmhints.input = True; X if (app_resources.bigicon) X wmhints.icon_pixmap = XCreateBitmapFromData(display, XtWindow(toplevel), X xdbx64_bits, xdbx64_width, xdbx64_height); X else X wmhints.icon_pixmap = XCreateBitmapFromData(display, XtWindow(toplevel), X xdbx48_bits, xdbx48_width, xdbx48_height); X wmhints.flags = IconPixmapHint | InputHint; X XSetWMHints(display, XtWindow(toplevel), &wmhints); X X if (!app_resources.delimiters || X strcmp(app_resources.delimiters, "") == NULL) X app_resources.delimiters = XtNewString(DELIMITERS); X if (app_resources.prompt && strcmp(app_resources.prompt, "") != NULL) X xdbxprompt = app_resources.prompt; X else X xdbxprompt = XtNewString(XDBXPROMPT); X debug = app_resources.debug; X DisableWindowResize(fileWindow); X X strcpy(xdbxinit, ".dbxinit"); X if (access(xdbxinit, R_OK) == -1) { X sprintf(xdbxinit, "%s/%s", (char *) getenv("HOME"), ".dbxinit"); X if (access(xdbxinit, R_OK) == -1) { X strcpy(xdbxinit, ""); X } X } X source_init(); X signs_init(); X parser_init(); X} X X X/* Reconstruct command line arguments for calling dbx. X * Return the argument list for dbx and new value of argc. X */ Xstatic char **dbxoptions(argc, argv, app_resources) X int *argc; X char **argv; X XdbxResources *app_resources; X{ X char **dbxargv; X char *temp = "xdbx.XXXXXX"; X int i=0; X X dbxargv = (char **) XtMalloc (MAXARGS * sizeof(char *)); X for (i=0; i < *argc; i++) X dbxargv[i] = argv[i]; X X if (app_resources->dbxopt_r) X dbxargv[i++] = "-r"; X if (app_resources->dbxopt_i) X dbxargv[i++] = "-i"; X if (app_resources->includeDir) { X dbxargv[i++] = "-I"; X dbxargv[i++] = app_resources->includeDir; X } X if (app_resources->dbxopt_k) X dbxargv[i++] = "-k"; X if (app_resources->cfile) { X dbxargv[i++] = "-c"; X dbxargv[i++] = app_resources->cfile; X } X if (app_resources->dbxopt_kbd) X dbxargv[i++] = "-kbd"; X if (app_resources->fcount) { X dbxargv[i++] = "-f"; X dbxargv[i++] = app_resources->fcount; X } X /* If .dbxinit exists in the local or home directory, include the option X * -c (Berkeley dbx) or -s (Sun dbx) and a dummy filename as the option X * argument. This will prevent dbx from reading the user's command X * initialization file. Xdbx will read each line and pass it to dbx X * instead. X */ X if (strcmp(xdbxinit, "")) { /* .dbxinit or ~/.dbxinit exists */ X#ifdef BSD X dbxargv[i++] = "-c"; X#else X dbxargv[i++] = "-s"; X#endif X dbxargv[i++] = (char *) mktemp(temp); X } X if (app_resources->startup) { /* overwrites dbxinit */ X Tstartup = False; X strcpy(xdbxinit, app_resources->startup); X } X if (app_resources->tstartup) { /* overwrites dbxinit */ X Tstartup = True; X strcpy(xdbxinit, app_resources->tstartup); X } X#ifdef MIPS X if (app_resources->pixie) { /* pixie output */ X dbxargv[i++] = "-pixie"; X } X#endif X dbxargv[i] = NULL; X *argc = i; X return dbxargv; X} X X Xvoid main(argc, argv) Xint argc; Xchar **argv; X{ X char **dbxargv; X X trap_signals(); X X toplevel = XtAppInitialize(&app_context, "XDbx", options, XtNumber(options), X &argc, argv, fallback_resources, NULL, 0); X if (argc > 3) Syntax(argv[0]); X XtGetApplicationResources(toplevel, &app_resources, resources, X XtNumber(resources), NULL, 0); X XtAppAddActions(app_context, xdbx_actions, XtNumber(xdbx_actions)); X CreateSubWindows(toplevel); X XtRealizeWidget(toplevel); X X main_init(); X dbxargv = dbxoptions(&argc, argv, &app_resources); X calldbx(argc, dbxargv); X X XtAppMainLoop(app_context); X} END_OF_FILE if test 12215 -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 4 \(of 7\). cp /dev/null ark4isdone MISSING="" for I in 1 2 3 4 5 6 7 ; do if test ! -f ark${I}isdone ; then MISSING="${MISSING} ${I}" fi done if test "${MISSING}" = "" ; then echo You have unpacked all 7 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 dan ---------------------------------------------------- O'Reilly && Associates argv@sun.com / argv@ora.com Opinions expressed reflect those of the author only.