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