Annotation of 43BSDReno/contrib/emacs-18.55/gdb/xgdb.c, revision 1.1

1.1     ! root        1: /* Interface from GDB to X windows.
        !             2:    Copyright (C) 1987 Free Software Foundation, Inc.
        !             3: 
        !             4: GDB is distributed in the hope that it will be useful, but WITHOUT ANY
        !             5: WARRANTY.  No author or distributor accepts responsibility to anyone
        !             6: for the consequences of using it or for whether it serves any
        !             7: particular purpose or works at all, unless he says so in writing.
        !             8: Refer to the GDB General Public License for full details.
        !             9: 
        !            10: Everyone is granted permission to copy, modify and redistribute GDB,
        !            11: but only under the conditions described in the GDB General Public
        !            12: License.  A copy of this license is supposed to have been given to you
        !            13: along with GDB so you can know your rights and responsibilities.  It
        !            14: should be in a file named COPYING.  Among other things, the copyright
        !            15: notice and this notice must be preserved on all copies.
        !            16: 
        !            17: In other words, go ahead and share GDB, but don't try to stop
        !            18: anyone else from sharing it farther.  Help stamp out software hoarding!
        !            19: */
        !            20: 
        !            21: /* Original version was contributed by Derek Beatty, 30 June 87.  */
        !            22: 
        !            23: #include "defs.h"
        !            24: #include "initialize.h"
        !            25: #include "param.h"
        !            26: #include "symtab.h"
        !            27: #include "frame.h"
        !            28: 
        !            29: #include <X11/IntrinsicP.h>
        !            30: #include <X11/StringDefs.h>
        !            31: #include <X11/Label.h>
        !            32: #include <X11/Command.h>
        !            33: #include <X11/TextP.h>
        !            34: #include <X11/Box.h>
        !            35: #include <X11/VPaned.h>
        !            36: 
        !            37: #include <stdio.h>
        !            38: 
        !            39: /* Cursor used in GDB window.  */
        !            40: 
        !            41: #define gdb_width 16
        !            42: #define gdb_height 16
        !            43: #define gdb_x_hot 7
        !            44: #define gdb_y_hot 0
        !            45: static short gdb_bits[] = {
        !            46:    0x0000, 0x0140, 0x0220, 0x0220,
        !            47:    0x23e2, 0x13e4, 0x09c8, 0x0ff8,
        !            48:    0x0220, 0x3ffe, 0x0630, 0x03e0,
        !            49:    0x0220, 0x1ffc, 0x2632, 0x01c0};
        !            50: 
        !            51: #define gdb_mask_width 16
        !            52: #define gdb_mask_height 16
        !            53: #define gdb_mask_x_hot 7
        !            54: #define gdb_mask_y_hot 0
        !            55: static short gdb_mask_bits[] = {
        !            56:    0x0360, 0x07f0, 0x07f0, 0x77f7,
        !            57:    0x7fff, 0x7fff, 0x1ffc, 0x1ffc,
        !            58:    0x7fff, 0x7fff, 0x7fff, 0x0ff8,
        !            59:    0x3ffe, 0x7fff, 0x7fff, 0x7fff};
        !            60: 
        !            61: /* The X display on which the window appears.  */
        !            62: 
        !            63: static Display *screen_display;
        !            64: 
        !            65: /* Windows manipulated by this package.  */
        !            66: 
        !            67: static Widget main_widget;
        !            68: static Widget containing_widget;
        !            69: static Widget title_widget;
        !            70: static Widget source_name_widget;
        !            71: static Widget source_text_widget;
        !            72: static Widget exec_name_widget;
        !            73: static Widget button_box_widget;
        !            74: 
        !            75: #ifdef VTFD
        !            76: /* Interaction Window */
        !            77: 
        !            78: static Widget interactive_widget;
        !            79: XtTextSource PseudoDiskSourceCreate();
        !            80: XtTextSource TSource;
        !            81: static int vtfd[2], vifd[2];
        !            82: #endif
        !            83: 
        !            84: /* Source text display.  */
        !            85: 
        !            86: static struct symtab *source_window_symtab = 0;
        !            87: 
        !            88: /* Forward declarations */
        !            89: 
        !            90: static Widget create_text_widget ();
        !            91: 
        !            92: START_FILE
        !            93: 
        !            94: /* Return number of text lines displayed in text widget W.  */
        !            95: 
        !            96: int /* was XtTextPosition */
        !            97: XtTextLines (w)
        !            98:      Widget w;
        !            99: {
        !           100:   TextWidget ctx = (TextWidget)w;
        !           101: 
        !           102:   return ctx->text.lt.lines;
        !           103: }
        !           104: 
        !           105: /* Display an appropriate piece of source code in the source window.  */
        !           106: 
        !           107: xgdb_display_source ()
        !           108: {
        !           109:   char *filename;
        !           110:   Arg args[1];
        !           111:   Arg labelArgs[1];
        !           112:   int linenumbers_changed = 0;
        !           113:   int must_scroll = 0;
        !           114:   int height = XtTextLines (source_text_widget);
        !           115: 
        !           116:   struct symtab_and_line get_selected_frame_sal ();
        !           117:   struct symtab_and_line sal;
        !           118:   struct frame_info fi;
        !           119: 
        !           120:   /* Do nothing if called before we are initialized */
        !           121: 
        !           122:   if (!containing_widget) return;
        !           123: 
        !           124:   /* Get the symtab and line number of the selected frame.  */
        !           125: 
        !           126:   fi = get_frame_info (selected_frame);
        !           127:   sal = find_pc_line (fi.pc, fi.next_frame);
        !           128: 
        !           129:   /* Strictly this is wrong, but better than a blank display */
        !           130: 
        !           131:   if (sal.symtab == NULL) 
        !           132:     {
        !           133:       sal.symtab = current_source_symtab;
        !           134:       /* current_source_line may be off by a small number like 4 */
        !           135:       sal.line = current_source_line;
        !           136:     }
        !           137: 
        !           138:   /* Do a path search and get the exact filename of this source file.
        !           139:      Also scan it and find its source lines if not already done.  */
        !           140: 
        !           141:   if (sal.symtab)
        !           142:     linenumbers_changed = get_filename_and_charpos (sal.symtab, sal.line,
        !           143:                                                    &filename);
        !           144: 
        !           145:   if (!filename) sal.symtab = NULL;
        !           146: 
        !           147:   /* If the source window may be wrong, destroy it (and make a new one).  */
        !           148: 
        !           149:   if (linenumbers_changed || source_window_symtab != sal.symtab)
        !           150:     {
        !           151:       Arg fileArgs[1];
        !           152:       XtTextSource src;
        !           153: 
        !           154:       must_scroll = 1;
        !           155:       source_window_symtab = sal.symtab;
        !           156: 
        !           157:       src = XtTextGetSource (source_text_widget);
        !           158:       XtDiskSourceDestroy (src);
        !           159:       
        !           160:       XtSetArg (fileArgs[0], XtNfile, filename);
        !           161:       src = XtDiskSourceCreate (source_text_widget->core.parent, fileArgs, 1);
        !           162:       XtTextSetSource (source_text_widget, src, 0);
        !           163: 
        !           164:       XtSetArg (labelArgs[0], XtNlabel,
        !           165:                filename ? filename : "No source displayed.");
        !           166:       XtSetValues (source_name_widget, labelArgs, XtNumber (labelArgs));
        !           167:       if (filename) free (filename);
        !           168:     }
        !           169: 
        !           170:   /* Update display and cursor positions as necessary.
        !           171:      Cursor should be placed on line sal.line.  */
        !           172: 
        !           173:   /* Find out where the display is positioned (in case user scrolled it).  */
        !           174: 
        !           175:   if (! must_scroll)
        !           176:     {
        !           177:       int top_line_number;
        !           178: 
        !           179:       XtSetArg (args[0], XtNdisplayPosition, NULL);
        !           180:       XtGetValues (source_text_widget, args, 1);
        !           181:       top_line_number = source_charpos_line (source_window_symtab,
        !           182:                                             (int) args[0].value);
        !           183:       /* If desired position is off screen, we must scroll.  */
        !           184:       if (sal.line < top_line_number
        !           185:          || sal.line >= top_line_number + height)
        !           186:        must_scroll = 1;
        !           187:     }
        !           188: 
        !           189:   /* If appropriate, scroll the text display.  */
        !           190: 
        !           191:   if (must_scroll)
        !           192:     {
        !           193:       int top_line_number = (sal.line > height/3) ? sal.line - height/3 : 1;
        !           194: 
        !           195:       XtSetArg (args[0], XtNdisplayPosition,
        !           196:                source_line_charpos (source_window_symtab, top_line_number));
        !           197:       XtSetValues (source_text_widget, args, 1);
        !           198:     }
        !           199: 
        !           200:   /* Set the text display cursor position within the text.  */
        !           201: 
        !           202:   XtSetArg (args[0], XtNinsertPosition, 
        !           203:            source_line_charpos (source_window_symtab, sal.line));
        !           204:   XtSetValues (source_text_widget, args, 1);
        !           205: }
        !           206: 
        !           207: /* Display FILENAME in the title bar at bottom of window.  */
        !           208: 
        !           209: xgdb_display_exec_file (filename)
        !           210:      char *filename;
        !           211: {
        !           212:   static Arg labelArgs[1];
        !           213: 
        !           214:   XtSetArg (labelArgs[0], XtNlabel, filename);
        !           215:   XtSetValues (exec_name_widget, labelArgs, XtNumber (labelArgs));
        !           216: }
        !           217: 
        !           218: /* Do any necessary prompting, etc.  */
        !           219: 
        !           220: static char *prompt_string;
        !           221: 
        !           222: static void
        !           223: print_prompt ()
        !           224: {
        !           225:   if (prompt_string)
        !           226:     {
        !           227:       printf ("%s", prompt_string);
        !           228:       fflush (stdout);
        !           229:     }
        !           230: }
        !           231: 
        !           232: /* Handlers for buttons.  */
        !           233: 
        !           234: /* Subroutine used by "print" and "print*" buttons.
        !           235:    STARFLAG is 1 for print*, 0 for print.
        !           236:    Get the "selection" from X and use it as the operand of a print command.  */
        !           237: 
        !           238: static void
        !           239: print_button (w, starflag, call_data)
        !           240:      Widget w;
        !           241:      int starflag;
        !           242:      caddr_t call_data;
        !           243: {
        !           244:   int selected_length;
        !           245:   char *selected_text;
        !           246:   char *cmd = starflag ? "print * " : "print ";
        !           247:   register int cmdlen = strlen (cmd);
        !           248:   
        !           249:   selected_text = XFetchBytes (screen_display, &selected_length);
        !           250:   if (selected_length)
        !           251:     {
        !           252:       char *line = xmalloc (cmdlen + selected_length + 1);
        !           253:       strcpy (line, cmd);
        !           254:       strncpy (line + cmdlen, selected_text, selected_length);
        !           255:       line[cmdlen + selected_length] = 0;
        !           256: 
        !           257:       execute_command (line, 0);
        !           258: 
        !           259:       free (selected_text);
        !           260:       free (line);
        !           261:     }
        !           262: 
        !           263:   print_prompt ();
        !           264: }
        !           265: 
        !           266: 
        !           267: /* Subroutine used by "stop at" and "go till" buttons.
        !           268:    Set a breakpoint at the position indicated by the "selection"
        !           269:    in the source window, and, if RUNFLAG is nonzero, continue.  */
        !           270: 
        !           271: static void
        !           272: breakpoint_button (w, runflag, call_data)
        !           273:      Widget w;
        !           274:      int runflag;
        !           275:      caddr_t call_data;
        !           276: {
        !           277:   XtTextPosition start, finish;
        !           278:   
        !           279:   XtTextGetSelectionPos (source_text_widget, &start, &finish);
        !           280:   if (!source_window_symtab)
        !           281:     printf ("No source file displayed.\n");
        !           282:   else
        !           283:     {
        !           284:       set_breakpoint (source_window_symtab, 
        !           285:                      source_charpos_line (source_window_symtab, start),
        !           286:                      runflag);
        !           287:       if (runflag)
        !           288:        {
        !           289:          cont_command (0, 1);
        !           290:          xgdb_display_source ();
        !           291:        }
        !           292:     }
        !           293:   print_prompt ();
        !           294: }
        !           295: 
        !           296: /* decide if a character is trash */
        !           297: static int
        !           298: garbage (c)
        !           299:      char c;
        !           300: {
        !           301:   if ('a' <= c && c <= 'z') return 0;
        !           302:   if ('A' <= c && c <= 'Z') return 0;
        !           303:   if ('0' <= c && c <= '9') return 0;
        !           304:   if (c == '_') return 0;
        !           305:   return 1;
        !           306: }
        !           307: 
        !           308: /* Set a breakpoint at the place specified by the "selection" in X.  */
        !           309: 
        !           310: static void
        !           311: explicit_breakpoint_button ()
        !           312: {
        !           313:   int selected_length;
        !           314:   char *selected_text;
        !           315: 
        !           316:   selected_text = XFetchBytes (screen_display, &selected_length);
        !           317:   if (selected_length)
        !           318:     {
        !           319:       char *line = (char *) xmalloc (selected_length + 6);
        !           320:       register char *p, *sp, *end;
        !           321: 
        !           322:       strcpy (line, "break ");
        !           323: 
        !           324:       /* Copy selection but exclude "garbage" characters.  */
        !           325: 
        !           326:       p = selected_text;
        !           327:       end = p + selected_length;
        !           328:       sp = line + strlen (line);
        !           329: 
        !           330:       while (garbage (*p) && p != end) p++;
        !           331:       while (!garbage (*p) && p != end)
        !           332:        *sp++ = *p++;
        !           333:       *sp = 0;
        !           334: 
        !           335:       execute_command (line, 0);
        !           336:       free (selected_text);
        !           337:       free (line);
        !           338:     }
        !           339:   print_prompt ();
        !           340: }
        !           341: 
        !           342: /* Handle a button by running the command COMMAND.  */
        !           343: 
        !           344: static void
        !           345: do_command (w, command, call_data)
        !           346:      Widget w;
        !           347:      char *command;
        !           348:      caddr_t call_data;
        !           349: {
        !           350:   execute_command (command, 0);
        !           351:   xgdb_display_source ();
        !           352:   print_prompt ();
        !           353: }
        !           354: 
        !           355: static void
        !           356: redisplay_button()
        !           357: {
        !           358:   xgdb_display_source();
        !           359: }
        !           360: 
        !           361: /* Define and display all the buttons.  */
        !           362: 
        !           363: static void
        !           364: addbutton (parent, name, function, closure)
        !           365:      Widget parent;
        !           366:      char *name;
        !           367:      void (*function) ();
        !           368:      caddr_t closure;
        !           369: {
        !           370:   static XtCallbackRec Callback[] =
        !           371:     {
        !           372:       {NULL, (caddr_t)NULL},
        !           373:       {NULL, (caddr_t)NULL},
        !           374:     };
        !           375:   static Arg commandArgs[] =
        !           376:     {
        !           377:       {XtNlabel, (XtArgVal)NULL},
        !           378:       {XtNcallback, (XtArgVal)Callback},
        !           379:     };
        !           380: 
        !           381:   Callback[0].callback = (XtCallbackProc)function;
        !           382:   Callback[0].closure = (caddr_t)closure;
        !           383:   commandArgs[0].value = (XtArgVal)name;
        !           384:   XtCreateManagedWidget (name, commandWidgetClass, parent,
        !           385:                         commandArgs, XtNumber(commandArgs));
        !           386: }
        !           387: 
        !           388: /* Create the button windows and store them in `buttons'.  */
        !           389: 
        !           390: static void
        !           391: create_buttons (parent)
        !           392:      Widget parent;
        !           393: {
        !           394:   addbutton (parent, "run", do_command, "run");
        !           395:   addbutton (parent, "quit", do_command, "quit");
        !           396: 
        !           397:   addbutton (parent, "break in", explicit_breakpoint_button, NULL);
        !           398:   addbutton (parent, "break at", breakpoint_button, 0);
        !           399:   addbutton (parent, "go until", breakpoint_button, 1);
        !           400: 
        !           401:   addbutton (parent, "print", print_button, 0);
        !           402:   addbutton (parent, "print*", print_button, 1);
        !           403: 
        !           404:   addbutton (parent, "next", do_command, "next");
        !           405:   addbutton (parent, "step", do_command, "step");
        !           406:   addbutton (parent, "cont", do_command, "cont");
        !           407:   addbutton (parent, "finish", do_command, "finish");
        !           408:   
        !           409:   addbutton (parent, "up", do_command, "up");
        !           410:   addbutton (parent, "down", do_command, "down");
        !           411: 
        !           412:   addbutton (parent, "redisplay", redisplay_button, NULL);
        !           413: }
        !           414: 
        !           415: /* Create a "label window" that just displays the string LABEL.  */
        !           416: 
        !           417: static Widget
        !           418: create_label (name, label)
        !           419:      char *name, *label;
        !           420: {
        !           421:   Arg labelArgs[2];
        !           422:   Widget w; 
        !           423:   
        !           424:   XtSetArg (labelArgs[0], XtNname, name);
        !           425:   XtSetArg (labelArgs[1], XtNlabel, label);
        !           426: 
        !           427:   w = XtCreateManagedWidget ("label", labelWidgetClass, containing_widget,
        !           428:                             labelArgs, XtNumber (labelArgs));
        !           429:   XtPanedSetMinMax (w, w->core.height, w->core.height);
        !           430:   return w;
        !           431: }
        !           432: 
        !           433: /* Create a subwindow of PARENT that displays and scrolls the contents
        !           434:    of file FILENAME.  */
        !           435: 
        !           436: static Widget
        !           437: create_text_widget (parent, filename)
        !           438:      Widget parent;
        !           439:      char *filename;
        !           440: {
        !           441:   static Arg fileArgs[3];
        !           442:   XtTextSource src;
        !           443:   XtTextSink   sink;
        !           444: 
        !           445:   XtSetArg (fileArgs[0], XtNfile, filename);
        !           446:   src = XtDiskSourceCreate(parent, fileArgs, 1);
        !           447:   sink = XtAsciiSinkCreate(parent, NULL, 0);
        !           448: 
        !           449:   XtSetArg (fileArgs[0], XtNtextOptions, scrollVertical);
        !           450:   XtSetArg (fileArgs[1], XtNtextSource, src);
        !           451:   XtSetArg (fileArgs[2], XtNtextSink, sink);
        !           452:   return XtCreateManagedWidget ("disk", textWidgetClass, parent,
        !           453:                                fileArgs, XtNumber (fileArgs));
        !           454: 
        !           455: #if 0 /* This is tucker's method.  */
        !           456: 
        !           457:   /* Create an empty source-display window and add to containing_widget */
        !           458:   XtSetArg (argl[0], XtNfile, "/dev/null");
        !           459:   XtSetArg (argl[1], XtNtextOptions, scrollVertical);
        !           460:   XtSetArg (argl[2], XtNheight, (XtArgVal)sheight);
        !           461:   source_text_widget = XtCreateManagedWidget (NULL, asciiDiskWidgetClass,
        !           462:                                              containing_widget, argl,
        !           463:                                              XtNumber (argl));
        !           464: 
        !           465:   /* Create NULL disk source */
        !           466:   XtSetArg (argl[0], XtNfile, "/dev/null");
        !           467:   NullSource = XtDiskSourceCreate (source_text_widget, argl, ONE);
        !           468: #endif
        !           469: }
        !           470: 
        !           471: /* window manager argument parsing */
        !           472: extern int *win_argc;
        !           473: extern char **win_argv;
        !           474: 
        !           475: /* Entry point to create the widgets representing our display.  */
        !           476: int
        !           477: xgdb_create_window ()
        !           478: {
        !           479:   int width, height;
        !           480:   int sheight;
        !           481:   Arg argl[3];
        !           482:   
        !           483:   /* initialize toolkit, setup defaults */
        !           484:   main_widget = XtInitialize ("gdb", "gdb", NULL, 0, win_argc, win_argv);
        !           485:   screen_display = XtDisplay (main_widget);
        !           486: 
        !           487:   /* Find out what size the user specified.  */
        !           488: 
        !           489:   XtSetArg (argl[0], XtNwidth, (XtArgVal)&width);
        !           490:   XtSetArg (argl[1], XtNheight, (XtArgVal)&height);
        !           491:   XtGetValues (main_widget, argl, XtNumber(argl));
        !           492: 
        !           493:   /* If none specified, set a default size.  */
        !           494: 
        !           495:   if (!width || !height)
        !           496:     {
        !           497:       width = 500, height = 700;
        !           498:       XtSetArg (argl[0], XtNwidth, (XtArgVal)width);
        !           499:       XtSetArg (argl[1], XtNheight, (XtArgVal)height);
        !           500:       XtSetValues (main_widget, argl, XtNumber(argl));
        !           501:     }
        !           502:   sheight = (float)height / 2.5;
        !           503: 
        !           504:   /* Create the (toplevel) main_widget */
        !           505:   XtSetArg (argl[0], XtNwidth, (XtArgVal)width);
        !           506:   XtSetArg (argl[1], XtNheight, (XtArgVal)height);
        !           507:   containing_widget
        !           508:     = XtCreateManagedWidget ("vpaned", vPanedWidgetClass,
        !           509:                             main_widget, argl, XtNumber (argl));
        !           510:   XtPanedSetRefigureMode (containing_widget, FALSE);
        !           511:   
        !           512:   /* Create title */
        !           513:   {
        !           514:     char buf[200];
        !           515:     extern char *version;
        !           516:     sprintf (buf, "GDB %s", version);
        !           517:     title_widget =
        !           518:       create_label ("Title", buf);
        !           519:   }
        !           520: 
        !           521:   /* Create exec file name window and add */
        !           522:   exec_name_widget =
        !           523:     create_label ("Executable", "No executable specified");
        !           524: 
        !           525:   /* Create window full of buttons.  */
        !           526:   button_box_widget = XtCreateManagedWidget ("buttons", boxWidgetClass,
        !           527:                                             containing_widget, NULL, 0);
        !           528:   create_buttons (button_box_widget);
        !           529: 
        !           530:   /* Create source file name window and add to containing_widget */
        !           531:   source_name_widget =
        !           532:     create_label ("Source File", "No source file yet.");
        !           533: 
        !           534:   /* Create an empty source-display window and add to containing_widget */
        !           535:   source_text_widget = create_text_widget (containing_widget, "/dev/null");
        !           536: 
        !           537: #ifdef VFTD
        !           538:   /* Create Fake Text source */
        !           539:   {
        !           540:     extern XtTextSource TCreateApAsSource();
        !           541:     TSource = TCreateApAsSource();
        !           542:   }
        !           543: 
        !           544:   /* Create interactive box */
        !           545:   XtSetArg (argl[0], XtNtextSource, (XtArgVal)TSource);
        !           546:   XtSetArg (argl[1], XtNtextSink,
        !           547:            (XtArgVal)XtAsciiSinkCreate(containing_widget, NULL, 0));
        !           548:   XtSetArg (argl[2], XtNtextOptions,
        !           549:            (XtArgVal)(scrollVertical | wordBreak));
        !           550:   interactive_widget = XtCreateManagedWidget ("gdbWindow", textWidgetClass,
        !           551:                                              containing_widget, argl, THREE);
        !           552: #endif
        !           553: 
        !           554:   /* Put them one screen */
        !           555:   XtPanedSetRefigureMode(containing_widget, TRUE);
        !           556:   XtRealizeWidget (main_widget);
        !           557: 
        !           558:   /* Define GDB cursor */
        !           559: #if 0
        !           560:   XDefineCursor (screen_display, XtWindow (main_widget),
        !           561:                 XCreateFontCursor (screen_display, XC_circle));
        !           562: #endif
        !           563: 
        !           564:   XFlush (screen_display);
        !           565:   return 1;
        !           566: }
        !           567: 
        !           568: #define MAX_XGDB_READ 128
        !           569: 
        !           570: /* xgdb_dispatch -- Loop, dispatching on window events,
        !           571:    until data is available on FP (which is normally stdin).
        !           572:    Then return, so the data on FP can be processed.  */
        !           573: 
        !           574: void
        !           575: xgdb_dispatch (fp)
        !           576:      FILE *fp;
        !           577: {
        !           578:   int inmask = 1 << fileno (fp);
        !           579:   int xmask = 1 << ConnectionNumber (screen_display);
        !           580:   int rfds = 0;
        !           581:   int nfds;
        !           582:   XEvent ev;
        !           583:   int pend;
        !           584:   int nread;
        !           585:   char buf[1024];
        !           586:   int ipmask;
        !           587: 
        !           588: #ifdef VTFD
        !           589:   ipmask = 1 << vtfd[0];
        !           590: #endif
        !           591: 
        !           592:   while (! (rfds & inmask))
        !           593:     {
        !           594:       pend = XPending (screen_display);
        !           595:       if (!pend)
        !           596:        {
        !           597:          rfds = inmask | xmask | ipmask;
        !           598:          /* this isn't right for 4.3 but it works 'cuz of 4.2 compatibility */
        !           599:          nfds = select (32, &rfds, 0, 0, (struct timeval *) 0);
        !           600:        }
        !           601:       if (pend || rfds & xmask)
        !           602:        {
        !           603:          XNextEvent (screen_display, &ev);
        !           604:          XtDispatchEvent (&ev);
        !           605:        }
        !           606: 
        !           607: #ifdef VTFD
        !           608:       /* Handle I/O through the command window.  */
        !           609:       if (pend == 0 && (rfds & ipmask))
        !           610:        {
        !           611:          nread = read (vtfd[0], buf, sizeof(buf));
        !           612:          xgdb_write (buf, nread);
        !           613:        }
        !           614:       nread = xgdb_read (buf, MAX_XGDB_READ);
        !           615:       if (pend == 0 && nread > 0)
        !           616:        {
        !           617:          write (vifd[1], buf, nread);
        !           618:        }
        !           619: #endif
        !           620:     }
        !           621: }  
        !           622: 
        !           623: #ifdef VTFD
        !           624: 
        !           625: static int output_size;
        !           626: static int used_size;
        !           627: static char *output_string;
        !           628: 
        !           629: static void
        !           630: xgdb_init_text ()
        !           631: {
        !           632:   Arg args[2];
        !           633: 
        !           634:   output_size = 1000;
        !           635:   output_string = (char *) xmalloc (output_size);
        !           636:   used_size = 0;
        !           637: 
        !           638:   XtSetArg (args[0], XtNstring, (XtArgVal) output_string);
        !           639:   XtSetArg (args[1], XtNlength, (XtArgVal) output_size);
        !           640:   TSource
        !           641:     = XtStringSourceCreate (toplevel, args, 2);
        !           642: 
        !           643:   XtSetArg (args[0], XtNtextSource, TSource);
        !           644:   XtSetValues (interaction_widget, Args, 1);
        !           645: }
        !           646: 
        !           647: static void
        !           648: xgdb_grow_text (size)
        !           649:      int size;
        !           650: {
        !           651:   if (output_size < used_size + size + 200)
        !           652:     {
        !           653:       Arg args[2];
        !           654: 
        !           655:       XtStringSourceDestroy (TSource);
        !           656: 
        !           657:       output_size = (used_size + size + 1010 + 512) / 1010 * 1010;
        !           658:       output_string = xrealloc (output_string, output_size);
        !           659: 
        !           660:       XtSetArg (args[0], XtNstring, (XtArgVal) output_string);
        !           661:       XtSetArg (args[1], XtNlength, (XtArgVal) output_size);
        !           662:       TSource
        !           663:        = XtStringSourceCreate (toplevel, args, 2);
        !           664: 
        !           665:       XtSetArg (args[0], XtNtextSource, TSource);
        !           666:       XtSetValues (interaction_widget, Args, 1);
        !           667:     }
        !           668: }
        !           669: 
        !           670: /*VARARGS*/
        !           671: xgdb_printf (fmt, arg1, arg2, arg3, arg4)
        !           672:      char *fmt;
        !           673: {
        !           674:   char buf[1024];
        !           675:   XtTextBlock text;
        !           676:   XtTextPosition pos;
        !           677: 
        !           678: /* ??? This will crash on the wrong data.  */
        !           679:   pos = (*TSource->Scan)(TSource, 0, XtstAll, XtsdRight, 1, 0);
        !           680:   sprintf (buf, fmt, arg1, arg2, arg3, arg4);
        !           681:   text.length = strlen (buf);
        !           682:   text.ptr = buf;
        !           683:   xgdb_grow_text (text.length);
        !           684:   used_size += text.length;
        !           685:   XtTextReplace (interactive_widget, pos, pos, &text);
        !           686:   XtTextSetInsertionPoint (interactive_widget, pos + text.length);
        !           687:   XFlush (screen_display);
        !           688: }
        !           689: 
        !           690: int
        !           691: xgdb_write (buf, len)
        !           692:     char *buf;
        !           693:     int len;
        !           694: {
        !           695:   XtTextBlock text;
        !           696:   XtTextPosition pos;
        !           697: 
        !           698:   pos = (*TSource->Scan)(TSource, 0, XtstAll, XtsdRight, 1, 0);
        !           699:   text.length = len;
        !           700:   text.ptr = buf;
        !           701:   xgdb_grow_text (text.length);
        !           702:   used_size += text.length;
        !           703:   XtTextReplace (interactive_widget, pos, pos, &text);
        !           704:   XtTextSetInsertionPoint (interactive_widget, pos + text.length);
        !           705:   XFlush (screen_display);
        !           706: }
        !           707: 
        !           708: int
        !           709: xgdb_read (buf, maxlen)
        !           710:      char *buf;
        !           711:      int maxlen;
        !           712: {
        !           713:   XtTextBlock text;
        !           714:   XtTextPosition endpos;
        !           715:   int length = 0;
        !           716: 
        !           717:   xgdb_grow_text (maxlen);
        !           718:   endpos = XtTextGetInsertionPoint (interactive_widget);
        !           719:   length = endpos - used_size;
        !           720:   if (length > 0)
        !           721:     {
        !           722:       (*TSource->Read) (TSource, lastpos, &text, maxlen - 10);
        !           723:       length = text.length;
        !           724:       strncpy(buf, text.ptr, length);
        !           725:       buf[length] = NULL;
        !           726:       used_size += length;
        !           727:     }
        !           728:   return length;
        !           729: }
        !           730: #endif /* VTFD */
        !           731: 
        !           732: /* If we use an X window, the GDB command loop is told to call this function
        !           733:    before reading a command from stdin.
        !           734:    PROMPT is saved for later use so buttons can print a prompt-string.  */
        !           735: 
        !           736: void
        !           737: xgdb_window_hook (infile, prompt)
        !           738:      FILE *infile;
        !           739:      char *prompt;
        !           740: {
        !           741:   prompt_string = prompt;
        !           742:   xgdb_display_source ();
        !           743:   xgdb_dispatch (infile);
        !           744: }
        !           745: 
        !           746: static
        !           747: initialize ()
        !           748: {
        !           749:   extern void (*window_hook) ();
        !           750:   extern int inhibit_windows;
        !           751: 
        !           752:   if (getenv ("DISPLAY") && ! inhibit_windows)
        !           753:     if (xgdb_create_window ())
        !           754:       window_hook = xgdb_window_hook;
        !           755: 
        !           756:   specify_exec_file_hook (xgdb_display_exec_file);
        !           757: }
        !           758: 
        !           759: END_FILE
        !           760: 

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.