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