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 / ttytest.C < prev    next >
C/C++ Source or Header  |  1998-03-25  |  4KB  |  153 lines

  1. // $Id: ttytest.C,v 1.8 1998/03/25 12:46:44 zeller Exp $ 
  2. // TTYAgent test program
  3.  
  4. // Copyright (C) 1995 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 ttytest_rcsid[] = 
  30.     "$Id: ttytest.C,v 1.8 1998/03/25 12:46:44 zeller Exp $";
  31.  
  32. #include <stdlib.h>
  33. #include "TTYAgent.h"
  34. #include "cook.h"
  35.  
  36. #ifndef EXIT_SUCCESS
  37. #define EXIT_SUCCESS 0
  38. #endif
  39.  
  40. #ifndef EXIT_FAILURE
  41. #define EXIT_FAILURE 1
  42. #endif
  43.  
  44. // Trace communication
  45. static void trace(const string& prefix, void *call_data)
  46. {
  47.     DataLength* dl    = (DataLength *) call_data;
  48.     string s(dl->data, dl->length);
  49.  
  50.     bool s_ends_with_nl = false;
  51.     if (s.length() > 0 && s[s.length() - 1] == '\n')
  52.     {
  53.     s_ends_with_nl = true;
  54.     s = s.before(int(s.length() - 1));
  55.     }
  56.  
  57.     s = quote(s);
  58.     string nl = string("\\n\"\n") + replicate(' ', prefix.length()) + "\"";
  59.     s.gsub("\\n", nl);
  60.  
  61.     if (s_ends_with_nl)
  62.     s(s.length() - 1, 0) = "\\n";
  63.  
  64.     cerr << prefix << s << '\n';
  65. }
  66.  
  67. // Invoked whenever text is received from the inferior
  68. void traceInputHP(Agent *, void *, void *call_data)
  69. {
  70.     trace("<- ", call_data);
  71. }
  72.  
  73. // Invoked whenever text is sent to the inferior
  74. void traceOutputHP(Agent *, void *, void *call_data)
  75. {
  76.     trace("-> ", call_data);
  77. }
  78.  
  79. // Invoked whenever error messages are received from the inferior
  80. void traceErrorHP (Agent *, void *, void *call_data)
  81. {
  82.     trace("<= ", call_data);
  83. }
  84.  
  85. // Invoked whenever text is received from standard input
  86. void sendInputHP(Agent *, void *client_data, void *call_data)
  87. {
  88.     TTYAgent& tty = *((TTYAgent *)client_data);
  89.     DataLength* dl    = (DataLength *) call_data;
  90.  
  91.     tty.write(dl->data, dl->length);
  92. }
  93.  
  94. // Invoked whenever EOF is received from standard input
  95. void exitHP(Agent *, void *client_data, void *)
  96. {
  97.     TTYAgent& tty = *((TTYAgent *)client_data);
  98.     tty.shutdown();
  99. }
  100.  
  101. // Invoked whenever the inferior dies
  102. void diedHP(Agent *a, void *client_data, void *call_data)
  103. {
  104.     cerr << a->path() << ": " << (char *)call_data << "\n";
  105.  
  106.     TTYAgent& tty = *((TTYAgent *)client_data);
  107.     tty.shutdown();
  108.     exit(EXIT_SUCCESS);
  109. }
  110.  
  111. int main(int argc, char *argv[])
  112. {
  113.     XtAppContext app_context;
  114.  
  115.     // Initialize it all
  116.     Widget toplevel = 
  117.     XtAppInitialize(&app_context, "TTYtest", 0, 0, &argc, argv, 0, 0, 0);
  118.  
  119.     string command;
  120.     for (int i = 1; i < argc; i++)
  121.     {
  122.     if (command != "")
  123.         command += " ";
  124.     command += argv[i];
  125.     }
  126.  
  127.     if (command == "")
  128.     {
  129.     cerr << XtName(toplevel) 
  130.          << ": usage: " << XtName(toplevel) << " COMMAND [ARGS...]\n";
  131.     return 1;
  132.     }
  133.  
  134.     // `tty' handles communication with the inferior
  135.     TTYAgent tty(app_context, command);
  136.     tty.addHandler(Input,  traceInputHP);
  137.     tty.addHandler(Output, traceOutputHP);
  138.     tty.addHandler(Error,  traceErrorHP);
  139.     tty.addHandler(Died,   diedHP, &tty);
  140.  
  141.     // `me' handles communication with standard input and output
  142.     LiterateAgent me(app_context);
  143.     me.addHandler(Input, sendInputHP, &tty);
  144.     me.addHandler(InputEOF, exitHP, &tty);
  145.  
  146.     tty.start();
  147.     me.start();
  148.  
  149.     XtAppMainLoop(app_context);
  150.  
  151.     return EXIT_SUCCESS;    // Never reached
  152. }
  153.