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 / deref.C < prev    next >
C/C++ Source or Header  |  1998-10-23  |  3KB  |  102 lines

  1. // $Id: deref.C,v 1.5 1998/10/23 20:30:25 zeller Exp $ -*- C++ -*-
  2. // Dereference expression
  3.  
  4. // Copyright (C) 1998 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 deref_rcsid[] = 
  30.     "$Id: deref.C,v 1.5 1998/10/23 20:30:25 zeller Exp $";
  31.  
  32. #ifdef __GNUG__
  33. #pragma implementation
  34. #endif
  35.  
  36. #include "deref.h"
  37.  
  38. #include "GDBAgent.h"
  39. #include "assert.h"
  40. #include "ddd.h"
  41. #include "buttons.h"
  42. #include "disp-read.h"
  43. #include "question.h"
  44. #include "regexps.h"
  45. #include "string-fun.h"
  46.  
  47. // Return dereferenced EXPR.  Only useful in Perl.
  48. string deref(const string& expr, const string& sym)
  49. {
  50.     const string& symbol = (sym == "" ? expr : sym);
  51.  
  52.     if (gdb->program_language() != LANGUAGE_PERL)
  53.     return gdb->dereferenced_expr(symbol);
  54.  
  55.     assert(gdb->program_language() == LANGUAGE_PERL);
  56.     if (!expr.contains('$', 0))
  57.     return symbol;        // Only scalars can be dereferenced
  58.  
  59.     string ref = NO_GDB_ANSWER;
  60.  
  61.     if (ref == NO_GDB_ANSWER)
  62.     {
  63.     // Try value directly.  Must have the form `REF(ADDRESS)'.
  64.     string val = gdbValue(expr);
  65.     if (val.matches(rxperlref))
  66.         ref = val.through(rxidentifier);
  67.     }
  68.  
  69. #if 0
  70.     if (ref == NO_GDB_ANSWER)
  71.     {
  72.     // Try `ref' operator
  73.     ref = gdbValue("ref(" + expr + ")");
  74.     }
  75. #endif
  76.  
  77.     if (ref == NO_GDB_ANSWER)
  78.     return symbol;        // Cannot access debugger
  79.  
  80.     strip_space(ref);
  81.     string prefix = "";
  82.     if (ref == "REF")
  83.     prefix = "$";
  84.     else if (ref == "SCALAR")
  85.     prefix = "$";
  86.     else if (ref == "ARRAY")
  87.     prefix = "@";
  88.     else if (ref == "HASH")
  89.     prefix = "%";
  90.     else if (ref == "CODE")
  91.     prefix = "&";
  92.     else if (ref == "GLOB")
  93.     prefix = "*";
  94.     else
  95.     return symbol;        // Unknown type
  96.  
  97.     if (symbol == "()" || symbol.matches(rxidentifier))
  98.     return prefix + symbol;
  99.     else
  100.     return prefix + "{" + symbol + "}";
  101. }
  102.