Commit | Line | Data |
---|---|---|
fa3a4f15 | 1 | # Extended prompt utilities. |
e2882c85 | 2 | # Copyright (C) 2011-2018 Free Software Foundation, Inc. |
fa3a4f15 PM |
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." | |
89ed8ea1 | 24 | return os.getcwd() |
fa3a4f15 PM |
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 = '' | |
9a27f2c6 | 101 | keys = sorted (prompt_substitutions.keys()) |
fa3a4f15 PM |
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 |