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 / Command.h < prev    next >
C/C++ Source or Header  |  1998-10-23  |  6KB  |  197 lines

  1. // $Id: Command.h,v 1.9 1998/10/23 15:13:50 zeller Exp $ -*- C++ -*-
  2. // DDD interface to GDB commands
  3.  
  4. // Copyright (C) 1996-1997 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. #ifndef _DDD_Command_h
  30. #define _DDD_Command_h
  31.  
  32. #ifdef __GNUG__
  33. #pragma interface
  34. #endif
  35.  
  36. #include "GDBAgent.h"
  37. #include "question.h"        // NO_GDB_ANSWER
  38.  
  39. #define COMMAND_PRIORITY_WORK  -1 // work procedures
  40. #define COMMAND_PRIORITY_USER   0 // user-initiated commands
  41. #define COMMAND_PRIORITY_BATCH  1 // batch jobs (auto commands)
  42. #define COMMAND_PRIORITY_INIT   2 // init commands
  43. #define COMMAND_PRIORITY_SYSTEM 3 // system-initiated commands
  44. #define COMMAND_PRIORITY_AGAIN 99 // try again
  45.  
  46. // Commands
  47. struct Command
  48. {
  49.     string command;        // Command text
  50.     Widget origin;        // Origin
  51.     OQCProc callback;        // Completion of COMMAND
  52.     OACProc extra_callback;    // Completion of extra commands
  53.     void *data;            // Data for callbacks
  54.     bool echo;            // Flag: issue command in GDB console?
  55.     bool verbose;        // Flag: issue answer in GDB console?
  56.     bool prompt;        // Flag: issue prompt in GDB console?
  57.     bool check;            // Flag: add extra commands to get GDB state?
  58.     int priority;        // Priority (highest get executed first)
  59.  
  60. private:
  61.     static void clear_origin(Widget w, XtPointer client_data, 
  62.                  XtPointer call_data);
  63.     void add_destroy_callback();
  64.     void remove_destroy_callback();
  65.  
  66. public:
  67.     Command(const string& cmd, Widget w, OQCProc cb, void *d = 0, 
  68.         bool v = false, bool c = false, int p = COMMAND_PRIORITY_SYSTEM)
  69.     : command(cmd), origin(w), callback(cb), extra_callback(0), data(d), 
  70.       echo(v), verbose(v), prompt(v), check(c), priority(p)
  71.     {
  72.     add_destroy_callback();
  73.     }
  74.     Command(const string& cmd, Widget w = 0)
  75.     : command(cmd), origin(w), callback(0), extra_callback(0), data(0), 
  76.       echo(true), verbose(true), prompt(true), check(true), 
  77.       priority(COMMAND_PRIORITY_USER)
  78.     {
  79.     add_destroy_callback();
  80.     }
  81.     Command(const Command& c)
  82.     : command(c.command), origin(c.origin), callback(c.callback),
  83.       extra_callback(c.extra_callback), data(c.data), 
  84.       echo(c.echo), verbose(c.verbose), prompt(c.prompt),
  85.       check(c.check), priority(c.priority)
  86.     {
  87.     add_destroy_callback();
  88.     }
  89.     ~Command()
  90.     {
  91.     remove_destroy_callback();
  92.     }
  93.     Command& operator = (const Command& c)
  94.     {
  95.     if (this != &c)
  96.     {
  97.         remove_destroy_callback();
  98.  
  99.         command        = c.command;
  100.         origin         = c.origin;
  101.         callback       = c.callback;
  102.         extra_callback = c.extra_callback;
  103.         data           = c.data;
  104.         echo           = c.echo;
  105.         verbose        = c.verbose;
  106.         prompt         = c.prompt;
  107.         check          = c.check;
  108.         priority       = c.priority;
  109.  
  110.         add_destroy_callback();
  111.     }
  112.     return *this;
  113.     }
  114.     bool operator == (const Command& c)
  115.     {
  116.     return this == &c || 
  117.         command == c.command 
  118.         && origin == c.origin 
  119.         && callback == c.callback 
  120.         && extra_callback == c.extra_callback 
  121.         && data == c.data
  122.         && echo == c.echo
  123.         && verbose == c.verbose
  124.         && prompt == c.prompt
  125.         && check == c.check
  126.         && priority == c.priority;
  127.     }
  128. };
  129.  
  130.  
  131. // Enqueue COMMAND in command queue
  132. extern void gdb_command(const Command& command);
  133.  
  134. // Custom calls
  135. inline void gdb_command(const string& command, Widget origin,
  136.             OQCProc callback, void *data = 0, 
  137.             bool verbose = false, bool check = false,
  138.             int priority = COMMAND_PRIORITY_SYSTEM)
  139. {
  140.     gdb_command(Command(command, origin, callback, data, 
  141.             verbose, check, priority));
  142. }
  143.  
  144. inline void gdb_command(const string& command, Widget origin = 0)
  145. {
  146.     gdb_command(Command(command, origin));
  147. }
  148.  
  149. inline void gdb_batch(const string& command, Widget origin,
  150.               OQCProc callback, void *data = 0,
  151.               bool verbose = false, bool check = false,
  152.               int priority = COMMAND_PRIORITY_BATCH)
  153. {
  154.     gdb_command(Command(command, origin, callback, data, 
  155.             verbose, check, priority));
  156. }
  157.  
  158. inline void gdb_batch(const string& command, Widget origin = 0)
  159. {
  160.     gdb_command(Command(command, origin, OQCProc(0), 0, 
  161.             false, true, COMMAND_PRIORITY_BATCH));
  162. }
  163.  
  164. // Pass the COMMAND given in CLIENT_DATA to gdb_command()
  165. extern void gdbCommandCB(Widget w, XtPointer call_data, XtPointer client_data);
  166.  
  167. // Check if command queue is empty
  168. extern bool emptyCommandQueue();
  169.  
  170. // Clear command queue
  171. extern void clearCommandQueue();
  172.  
  173. // Synchronize with command queue
  174. extern void syncCommandQueue();
  175.  
  176. // Return a shell widget according to last command origin
  177. extern Widget find_shell(Widget w = 0);
  178.  
  179. // Process next element from command queue
  180. extern void processCommandQueue(XtPointer = 0, XtIntervalId *id = 0);
  181.  
  182. // True if GDB processed any user command (= we had user interaction)
  183. extern bool userInteractionSeen();
  184.  
  185. // Last user reply to a `y or n' question
  186. extern string lastUserReply();
  187.  
  188. // Translate frequently used commands
  189. extern void translate_command(string& command);
  190.  
  191. // Add and strip auto_command prefix
  192. extern void add_auto_command_prefix(string& command);
  193. extern void strip_auto_command_prefix(string& command);
  194.  
  195. #endif // _DDD_Command_h
  196. // DON'T ADD ANYTHING BEHIND THIS #endif
  197.