diff options
Diffstat (limited to 'share/gdb/python/gdb/prompt.py')
-rw-r--r-- | share/gdb/python/gdb/prompt.py | 163 |
1 files changed, 163 insertions, 0 deletions
diff --git a/share/gdb/python/gdb/prompt.py b/share/gdb/python/gdb/prompt.py new file mode 100644 index 0000000..9bbfcb9 --- /dev/null +++ b/share/gdb/python/gdb/prompt.py @@ -0,0 +1,163 @@ +# Extended prompt utilities. +# Copyright (C) 2011-2023 Free Software Foundation, Inc. + +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 3 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program. If not, see <http://www.gnu.org/licenses/>. + +""" Extended prompt library functions.""" + +import gdb +import os + + +def _prompt_pwd(ignore): + "The current working directory." + return os.getcwd() + + +def _prompt_object_attr(func, what, attr, nattr): + """Internal worker for fetching GDB attributes.""" + if attr is None: + attr = nattr + try: + obj = func() + except gdb.error: + return "<no %s>" % what + if hasattr(obj, attr): + result = getattr(obj, attr) + if callable(result): + result = result() + return result + else: + return "<no attribute %s on current %s>" % (attr, what) + + +def _prompt_frame(attr): + "The selected frame; an argument names a frame parameter." + return _prompt_object_attr(gdb.selected_frame, "frame", attr, "name") + + +def _prompt_thread(attr): + "The selected thread; an argument names a thread parameter." + return _prompt_object_attr(gdb.selected_thread, "thread", attr, "num") + + +def _prompt_version(attr): + "The version of GDB." + return gdb.VERSION + + +def _prompt_esc(attr): + "The ESC character." + return "\033" + + +def _prompt_bs(attr): + "A backslash." + return "\\" + + +def _prompt_n(attr): + "A newline." + return "\n" + + +def _prompt_r(attr): + "A carriage return." + return "\r" + + +def _prompt_param(attr): + "A parameter's value; the argument names the parameter." + return gdb.parameter(attr) + + +def _prompt_noprint_begin(attr): + "Begins a sequence of non-printing characters." + return "\001" + + +def _prompt_noprint_end(attr): + "Ends a sequence of non-printing characters." + return "\002" + + +prompt_substitutions = { + "e": _prompt_esc, + "\\": _prompt_bs, + "n": _prompt_n, + "r": _prompt_r, + "v": _prompt_version, + "w": _prompt_pwd, + "f": _prompt_frame, + "t": _prompt_thread, + "p": _prompt_param, + "[": _prompt_noprint_begin, + "]": _prompt_noprint_end, +} + + +def prompt_help(): + """Generate help dynamically from the __doc__ strings of attribute + functions.""" + + result = "" + keys = sorted(prompt_substitutions.keys()) + for key in keys: + result += " \\%s\t%s\n" % (key, prompt_substitutions[key].__doc__) + result += """ +A substitution can be used in a simple form, like "\\f". +An argument can also be passed to it, like "\\f{name}". +The meaning of the argument depends on the particular substitution.""" + return result + + +def substitute_prompt(prompt): + "Perform substitutions on PROMPT." + + result = "" + plen = len(prompt) + i = 0 + while i < plen: + if prompt[i] == "\\": + i = i + 1 + if i >= plen: + break + cmdch = prompt[i] + + if cmdch in prompt_substitutions: + cmd = prompt_substitutions[cmdch] + + if i + 1 < plen and prompt[i + 1] == "{": + j = i + 1 + while j < plen and prompt[j] != "}": + j = j + 1 + # Just ignore formatting errors. + if j >= plen or prompt[j] != "}": + arg = None + else: + arg = prompt[i + 2 : j] + i = j + else: + arg = None + result += str(cmd(arg)) + else: + # Unrecognized escapes are turned into the escaped + # character itself. + result += prompt[i] + else: + result += prompt[i] + + i = i + 1 + + return result |