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