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