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