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 / PosBuffer.h < prev    next >
C/C++ Source or Header  |  1998-12-06  |  5KB  |  165 lines

  1. // $Id: PosBuffer.h,v 1.25.4.1 1998/12/06 12:59:20 zeller Exp $
  2. // Filter position information from GDB output.
  3.  
  4. // Copyright (C) 1995 Technische Universitaet Braunschweig, Germany.
  5. // Written by Dorothea Luetkehaus <luetke@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_PosBuffer_h
  30. #define _DDD_PosBuffer_h
  31.  
  32. #ifdef __GNUG__
  33. #pragma interface
  34. #endif
  35.  
  36. //-----------------------------------------------------------------------------
  37. // A `PosBuffer' filters position infos from GDB output.
  38. //-----------------------------------------------------------------------------
  39.  
  40. // Misc includes
  41. #include "bool.h"
  42. #include "strclass.h"
  43.  
  44. class PosBuffer {
  45.     // What was in the previous answer?
  46.     enum ReadState {Null, PosPart, PosComplete};
  47.  
  48.     string pos_buffer;
  49.     string func_buffer;
  50.     string answer_buffer;    // Possible parts of positions
  51.     string pc_buffer;
  52.     ReadState already_read;
  53.  
  54.     bool started;        // Program has started
  55.     bool terminated;        // Program has terminated
  56.     bool signaled;        // Program has received a signal
  57.     bool recompiled;        // Program has been recompiled
  58.  
  59.     string auto_cmd_buffer;    // AutoCommand found
  60.  
  61. protected:
  62.     void filter_gdb(string& answer);
  63.     void filter_dbx(string& answer);
  64.     void filter_xdb(string& answer);
  65.     void filter_jdb(string& answer);
  66.     void filter_pydb(string& answer);
  67.     void filter_perl(string& answer);
  68.  
  69. public:
  70.     bool check_pc;        // Whether to search for PC
  71.     bool check_func;        // Whether to search for function name
  72.  
  73.     // Call this before filtering any new output.
  74.     void clear()
  75.     {
  76.     pos_buffer      = "";
  77.     func_buffer     = "";
  78.     answer_buffer   = "";
  79.     pc_buffer       = "";
  80.     already_read    = Null;
  81.     started         = false;
  82.     terminated      = false;
  83.     signaled        = false;
  84.     recompiled      = false;
  85.     auto_cmd_buffer = "";
  86.     check_pc        = true;
  87.     check_func      = true;
  88.     }
  89.  
  90.     // Constructor
  91.     PosBuffer()
  92.     : pos_buffer(""),
  93.       func_buffer(""),
  94.       answer_buffer(""),
  95.       pc_buffer(""),
  96.       already_read(Null),
  97.       started(false),
  98.       terminated(false),
  99.       signaled(false),
  100.       recompiled(false),
  101.       auto_cmd_buffer(""),
  102.       check_pc(true),
  103.           check_func(true)
  104.     {
  105.     // clear();
  106.     }
  107.  
  108.     // This should avoid link warnings on SGI
  109.     // as reported by Mike Tosti <tosti@cinesite.com>
  110.     ~PosBuffer() {}
  111.  
  112.     // Filter positions from ANSWER and buffer them.  ANSWER contains
  113.     // any remaining parts.
  114.     void filter(string& answer);
  115.  
  116.     // GDB output has ended.  Return any non-position parts.
  117.     string answer_ended();
  118.  
  119.     // Did we find a position in the last output?
  120.     bool pos_found() const         { return already_read == PosComplete; }
  121.     bool partial_pos_found() const { return already_read == PosPart; }
  122.     bool pc_found()  const         { return pc_buffer != ""; }
  123.     bool auto_cmd_found() const    { return auto_cmd_buffer != ""; }
  124.  
  125.     // Return the position found.
  126.     const string& get_position() const { return pos_buffer; }
  127.     const string& get_function() const { return func_buffer; }
  128.     const string& get_pc()       const { return pc_buffer; }
  129.     const string& get_auto_cmd() const { return auto_cmd_buffer; }
  130.  
  131.     // Other properties.
  132.     bool started_found()    const { return started; }
  133.     bool terminated_found() const { return terminated; }
  134.     bool signaled_found()   const { return signaled; }
  135.     bool recompiled_found() const { return recompiled; }
  136. };
  137.  
  138.  
  139. // A regex for C addresses ("0xdead"), Modula-2 addresses ("0BEEFH"),
  140. // and Chill addresses ("H'AFFE").  XDB uses the pattern `00000000'
  141. // for nil pointers; XDB uses `nil' and `NIL'.  `null' is the Java
  142. // expression for NULL pointers; GDB uses `@2b2b' for Java pointers.
  143. // The origin of the last format "16_FFFF" is lost in the mist of time.
  144. #define RXADDRESS "(0x[0-9a-fA-F]+|0[0-9a-fA-F]+[hH]|H'[0-9a-fA-F]+" \
  145.                   "|00+|[(]nil[)]|NIL|null|@[0-9a-fA-F]+|16_[0-9a-f]+)"
  146. #if RUNTIME_REGEX
  147. extern const regex rxaddress;
  148. #endif
  149.  
  150. // Possible start of address - simple prefix of RXADDRESS
  151. #define RXADDRESS_START "[0H@]"
  152.  
  153. #if RUNTIME_REGEX
  154. extern const regex rxaddress_start;
  155. #endif
  156.  
  157. // An even faster check - for hand-written parsers
  158. inline bool is_address_start(char c)
  159. {
  160.     return c == '0' || c == 'H';
  161. }
  162.  
  163. #endif // _DDD_PosBuffer_h
  164. // DON'T ADD ANYTHING BEHIND THIS #endif
  165.