home *** CD-ROM | disk | FTP | other *** search
/ PC World Komputer 1999 mARCH / PCWK3A99.iso / Linux / DDD331 / DDD-3_1_.000 / DDD-3_1_ / ddd-3.1.1 / ddd / cmdtty.C < prev    next >
C/C++ Source or Header  |  1998-10-22  |  4KB  |  137 lines

  1. // $Id: cmdtty.C,v 1.16 1998/10/22 15:12:42 zeller Exp $ -*- C++ -*-
  2. // TTY command interface
  3.  
  4. // Copyright (C) 1996 Technische Universitaet Braunschweig, Germany.
  5. // Written by Andreas Zeller <zeller@ips.cs.tu-bs.de>.
  6. // 
  7. // This file is part of DDD.
  8. // 
  9. // DDD is free software; you can redistribute it and/or
  10. // modify it under the terms of the GNU General Public
  11. // License as published by the Free Software Foundation; either
  12. // version 2 of the License, or (at your option) any later version.
  13. // 
  14. // DDD is distributed in the hope that it will be useful,
  15. // but WITHOUT ANY WARRANTY; without even the implied warranty of
  16. // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
  17. // See the GNU General Public License for more details.
  18. // 
  19. // You should have received a copy of the GNU General Public
  20. // License along with DDD -- see the file COPYING.
  21. // If not, write to the Free Software Foundation, Inc.,
  22. // 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
  23. // 
  24. // DDD is the data display debugger.
  25. // For details, see the DDD World-Wide-Web page, 
  26. // `http://www.cs.tu-bs.de/softech/ddd/',
  27. // or send a mail to the DDD developers <ddd@ips.cs.tu-bs.de>.
  28.  
  29. char cmdtty_rcsid[] = 
  30.     "$Id: cmdtty.C,v 1.16 1998/10/22 15:12:42 zeller Exp $";
  31.  
  32. #ifdef __GNUG__
  33. #pragma implementation
  34. #endif
  35.  
  36. #include "cmdtty.h"
  37.  
  38. #include "AppData.h"
  39. #include "GDBAgent.h"
  40. #include "LiterateA.h"
  41. #include "SourceView.h"
  42. #include "ddd.h"
  43. #include "editing.h"
  44. #include "exit.h"
  45.  
  46. #include <Xm/Xm.h>
  47. #include <Xm/Text.h>
  48.  
  49. //-----------------------------------------------------------------------------
  50. // Command TTY
  51. //-----------------------------------------------------------------------------
  52.  
  53. // All communication with the command TTY passes through this variable
  54. static LiterateAgent* command_tty = 0;
  55.  
  56. // true if input comes from command tty
  57. static bool tty_gdb_input;
  58.  
  59. // TTY input received
  60. void tty_command(Agent *, void *, void *call_data)
  61. {
  62.     DataLength *d = (DataLength *)call_data;
  63.  
  64.     // Simply insert text, invoking all necessary callbacks
  65.     tty_gdb_input = true;
  66.     XmTextInsert(gdb_w, XmTextGetLastPosition(gdb_w), (String)d->data);
  67.     tty_gdb_input = false;
  68. }
  69.  
  70. // TTY EOF received
  71. void tty_eof(Agent *, void *, void *)
  72. {
  73.     // Forward EOF to GDB (or whatever GDB is just running)
  74.     gdb->send_user_ctrl_cmd("\004");
  75.     if (gdb_input_at_prompt)
  76.     gdb_is_exiting = true;
  77. }
  78.  
  79. // Echo on TTY
  80. void tty_out(const string& text)
  81. {
  82.     if (tty_gdb_input)
  83.     return;
  84.  
  85.     _tty_out(text);
  86. }
  87.  
  88. // Output TEXT on controlling TTY (unconditionally)
  89. void _tty_out(const string& text)
  90. {
  91.     if (command_tty == 0)
  92.     return;
  93.  
  94.     command_tty->write((char *)text, text.length());
  95. }
  96.  
  97. // Output TEXT on controlling TTY if we're in full_name_mode
  98. void tty_full_name(const string& pos)
  99. {
  100.     if (command_tty == 0)
  101.     return;
  102.  
  103.     if (app_data.full_name_mode)
  104.     {
  105.     _tty_out("\032\032" + pos + "\n");
  106.     }
  107.     else
  108.     {
  109.     string line = source_view->get_line(pos);
  110.     if (line != "")
  111.         _tty_out(line + "\n");
  112.     }
  113. }
  114.  
  115. // Issue an artificial prompt
  116. void prompt()
  117. {
  118.     _gdb_out(gdb->prompt());
  119.     if (tty_gdb_input)
  120.     _tty_out(gdb->prompt());
  121. }
  122.  
  123. // Initialize command tty
  124. void init_command_tty()
  125. {
  126.     command_tty = new LiterateAgent(XtWidgetToApplicationContext(gdb_w));
  127.     command_tty->addHandler(Input, tty_command);
  128.     command_tty->addHandler(InputEOF, tty_eof);
  129.     command_tty->start();
  130. }
  131.  
  132. // Check if command tty is still running
  133. bool tty_running()
  134. {
  135.     return command_tty != 0 && command_tty->running();
  136. }
  137.