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