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 / question.C < prev    next >
C/C++ Source or Header  |  1998-10-23  |  4KB  |  150 lines

  1. // $Id: question.C,v 1.19 1998/10/23 15:16:11 zeller Exp $ -*- C++ -*-
  2. // Synchronous GDB questions
  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 question_rcsid[] = 
  30.     "$Id: question.C,v 1.19 1998/10/23 15:16:11 zeller Exp $";
  31.  
  32. #ifdef __GNUG__
  33. #pragma implementation
  34. #endif
  35.  
  36. #include "question.h"
  37.  
  38. #include "ddd.h"
  39. #include "AppData.h"
  40. #include "GDBAgent.h"
  41. #include "Delay.h"
  42. #include "TimeOut.h"
  43. #include "disp-read.h"
  44.  
  45. #include <X11/Intrinsic.h>
  46.  
  47. //-----------------------------------------------------------------------------
  48. // Synchronized questions
  49. //-----------------------------------------------------------------------------
  50.  
  51. bool gdb_question_running = false; // Flag: is gdb_question() running?
  52.  
  53. struct GDBReply {
  54.     string answer;    // The answer text (NO_GDB_ANSWER if timeout)
  55.     bool received;    // true iff we found an answer
  56.  
  57.     GDBReply()
  58.     : answer(NO_GDB_ANSWER), received(false)
  59.     {}
  60. };
  61.  
  62. // Timeout proc - called from XtAppAddTimeOut()
  63. static void gdb_reply_timeout(XtPointer client_data, XtIntervalId *)
  64. {
  65.     GDBReply *reply = (GDBReply *)client_data;
  66.     reply->answer   = NO_GDB_ANSWER;
  67.     reply->received = true;
  68. }
  69.  
  70. // GDB sent a reply - Called from GDBAgent::send_question()
  71. static void gdb_reply(const string& complete_answer, void *qu_data)
  72. {
  73.     GDBReply *reply = (GDBReply *)qu_data;
  74.     reply->answer   = complete_answer;
  75.     reply->received = true;
  76. }
  77.  
  78. // Send COMMAND to GDB; return answer (NO_GDB_ANSWER if none)
  79. // TIMEOUT is either 0 (= use default timeout), -1 (= no timeout)
  80. // or maximal time in seconds
  81. string gdb_question(const string& command, int timeout, bool verbatim)
  82. {
  83.     if (command == "")
  84.     return "";
  85.  
  86.     if (gdb_question_running)
  87.     return NO_GDB_ANSWER;
  88.  
  89.     if (gdb->recording())
  90.     return NO_GDB_ANSWER;
  91.  
  92.     // Block against reentrant calls
  93.     gdb_question_running = true;
  94.  
  95.     static GDBReply reply;
  96.     reply.received = false;
  97.     reply.answer   = NO_GDB_ANSWER;
  98.  
  99.     // Set verbatim mode if needed
  100.     bool old_verbatim = gdb->verbatim();
  101.     gdb->verbatim(verbatim);
  102.  
  103.     // Send question to GDB
  104.     bool ok = gdb->send_question(command, gdb_reply, (void *)&reply);
  105.  
  106.     if (ok)
  107.     {
  108.     // GDB received question - set timeout
  109.     if (timeout == 0)
  110.         timeout = app_data.question_timeout;
  111.  
  112.     XtIntervalId timer = 0;
  113.     if (timeout > 0)
  114.     {
  115.         timer = XtAppAddTimeOut(XtWidgetToApplicationContext(gdb_w), 
  116.                     timeout * 1000,
  117.                     gdb_reply_timeout, (void *)&reply);
  118.     }
  119.  
  120.     // Set delay (unless this is a trivial question)
  121.     Delay *delay = 0;
  122.     if (!command.contains("help", 0) && !is_print_cmd(command, gdb))
  123.         delay = new Delay;
  124.  
  125.     // Process all GDB input and timer events
  126.     while (!reply.received && gdb->running())
  127.         XtAppProcessEvent(XtWidgetToApplicationContext(gdb_w), 
  128.                   XtIMTimer | XtIMAlternateInput);
  129.  
  130.     // Remove timeout in case it's still running
  131.     if (reply.answer != NO_GDB_ANSWER)
  132.     {
  133.         if (timer && timeout > 0)
  134.         XtRemoveTimeOut(timer);
  135.     }
  136.  
  137.     // Clear delay again
  138.     delete delay;
  139.     }
  140.  
  141.     // Restore old verbatim mode
  142.     gdb->verbatim(old_verbatim);
  143.  
  144.     // Unblock against reentrant calls
  145.     gdb_question_running = false;
  146.  
  147.     // Return answer
  148.     return reply.answer;
  149. }
  150.