cli-script.c revision 1.10 1 1.1 christos /* GDB CLI command scripting.
2 1.1 christos
3 1.10 christos Copyright (C) 1986-2023 Free Software Foundation, Inc.
4 1.1 christos
5 1.1 christos This file is part of GDB.
6 1.1 christos
7 1.1 christos This program is free software; you can redistribute it and/or modify
8 1.1 christos it under the terms of the GNU General Public License as published by
9 1.1 christos the Free Software Foundation; either version 3 of the License, or
10 1.1 christos (at your option) any later version.
11 1.1 christos
12 1.1 christos This program is distributed in the hope that it will be useful,
13 1.1 christos but WITHOUT ANY WARRANTY; without even the implied warranty of
14 1.1 christos MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 1.1 christos GNU General Public License for more details.
16 1.1 christos
17 1.1 christos You should have received a copy of the GNU General Public License
18 1.1 christos along with this program. If not, see <http://www.gnu.org/licenses/>. */
19 1.1 christos
20 1.1 christos #include "defs.h"
21 1.1 christos #include "value.h"
22 1.1 christos #include <ctype.h>
23 1.1 christos
24 1.1 christos #include "ui-out.h"
25 1.1 christos #include "top.h"
26 1.1 christos #include "breakpoint.h"
27 1.8 christos #include "tracepoint.h"
28 1.1 christos #include "cli/cli-cmds.h"
29 1.1 christos #include "cli/cli-decode.h"
30 1.1 christos #include "cli/cli-script.h"
31 1.9 christos #include "cli/cli-style.h"
32 1.10 christos #include "gdbcmd.h"
33 1.1 christos
34 1.3 christos #include "extension.h"
35 1.1 christos #include "interps.h"
36 1.3 christos #include "compile/compile.h"
37 1.9 christos #include "gdbsupport/gdb_string_view.h"
38 1.8 christos #include "python/python.h"
39 1.8 christos #include "guile/guile.h"
40 1.1 christos
41 1.7 christos #include <vector>
42 1.7 christos
43 1.1 christos /* Prototypes for local functions. */
44 1.1 christos
45 1.1 christos static enum command_control_type
46 1.8 christos recurse_read_control_structure
47 1.10 christos (read_next_line_ftype read_next_line_func,
48 1.8 christos struct command_line *current_cmd,
49 1.8 christos gdb::function_view<void (const char *)> validator);
50 1.8 christos
51 1.8 christos static void do_define_command (const char *comname, int from_tty,
52 1.8 christos const counted_command_line *commands);
53 1.1 christos
54 1.10 christos static void do_document_command (const char *comname, int from_tty,
55 1.10 christos const counted_command_line *commands);
56 1.10 christos
57 1.10 christos static const char *read_next_line (std::string &buffer);
58 1.1 christos
59 1.1 christos /* Level of control structure when reading. */
60 1.1 christos static int control_level;
61 1.1 christos
62 1.1 christos /* Level of control structure when executing. */
63 1.1 christos static int command_nest_depth = 1;
64 1.1 christos
65 1.1 christos /* This is to prevent certain commands being printed twice. */
66 1.1 christos static int suppress_next_print_command_trace = 0;
67 1.1 christos
68 1.8 christos /* Command element for the 'while' command. */
69 1.8 christos static cmd_list_element *while_cmd_element = nullptr;
70 1.7 christos
71 1.8 christos /* Command element for the 'if' command. */
72 1.8 christos static cmd_list_element *if_cmd_element = nullptr;
73 1.7 christos
74 1.8 christos /* Command element for the 'define' command. */
75 1.8 christos static cmd_list_element *define_cmd_element = nullptr;
76 1.7 christos
77 1.10 christos /* Command element for the 'document' command. */
78 1.10 christos static cmd_list_element *document_cmd_element = nullptr;
79 1.10 christos
80 1.1 christos /* Structure for arguments to user defined functions. */
81 1.7 christos
82 1.7 christos class user_args
83 1.7 christos {
84 1.7 christos public:
85 1.7 christos /* Save the command line and store the locations of arguments passed
86 1.7 christos to the user defined function. */
87 1.7 christos explicit user_args (const char *line);
88 1.7 christos
89 1.7 christos /* Insert the stored user defined arguments into the $arg arguments
90 1.7 christos found in LINE. */
91 1.7 christos std::string insert_args (const char *line) const;
92 1.7 christos
93 1.7 christos private:
94 1.7 christos /* Disable copy/assignment. (Since the elements of A point inside
95 1.7 christos COMMAND, copying would need to reconstruct the A vector in the
96 1.7 christos new copy.) */
97 1.7 christos user_args (const user_args &) =delete;
98 1.7 christos user_args &operator= (const user_args &) =delete;
99 1.7 christos
100 1.7 christos /* It is necessary to store a copy of the command line to ensure
101 1.7 christos that the arguments are not overwritten before they are used. */
102 1.7 christos std::string m_command_line;
103 1.7 christos
104 1.7 christos /* The arguments. Each element points inside M_COMMAND_LINE. */
105 1.8 christos std::vector<gdb::string_view> m_args;
106 1.7 christos };
107 1.7 christos
108 1.7 christos /* The stack of arguments passed to user defined functions. We need a
109 1.7 christos stack because user-defined functions can call other user-defined
110 1.7 christos functions. */
111 1.7 christos static std::vector<std::unique_ptr<user_args>> user_args_stack;
112 1.7 christos
113 1.7 christos /* An RAII-base class used to push/pop args on the user args
114 1.7 christos stack. */
115 1.7 christos struct scoped_user_args_level
116 1.7 christos {
117 1.7 christos /* Parse the command line and push the arguments in the user args
118 1.7 christos stack. */
119 1.7 christos explicit scoped_user_args_level (const char *line)
120 1.1 christos {
121 1.7 christos user_args_stack.emplace_back (new user_args (line));
122 1.7 christos }
123 1.7 christos
124 1.7 christos /* Pop the current user arguments from the stack. */
125 1.7 christos ~scoped_user_args_level ()
126 1.7 christos {
127 1.7 christos user_args_stack.pop_back ();
128 1.1 christos }
129 1.7 christos };
130 1.1 christos
131 1.1 christos
132 1.1 christos /* Return non-zero if TYPE is a multi-line command (i.e., is terminated
134 1.1 christos by "end"). */
135 1.1 christos
136 1.1 christos static int
137 1.1 christos multi_line_command_p (enum command_control_type type)
138 1.1 christos {
139 1.1 christos switch (type)
140 1.1 christos {
141 1.1 christos case if_control:
142 1.1 christos case while_control:
143 1.1 christos case while_stepping_control:
144 1.3 christos case commands_control:
145 1.1 christos case compile_control:
146 1.3 christos case python_control:
147 1.8 christos case guile_control:
148 1.10 christos case define_control:
149 1.1 christos case document_control:
150 1.1 christos return 1;
151 1.1 christos default:
152 1.1 christos return 0;
153 1.1 christos }
154 1.1 christos }
155 1.1 christos
156 1.1 christos /* Allocate, initialize a new command line structure for one of the
157 1.1 christos control commands (if/while). */
158 1.10 christos
159 1.7 christos static command_line_up
160 1.1 christos build_command_line (enum command_control_type type, const char *args)
161 1.8 christos {
162 1.8 christos if (args == NULL || *args == '\0')
163 1.8 christos {
164 1.8 christos if (type == if_control)
165 1.8 christos error (_("if command requires an argument."));
166 1.8 christos else if (type == while_control)
167 1.8 christos error (_("while command requires an argument."));
168 1.8 christos else if (type == define_control)
169 1.10 christos error (_("define command requires an argument."));
170 1.10 christos else if (type == document_control)
171 1.8 christos error (_("document command requires an argument."));
172 1.1 christos }
173 1.1 christos gdb_assert (args != NULL);
174 1.10 christos
175 1.1 christos return command_line_up (new command_line (type, xstrdup (args)));
176 1.1 christos }
177 1.1 christos
178 1.1 christos /* Build and return a new command structure for the control commands
179 1.1 christos such as "if" and "while". */
180 1.8 christos
181 1.7 christos counted_command_line
182 1.1 christos get_command_line (enum command_control_type type, const char *arg)
183 1.1 christos {
184 1.10 christos /* Allocate and build a new command line structure. */
185 1.8 christos counted_command_line cmd (build_command_line (type, arg).release (),
186 1.1 christos command_lines_deleter ());
187 1.1 christos
188 1.8 christos /* Read in the body of this command. */
189 1.1 christos if (recurse_read_control_structure (read_next_line, cmd.get (), 0)
190 1.1 christos == invalid_control)
191 1.1 christos {
192 1.1 christos warning (_("Error reading in canned sequence of commands."));
193 1.1 christos return NULL;
194 1.1 christos }
195 1.1 christos
196 1.1 christos return cmd;
197 1.1 christos }
198 1.1 christos
199 1.1 christos /* Recursively print a command (including full control structures). */
200 1.1 christos
201 1.1 christos void
202 1.1 christos print_command_lines (struct ui_out *uiout, struct command_line *cmd,
203 1.1 christos unsigned int depth)
204 1.1 christos {
205 1.1 christos struct command_line *list;
206 1.1 christos
207 1.1 christos list = cmd;
208 1.1 christos while (list)
209 1.1 christos {
210 1.7 christos if (depth)
211 1.1 christos uiout->spaces (2 * depth);
212 1.1 christos
213 1.1 christos /* A simple command, print it and continue. */
214 1.1 christos if (list->control_type == simple_control)
215 1.7 christos {
216 1.7 christos uiout->field_string (NULL, list->line);
217 1.1 christos uiout->text ("\n");
218 1.1 christos list = list->next;
219 1.1 christos continue;
220 1.1 christos }
221 1.1 christos
222 1.10 christos /* loop_continue to jump to the start of a while loop, print it
223 1.1 christos and continue. */
224 1.1 christos if (list->control_type == continue_control)
225 1.7 christos {
226 1.7 christos uiout->field_string (NULL, "loop_continue");
227 1.1 christos uiout->text ("\n");
228 1.1 christos list = list->next;
229 1.1 christos continue;
230 1.1 christos }
231 1.1 christos
232 1.1 christos /* loop_break to break out of a while loop, print it and
233 1.1 christos continue. */
234 1.1 christos if (list->control_type == break_control)
235 1.7 christos {
236 1.7 christos uiout->field_string (NULL, "loop_break");
237 1.1 christos uiout->text ("\n");
238 1.1 christos list = list->next;
239 1.1 christos continue;
240 1.1 christos }
241 1.1 christos
242 1.1 christos /* A while command. Recursively print its subcommands and
243 1.1 christos continue. */
244 1.1 christos if (list->control_type == while_control
245 1.1 christos || list->control_type == while_stepping_control)
246 1.1 christos {
247 1.1 christos /* For while-stepping, the line includes the 'while-stepping'
248 1.1 christos token. See comment in process_next_line for explanation.
249 1.1 christos Here, take care not print 'while-stepping' twice. */
250 1.7 christos if (list->control_type == while_control)
251 1.1 christos uiout->field_fmt (NULL, "while %s", list->line);
252 1.7 christos else
253 1.7 christos uiout->field_string (NULL, list->line);
254 1.8 christos uiout->text ("\n");
255 1.1 christos print_command_lines (uiout, list->body_list_0.get (), depth + 1);
256 1.7 christos if (depth)
257 1.7 christos uiout->spaces (2 * depth);
258 1.7 christos uiout->field_string (NULL, "end");
259 1.1 christos uiout->text ("\n");
260 1.1 christos list = list->next;
261 1.1 christos continue;
262 1.1 christos }
263 1.1 christos
264 1.9 christos /* An if command. Recursively print both arms before
265 1.1 christos continuing. */
266 1.1 christos if (list->control_type == if_control)
267 1.7 christos {
268 1.7 christos uiout->field_fmt (NULL, "if %s", list->line);
269 1.1 christos uiout->text ("\n");
270 1.8 christos /* The true arm. */
271 1.1 christos print_command_lines (uiout, list->body_list_0.get (), depth + 1);
272 1.1 christos
273 1.8 christos /* Show the false arm if it exists. */
274 1.1 christos if (list->body_list_1 != nullptr)
275 1.1 christos {
276 1.7 christos if (depth)
277 1.7 christos uiout->spaces (2 * depth);
278 1.7 christos uiout->field_string (NULL, "else");
279 1.8 christos uiout->text ("\n");
280 1.1 christos print_command_lines (uiout, list->body_list_1.get (), depth + 1);
281 1.1 christos }
282 1.1 christos
283 1.7 christos if (depth)
284 1.7 christos uiout->spaces (2 * depth);
285 1.7 christos uiout->field_string (NULL, "end");
286 1.1 christos uiout->text ("\n");
287 1.1 christos list = list->next;
288 1.1 christos continue;
289 1.1 christos }
290 1.1 christos
291 1.1 christos /* A commands command. Print the breakpoint commands and
292 1.1 christos continue. */
293 1.1 christos if (list->control_type == commands_control)
294 1.1 christos {
295 1.7 christos if (*(list->line))
296 1.1 christos uiout->field_fmt (NULL, "commands %s", list->line);
297 1.7 christos else
298 1.7 christos uiout->field_string (NULL, "commands");
299 1.8 christos uiout->text ("\n");
300 1.1 christos print_command_lines (uiout, list->body_list_0.get (), depth + 1);
301 1.7 christos if (depth)
302 1.7 christos uiout->spaces (2 * depth);
303 1.7 christos uiout->field_string (NULL, "end");
304 1.1 christos uiout->text ("\n");
305 1.1 christos list = list->next;
306 1.1 christos continue;
307 1.1 christos }
308 1.1 christos
309 1.1 christos if (list->control_type == python_control)
310 1.7 christos {
311 1.7 christos uiout->field_string (NULL, "python");
312 1.1 christos uiout->text ("\n");
313 1.8 christos /* Don't indent python code at all. */
314 1.1 christos print_command_lines (uiout, list->body_list_0.get (), 0);
315 1.7 christos if (depth)
316 1.7 christos uiout->spaces (2 * depth);
317 1.7 christos uiout->field_string (NULL, "end");
318 1.1 christos uiout->text ("\n");
319 1.1 christos list = list->next;
320 1.1 christos continue;
321 1.1 christos }
322 1.3 christos
323 1.3 christos if (list->control_type == compile_control)
324 1.7 christos {
325 1.7 christos uiout->field_string (NULL, "compile expression");
326 1.8 christos uiout->text ("\n");
327 1.3 christos print_command_lines (uiout, list->body_list_0.get (), 0);
328 1.7 christos if (depth)
329 1.7 christos uiout->spaces (2 * depth);
330 1.7 christos uiout->field_string (NULL, "end");
331 1.3 christos uiout->text ("\n");
332 1.3 christos list = list->next;
333 1.3 christos continue;
334 1.3 christos }
335 1.3 christos
336 1.3 christos if (list->control_type == guile_control)
337 1.7 christos {
338 1.7 christos uiout->field_string (NULL, "guile");
339 1.8 christos uiout->text ("\n");
340 1.3 christos print_command_lines (uiout, list->body_list_0.get (), depth + 1);
341 1.7 christos if (depth)
342 1.7 christos uiout->spaces (2 * depth);
343 1.7 christos uiout->field_string (NULL, "end");
344 1.3 christos uiout->text ("\n");
345 1.3 christos list = list->next;
346 1.3 christos continue;
347 1.3 christos }
348 1.1 christos
349 1.1 christos /* Ignore illegal command type and try next. */
350 1.1 christos list = list->next;
351 1.1 christos } /* while (list) */
352 1.1 christos }
353 1.1 christos
354 1.1 christos /* Handle pre-post hooks. */
355 1.8 christos
356 1.1 christos class scoped_restore_hook_in
357 1.8 christos {
358 1.1 christos public:
359 1.8 christos
360 1.8 christos scoped_restore_hook_in (struct cmd_list_element *c)
361 1.8 christos : m_cmd (c)
362 1.8 christos {
363 1.8 christos }
364 1.8 christos
365 1.8 christos ~scoped_restore_hook_in ()
366 1.8 christos {
367 1.8 christos m_cmd->hook_in = 0;
368 1.8 christos }
369 1.8 christos
370 1.8 christos scoped_restore_hook_in (const scoped_restore_hook_in &) = delete;
371 1.8 christos scoped_restore_hook_in &operator= (const scoped_restore_hook_in &) = delete;
372 1.8 christos
373 1.8 christos private:
374 1.8 christos
375 1.8 christos struct cmd_list_element *m_cmd;
376 1.1 christos };
377 1.1 christos
378 1.1 christos void
379 1.1 christos execute_cmd_pre_hook (struct cmd_list_element *c)
380 1.1 christos {
381 1.1 christos if ((c->hook_pre) && (!c->hook_in))
382 1.8 christos {
383 1.1 christos scoped_restore_hook_in restore_hook (c);
384 1.8 christos c->hook_in = 1; /* Prevent recursive hooking. */
385 1.1 christos execute_user_command (c->hook_pre, nullptr);
386 1.1 christos }
387 1.1 christos }
388 1.1 christos
389 1.1 christos void
390 1.1 christos execute_cmd_post_hook (struct cmd_list_element *c)
391 1.1 christos {
392 1.1 christos if ((c->hook_post) && (!c->hook_in))
393 1.8 christos {
394 1.1 christos scoped_restore_hook_in restore_hook (c);
395 1.8 christos c->hook_in = 1; /* Prevent recursive hooking. */
396 1.1 christos execute_user_command (c->hook_post, nullptr);
397 1.1 christos }
398 1.1 christos }
399 1.8 christos
400 1.1 christos /* See cli-script.h. */
401 1.1 christos
402 1.8 christos void
403 1.1 christos execute_control_commands (struct command_line *cmdlines, int from_tty)
404 1.7 christos {
405 1.8 christos scoped_restore save_async = make_scoped_restore (¤t_ui->async, 0);
406 1.8 christos scoped_restore save_nesting
407 1.1 christos = make_scoped_restore (&command_nest_depth, command_nest_depth + 1);
408 1.1 christos
409 1.1 christos while (cmdlines)
410 1.8 christos {
411 1.8 christos enum command_control_type ret = execute_control_command (cmdlines,
412 1.1 christos from_tty);
413 1.1 christos if (ret != simple_control && ret != break_control)
414 1.1 christos {
415 1.1 christos warning (_("Error executing canned sequence of commands."));
416 1.1 christos break;
417 1.1 christos }
418 1.1 christos cmdlines = cmdlines->next;
419 1.8 christos }
420 1.8 christos }
421 1.8 christos
422 1.8 christos /* See cli-script.h. */
423 1.8 christos
424 1.8 christos std::string
425 1.8 christos execute_control_commands_to_string (struct command_line *commands,
426 1.8 christos int from_tty)
427 1.10 christos {
428 1.8 christos std::string result;
429 1.10 christos
430 1.10 christos execute_fn_to_string (result, [&] ()
431 1.10 christos {
432 1.10 christos execute_control_commands (commands, from_tty);
433 1.8 christos }, false);
434 1.10 christos
435 1.8 christos return result;
436 1.8 christos }
437 1.8 christos
438 1.8 christos void
439 1.8 christos execute_user_command (struct cmd_list_element *c, const char *args)
440 1.8 christos {
441 1.8 christos counted_command_line cmdlines_copy;
442 1.8 christos
443 1.8 christos /* Ensure that the user commands can't be deleted while they are
444 1.8 christos executing. */
445 1.8 christos cmdlines_copy = c->user_commands;
446 1.8 christos if (cmdlines_copy == 0)
447 1.8 christos /* Null command */
448 1.8 christos return;
449 1.8 christos struct command_line *cmdlines = cmdlines_copy.get ();
450 1.8 christos
451 1.8 christos scoped_user_args_level push_user_args (args);
452 1.8 christos
453 1.8 christos if (user_args_stack.size () > max_user_call_depth)
454 1.8 christos error (_("Max user call depth exceeded -- command aborted."));
455 1.10 christos
456 1.10 christos /* Set the instream to nullptr, indicating execution of a
457 1.10 christos user-defined function. */
458 1.10 christos scoped_restore restore_instream
459 1.10 christos = make_scoped_restore (¤t_ui->instream, nullptr);
460 1.8 christos
461 1.1 christos execute_control_commands (cmdlines, 0);
462 1.1 christos }
463 1.1 christos
464 1.1 christos /* This function is called every time GDB prints a prompt. It ensures
465 1.1 christos that errors and the like do not confuse the command tracing. */
466 1.1 christos
467 1.1 christos void
468 1.1 christos reset_command_nest_depth (void)
469 1.1 christos {
470 1.1 christos command_nest_depth = 1;
471 1.1 christos
472 1.1 christos /* Just in case. */
473 1.1 christos suppress_next_print_command_trace = 0;
474 1.1 christos }
475 1.1 christos
476 1.1 christos /* Print the command, prefixed with '+' to represent the call depth.
477 1.1 christos This is slightly complicated because this function may be called
478 1.1 christos from execute_command and execute_control_command. Unfortunately
479 1.1 christos execute_command also prints the top level control commands.
480 1.1 christos In these cases execute_command will call execute_control_command
481 1.1 christos via while_command or if_command. Inner levels of 'if' and 'while'
482 1.1 christos are dealt with directly. Therefore we can use these functions
483 1.8 christos to determine whether the command has been printed already or not. */
484 1.1 christos ATTRIBUTE_PRINTF (1, 2)
485 1.8 christos void
486 1.1 christos print_command_trace (const char *fmt, ...)
487 1.1 christos {
488 1.1 christos int i;
489 1.1 christos
490 1.1 christos if (suppress_next_print_command_trace)
491 1.1 christos {
492 1.1 christos suppress_next_print_command_trace = 0;
493 1.1 christos return;
494 1.1 christos }
495 1.1 christos
496 1.1 christos if (!source_verbose && !trace_commands)
497 1.1 christos return;
498 1.1 christos
499 1.10 christos for (i=0; i < command_nest_depth; i++)
500 1.1 christos gdb_printf ("+");
501 1.8 christos
502 1.8 christos va_list args;
503 1.8 christos
504 1.10 christos va_start (args, fmt);
505 1.8 christos gdb_vprintf (fmt, args);
506 1.10 christos va_end (args);
507 1.1 christos gdb_puts ("\n");
508 1.1 christos }
509 1.8 christos
510 1.8 christos /* Helper for execute_control_command. */
511 1.8 christos
512 1.8 christos static enum command_control_type
513 1.1 christos execute_control_command_1 (struct command_line *cmd, int from_tty)
514 1.1 christos {
515 1.1 christos struct command_line *current;
516 1.1 christos int loop;
517 1.1 christos enum command_control_type ret;
518 1.1 christos
519 1.1 christos /* Start by assuming failure, if a problem is detected, the code
520 1.1 christos below will simply "break" out of the switch. */
521 1.1 christos ret = invalid_control;
522 1.1 christos
523 1.1 christos switch (cmd->control_type)
524 1.1 christos {
525 1.7 christos case simple_control:
526 1.7 christos {
527 1.7 christos /* A simple command, execute it and return. */
528 1.8 christos std::string new_line = insert_user_defined_cmd_args (cmd->line);
529 1.7 christos execute_command (new_line.c_str (), from_tty);
530 1.1 christos ret = cmd->control_type;
531 1.7 christos break;
532 1.1 christos }
533 1.1 christos
534 1.1 christos case continue_control:
535 1.1 christos print_command_trace ("loop_continue");
536 1.1 christos
537 1.10 christos /* Return for "continue", and "break" so we can either
538 1.1 christos continue the loop at the top, or break out. */
539 1.1 christos ret = cmd->control_type;
540 1.1 christos break;
541 1.1 christos
542 1.1 christos case break_control:
543 1.1 christos print_command_trace ("loop_break");
544 1.1 christos
545 1.10 christos /* Return for "continue", and "break" so we can either
546 1.1 christos continue the loop at the top, or break out. */
547 1.1 christos ret = cmd->control_type;
548 1.1 christos break;
549 1.1 christos
550 1.1 christos case while_control:
551 1.8 christos {
552 1.1 christos print_command_trace ("while %s", cmd->line);
553 1.1 christos
554 1.7 christos /* Parse the loop control expression for the while statement. */
555 1.7 christos std::string new_line = insert_user_defined_cmd_args (cmd->line);
556 1.1 christos expression_up expr = parse_expression (new_line.c_str ());
557 1.1 christos
558 1.1 christos ret = simple_control;
559 1.1 christos loop = 1;
560 1.1 christos
561 1.1 christos /* Keep iterating so long as the expression is true. */
562 1.1 christos while (loop == 1)
563 1.10 christos {
564 1.1 christos bool cond_result;
565 1.1 christos
566 1.1 christos QUIT;
567 1.1 christos
568 1.10 christos /* Evaluate the expression. */
569 1.10 christos {
570 1.10 christos scoped_value_mark mark;
571 1.10 christos value *val = evaluate_expression (expr.get ());
572 1.10 christos cond_result = value_true (val);
573 1.1 christos }
574 1.1 christos
575 1.1 christos /* If the value is false, then break out of the loop. */
576 1.1 christos if (!cond_result)
577 1.1 christos break;
578 1.1 christos
579 1.8 christos /* Execute the body of the while statement. */
580 1.1 christos current = cmd->body_list_0.get ();
581 1.1 christos while (current)
582 1.8 christos {
583 1.8 christos scoped_restore save_nesting
584 1.8 christos = make_scoped_restore (&command_nest_depth, command_nest_depth + 1);
585 1.1 christos ret = execute_control_command_1 (current, from_tty);
586 1.1 christos
587 1.1 christos /* If we got an error, or a "break" command, then stop
588 1.1 christos looping. */
589 1.1 christos if (ret == invalid_control || ret == break_control)
590 1.1 christos {
591 1.1 christos loop = 0;
592 1.1 christos break;
593 1.1 christos }
594 1.1 christos
595 1.1 christos /* If we got a "continue" command, then restart the loop
596 1.1 christos at this point. */
597 1.1 christos if (ret == continue_control)
598 1.1 christos break;
599 1.1 christos
600 1.1 christos /* Get the next statement. */
601 1.1 christos current = current->next;
602 1.1 christos }
603 1.1 christos }
604 1.1 christos
605 1.1 christos /* Reset RET so that we don't recurse the break all the way down. */
606 1.1 christos if (ret == break_control)
607 1.1 christos ret = simple_control;
608 1.1 christos
609 1.1 christos break;
610 1.1 christos }
611 1.1 christos
612 1.1 christos case if_control:
613 1.8 christos {
614 1.1 christos print_command_trace ("if %s", cmd->line);
615 1.1 christos
616 1.7 christos /* Parse the conditional for the if statement. */
617 1.7 christos std::string new_line = insert_user_defined_cmd_args (cmd->line);
618 1.1 christos expression_up expr = parse_expression (new_line.c_str ());
619 1.1 christos
620 1.1 christos current = NULL;
621 1.1 christos ret = simple_control;
622 1.1 christos
623 1.10 christos /* Evaluate the conditional. */
624 1.10 christos {
625 1.10 christos scoped_value_mark mark;
626 1.1 christos value *val = evaluate_expression (expr.get ());
627 1.10 christos
628 1.10 christos /* Choose which arm to take commands from based on the value
629 1.10 christos of the conditional expression. */
630 1.10 christos if (value_true (val))
631 1.10 christos current = cmd->body_list_0.get ();
632 1.10 christos else if (cmd->body_list_1 != nullptr)
633 1.10 christos current = cmd->body_list_1.get ();
634 1.1 christos }
635 1.1 christos
636 1.1 christos /* Execute commands in the given arm. */
637 1.1 christos while (current)
638 1.8 christos {
639 1.8 christos scoped_restore save_nesting
640 1.8 christos = make_scoped_restore (&command_nest_depth, command_nest_depth + 1);
641 1.1 christos ret = execute_control_command_1 (current, from_tty);
642 1.1 christos
643 1.1 christos /* If we got an error, get out. */
644 1.1 christos if (ret != simple_control)
645 1.1 christos break;
646 1.1 christos
647 1.1 christos /* Get the next statement in the body. */
648 1.1 christos current = current->next;
649 1.1 christos }
650 1.1 christos
651 1.1 christos break;
652 1.1 christos }
653 1.1 christos
654 1.1 christos case commands_control:
655 1.1 christos {
656 1.1 christos /* Breakpoint commands list, record the commands in the
657 1.7 christos breakpoint's command list and return. */
658 1.7 christos std::string new_line = insert_user_defined_cmd_args (cmd->line);
659 1.1 christos ret = commands_from_control_command (new_line.c_str (), cmd);
660 1.1 christos break;
661 1.1 christos }
662 1.3 christos
663 1.5 christos case compile_control:
664 1.5 christos eval_compile_command (cmd, NULL, cmd->control_u.compile.scope,
665 1.3 christos cmd->control_u.compile.scope_data);
666 1.3 christos ret = simple_control;
667 1.3 christos break;
668 1.8 christos
669 1.8 christos case define_control:
670 1.8 christos print_command_trace ("define %s", cmd->line);
671 1.8 christos do_define_command (cmd->line, 0, &cmd->body_list_0);
672 1.8 christos ret = simple_control;
673 1.8 christos break;
674 1.10 christos
675 1.10 christos case document_control:
676 1.10 christos print_command_trace ("document %s", cmd->line);
677 1.10 christos do_document_command (cmd->line, 0, &cmd->body_list_0);
678 1.10 christos ret = simple_control;
679 1.10 christos break;
680 1.1 christos
681 1.3 christos case python_control:
682 1.1 christos case guile_control:
683 1.3 christos {
684 1.1 christos eval_ext_lang_from_control_command (cmd);
685 1.1 christos ret = simple_control;
686 1.1 christos break;
687 1.1 christos }
688 1.1 christos
689 1.1 christos default:
690 1.1 christos warning (_("Invalid control type in canned commands structure."));
691 1.1 christos break;
692 1.1 christos }
693 1.1 christos
694 1.1 christos return ret;
695 1.1 christos }
696 1.8 christos
697 1.8 christos enum command_control_type
698 1.8 christos execute_control_command (struct command_line *cmd, int from_tty)
699 1.9 christos {
700 1.9 christos if (!current_uiout->is_mi_like_p ())
701 1.9 christos return execute_control_command_1 (cmd, from_tty);
702 1.8 christos
703 1.8 christos /* Make sure we use the console uiout. It's possible that we are executing
704 1.8 christos breakpoint commands while running the MI interpreter. */
705 1.8 christos interp *console = interp_lookup (current_ui, INTERP_CONSOLE);
706 1.8 christos scoped_restore save_uiout
707 1.8 christos = make_scoped_restore (¤t_uiout, console->interp_ui_out ());
708 1.8 christos
709 1.8 christos return execute_control_command_1 (cmd, from_tty);
710 1.8 christos }
711 1.1 christos
712 1.1 christos /* Like execute_control_command, but first set
713 1.1 christos suppress_next_print_command_trace. */
714 1.1 christos
715 1.1 christos enum command_control_type
716 1.1 christos execute_control_command_untraced (struct command_line *cmd)
717 1.1 christos {
718 1.1 christos suppress_next_print_command_trace = 1;
719 1.1 christos return execute_control_command (cmd);
720 1.1 christos }
721 1.1 christos
722 1.1 christos
723 1.1 christos /* "while" command support. Executes a body of statements while the
724 1.1 christos loop condition is nonzero. */
725 1.1 christos
726 1.8 christos static void
727 1.1 christos while_command (const char *arg, int from_tty)
728 1.1 christos {
729 1.8 christos control_level = 1;
730 1.1 christos counted_command_line command = get_command_line (while_control, arg);
731 1.1 christos
732 1.1 christos if (command == NULL)
733 1.1 christos return;
734 1.7 christos
735 1.1 christos scoped_restore save_async = make_scoped_restore (¤t_ui->async, 0);
736 1.7 christos
737 1.1 christos execute_control_command_untraced (command.get ());
738 1.1 christos }
739 1.1 christos
740 1.1 christos /* "if" command support. Execute either the true or false arm depending
741 1.1 christos on the value of the if conditional. */
742 1.1 christos
743 1.8 christos static void
744 1.1 christos if_command (const char *arg, int from_tty)
745 1.1 christos {
746 1.8 christos control_level = 1;
747 1.1 christos counted_command_line command = get_command_line (if_control, arg);
748 1.1 christos
749 1.1 christos if (command == NULL)
750 1.1 christos return;
751 1.7 christos
752 1.1 christos scoped_restore save_async = make_scoped_restore (¤t_ui->async, 0);
753 1.7 christos
754 1.1 christos execute_control_command_untraced (command.get ());
755 1.1 christos }
756 1.7 christos
757 1.7 christos /* Bind the incoming arguments for a user defined command to $arg0,
758 1.1 christos $arg1 ... $argN. */
759 1.7 christos
760 1.1 christos user_args::user_args (const char *command_line)
761 1.7 christos {
762 1.1 christos const char *p;
763 1.7 christos
764 1.7 christos if (command_line == NULL)
765 1.1 christos return;
766 1.7 christos
767 1.7 christos m_command_line = command_line;
768 1.1 christos p = m_command_line.c_str ();
769 1.1 christos
770 1.1 christos while (*p)
771 1.7 christos {
772 1.1 christos const char *start_arg;
773 1.1 christos int squote = 0;
774 1.1 christos int dquote = 0;
775 1.1 christos int bsquote = 0;
776 1.1 christos
777 1.1 christos /* Strip whitespace. */
778 1.1 christos while (*p == ' ' || *p == '\t')
779 1.1 christos p++;
780 1.1 christos
781 1.1 christos /* P now points to an argument. */
782 1.1 christos start_arg = p;
783 1.1 christos
784 1.1 christos /* Get to the end of this argument. */
785 1.1 christos while (*p)
786 1.1 christos {
787 1.1 christos if (((*p == ' ' || *p == '\t')) && !squote && !dquote && !bsquote)
788 1.1 christos break;
789 1.1 christos else
790 1.1 christos {
791 1.1 christos if (bsquote)
792 1.1 christos bsquote = 0;
793 1.1 christos else if (*p == '\\')
794 1.1 christos bsquote = 1;
795 1.1 christos else if (squote)
796 1.1 christos {
797 1.1 christos if (*p == '\'')
798 1.1 christos squote = 0;
799 1.1 christos }
800 1.1 christos else if (dquote)
801 1.1 christos {
802 1.1 christos if (*p == '"')
803 1.1 christos dquote = 0;
804 1.1 christos }
805 1.1 christos else
806 1.1 christos {
807 1.1 christos if (*p == '\'')
808 1.1 christos squote = 1;
809 1.1 christos else if (*p == '"')
810 1.1 christos dquote = 1;
811 1.1 christos }
812 1.1 christos p++;
813 1.1 christos }
814 1.1 christos }
815 1.7 christos
816 1.1 christos m_args.emplace_back (start_arg, p - start_arg);
817 1.1 christos }
818 1.1 christos }
819 1.1 christos
820 1.1 christos /* Given character string P, return a point to the first argument
821 1.1 christos ($arg), or NULL if P contains no arguments. */
822 1.7 christos
823 1.7 christos static const char *
824 1.1 christos locate_arg (const char *p)
825 1.1 christos {
826 1.1 christos while ((p = strchr (p, '$')))
827 1.5 christos {
828 1.1 christos if (startswith (p, "$arg")
829 1.1 christos && (isdigit (p[4]) || p[4] == 'c'))
830 1.1 christos return p;
831 1.1 christos p++;
832 1.1 christos }
833 1.1 christos return NULL;
834 1.1 christos }
835 1.7 christos
836 1.1 christos /* See cli-script.h. */
837 1.7 christos
838 1.7 christos std::string
839 1.1 christos insert_user_defined_cmd_args (const char *line)
840 1.7 christos {
841 1.1 christos /* If we are not in a user-defined command, treat $argc, $arg0, et
842 1.7 christos cetera as normal convenience variables. */
843 1.7 christos if (user_args_stack.empty ())
844 1.1 christos return line;
845 1.7 christos
846 1.7 christos const std::unique_ptr<user_args> &args = user_args_stack.back ();
847 1.7 christos return args->insert_args (line);
848 1.1 christos }
849 1.7 christos
850 1.7 christos /* Insert the user defined arguments stored in user_args into the $arg
851 1.1 christos arguments found in line. */
852 1.7 christos
853 1.7 christos std::string
854 1.7 christos user_args::insert_args (const char *line) const
855 1.7 christos {
856 1.7 christos std::string new_line;
857 1.1 christos const char *p;
858 1.1 christos
859 1.1 christos while ((p = locate_arg (line)))
860 1.7 christos {
861 1.1 christos new_line.append (line, p - line);
862 1.1 christos
863 1.1 christos if (p[4] == 'c')
864 1.8 christos {
865 1.7 christos new_line += std::to_string (m_args.size ());
866 1.1 christos line = p + 5;
867 1.1 christos }
868 1.1 christos else
869 1.7 christos {
870 1.7 christos char *tmp;
871 1.7 christos unsigned long i;
872 1.7 christos
873 1.7 christos errno = 0;
874 1.7 christos i = strtoul (p + 4, &tmp, 10);
875 1.7 christos if ((i == 0 && tmp == p + 4) || errno != 0)
876 1.7 christos line = p + 4;
877 1.7 christos else if (i >= m_args.size ())
878 1.7 christos error (_("Missing argument %ld in user function."), i);
879 1.1 christos else
880 1.8 christos {
881 1.7 christos new_line.append (m_args[i].data (), m_args[i].length ());
882 1.1 christos line = tmp;
883 1.1 christos }
884 1.1 christos }
885 1.1 christos }
886 1.7 christos /* Don't forget the tail. */
887 1.1 christos new_line.append (line);
888 1.7 christos
889 1.1 christos return new_line;
890 1.1 christos }
891 1.1 christos
892 1.6 christos
893 1.1 christos /* Read next line from stdin. Passed to read_command_line_1 and
895 1.1 christos recurse_read_control_structure whenever we need to read commands
896 1.9 christos from stdin. */
897 1.10 christos
898 1.1 christos static const char *
899 1.6 christos read_next_line (std::string &buffer)
900 1.1 christos {
901 1.1 christos struct ui *ui = current_ui;
902 1.6 christos char *prompt_ptr, control_prompt[256];
903 1.1 christos int i = 0;
904 1.1 christos int from_tty = ui->instream == ui->stdin_stream;
905 1.1 christos
906 1.1 christos if (control_level >= 254)
907 1.1 christos error (_("Control nesting too deep!"));
908 1.6 christos
909 1.6 christos /* Set a prompt based on the nesting of the control commands. */
910 1.1 christos if (from_tty
911 1.1 christos || (ui->instream == 0 && deprecated_readline_hook != NULL))
912 1.1 christos {
913 1.1 christos for (i = 0; i < control_level; i++)
914 1.1 christos control_prompt[i] = ' ';
915 1.1 christos control_prompt[i] = '>';
916 1.1 christos control_prompt[i + 1] = '\0';
917 1.1 christos prompt_ptr = (char *) &control_prompt[0];
918 1.1 christos }
919 1.1 christos else
920 1.10 christos prompt_ptr = NULL;
921 1.7 christos
922 1.7 christos return command_line_input (buffer, prompt_ptr, "commands");
923 1.7 christos }
924 1.7 christos
925 1.7 christos /* Given an input line P, skip the command and return a pointer to the
926 1.7 christos first argument. */
927 1.7 christos
928 1.7 christos static const char *
929 1.7 christos line_first_arg (const char *p)
930 1.7 christos {
931 1.8 christos const char *first_arg = p + find_command_name_length (p);
932 1.7 christos
933 1.7 christos return skip_spaces (first_arg);
934 1.1 christos }
935 1.1 christos
936 1.1 christos /* Process one input line. If the command is an "end", return such an
937 1.1 christos indication to the caller. If PARSE_COMMANDS is true, strip leading
938 1.1 christos whitespace (trailing whitespace is always stripped) in the line,
939 1.1 christos attempt to recognize GDB control commands, and also return an
940 1.1 christos indication if the command is an "else" or a nop.
941 1.1 christos
942 1.1 christos Otherwise, only "end" is recognized. */
943 1.10 christos
944 1.8 christos static enum misc_command_type
945 1.8 christos process_next_line (const char *p, command_line_up *command,
946 1.8 christos int parse_commands,
947 1.1 christos gdb::function_view<void (const char *)> validator)
948 1.8 christos
949 1.8 christos {
950 1.1 christos const char *p_end;
951 1.1 christos const char *p_start;
952 1.1 christos int not_handled = 0;
953 1.1 christos
954 1.1 christos /* Not sure what to do here. */
955 1.1 christos if (p == NULL)
956 1.1 christos return end_command;
957 1.1 christos
958 1.1 christos /* Strip trailing whitespace. */
959 1.1 christos p_end = p + strlen (p);
960 1.1 christos while (p_end > p && (p_end[-1] == ' ' || p_end[-1] == '\t'))
961 1.1 christos p_end--;
962 1.1 christos
963 1.1 christos p_start = p;
964 1.1 christos /* Strip leading whitespace. */
965 1.1 christos while (p_start < p_end && (*p_start == ' ' || *p_start == '\t'))
966 1.1 christos p_start++;
967 1.1 christos
968 1.5 christos /* 'end' is always recognized, regardless of parse_commands value.
969 1.1 christos We also permit whitespace before end and after. */
970 1.7 christos if (p_end - p_start == 3 && startswith (p_start, "end"))
971 1.1 christos return end_command;
972 1.1 christos
973 1.7 christos if (parse_commands)
974 1.7 christos {
975 1.7 christos /* Resolve command abbreviations (e.g. 'ws' for 'while-stepping'). */
976 1.9 christos const char *cmd_name = p;
977 1.8 christos struct cmd_list_element *cmd
978 1.8 christos = lookup_cmd_1 (&cmd_name, cmdlist, NULL, NULL, 1);
979 1.7 christos cmd_name = skip_spaces (cmd_name);
980 1.1 christos bool inline_cmd = *cmd_name != '\0';
981 1.1 christos
982 1.1 christos /* If commands are parsed, we skip initial spaces. Otherwise,
983 1.1 christos which is the case for Python commands and documentation
984 1.1 christos (see the 'document' command), spaces are preserved. */
985 1.1 christos p = p_start;
986 1.1 christos
987 1.1 christos /* Blanks and comments don't really do anything, but we need to
988 1.1 christos distinguish them from else, end and other commands which can
989 1.1 christos be executed. */
990 1.1 christos if (p_end == p || p[0] == '#')
991 1.1 christos return nop_command;
992 1.5 christos
993 1.1 christos /* Is the else clause of an if control structure? */
994 1.1 christos if (p_end - p == 4 && startswith (p, "else"))
995 1.1 christos return else_command;
996 1.1 christos
997 1.8 christos /* Check for while, if, break, continue, etc and build a new
998 1.1 christos command line structure for them. */
999 1.1 christos if (cmd == while_stepping_cmd_element)
1000 1.1 christos {
1001 1.1 christos /* Because validate_actionline and encode_action lookup
1002 1.1 christos command's line as command, we need the line to
1003 1.1 christos include 'while-stepping'.
1004 1.1 christos
1005 1.1 christos For 'ws' alias, the command will have 'ws', not expanded
1006 1.1 christos to 'while-stepping'. This is intentional -- we don't
1007 1.1 christos really want frontend to send a command list with 'ws',
1008 1.1 christos and next break-info returning command line with
1009 1.1 christos 'while-stepping'. This should work, but might cause the
1010 1.1 christos breakpoint to be marked as changed while it's actually
1011 1.1 christos not. */
1012 1.8 christos *command = build_command_line (while_stepping_control, p);
1013 1.8 christos }
1014 1.8 christos else if (cmd == while_cmd_element)
1015 1.8 christos *command = build_command_line (while_control, line_first_arg (p));
1016 1.8 christos else if (cmd == if_cmd_element)
1017 1.8 christos *command = build_command_line (if_control, line_first_arg (p));
1018 1.8 christos else if (cmd == commands_cmd_element)
1019 1.8 christos *command = build_command_line (commands_control, line_first_arg (p));
1020 1.10 christos else if (cmd == define_cmd_element)
1021 1.10 christos *command = build_command_line (define_control, line_first_arg (p));
1022 1.8 christos else if (cmd == document_cmd_element)
1023 1.1 christos *command = build_command_line (document_control, line_first_arg (p));
1024 1.1 christos else if (cmd == python_cmd_element && !inline_cmd)
1025 1.1 christos {
1026 1.1 christos /* Note that we ignore the inline "python command" form
1027 1.1 christos here. */
1028 1.8 christos *command = build_command_line (python_control, "");
1029 1.3 christos }
1030 1.3 christos else if (cmd == compile_cmd_element && !inline_cmd)
1031 1.3 christos {
1032 1.3 christos /* Note that we ignore the inline "compile command" form
1033 1.3 christos here. */
1034 1.3 christos *command = build_command_line (compile_control, "");
1035 1.8 christos (*command)->control_u.compile.scope = COMPILE_I_INVALID_SCOPE;
1036 1.3 christos }
1037 1.3 christos else if (cmd == guile_cmd_element && !inline_cmd)
1038 1.3 christos {
1039 1.3 christos /* Note that we ignore the inline "guile command" form here. */
1040 1.5 christos *command = build_command_line (guile_control, "");
1041 1.10 christos }
1042 1.5 christos else if (p_end - p == 10 && startswith (p, "loop_break"))
1043 1.10 christos *command = command_line_up (new command_line (break_control));
1044 1.1 christos else if (p_end - p == 13 && startswith (p, "loop_continue"))
1045 1.1 christos *command = command_line_up (new command_line (continue_control));
1046 1.1 christos else
1047 1.1 christos not_handled = 1;
1048 1.1 christos }
1049 1.1 christos
1050 1.1 christos if (!parse_commands || not_handled)
1051 1.10 christos {
1052 1.10 christos /* A normal command. */
1053 1.1 christos *command = command_line_up (new command_line (simple_control,
1054 1.1 christos savestring (p, p_end - p)));
1055 1.1 christos }
1056 1.10 christos
1057 1.1 christos if (validator)
1058 1.1 christos validator ((*command)->line);
1059 1.1 christos
1060 1.1 christos /* Nothing special. */
1061 1.1 christos return ok_command;
1062 1.1 christos }
1063 1.1 christos
1064 1.1 christos /* Recursively read in the control structures and create a
1065 1.1 christos command_line structure from them. Use read_next_line_func to
1066 1.1 christos obtain lines of the command. */
1067 1.10 christos
1068 1.1 christos static enum command_control_type
1069 1.8 christos recurse_read_control_structure (read_next_line_ftype read_next_line_func,
1070 1.1 christos struct command_line *current_cmd,
1071 1.1 christos gdb::function_view<void (const char *)> validator)
1072 1.1 christos {
1073 1.10 christos enum misc_command_type val;
1074 1.8 christos enum command_control_type ret;
1075 1.10 christos struct command_line *child_tail;
1076 1.1 christos counted_command_line *current_body = ¤t_cmd->body_list_0;
1077 1.10 christos command_line_up next;
1078 1.1 christos
1079 1.1 christos child_tail = nullptr;
1080 1.1 christos
1081 1.1 christos /* Sanity checks. */
1082 1.1 christos if (current_cmd->control_type == simple_control)
1083 1.1 christos error (_("Recursed on a simple control type."));
1084 1.1 christos
1085 1.1 christos /* Read lines from the input stream and build control structures. */
1086 1.1 christos while (1)
1087 1.1 christos {
1088 1.10 christos dont_repeat ();
1089 1.10 christos
1090 1.10 christos std::string buffer;
1091 1.3 christos next = nullptr;
1092 1.3 christos val = process_next_line (read_next_line_func (buffer), &next,
1093 1.3 christos current_cmd->control_type != python_control
1094 1.8 christos && current_cmd->control_type != guile_control
1095 1.1 christos && current_cmd->control_type != compile_control,
1096 1.1 christos validator);
1097 1.1 christos
1098 1.1 christos /* Just skip blanks and comments. */
1099 1.1 christos if (val == nop_command)
1100 1.1 christos continue;
1101 1.1 christos
1102 1.1 christos if (val == end_command)
1103 1.1 christos {
1104 1.1 christos if (multi_line_command_p (current_cmd->control_type))
1105 1.1 christos {
1106 1.1 christos /* Success reading an entire canned sequence of commands. */
1107 1.1 christos ret = simple_control;
1108 1.1 christos break;
1109 1.1 christos }
1110 1.1 christos else
1111 1.1 christos {
1112 1.1 christos ret = invalid_control;
1113 1.1 christos break;
1114 1.1 christos }
1115 1.1 christos }
1116 1.1 christos
1117 1.1 christos /* Not the end of a control structure. */
1118 1.1 christos if (val == else_command)
1119 1.8 christos {
1120 1.1 christos if (current_cmd->control_type == if_control
1121 1.8 christos && current_body == ¤t_cmd->body_list_0)
1122 1.10 christos {
1123 1.1 christos current_body = ¤t_cmd->body_list_1;
1124 1.1 christos child_tail = nullptr;
1125 1.1 christos continue;
1126 1.1 christos }
1127 1.1 christos else
1128 1.1 christos {
1129 1.1 christos ret = invalid_control;
1130 1.1 christos break;
1131 1.1 christos }
1132 1.10 christos }
1133 1.10 christos
1134 1.1 christos /* Transfer ownership of NEXT to the command's body list. */
1135 1.10 christos if (child_tail != nullptr)
1136 1.10 christos {
1137 1.1 christos child_tail->next = next.release ();
1138 1.1 christos child_tail = child_tail->next;
1139 1.10 christos }
1140 1.10 christos else
1141 1.10 christos {
1142 1.10 christos child_tail = next.get ();
1143 1.10 christos *current_body = counted_command_line (next.release (),
1144 1.1 christos command_lines_deleter ());
1145 1.1 christos }
1146 1.10 christos
1147 1.10 christos /* If the latest line is another control structure, then recurse
1148 1.1 christos on it. */
1149 1.1 christos if (multi_line_command_p (child_tail->control_type))
1150 1.10 christos {
1151 1.10 christos control_level++;
1152 1.8 christos ret = recurse_read_control_structure (read_next_line_func,
1153 1.1 christos child_tail,
1154 1.1 christos validator);
1155 1.1 christos control_level--;
1156 1.1 christos
1157 1.1 christos if (ret != simple_control)
1158 1.1 christos break;
1159 1.1 christos }
1160 1.1 christos }
1161 1.1 christos
1162 1.1 christos dont_repeat ();
1163 1.1 christos
1164 1.1 christos return ret;
1165 1.1 christos }
1166 1.1 christos
1167 1.1 christos /* Read lines from the input stream and accumulate them in a chain of
1168 1.1 christos struct command_line's, which is then returned. For input from a
1169 1.1 christos terminal, the special command "end" is used to mark the end of the
1170 1.1 christos input, and is not included in the returned chain of commands.
1171 1.1 christos
1172 1.1 christos If PARSE_COMMANDS is true, strip leading whitespace (trailing whitespace
1173 1.1 christos is always stripped) in the line and attempt to recognize GDB control
1174 1.1 christos commands. Otherwise, only "end" is recognized. */
1175 1.1 christos
1176 1.8 christos #define END_MESSAGE "End with a line saying just \"end\"."
1177 1.8 christos
1178 1.8 christos counted_command_line
1179 1.1 christos read_command_lines (const char *prompt_arg, int from_tty, int parse_commands,
1180 1.10 christos gdb::function_view<void (const char *)> validator)
1181 1.1 christos {
1182 1.1 christos if (from_tty && current_ui->input_interactive_p ())
1183 1.1 christos {
1184 1.1 christos if (deprecated_readline_begin_hook)
1185 1.1 christos {
1186 1.1 christos /* Note - intentional to merge messages with no newline. */
1187 1.1 christos (*deprecated_readline_begin_hook) ("%s %s\n", prompt_arg,
1188 1.1 christos END_MESSAGE);
1189 1.9 christos }
1190 1.1 christos else
1191 1.1 christos printf_unfiltered ("%s\n%s\n", prompt_arg, END_MESSAGE);
1192 1.1 christos }
1193 1.1 christos
1194 1.1 christos
1195 1.8 christos /* Reading commands assumes the CLI behavior, so temporarily
1196 1.1 christos override the current interpreter with CLI. */
1197 1.1 christos counted_command_line head (nullptr, command_lines_deleter ());
1198 1.8 christos if (current_interp_named_p (INTERP_CONSOLE))
1199 1.1 christos head = read_command_lines_1 (read_next_line, parse_commands,
1200 1.1 christos validator);
1201 1.8 christos else
1202 1.1 christos {
1203 1.1 christos scoped_restore_interp interp_restorer (INTERP_CONSOLE);
1204 1.8 christos
1205 1.1 christos head = read_command_lines_1 (read_next_line, parse_commands,
1206 1.1 christos validator);
1207 1.10 christos }
1208 1.6 christos
1209 1.1 christos if (from_tty && current_ui->input_interactive_p ()
1210 1.1 christos && deprecated_readline_end_hook)
1211 1.1 christos {
1212 1.1 christos (*deprecated_readline_end_hook) ();
1213 1.1 christos }
1214 1.1 christos return (head);
1215 1.1 christos }
1216 1.1 christos
1217 1.1 christos /* Act the same way as read_command_lines, except that each new line is
1218 1.8 christos obtained using READ_NEXT_LINE_FUNC. */
1219 1.10 christos
1220 1.8 christos counted_command_line
1221 1.8 christos read_command_lines_1 (read_next_line_ftype read_next_line_func,
1222 1.1 christos int parse_commands,
1223 1.10 christos gdb::function_view<void (const char *)> validator)
1224 1.8 christos {
1225 1.1 christos struct command_line *tail;
1226 1.1 christos counted_command_line head (nullptr, command_lines_deleter ());
1227 1.10 christos enum command_control_type ret;
1228 1.1 christos enum misc_command_type val;
1229 1.1 christos command_line_up next;
1230 1.7 christos
1231 1.1 christos control_level = 0;
1232 1.1 christos tail = NULL;
1233 1.1 christos
1234 1.1 christos while (1)
1235 1.10 christos {
1236 1.10 christos dont_repeat ();
1237 1.10 christos
1238 1.8 christos std::string buffer;
1239 1.1 christos val = process_next_line (read_next_line_func (buffer), &next, parse_commands,
1240 1.1 christos validator);
1241 1.1 christos
1242 1.1 christos /* Ignore blank lines or comments. */
1243 1.1 christos if (val == nop_command)
1244 1.1 christos continue;
1245 1.1 christos
1246 1.1 christos if (val == end_command)
1247 1.1 christos {
1248 1.1 christos ret = simple_control;
1249 1.1 christos break;
1250 1.1 christos }
1251 1.1 christos
1252 1.1 christos if (val != ok_command)
1253 1.1 christos {
1254 1.1 christos ret = invalid_control;
1255 1.1 christos break;
1256 1.1 christos }
1257 1.1 christos
1258 1.1 christos if (multi_line_command_p (next->control_type))
1259 1.10 christos {
1260 1.8 christos control_level++;
1261 1.1 christos ret = recurse_read_control_structure (read_next_line_func, next.get (),
1262 1.1 christos validator);
1263 1.1 christos control_level--;
1264 1.1 christos
1265 1.1 christos if (ret == invalid_control)
1266 1.1 christos break;
1267 1.10 christos }
1268 1.1 christos
1269 1.1 christos /* Transfer ownership of NEXT to the HEAD list. */
1270 1.10 christos if (tail)
1271 1.10 christos {
1272 1.1 christos tail->next = next.release ();
1273 1.1 christos tail = tail->next;
1274 1.1 christos }
1275 1.10 christos else
1276 1.10 christos {
1277 1.10 christos tail = next.get ();
1278 1.1 christos head = counted_command_line (next.release (),
1279 1.1 christos command_lines_deleter ());
1280 1.1 christos }
1281 1.1 christos }
1282 1.1 christos
1283 1.7 christos dont_repeat ();
1284 1.7 christos
1285 1.1 christos if (ret == invalid_control)
1286 1.1 christos return NULL;
1287 1.1 christos
1288 1.1 christos return head;
1289 1.1 christos }
1290 1.1 christos
1291 1.1 christos /* Free a chain of struct command_line's. */
1292 1.1 christos
1293 1.1 christos void
1294 1.1 christos free_command_lines (struct command_line **lptr)
1295 1.1 christos {
1296 1.1 christos struct command_line *l = *lptr;
1297 1.1 christos struct command_line *next;
1298 1.1 christos
1299 1.1 christos while (l)
1300 1.8 christos {
1301 1.1 christos next = l->next;
1302 1.1 christos delete l;
1303 1.1 christos l = next;
1304 1.1 christos }
1305 1.1 christos *lptr = NULL;
1306 1.1 christos }
1307 1.1 christos
1308 1.1 christos /* Validate that *COMNAME is a valid name for a command. Return the
1310 1.1 christos containing command list, in case it starts with a prefix command.
1311 1.1 christos The prefix must already exist. *COMNAME is advanced to point after
1312 1.1 christos any prefix, and a NUL character overwrites the space after the
1313 1.8 christos prefix. */
1314 1.1 christos
1315 1.1 christos static struct cmd_list_element **
1316 1.8 christos validate_comname (const char **comname)
1317 1.1 christos {
1318 1.1 christos struct cmd_list_element **list = &cmdlist;
1319 1.1 christos const char *p, *last_word;
1320 1.1 christos
1321 1.1 christos if (*comname == 0)
1322 1.1 christos error_no_arg (_("name of command to define"));
1323 1.1 christos
1324 1.1 christos /* Find the last word of the argument. */
1325 1.1 christos p = *comname + strlen (*comname);
1326 1.1 christos while (p > *comname && isspace (p[-1]))
1327 1.1 christos p--;
1328 1.1 christos while (p > *comname && !isspace (p[-1]))
1329 1.1 christos p--;
1330 1.1 christos last_word = p;
1331 1.1 christos
1332 1.1 christos /* Find the corresponding command list. */
1333 1.1 christos if (last_word != *comname)
1334 1.1 christos {
1335 1.8 christos struct cmd_list_element *c;
1336 1.8 christos
1337 1.1 christos /* Separate the prefix and the command. */
1338 1.9 christos std::string prefix (*comname, last_word - 1);
1339 1.10 christos const char *tem = prefix.c_str ();
1340 1.8 christos
1341 1.1 christos c = lookup_cmd (&tem, cmdlist, "", NULL, 0, 1);
1342 1.10 christos if (!c->is_prefix ())
1343 1.1 christos error (_("\"%s\" is not a prefix command."), prefix.c_str ());
1344 1.1 christos
1345 1.1 christos list = c->subcommands;
1346 1.1 christos *comname = last_word;
1347 1.1 christos }
1348 1.1 christos
1349 1.9 christos p = *comname;
1350 1.1 christos while (*p)
1351 1.1 christos {
1352 1.1 christos if (!valid_cmd_char_p (*p))
1353 1.1 christos error (_("Junk in argument list: \"%s\""), p);
1354 1.1 christos p++;
1355 1.1 christos }
1356 1.1 christos
1357 1.1 christos return list;
1358 1.1 christos }
1359 1.8 christos
1360 1.1 christos /* This is just a placeholder in the command data structures. */
1361 1.1 christos static void
1362 1.1 christos user_defined_command (const char *ignore, int from_tty)
1363 1.8 christos {
1364 1.8 christos }
1365 1.8 christos
1366 1.8 christos /* Define a user-defined command. If COMMANDS is NULL, then this is a
1367 1.8 christos top-level call and the commands will be read using
1368 1.8 christos read_command_lines. Otherwise, it is a "define" command in an
1369 1.1 christos existing command and the commands are provided. In the
1370 1.8 christos non-top-level case, various prompts and warnings are disabled. */
1371 1.8 christos
1372 1.1 christos static void
1373 1.1 christos do_define_command (const char *comname, int from_tty,
1374 1.1 christos const counted_command_line *commands)
1375 1.1 christos {
1376 1.1 christos enum cmd_hook_type
1377 1.1 christos {
1378 1.1 christos CMD_NO_HOOK = 0,
1379 1.1 christos CMD_PRE_HOOK,
1380 1.10 christos CMD_POST_HOOK
1381 1.1 christos };
1382 1.1 christos struct cmd_list_element *c, *newc, *hookc = 0, **list;
1383 1.1 christos const char *comfull;
1384 1.1 christos int hook_type = CMD_NO_HOOK;
1385 1.1 christos int hook_name_size = 0;
1386 1.1 christos
1387 1.1 christos #define HOOK_STRING "hook-"
1388 1.1 christos #define HOOK_LEN 5
1389 1.1 christos #define HOOK_POST_STRING "hookpost-"
1390 1.1 christos #define HOOK_POST_LEN 9
1391 1.1 christos
1392 1.10 christos comfull = comname;
1393 1.1 christos list = validate_comname (&comname);
1394 1.8 christos
1395 1.1 christos c = lookup_cmd_exact (comname, *list);
1396 1.1 christos
1397 1.1 christos if (c && commands == nullptr)
1398 1.5 christos {
1399 1.9 christos int q;
1400 1.9 christos
1401 1.9 christos if (c->theclass == class_user || c->theclass == class_alias)
1402 1.9 christos {
1403 1.10 christos /* if C is a prefix command that was previously defined,
1404 1.9 christos tell the user its subcommands will be kept, and ask
1405 1.9 christos if ok to redefine the command. */
1406 1.9 christos if (c->is_prefix ())
1407 1.9 christos q = (c->user_commands.get () == nullptr
1408 1.9 christos || query (_("Keeping subcommands of prefix command \"%s\".\n"
1409 1.9 christos "Redefine command \"%s\"? "), c->name, c->name));
1410 1.1 christos else
1411 1.1 christos q = query (_("Redefine command \"%s\"? "), c->name);
1412 1.1 christos }
1413 1.1 christos else
1414 1.1 christos q = query (_("Really redefine built-in command \"%s\"? "), c->name);
1415 1.1 christos if (!q)
1416 1.1 christos error (_("Command \"%s\" not redefined."), c->name);
1417 1.1 christos }
1418 1.1 christos
1419 1.1 christos /* If this new command is a hook, then mark the command which it
1420 1.1 christos is hooking. Note that we allow hooking `help' commands, so that
1421 1.1 christos we can hook the `stop' pseudo-command. */
1422 1.1 christos
1423 1.1 christos if (!strncmp (comname, HOOK_STRING, HOOK_LEN))
1424 1.1 christos {
1425 1.1 christos hook_type = CMD_PRE_HOOK;
1426 1.1 christos hook_name_size = HOOK_LEN;
1427 1.1 christos }
1428 1.1 christos else if (!strncmp (comname, HOOK_POST_STRING, HOOK_POST_LEN))
1429 1.1 christos {
1430 1.9 christos hook_type = CMD_POST_HOOK;
1431 1.1 christos hook_name_size = HOOK_POST_LEN;
1432 1.1 christos }
1433 1.10 christos
1434 1.10 christos if (hook_type != CMD_NO_HOOK)
1435 1.10 christos {
1436 1.8 christos /* Look up cmd it hooks. */
1437 1.1 christos hookc = lookup_cmd_exact (comname + hook_name_size, *list,
1438 1.1 christos /* ignore_help_classes = */ false);
1439 1.1 christos if (!hookc && commands == nullptr)
1440 1.1 christos {
1441 1.1 christos warning (_("Your new `%s' command does not "
1442 1.1 christos "hook any existing command."),
1443 1.1 christos comfull);
1444 1.1 christos if (!query (_("Proceed? ")))
1445 1.1 christos error (_("Not confirmed."));
1446 1.1 christos }
1447 1.1 christos }
1448 1.8 christos
1449 1.8 christos comname = xstrdup (comname);
1450 1.8 christos
1451 1.8 christos counted_command_line cmds;
1452 1.8 christos if (commands == nullptr)
1453 1.8 christos {
1454 1.8 christos std::string prompt
1455 1.8 christos = string_printf ("Type commands for definition of \"%s\".", comfull);
1456 1.8 christos cmds = read_command_lines (prompt.c_str (), from_tty, 1, 0);
1457 1.1 christos }
1458 1.9 christos else
1459 1.10 christos cmds = *commands;
1460 1.10 christos
1461 1.9 christos {
1462 1.9 christos struct cmd_list_element **c_subcommands
1463 1.9 christos = c == nullptr ? nullptr : c->subcommands;
1464 1.9 christos
1465 1.9 christos newc = add_cmd (comname, class_user, user_defined_command,
1466 1.9 christos (c != nullptr && c->theclass == class_user)
1467 1.9 christos ? c->doc : xstrdup ("User-defined."), list);
1468 1.9 christos newc->user_commands = std::move (cmds);
1469 1.10 christos
1470 1.9 christos /* If we define or re-define a command that was previously defined
1471 1.10 christos as a prefix, keep the prefix information. */
1472 1.9 christos if (c_subcommands != nullptr)
1473 1.9 christos {
1474 1.9 christos newc->subcommands = c_subcommands;
1475 1.9 christos /* allow_unknown: see explanation in equivalent logic in
1476 1.9 christos define_prefix_command (). */
1477 1.1 christos newc->allow_unknown = newc->user_commands.get () != nullptr;
1478 1.1 christos }
1479 1.1 christos }
1480 1.1 christos
1481 1.1 christos /* If this new command is a hook, then mark both commands as being
1482 1.1 christos tied. */
1483 1.10 christos if (hookc)
1484 1.10 christos {
1485 1.10 christos switch (hook_type)
1486 1.10 christos {
1487 1.10 christos case CMD_PRE_HOOK:
1488 1.10 christos hookc->hook_pre = newc; /* Target gets hooked. */
1489 1.10 christos newc->hookee_pre = hookc; /* We are marked as hooking target cmd. */
1490 1.10 christos break;
1491 1.1 christos case CMD_POST_HOOK:
1492 1.10 christos hookc->hook_post = newc; /* Target gets hooked. */
1493 1.10 christos newc->hookee_post = hookc; /* We are marked as hooking
1494 1.10 christos target cmd. */
1495 1.10 christos break;
1496 1.10 christos default:
1497 1.1 christos /* Should never come here as hookc would be 0. */
1498 1.1 christos internal_error (_("bad switch"));
1499 1.1 christos }
1500 1.1 christos }
1501 1.8 christos }
1502 1.8 christos
1503 1.8 christos static void
1504 1.8 christos define_command (const char *comname, int from_tty)
1505 1.8 christos {
1506 1.10 christos do_define_command (comname, from_tty, nullptr);
1507 1.10 christos }
1508 1.10 christos
1509 1.10 christos /* Document a user-defined command or user defined alias. If COMMANDS is NULL,
1510 1.8 christos then this is a top-level call and the document will be read using
1511 1.10 christos read_command_lines. Otherwise, it is a "document" command in an existing
1512 1.10 christos command and the commands are provided. */
1513 1.1 christos static void
1514 1.10 christos do_document_command (const char *comname, int from_tty,
1515 1.8 christos const counted_command_line *commands)
1516 1.1 christos {
1517 1.1 christos struct cmd_list_element *alias, *prefix_cmd, *c;
1518 1.10 christos const char *comfull;
1519 1.10 christos
1520 1.10 christos comfull = comname;
1521 1.10 christos validate_comname (&comname);
1522 1.10 christos
1523 1.10 christos lookup_cmd_composition (comfull, &alias, &prefix_cmd, &c);
1524 1.10 christos if (c == nullptr)
1525 1.10 christos error (_("Undefined command: \"%s\"."), comfull);
1526 1.10 christos
1527 1.10 christos if (c->theclass != class_user
1528 1.10 christos && (alias == nullptr || alias->theclass != class_alias))
1529 1.10 christos {
1530 1.10 christos if (alias == nullptr)
1531 1.10 christos error (_("Command \"%s\" is built-in."), comfull);
1532 1.1 christos else
1533 1.10 christos error (_("Alias \"%s\" is built-in."), comfull);
1534 1.10 christos }
1535 1.10 christos
1536 1.10 christos /* If we found an alias of class_alias, the user is documenting this
1537 1.1 christos user-defined alias. */
1538 1.10 christos if (alias != nullptr)
1539 1.1 christos c = alias;
1540 1.10 christos
1541 1.10 christos counted_command_line doclines;
1542 1.10 christos
1543 1.10 christos if (commands == nullptr)
1544 1.10 christos {
1545 1.10 christos std::string prompt
1546 1.10 christos = string_printf ("Type documentation for \"%s\".", comfull);
1547 1.10 christos doclines = read_command_lines (prompt.c_str (), from_tty, 0, 0);
1548 1.1 christos }
1549 1.10 christos else
1550 1.10 christos doclines = *commands;
1551 1.1 christos
1552 1.1 christos if (c->doc_allocated)
1553 1.1 christos xfree ((char *) c->doc);
1554 1.1 christos
1555 1.3 christos {
1556 1.1 christos struct command_line *cl1;
1557 1.7 christos int len = 0;
1558 1.1 christos char *doc;
1559 1.1 christos
1560 1.3 christos for (cl1 = doclines.get (); cl1; cl1 = cl1->next)
1561 1.3 christos len += strlen (cl1->line) + 1;
1562 1.1 christos
1563 1.7 christos doc = (char *) xmalloc (len + 1);
1564 1.1 christos *doc = 0;
1565 1.3 christos
1566 1.1 christos for (cl1 = doclines.get (); cl1; cl1 = cl1->next)
1567 1.3 christos {
1568 1.1 christos strcat (doc, cl1->line);
1569 1.3 christos if (cl1->next)
1570 1.3 christos strcat (doc, "\n");
1571 1.10 christos }
1572 1.1 christos
1573 1.1 christos c->doc = doc;
1574 1.9 christos c->doc_allocated = 1;
1575 1.10 christos }
1576 1.10 christos }
1577 1.10 christos
1578 1.10 christos static void
1579 1.10 christos document_command (const char *comname, int from_tty)
1580 1.10 christos {
1581 1.9 christos do_document_command (comname, from_tty, nullptr);
1582 1.9 christos }
1583 1.9 christos
1584 1.9 christos /* Implementation of the "define-prefix" command. */
1585 1.9 christos
1586 1.9 christos static void
1587 1.9 christos define_prefix_command (const char *comname, int from_tty)
1588 1.9 christos {
1589 1.9 christos struct cmd_list_element *c, **list;
1590 1.9 christos const char *comfull;
1591 1.9 christos
1592 1.10 christos comfull = comname;
1593 1.9 christos list = validate_comname (&comname);
1594 1.9 christos
1595 1.9 christos c = lookup_cmd_exact (comname, *list);
1596 1.9 christos
1597 1.10 christos if (c != nullptr && c->theclass != class_user)
1598 1.9 christos error (_("Command \"%s\" is built-in."), comfull);
1599 1.9 christos
1600 1.9 christos if (c != nullptr && c->is_prefix ())
1601 1.9 christos {
1602 1.9 christos /* c is already a user defined prefix command. */
1603 1.9 christos return;
1604 1.9 christos }
1605 1.9 christos
1606 1.9 christos /* If the command does not exist at all, create it. */
1607 1.9 christos if (c == nullptr)
1608 1.9 christos {
1609 1.9 christos comname = xstrdup (comname);
1610 1.9 christos c = add_cmd (comname, class_user, user_defined_command,
1611 1.10 christos xstrdup ("User-defined."), list);
1612 1.9 christos }
1613 1.10 christos
1614 1.10 christos /* Allocate the c->subcommands, which marks the command as a prefix
1615 1.9 christos command. */
1616 1.9 christos c->subcommands = new struct cmd_list_element*;
1617 1.9 christos *(c->subcommands) = nullptr;
1618 1.9 christos /* If the prefix command C is not a command, then it must be followed
1619 1.9 christos by known subcommands. Otherwise, if C is also a normal command,
1620 1.9 christos it can be followed by C args that must not cause a 'subcommand'
1621 1.9 christos not recognised error, and thus we must allow unknown. */
1622 1.1 christos c->allow_unknown = c->user_commands.get () != nullptr;
1623 1.1 christos }
1624 1.1 christos
1625 1.1 christos
1626 1.1 christos /* Used to implement source_command. */
1628 1.1 christos
1629 1.10 christos void
1630 1.1 christos script_from_file (FILE *stream, const char *file)
1631 1.8 christos {
1632 1.8 christos if (stream == NULL)
1633 1.8 christos internal_error (_("called with NULL file pointer!"));
1634 1.8 christos
1635 1.8 christos scoped_restore restore_line_number
1636 1.1 christos = make_scoped_restore (&source_line_number, 0);
1637 1.8 christos scoped_restore restore_file
1638 1.1 christos = make_scoped_restore<std::string, const std::string &> (&source_file_name,
1639 1.9 christos file);
1640 1.8 christos
1641 1.8 christos scoped_restore save_async = make_scoped_restore (¤t_ui->async, 0);
1642 1.8 christos
1643 1.9 christos try
1644 1.8 christos {
1645 1.8 christos read_command_file (stream);
1646 1.8 christos }
1647 1.8 christos catch (const gdb_exception_error &e)
1648 1.8 christos {
1649 1.9 christos /* Re-throw the error, but with the file name information
1650 1.9 christos prepended. */
1651 1.8 christos throw_error (e.error,
1652 1.1 christos _("%s:%d: Error in sourced command file:\n%s"),
1653 1.1 christos source_file_name.c_str (), source_line_number,
1654 1.1 christos e.what ());
1655 1.1 christos }
1656 1.1 christos }
1657 1.1 christos
1658 1.1 christos /* Print the definition of user command C to STREAM. Or, if C is a
1659 1.1 christos prefix command, show the definitions of all user commands under C
1660 1.1 christos (recursively). PREFIX and NAME combined are the name of the
1661 1.1 christos current command. */
1662 1.9 christos void
1663 1.9 christos show_user_1 (struct cmd_list_element *c, const char *prefix, const char *name,
1664 1.9 christos struct ui_file *stream)
1665 1.9 christos {
1666 1.10 christos if (cli_user_command_p (c))
1667 1.10 christos {
1668 1.9 christos struct command_line *cmdlines = c->user_commands.get ();
1669 1.9 christos
1670 1.10 christos gdb_printf (stream, "User %scommand \"",
1671 1.9 christos c->is_prefix () ? "prefix" : "");
1672 1.9 christos fprintf_styled (stream, title_style.style (), "%s%s",
1673 1.9 christos prefix, name);
1674 1.10 christos gdb_printf (stream, "\":\n");
1675 1.9 christos if (cmdlines)
1676 1.9 christos {
1677 1.1 christos print_command_lines (current_uiout, cmdlines, 1);
1678 1.10 christos gdb_puts ("\n", stream);
1679 1.1 christos }
1680 1.10 christos }
1681 1.1 christos
1682 1.10 christos if (c->is_prefix ())
1683 1.10 christos {
1684 1.10 christos const std::string prefixname = c->prefixname ();
1685 1.1 christos
1686 1.1 christos for (c = *c->subcommands; c != NULL; c = c->next)
1687 1.1 christos if (c->theclass == class_user || c->is_prefix ())
1688 1.1 christos show_user_1 (c, prefixname.c_str (), c->name, gdb_stdout);
1689 1.9 christos }
1690 1.1 christos
1691 1.9 christos }
1692 1.1 christos
1693 1.9 christos void _initialize_cli_script ();
1694 1.9 christos void
1695 1.9 christos _initialize_cli_script ()
1696 1.9 christos {
1697 1.9 christos struct cmd_list_element *c;
1698 1.10 christos
1699 1.10 christos /* "document", "define" and "define-prefix" use command_completer,
1700 1.10 christos as this helps the user to either type the command name and/or
1701 1.10 christos its prefixes. */
1702 1.1 christos document_cmd_element = add_com ("document", class_support, document_command,
1703 1.10 christos _("\
1704 1.8 christos Document a user-defined command or user-defined alias.\n\
1705 1.1 christos Give command or alias name as argument. Give documentation on following lines.\n\
1706 1.1 christos End with a line of just \"end\"."));
1707 1.1 christos set_cmd_completer (document_cmd_element, command_completer);
1708 1.1 christos define_cmd_element = add_com ("define", class_support, define_command, _("\
1709 1.8 christos Define a new command name. Command name is argument.\n\
1710 1.8 christos Definition appears on following lines, one command per line.\n\
1711 1.8 christos End with a line of just \"end\".\n\
1712 1.9 christos Use the \"document\" command to give documentation for the new command.\n\
1713 1.9 christos Commands defined in this way may accept an unlimited number of arguments\n\
1714 1.9 christos accessed via $arg0 .. $argN. $argc tells how many arguments have\n\
1715 1.9 christos been passed."));
1716 1.9 christos set_cmd_completer (define_cmd_element, command_completer);
1717 1.9 christos c = add_com ("define-prefix", class_support, define_prefix_command,
1718 1.9 christos _("\
1719 1.9 christos Define or mark a command as a user-defined prefix command.\n\
1720 1.1 christos User defined prefix commands can be used as prefix commands for\n\
1721 1.8 christos other user defined commands.\n\
1722 1.1 christos If the command already exists, it is changed to a prefix command."));
1723 1.1 christos set_cmd_completer (c, command_completer);
1724 1.1 christos
1725 1.1 christos while_cmd_element = add_com ("while", class_support, while_command, _("\
1726 1.1 christos Execute nested commands WHILE the conditional expression is non zero.\n\
1727 1.8 christos The conditional expression must follow the word `while' and must in turn be\n\
1728 1.1 christos followed by a new line. The nested commands must be entered one per line,\n\
1729 1.1 christos and should be terminated by the word `end'."));
1730 1.1 christos
1731 1.1 christos if_cmd_element = add_com ("if", class_support, if_command, _("\
1732 1.1 christos Execute nested commands once IF the conditional expression is non zero.\n\
1733 1.1 christos The conditional expression must follow the word `if' and must in turn be\n\
1734 followed by a new line. The nested commands must be entered one per line,\n\
1735 and should be terminated by the word 'else' or `end'. If an else clause\n\
1736 is used, the same rules apply to its nested commands as to the first ones."));
1737 }
1738