"Fossies" - the Fresh Open Source Software Archive

Member "xxgdb-1.12/dbx.c" (18 Nov 1994, 7926 Bytes) of package /linux/misc/old/xxgdb-1.12.tar.gz:


As a special service "Fossies" has tried to format the requested source page into HTML format using (guessed) C and C++ source code syntax highlighting (style: standard) with prefixed line numbers and code folding option. Alternatively you can here view or download the uninterpreted source code file.

    1 /*****************************************************************************
    2  *
    3  *  xdbx - X Window System interface to the dbx debugger
    4  *
    5  *  Copyright 1989 The University of Texas at Austin
    6  *  Copyright 1990 Microelectronics and Computer Technology Corporation
    7  *
    8  *  Permission to use, copy, modify, and distribute this software and its
    9  *  documentation for any purpose and without fee is hereby granted,
   10  *  provided that the above copyright notice appear in all copies and that
   11  *  both that copyright notice and this permission notice appear in
   12  *  supporting documentation, and that the name of The University of Texas
   13  *  and Microelectronics and Computer Technology Corporation (MCC) not be 
   14  *  used in advertising or publicity pertaining to distribution of
   15  *  the software without specific, written prior permission.  The
   16  *  University of Texas and MCC makes no representations about the 
   17  *  suitability of this software for any purpose.  It is provided "as is" 
   18  *  without express or implied warranty.
   19  *
   20  *  THE UNIVERSITY OF TEXAS AND MCC DISCLAIMS ALL WARRANTIES WITH REGARD TO
   21  *  THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND
   22  *  FITNESS, IN NO EVENT SHALL THE UNIVERSITY OF TEXAS OR MCC BE LIABLE FOR
   23  *  ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER
   24  *  RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF
   25  *  CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN
   26  *  CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
   27  *
   28  *  Author:     Po Cheung
   29  *  Created:    March 10, 1989
   30  * 
   31  *****************************************************************************
   32  * 
   33  *  xxgdb - X Window System interface to the gdb debugger
   34  *  
   35  *  Copyright 1990,1993 Thomson Consumer Electronics, Inc.
   36  *  
   37  *  Permission to use, copy, modify, and distribute this software and its
   38  *  documentation for any purpose and without fee is hereby granted,
   39  *  provided that the above copyright notice appear in all copies and that
   40  *  both that copyright notice and this permission notice appear in
   41  *  supporting documentation, and that the name of Thomson Consumer
   42  *  Electronics (TCE) not be used in advertising or publicity pertaining
   43  *  to distribution of the software without specific, written prior
   44  *  permission.  TCE makes no representations about the suitability of
   45  *  this software for any purpose.  It is provided "as is" without express
   46  *  or implied warranty.
   47  *
   48  *  TCE DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING
   49  *  ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT
   50  *  SHALL TCE BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES
   51  *  OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS,
   52  *  WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION,
   53  *  ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS
   54  *  SOFTWARE.
   55  *
   56  *  Adaptation to GDB:  Pierre Willard
   57  *  XXGDB Created:      December, 1990
   58  *
   59  *****************************************************************************/
   60 
   61 /*
   62  *  dbx.c
   63  *
   64  *    Handle dbx command initialization file (.dbxinit) and communication 
   65  *    between dbx and xdbx.
   66  *
   67  *    dbx_init():   Handle .dbxinit
   68  *    debug_init(): 
   69  *    read_dbx():   Read dbx output, parse and filter it before displaying
   70  *          onto the dialog window.
   71  *    write_dbx():  Send a command to dbx.
   72  *    query_dbx():  Send a command to dbx and process it.
   73  */
   74 #include <stdio.h>
   75 #include <unistd.h>
   76 #include "global.h"
   77 
   78 Boolean Prompt;         /* True when dbx prompt arrives */
   79 char    *concat();
   80 char    *dbxprompt; 
   81 char    *xdbxprompt;
   82 
   83 /*  Given a dbx command initialization file, this routine executes each dbx 
   84  *  command in the file.  It sends the command to dbx, and calls read_dbx() 
   85  *  directly to process output returned from dbx.
   86  */
   87  
   88 static void dbx_init(xdbxinit)
   89 char *xdbxinit;
   90 {
   91 #ifndef GDB
   92     FILE *fp;
   93     char s[LINESIZ];
   94 #endif /* not GDB */
   95 
   96     if (strcmp(xdbxinit, "") == 0)
   97     return;
   98     
   99 #ifdef GDB
  100 
  101     read_source_file(xdbxinit);
  102     
  103 #else /* not GDB */
  104     if (fp = fopen(xdbxinit, "r")) {
  105         while (fgets(s, LINESIZ, fp)) {
  106             send_command(s);
  107             AppendDialogText(s);
  108             Prompt = False;
  109             while (!Prompt)
  110                 read_dbx();
  111         }
  112     fclose(fp);
  113     }
  114 #endif /* not GDB */
  115 }
  116 
  117 /*
  118  *  This routine is called after getting the first dbx prompt.  
  119  *  > check the use list to create a list of directories for searching
  120  *    source files.
  121  *  > ask dbx for the source file and display it if it exists.
  122  *  > open the command initialization file and executed the commands;
  123  *    if Tstartup is true, remove the initialization file.
  124  */
  125 void debug_init()
  126 {
  127     static visited = False;
  128 
  129     if (!visited) {
  130     visited = True;
  131     dbx_init(xdbxinit);
  132     if (Tstartup)
  133         unlink(xdbxinit);
  134     strcpy(xdbxinit, "");
  135     }
  136 }
  137 
  138 #ifndef GDB
  139 /*
  140  *  This is a callback procedure invoked everytime when input is pending
  141  *  on the file descriptor to dbx.
  142  *  o reads all the data available on the file descriptor line by line
  143  *    into local variable 'string' and global variable 'output'.
  144  *    'output' records the entire dbx output whereas 'string' records
  145  *    only the data read in this invocation of read_dbx().
  146  *  o in Echo mode, the contents in 'string' is edited by filter()
  147  *    before it gets displayed on the dialog window.
  148  *  o once the dbx prompt is read, calls parse() to analyse the dbx output
  149  *    and take appropriate action.
  150  */
  151 /* ARGSUSED */
  152 void read_dbx(master, source, id)
  153 XtPointer master;
  154 int       *source;
  155 XtInputId *id;
  156 {
  157     static char *output = NULL;     /* buffer for dbx output */
  158     static char *next_string = NULL;
  159     static char *command;
  160     char    *string = NULL;
  161     char    s[LINESIZ];
  162     Boolean     more;
  163     
  164     more = True;
  165     while (more) {
  166     Prompt = False;
  167     /* keep reading until no more or until prompt arrives */
  168     while (more = fgets(s, LINESIZ, dbxfp) && !Prompt) {
  169         if (debug)
  170         fprintf(stderr, "=>%s", s);
  171         /* receive prompt? */
  172         if (strncmp(s, dbxprompt, strlen(dbxprompt)) == 0) {
  173         Prompt = True;
  174         /* more stuff behind prompt? */
  175         if (s[strlen(dbxprompt)])
  176             /* remember it */
  177             next_string = XtNewString(s+strlen(dbxprompt));
  178         /* destroy contents */
  179         strcpy(s, "");
  180         }
  181         string = concat(string, s);
  182         strcpy(s, "");
  183     }
  184     output = concat(output, string);
  185     command = get_command();
  186         
  187     if (Echo) {
  188         filter(string, output, command);
  189         if (Prompt) AppendDialogText(xdbxprompt);
  190     }
  191     if (string) {
  192         XtFree(string);
  193         string = NULL;
  194     }
  195     if (next_string) {
  196         string = concat(string, next_string);
  197         XtFree(next_string);
  198         next_string = NULL;
  199     }
  200     if (Prompt) {
  201         parse(output, command);
  202         delete_command();
  203         XtFree(output);
  204         output = NULL;
  205     }
  206     }
  207 }
  208 #endif /* not GDB */
  209 
  210 /*  Write string s to dbx, and flush the output.
  211  *
  212  *  18NOV94: it could happen that the string is too big for
  213  *  the IO system to handle at once. Just wait on try again.
  214  *  Do not try too soon else an error will be returned by
  215  *  write().
  216  *
  217  */
  218 
  219 void write_dbx(s)
  220 char *s;
  221 {
  222     int nbwritten;
  223     int strl = strlen(s);
  224     if (debug) {
  225         fprintf(stderr, ">>%s", s);     /* (PW) see what is sent to GDB */
  226     }
  227     while (strl) {
  228         nbwritten = write (fileno(dbxfp), s, strl);
  229         if (nbwritten == -1) {
  230             perror("write dbxfp");
  231             exit(-1);
  232         }
  233         strl -= nbwritten;
  234         if (strl == 0) {
  235             break;  /* nothing more */
  236         }
  237         s += nbwritten;
  238         if (debug) {
  239             fprintf(stderr, ">> sleep in write_dbx()\n");
  240         }
  241         sleep(1);       /* give gdb time to read his buffer */
  242     }
  243 }
  244 
  245 
  246 #ifndef GDB
  247 /*  Sends a command to dbx and read the corresponding output, directly
  248  *  invoking the Xt input procedure, read_dbx().
  249  */
  250 void query_dbx(command)
  251 char *command;
  252 {
  253     write_dbx(command);
  254     insert_command(command);
  255 
  256     Echo = False;
  257     Prompt = False;
  258     while (!Prompt)
  259         read_dbx();
  260 
  261     Parse = True;   /* Always reset Parse and Echo to True */
  262     Echo = True;
  263 }
  264 #endif