Home | History | Annotate | Download | only in gdb
      1 # Extended prompt utilities.
      2 # Copyright (C) 2011-2014 Free Software Foundation, Inc.
      3 
      4 # This program is free software; you can redistribute it and/or modify
      5 # it under the terms of the GNU General Public License as published by
      6 # the Free Software Foundation; either version 3 of the License, or
      7 # (at your option) any later version.
      8 #
      9 # This program is distributed in the hope that it will be useful,
     10 # but WITHOUT ANY WARRANTY; without even the implied warranty of
     11 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
     12 # GNU General Public License for more details.
     13 #
     14 # You should have received a copy of the GNU General Public License
     15 # along with this program.  If not, see <http://www.gnu.org/licenses/>.
     16 
     17 """ Extended prompt library functions."""
     18 
     19 import gdb
     20 import os
     21 
     22 def _prompt_pwd(ignore):
     23     "The current working directory."
     24     return os.getcwdu()
     25 
     26 def _prompt_object_attr(func, what, attr, nattr):
     27     """Internal worker for fetching GDB attributes."""
     28     if attr is None:
     29         attr = nattr
     30     try:
     31         obj = func()
     32     except gdb.error:
     33         return '<no %s>' % what
     34     if hasattr(obj, attr):
     35         result = getattr(obj, attr)
     36         if callable(result):
     37             result = result()
     38         return result
     39     else:
     40         return '<no attribute %s on current %s>' % (attr, what)
     41 
     42 def _prompt_frame(attr):
     43     "The selected frame; an argument names a frame parameter."
     44     return _prompt_object_attr(gdb.selected_frame, 'frame', attr, 'name')
     45 
     46 def _prompt_thread(attr):
     47     "The selected thread; an argument names a thread parameter."
     48     return _prompt_object_attr(gdb.selected_thread, 'thread', attr, 'num')
     49 
     50 def _prompt_version(attr):
     51     "The version of GDB."
     52     return gdb.VERSION
     53 
     54 def _prompt_esc(attr):
     55     "The ESC character."
     56     return '\033'
     57 
     58 def _prompt_bs(attr):
     59     "A backslash."
     60     return '\\'
     61 
     62 def _prompt_n(attr):
     63     "A newline."
     64     return '\n'
     65 
     66 def _prompt_r(attr):
     67     "A carriage return."
     68     return '\r'
     69 
     70 def _prompt_param(attr):
     71     "A parameter's value; the argument names the parameter."
     72     return gdb.parameter(attr)
     73 
     74 def _prompt_noprint_begin(attr):
     75     "Begins a sequence of non-printing characters."
     76     return '\001'
     77 
     78 def _prompt_noprint_end(attr):
     79      "Ends a sequence of non-printing characters."
     80      return '\002'
     81 
     82 prompt_substitutions = {
     83     'e': _prompt_esc,
     84     '\\': _prompt_bs,
     85     'n': _prompt_n,
     86     'r': _prompt_r,
     87     'v': _prompt_version,
     88     'w': _prompt_pwd,
     89     'f': _prompt_frame,
     90     't': _prompt_thread,
     91     'p': _prompt_param,
     92     '[': _prompt_noprint_begin,
     93     ']': _prompt_noprint_end
     94 }
     95 
     96 def prompt_help():
     97     """Generate help dynamically from the __doc__ strings of attribute
     98     functions."""
     99 
    100     result = ''
    101     keys = sorted (prompt_substitutions.keys())
    102     for key in keys:
    103         result += '  \\%s\t%s\n' % (key, prompt_substitutions[key].__doc__)
    104     result += """
    105 A substitution can be used in a simple form, like "\\f".
    106 An argument can also be passed to it, like "\\f{name}".
    107 The meaning of the argument depends on the particular substitution."""
    108     return result
    109 
    110 def substitute_prompt(prompt):
    111     "Perform substitutions on PROMPT."
    112 
    113     result = ''
    114     plen = len(prompt)
    115     i = 0
    116     while i < plen:
    117         if prompt[i] == '\\':
    118             i = i + 1
    119             if i >= plen:
    120                 break
    121             cmdch = prompt[i]
    122 
    123             if cmdch in prompt_substitutions:
    124                 cmd = prompt_substitutions[cmdch]
    125 
    126                 if i + 1 < plen and prompt[i + 1] == '{':
    127                     j = i + 1
    128                     while j < plen and prompt[j] != '}':
    129                         j = j + 1
    130                     # Just ignore formatting errors.
    131                     if j >= plen or prompt[j] != '}':
    132                         arg = None
    133                     else:
    134                         arg = prompt[i + 2 : j]
    135                         i = j
    136                 else:
    137                     arg = None
    138                 result += str(cmd(arg))
    139             else:
    140                 # Unrecognized escapes are turned into the escaped
    141                 # character itself.
    142                 result += prompt[i]
    143         else:
    144             result += prompt[i]
    145 
    146         i = i + 1
    147 
    148     return result
    149