]> git.ipfire.org Git - thirdparty/binutils-gdb.git/blame - gdb/cli/cli-script.c
Update copyright year range in all GDB files
[thirdparty/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"
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. */
95a6b0a1 372 execute_user_command (c->hook_pre, nullptr);
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. */
95a6b0a1 383 execute_user_command (c->hook_post, nullptr);
5913bcb0
AC
384 }
385}
386
d318976c 387void
95a6b0a1 388execute_user_command (struct cmd_list_element *c, const char *args)
d318976c 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
3a87ae65
SM
466/* Helper for execute_control_command. */
467
468static enum command_control_type
469execute_control_command_1 (struct command_line *cmd)
d318976c 470{
d318976c 471 struct command_line *current;
f976f6d4
AC
472 struct value *val;
473 struct value *val_mark;
d318976c
FN
474 int loop;
475 enum command_control_type ret;
d318976c 476
4d2acc65
AC
477 /* Start by assuming failure, if a problem is detected, the code
478 below will simply "break" out of the switch. */
479 ret = invalid_control;
480
d318976c
FN
481 switch (cmd->control_type)
482 {
483 case simple_control:
b0646401
PA
484 {
485 /* A simple command, execute it and return. */
01770bbd 486 std::string new_line = insert_user_defined_cmd_args (cmd->line);
95a6b0a1 487 execute_command (new_line.c_str (), 0);
b0646401
PA
488 ret = cmd->control_type;
489 break;
490 }
d318976c
FN
491
492 case continue_control:
16026cd7
AS
493 print_command_trace ("loop_continue");
494
495 /* Return for "continue", and "break" so we can either
496 continue the loop at the top, or break out. */
497 ret = cmd->control_type;
498 break;
499
d318976c 500 case break_control:
16026cd7
AS
501 print_command_trace ("loop_break");
502
d318976c
FN
503 /* Return for "continue", and "break" so we can either
504 continue the loop at the top, or break out. */
505 ret = cmd->control_type;
506 break;
507
508 case while_control:
509 {
8c042590 510 int len = strlen (cmd->line) + 7;
224c3ddb 511 char *buffer = (char *) alloca (len);
cdb27c12 512
8c042590 513 xsnprintf (buffer, len, "while %s", cmd->line);
16026cd7
AS
514 print_command_trace (buffer);
515
d318976c 516 /* Parse the loop control expression for the while statement. */
01770bbd 517 std::string new_line = insert_user_defined_cmd_args (cmd->line);
4d01a485 518 expression_up expr = parse_expression (new_line.c_str ());
d318976c
FN
519
520 ret = simple_control;
521 loop = 1;
522
523 /* Keep iterating so long as the expression is true. */
524 while (loop == 1)
525 {
526 int cond_result;
527
528 QUIT;
529
530 /* Evaluate the expression. */
531 val_mark = value_mark ();
4d01a485 532 val = evaluate_expression (expr.get ());
d318976c
FN
533 cond_result = value_true (val);
534 value_free_to_mark (val_mark);
535
536 /* If the value is false, then break out of the loop. */
537 if (!cond_result)
538 break;
539
540 /* Execute the body of the while statement. */
541 current = *cmd->body_list;
542 while (current)
543 {
b51b225e
TT
544 scoped_restore save_nesting
545 = make_scoped_restore (&command_nest_depth, command_nest_depth + 1);
3a87ae65 546 ret = execute_control_command_1 (current);
d318976c
FN
547
548 /* If we got an error, or a "break" command, then stop
549 looping. */
550 if (ret == invalid_control || ret == break_control)
551 {
552 loop = 0;
553 break;
554 }
555
556 /* If we got a "continue" command, then restart the loop
557 at this point. */
558 if (ret == continue_control)
559 break;
560
561 /* Get the next statement. */
562 current = current->next;
563 }
564 }
565
566 /* Reset RET so that we don't recurse the break all the way down. */
567 if (ret == break_control)
568 ret = simple_control;
569
570 break;
571 }
572
573 case if_control:
574 {
8c042590 575 int len = strlen (cmd->line) + 4;
224c3ddb 576 char *buffer = (char *) alloca (len);
cdb27c12 577
8c042590 578 xsnprintf (buffer, len, "if %s", cmd->line);
16026cd7
AS
579 print_command_trace (buffer);
580
d318976c 581 /* Parse the conditional for the if statement. */
01770bbd 582 std::string new_line = insert_user_defined_cmd_args (cmd->line);
4d01a485 583 expression_up expr = parse_expression (new_line.c_str ());
d318976c
FN
584
585 current = NULL;
586 ret = simple_control;
587
588 /* Evaluate the conditional. */
589 val_mark = value_mark ();
4d01a485 590 val = evaluate_expression (expr.get ());
d318976c 591
ebcd3b23
MS
592 /* Choose which arm to take commands from based on the value
593 of the conditional expression. */
d318976c
FN
594 if (value_true (val))
595 current = *cmd->body_list;
596 else if (cmd->body_count == 2)
597 current = *(cmd->body_list + 1);
598 value_free_to_mark (val_mark);
599
600 /* Execute commands in the given arm. */
601 while (current)
602 {
b51b225e
TT
603 scoped_restore save_nesting
604 = make_scoped_restore (&command_nest_depth, command_nest_depth + 1);
3a87ae65 605 ret = execute_control_command_1 (current);
d318976c
FN
606
607 /* If we got an error, get out. */
608 if (ret != simple_control)
609 break;
610
611 /* Get the next statement in the body. */
612 current = current->next;
613 }
614
615 break;
616 }
1e9c71b8 617
40c03ae8
EZ
618 case commands_control:
619 {
ebcd3b23
MS
620 /* Breakpoint commands list, record the commands in the
621 breakpoint's command list and return. */
01770bbd 622 std::string new_line = insert_user_defined_cmd_args (cmd->line);
b0646401 623 ret = commands_from_control_command (new_line.c_str (), cmd);
40c03ae8
EZ
624 break;
625 }
1e9c71b8 626
bb2ec1b3 627 case compile_control:
5c65b58a
JK
628 eval_compile_command (cmd, NULL, cmd->control_u.compile.scope,
629 cmd->control_u.compile.scope_data);
bb2ec1b3
TT
630 ret = simple_control;
631 break;
632
d57a3c85 633 case python_control:
ed3ef339 634 case guile_control:
d57a3c85 635 {
6dddc817 636 eval_ext_lang_from_control_command (cmd);
d57a3c85
TJB
637 ret = simple_control;
638 break;
639 }
d318976c
FN
640
641 default:
40c03ae8 642 warning (_("Invalid control type in canned commands structure."));
4d2acc65 643 break;
d318976c
FN
644 }
645
d318976c
FN
646 return ret;
647}
648
3a87ae65
SM
649enum command_control_type
650execute_control_command (struct command_line *cmd)
651{
652 /* Make sure we use the console uiout. It's possible that we are executing
653 breakpoint commands while running the MI interpreter. */
654 interp *console = interp_lookup (current_ui, INTERP_CONSOLE);
655 scoped_restore save_uiout
656 = make_scoped_restore (&current_uiout, interp_ui_out (console));
657
658 return execute_control_command_1 (cmd);
659}
660
d57a3c85 661/* Like execute_control_command, but first set
ebcd3b23 662 suppress_next_print_command_trace. */
d57a3c85
TJB
663
664enum command_control_type
665execute_control_command_untraced (struct command_line *cmd)
666{
667 suppress_next_print_command_trace = 1;
668 return execute_control_command (cmd);
669}
670
671
d318976c
FN
672/* "while" command support. Executes a body of statements while the
673 loop condition is nonzero. */
674
2370e853 675static void
0b39b52e 676while_command (const char *arg, int from_tty)
d318976c 677{
d318976c 678 control_level = 1;
93921405 679 command_line_up command = get_command_line (while_control, arg);
d318976c
FN
680
681 if (command == NULL)
682 return;
683
b7b633e9 684 scoped_restore save_async = make_scoped_restore (&current_ui->async, 0);
b4a14fd0 685
93921405 686 execute_control_command_untraced (command.get ());
d318976c
FN
687}
688
689/* "if" command support. Execute either the true or false arm depending
690 on the value of the if conditional. */
691
2370e853 692static void
0b39b52e 693if_command (const char *arg, int from_tty)
d318976c 694{
d318976c 695 control_level = 1;
93921405 696 command_line_up command = get_command_line (if_control, arg);
d318976c
FN
697
698 if (command == NULL)
699 return;
700
b7b633e9 701 scoped_restore save_async = make_scoped_restore (&current_ui->async, 0);
b4a14fd0 702
93921405 703 execute_control_command_untraced (command.get ());
d318976c
FN
704}
705
df3ee9ca
PA
706/* Bind the incoming arguments for a user defined command to $arg0,
707 $arg1 ... $argN. */
d318976c 708
df3ee9ca 709user_args::user_args (const char *command_line)
d318976c 710{
df3ee9ca 711 const char *p;
d318976c 712
df3ee9ca
PA
713 if (command_line == NULL)
714 return;
d318976c 715
df3ee9ca
PA
716 m_command_line = command_line;
717 p = m_command_line.c_str ();
e28493f2 718
d318976c
FN
719 while (*p)
720 {
df3ee9ca 721 const char *start_arg;
d318976c
FN
722 int squote = 0;
723 int dquote = 0;
724 int bsquote = 0;
725
d318976c
FN
726 /* Strip whitespace. */
727 while (*p == ' ' || *p == '\t')
728 p++;
729
730 /* P now points to an argument. */
731 start_arg = p;
d318976c
FN
732
733 /* Get to the end of this argument. */
734 while (*p)
735 {
736 if (((*p == ' ' || *p == '\t')) && !squote && !dquote && !bsquote)
737 break;
738 else
739 {
740 if (bsquote)
741 bsquote = 0;
742 else if (*p == '\\')
743 bsquote = 1;
744 else if (squote)
745 {
746 if (*p == '\'')
747 squote = 0;
748 }
749 else if (dquote)
750 {
751 if (*p == '"')
752 dquote = 0;
753 }
754 else
755 {
756 if (*p == '\'')
757 squote = 1;
758 else if (*p == '"')
759 dquote = 1;
760 }
761 p++;
762 }
763 }
764
df3ee9ca 765 m_args.emplace_back (start_arg, p - start_arg);
d318976c 766 }
d318976c
FN
767}
768
ebcd3b23
MS
769/* Given character string P, return a point to the first argument
770 ($arg), or NULL if P contains no arguments. */
d318976c 771
b0646401
PA
772static const char *
773locate_arg (const char *p)
d318976c
FN
774{
775 while ((p = strchr (p, '$')))
776 {
61012eef 777 if (startswith (p, "$arg")
c03c782f 778 && (isdigit (p[4]) || p[4] == 'c'))
d318976c
FN
779 return p;
780 p++;
781 }
782 return NULL;
783}
784
01770bbd 785/* See cli-script.h. */
d318976c 786
01770bbd
PA
787std::string
788insert_user_defined_cmd_args (const char *line)
d318976c 789{
01770bbd 790 /* If we are not in a user-defined command, treat $argc, $arg0, et
61d9b92f 791 cetera as normal convenience variables. */
df3ee9ca 792 if (user_args_stack.empty ())
b0646401 793 return line;
61d9b92f 794
df3ee9ca
PA
795 const std::unique_ptr<user_args> &args = user_args_stack.back ();
796 return args->insert_args (line);
797}
798
799/* Insert the user defined arguments stored in user_args into the $arg
800 arguments found in line. */
801
802std::string
803user_args::insert_args (const char *line) const
804{
b0646401
PA
805 std::string new_line;
806 const char *p;
d318976c
FN
807
808 while ((p = locate_arg (line)))
809 {
b0646401 810 new_line.append (line, p - line);
d318976c 811
c03c782f
AS
812 if (p[4] == 'c')
813 {
df3ee9ca
PA
814 new_line += std::to_string (m_args.size ());
815 line = p + 5;
c03c782f
AS
816 }
817 else
d318976c 818 {
df3ee9ca
PA
819 char *tmp;
820 unsigned long i;
821
822 errno = 0;
823 i = strtoul (p + 4, &tmp, 10);
824 if ((i == 0 && tmp == p + 4) || errno != 0)
825 line = p + 4;
826 else if (i >= m_args.size ())
827 error (_("Missing argument %ld in user function."), i);
828 else
829 {
830 new_line.append (m_args[i].str, m_args[i].len);
831 line = tmp;
832 }
d318976c 833 }
d318976c
FN
834 }
835 /* Don't forget the tail. */
b0646401 836 new_line.append (line);
d318976c 837
b0646401 838 return new_line;
d318976c
FN
839}
840
841\f
842/* Expand the body_list of COMMAND so that it can hold NEW_LENGTH
843 code bodies. This is typically used when we encounter an "else"
844 clause for an "if" command. */
845
846static void
847realloc_body_list (struct command_line *command, int new_length)
848{
849 int n;
850 struct command_line **body_list;
851
852 n = command->body_count;
853
854 /* Nothing to do? */
855 if (new_length <= n)
856 return;
857
8d749320 858 body_list = XCNEWVEC (struct command_line *, new_length);
d318976c
FN
859
860 memcpy (body_list, command->body_list, sizeof (struct command_line *) * n);
861
b8c9b27d 862 xfree (command->body_list);
d318976c
FN
863 command->body_list = body_list;
864 command->body_count = new_length;
865}
866
2181a6c6 867/* Read next line from stdin. Passed to read_command_line_1 and
3c1179ff 868 recurse_read_control_structure whenever we need to read commands
2181a6c6 869 from stdin. */
d318976c 870
3c1179ff 871static char *
a58d7472 872read_next_line (void)
d318976c 873{
f38d3ad1 874 struct ui *ui = current_ui;
3c1179ff 875 char *prompt_ptr, control_prompt[256];
d318976c 876 int i = 0;
268a799a 877 int from_tty = ui->instream == ui->stdin_stream;
d318976c
FN
878
879 if (control_level >= 254)
8a3fe4f8 880 error (_("Control nesting too deep!"));
d318976c
FN
881
882 /* Set a prompt based on the nesting of the control commands. */
268a799a 883 if (from_tty
f38d3ad1 884 || (ui->instream == 0 && deprecated_readline_hook != NULL))
d318976c
FN
885 {
886 for (i = 0; i < control_level; i++)
887 control_prompt[i] = ' ';
888 control_prompt[i] = '>';
889 control_prompt[i + 1] = '\0';
890 prompt_ptr = (char *) &control_prompt[0];
891 }
892 else
893 prompt_ptr = NULL;
894
268a799a 895 return command_line_input (prompt_ptr, from_tty, "commands");
3c1179ff
VP
896}
897
604c4576
JG
898/* Return true if CMD's name is NAME. */
899
900static bool
901command_name_equals (struct cmd_list_element *cmd, const char *name)
902{
903 return (cmd != NULL
904 && cmd != CMD_LIST_AMBIGUOUS
905 && strcmp (cmd->name, name) == 0);
906}
907
908/* Given an input line P, skip the command and return a pointer to the
909 first argument. */
910
911static const char *
912line_first_arg (const char *p)
913{
914 const char *first_arg = p + find_command_name_length (p);
915
f1735a53 916 return skip_spaces (first_arg);
604c4576
JG
917}
918
ebcd3b23
MS
919/* Process one input line. If the command is an "end", return such an
920 indication to the caller. If PARSE_COMMANDS is true, strip leading
921 whitespace (trailing whitespace is always stripped) in the line,
922 attempt to recognize GDB control commands, and also return an
923 indication if the command is an "else" or a nop.
924
3c1179ff
VP
925 Otherwise, only "end" is recognized. */
926
927static enum misc_command_type
a7bdde9e
VP
928process_next_line (char *p, struct command_line **command, int parse_commands,
929 void (*validator)(char *, void *), void *closure)
3c1179ff 930{
50cb2941
JK
931 char *p_end;
932 char *p_start;
3c1179ff 933 int not_handled = 0;
d318976c
FN
934
935 /* Not sure what to do here. */
936 if (p == NULL)
937 return end_command;
938
311a4e6b 939 /* Strip trailing whitespace. */
50cb2941
JK
940 p_end = p + strlen (p);
941 while (p_end > p && (p_end[-1] == ' ' || p_end[-1] == '\t'))
942 p_end--;
d318976c 943
50cb2941 944 p_start = p;
3630a92d 945 /* Strip leading whitespace. */
50cb2941
JK
946 while (p_start < p_end && (*p_start == ' ' || *p_start == '\t'))
947 p_start++;
d318976c 948
ebcd3b23 949 /* 'end' is always recognized, regardless of parse_commands value.
3630a92d 950 We also permit whitespace before end and after. */
61012eef 951 if (p_end - p_start == 3 && startswith (p_start, "end"))
3630a92d 952 return end_command;
604c4576 953
311a4e6b 954 if (parse_commands)
d318976c 955 {
604c4576
JG
956 /* Resolve command abbreviations (e.g. 'ws' for 'while-stepping'). */
957 const char *cmd_name = p;
958 struct cmd_list_element *cmd
959 = lookup_cmd_1 (&cmd_name, cmdlist, NULL, 1);
f1735a53 960 cmd_name = skip_spaces (cmd_name);
dc4bde35 961 bool inline_cmd = *cmd_name != '\0';
604c4576 962
ebcd3b23 963 /* If commands are parsed, we skip initial spaces. Otherwise,
3630a92d
VP
964 which is the case for Python commands and documentation
965 (see the 'document' command), spaces are preserved. */
50cb2941 966 p = p_start;
3630a92d 967
311a4e6b 968 /* Blanks and comments don't really do anything, but we need to
ebcd3b23
MS
969 distinguish them from else, end and other commands which can
970 be executed. */
50cb2941 971 if (p_end == p || p[0] == '#')
311a4e6b
TJB
972 return nop_command;
973
974 /* Is the else clause of an if control structure? */
61012eef 975 if (p_end - p == 4 && startswith (p, "else"))
311a4e6b
TJB
976 return else_command;
977
ebcd3b23
MS
978 /* Check for while, if, break, continue, etc and build a new
979 command line structure for them. */
604c4576 980 if (command_name_equals (cmd, "while-stepping"))
a7bdde9e
VP
981 {
982 /* Because validate_actionline and encode_action lookup
983 command's line as command, we need the line to
984 include 'while-stepping'.
985
986 For 'ws' alias, the command will have 'ws', not expanded
ebcd3b23 987 to 'while-stepping'. This is intentional -- we don't
a7bdde9e 988 really want frontend to send a command list with 'ws',
ebcd3b23
MS
989 and next break-info returning command line with
990 'while-stepping'. This should work, but might cause the
991 breakpoint to be marked as changed while it's actually
992 not. */
a7bdde9e
VP
993 *command = build_command_line (while_stepping_control, p);
994 }
604c4576 995 else if (command_name_equals (cmd, "while"))
311a4e6b 996 {
604c4576 997 *command = build_command_line (while_control, line_first_arg (p));
311a4e6b 998 }
604c4576 999 else if (command_name_equals (cmd, "if"))
311a4e6b 1000 {
604c4576 1001 *command = build_command_line (if_control, line_first_arg (p));
311a4e6b 1002 }
604c4576 1003 else if (command_name_equals (cmd, "commands"))
311a4e6b 1004 {
604c4576 1005 *command = build_command_line (commands_control, line_first_arg (p));
311a4e6b 1006 }
dc4bde35 1007 else if (command_name_equals (cmd, "python") && !inline_cmd)
311a4e6b
TJB
1008 {
1009 /* Note that we ignore the inline "python command" form
1010 here. */
1011 *command = build_command_line (python_control, "");
1012 }
dc4bde35 1013 else if (command_name_equals (cmd, "compile") && !inline_cmd)
bb2ec1b3
TT
1014 {
1015 /* Note that we ignore the inline "compile command" form
1016 here. */
1017 *command = build_command_line (compile_control, "");
1018 (*command)->control_u.compile.scope = COMPILE_I_INVALID_SCOPE;
1019 }
dc4bde35 1020 else if (command_name_equals (cmd, "guile") && !inline_cmd)
ed3ef339
DE
1021 {
1022 /* Note that we ignore the inline "guile command" form here. */
1023 *command = build_command_line (guile_control, "");
1024 }
61012eef 1025 else if (p_end - p == 10 && startswith (p, "loop_break"))
311a4e6b 1026 {
8d749320 1027 *command = XNEW (struct command_line);
311a4e6b
TJB
1028 (*command)->next = NULL;
1029 (*command)->line = NULL;
1030 (*command)->control_type = break_control;
1031 (*command)->body_count = 0;
1032 (*command)->body_list = NULL;
1033 }
61012eef 1034 else if (p_end - p == 13 && startswith (p, "loop_continue"))
311a4e6b 1035 {
8d749320 1036 *command = XNEW (struct command_line);
311a4e6b
TJB
1037 (*command)->next = NULL;
1038 (*command)->line = NULL;
1039 (*command)->control_type = continue_control;
1040 (*command)->body_count = 0;
1041 (*command)->body_list = NULL;
1042 }
1043 else
1044 not_handled = 1;
d318976c 1045 }
311a4e6b
TJB
1046
1047 if (!parse_commands || not_handled)
d318976c
FN
1048 {
1049 /* A normal command. */
8d749320 1050 *command = XNEW (struct command_line);
d318976c 1051 (*command)->next = NULL;
50cb2941 1052 (*command)->line = savestring (p, p_end - p);
d318976c
FN
1053 (*command)->control_type = simple_control;
1054 (*command)->body_count = 0;
1055 (*command)->body_list = NULL;
1056 }
1057
a7bdde9e
VP
1058 if (validator)
1059 {
cdb27c12 1060
492d29ea 1061 TRY
a7bdde9e
VP
1062 {
1063 validator ((*command)->line, closure);
1064 }
492d29ea 1065 CATCH (ex, RETURN_MASK_ALL)
a7bdde9e
VP
1066 {
1067 xfree (*command);
1068 throw_exception (ex);
1069 }
492d29ea 1070 END_CATCH
a7bdde9e
VP
1071 }
1072
d318976c
FN
1073 /* Nothing special. */
1074 return ok_command;
1075}
1076
ebcd3b23
MS
1077/* Recursively read in the control structures and create a
1078 command_line structure from them. Use read_next_line_func to
1079 obtain lines of the command. */
d318976c
FN
1080
1081static enum command_control_type
a58d7472 1082recurse_read_control_structure (char * (*read_next_line_func) (void),
a7bdde9e
VP
1083 struct command_line *current_cmd,
1084 void (*validator)(char *, void *),
1085 void *closure)
d318976c
FN
1086{
1087 int current_body, i;
1088 enum misc_command_type val;
1089 enum command_control_type ret;
1090 struct command_line **body_ptr, *child_tail, *next;
1091
1092 child_tail = NULL;
1093 current_body = 1;
1094
1095 /* Sanity checks. */
1096 if (current_cmd->control_type == simple_control)
8a3fe4f8 1097 error (_("Recursed on a simple control type."));
d318976c
FN
1098
1099 if (current_body > current_cmd->body_count)
8a3fe4f8 1100 error (_("Allocated body is smaller than this command type needs."));
d318976c
FN
1101
1102 /* Read lines from the input stream and build control structures. */
1103 while (1)
1104 {
1105 dont_repeat ();
1106
1107 next = NULL;
3c1179ff 1108 val = process_next_line (read_next_line_func (), &next,
ed3ef339 1109 current_cmd->control_type != python_control
bb2ec1b3
TT
1110 && current_cmd->control_type != guile_control
1111 && current_cmd->control_type != compile_control,
a7bdde9e 1112 validator, closure);
d318976c
FN
1113
1114 /* Just skip blanks and comments. */
1115 if (val == nop_command)
1116 continue;
1117
1118 if (val == end_command)
1119 {
1e9c71b8 1120 if (multi_line_command_p (current_cmd->control_type))
d318976c 1121 {
40c03ae8 1122 /* Success reading an entire canned sequence of commands. */
d318976c
FN
1123 ret = simple_control;
1124 break;
1125 }
1126 else
1127 {
1128 ret = invalid_control;
1129 break;
1130 }
1131 }
1132
1133 /* Not the end of a control structure. */
1134 if (val == else_command)
1135 {
1136 if (current_cmd->control_type == if_control
1137 && current_body == 1)
1138 {
1139 realloc_body_list (current_cmd, 2);
1140 current_body = 2;
1141 child_tail = NULL;
1142 continue;
1143 }
1144 else
1145 {
1146 ret = invalid_control;
1147 break;
1148 }
1149 }
1150
1151 if (child_tail)
1152 {
1153 child_tail->next = next;
1154 }
1155 else
1156 {
1157 body_ptr = current_cmd->body_list;
1158 for (i = 1; i < current_body; i++)
1159 body_ptr++;
1160
1161 *body_ptr = next;
1162
1163 }
1164
1165 child_tail = next;
1166
1167 /* If the latest line is another control structure, then recurse
1168 on it. */
1e9c71b8 1169 if (multi_line_command_p (next->control_type))
d318976c
FN
1170 {
1171 control_level++;
a7bdde9e
VP
1172 ret = recurse_read_control_structure (read_next_line_func, next,
1173 validator, closure);
d318976c
FN
1174 control_level--;
1175
1176 if (ret != simple_control)
1177 break;
1178 }
1179 }
1180
1181 dont_repeat ();
1182
1183 return ret;
1184}
1185
1186/* Read lines from the input stream and accumulate them in a chain of
1187 struct command_line's, which is then returned. For input from a
1188 terminal, the special command "end" is used to mark the end of the
311a4e6b
TJB
1189 input, and is not included in the returned chain of commands.
1190
1191 If PARSE_COMMANDS is true, strip leading whitespace (trailing whitespace
1192 is always stripped) in the line and attempt to recognize GDB control
1193 commands. Otherwise, only "end" is recognized. */
d318976c
FN
1194
1195#define END_MESSAGE "End with a line saying just \"end\"."
1196
93921405 1197command_line_up
a7bdde9e
VP
1198read_command_lines (char *prompt_arg, int from_tty, int parse_commands,
1199 void (*validator)(char *, void *), void *closure)
d318976c 1200{
268a799a 1201 if (from_tty && input_interactive_p (current_ui))
d318976c 1202 {
698ba934
DJ
1203 if (deprecated_readline_begin_hook)
1204 {
ebcd3b23 1205 /* Note - intentional to merge messages with no newline. */
9a2b4c1b
MS
1206 (*deprecated_readline_begin_hook) ("%s %s\n", prompt_arg,
1207 END_MESSAGE);
698ba934
DJ
1208 }
1209 else
1210 {
1211 printf_unfiltered ("%s\n%s\n", prompt_arg, END_MESSAGE);
1212 gdb_flush (gdb_stdout);
1213 }
d318976c
FN
1214 }
1215
c41535fd
EZ
1216
1217 /* Reading commands assumes the CLI behavior, so temporarily
1218 override the current interpreter with CLI. */
93921405 1219 command_line_up head;
c41535fd
EZ
1220 if (current_interp_named_p (INTERP_CONSOLE))
1221 head = read_command_lines_1 (read_next_line, parse_commands,
1222 validator, closure);
1223 else
1224 {
be0d7abb 1225 scoped_restore_interp interp_restorer (INTERP_CONSOLE);
c41535fd
EZ
1226
1227 head = read_command_lines_1 (read_next_line, parse_commands,
1228 validator, closure);
c41535fd 1229 }
3c1179ff 1230
268a799a
PA
1231 if (from_tty && input_interactive_p (current_ui)
1232 && deprecated_readline_end_hook)
3c1179ff
VP
1233 {
1234 (*deprecated_readline_end_hook) ();
1235 }
1236 return (head);
1237}
1238
1239/* Act the same way as read_command_lines, except that each new line is
1240 obtained using READ_NEXT_LINE_FUNC. */
1241
93921405 1242command_line_up
a7bdde9e
VP
1243read_command_lines_1 (char * (*read_next_line_func) (void), int parse_commands,
1244 void (*validator)(char *, void *), void *closure)
3c1179ff 1245{
93921405
TT
1246 struct command_line *tail, *next;
1247 command_line_up head;
3c1179ff
VP
1248 enum command_control_type ret;
1249 enum misc_command_type val;
1250
1251 control_level = 0;
93921405 1252 tail = NULL;
d318976c
FN
1253
1254 while (1)
1255 {
f429d7d0 1256 dont_repeat ();
a7bdde9e
VP
1257 val = process_next_line (read_next_line_func (), &next, parse_commands,
1258 validator, closure);
d318976c
FN
1259
1260 /* Ignore blank lines or comments. */
1261 if (val == nop_command)
1262 continue;
1263
1264 if (val == end_command)
1265 {
1266 ret = simple_control;
1267 break;
1268 }
1269
1270 if (val != ok_command)
1271 {
1272 ret = invalid_control;
1273 break;
1274 }
1275
1e9c71b8 1276 if (multi_line_command_p (next->control_type))
d318976c
FN
1277 {
1278 control_level++;
a7bdde9e
VP
1279 ret = recurse_read_control_structure (read_next_line_func, next,
1280 validator, closure);
d318976c
FN
1281 control_level--;
1282
1283 if (ret == invalid_control)
1284 break;
1285 }
1286
1287 if (tail)
1288 {
1289 tail->next = next;
1290 }
1291 else
1292 {
93921405 1293 head.reset (next);
d318976c
FN
1294 }
1295 tail = next;
1296 }
1297
1298 dont_repeat ();
1299
93921405
TT
1300 if (ret == invalid_control)
1301 return NULL;
d318976c 1302
3c1179ff 1303 return head;
d318976c
FN
1304}
1305
1306/* Free a chain of struct command_line's. */
1307
1308void
1309free_command_lines (struct command_line **lptr)
1310{
d5b5ac79
AC
1311 struct command_line *l = *lptr;
1312 struct command_line *next;
d318976c
FN
1313 struct command_line **blist;
1314 int i;
1315
1316 while (l)
1317 {
1318 if (l->body_count > 0)
1319 {
1320 blist = l->body_list;
1321 for (i = 0; i < l->body_count; i++, blist++)
1322 free_command_lines (blist);
1323 }
1324 next = l->next;
b8c9b27d
KB
1325 xfree (l->line);
1326 xfree (l);
d318976c
FN
1327 l = next;
1328 }
0d70f41b 1329 *lptr = NULL;
d318976c
FN
1330}
1331
93921405 1332command_line_up
c2b8ed2c
MS
1333copy_command_lines (struct command_line *cmds)
1334{
1335 struct command_line *result = NULL;
1336
1337 if (cmds)
1338 {
8d749320 1339 result = XNEW (struct command_line);
c2b8ed2c 1340
93921405 1341 result->next = copy_command_lines (cmds->next).release ();
c2b8ed2c
MS
1342 result->line = xstrdup (cmds->line);
1343 result->control_type = cmds->control_type;
1344 result->body_count = cmds->body_count;
1345 if (cmds->body_count > 0)
1346 {
1347 int i;
1348
8d749320 1349 result->body_list = XNEWVEC (struct command_line *, cmds->body_count);
c2b8ed2c
MS
1350
1351 for (i = 0; i < cmds->body_count; i++)
93921405
TT
1352 result->body_list[i]
1353 = copy_command_lines (cmds->body_list[i]).release ();
c2b8ed2c
MS
1354 }
1355 else
1356 result->body_list = NULL;
1357 }
1358
93921405 1359 return command_line_up (result);
c2b8ed2c 1360}
d318976c 1361\f
adb483fe
DJ
1362/* Validate that *COMNAME is a valid name for a command. Return the
1363 containing command list, in case it starts with a prefix command.
1364 The prefix must already exist. *COMNAME is advanced to point after
1365 any prefix, and a NUL character overwrites the space after the
1366 prefix. */
1367
1368static struct cmd_list_element **
0b39b52e 1369validate_comname (const char **comname)
d318976c 1370{
adb483fe 1371 struct cmd_list_element **list = &cmdlist;
0b39b52e 1372 const char *p, *last_word;
d318976c 1373
adb483fe 1374 if (*comname == 0)
e2e0b3e5 1375 error_no_arg (_("name of command to define"));
d318976c 1376
adb483fe
DJ
1377 /* Find the last word of the argument. */
1378 p = *comname + strlen (*comname);
1379 while (p > *comname && isspace (p[-1]))
1380 p--;
1381 while (p > *comname && !isspace (p[-1]))
1382 p--;
1383 last_word = p;
1384
1385 /* Find the corresponding command list. */
1386 if (last_word != *comname)
1387 {
1388 struct cmd_list_element *c;
adb483fe
DJ
1389
1390 /* Separate the prefix and the command. */
0b39b52e
TT
1391 std::string prefix (*comname, last_word - 1);
1392 const char *tem = prefix.c_str ();
adb483fe
DJ
1393
1394 c = lookup_cmd (&tem, cmdlist, "", 0, 1);
1395 if (c->prefixlist == NULL)
0b39b52e 1396 error (_("\"%s\" is not a prefix command."), prefix.c_str ());
adb483fe
DJ
1397
1398 list = c->prefixlist;
adb483fe
DJ
1399 *comname = last_word;
1400 }
1401
1402 p = *comname;
d318976c
FN
1403 while (*p)
1404 {
1405 if (!isalnum (*p) && *p != '-' && *p != '_')
8a3fe4f8 1406 error (_("Junk in argument list: \"%s\""), p);
d318976c
FN
1407 p++;
1408 }
adb483fe
DJ
1409
1410 return list;
d318976c
FN
1411}
1412
1413/* This is just a placeholder in the command data structures. */
1414static void
898241a5 1415user_defined_command (const char *ignore, int from_tty)
d318976c
FN
1416{
1417}
1418
2370e853 1419static void
0b39b52e 1420define_command (const char *comname, int from_tty)
d318976c
FN
1421{
1422#define MAX_TMPBUF 128
1423 enum cmd_hook_type
1424 {
1425 CMD_NO_HOOK = 0,
1426 CMD_PRE_HOOK,
1427 CMD_POST_HOOK
1428 };
d36fc00b 1429 struct cmd_list_element *c, *newc, *hookc = 0, **list;
0b39b52e 1430 const char *tem, *comfull;
d318976c
FN
1431 char tmpbuf[MAX_TMPBUF];
1432 int hook_type = CMD_NO_HOOK;
1433 int hook_name_size = 0;
1434
1435#define HOOK_STRING "hook-"
1436#define HOOK_LEN 5
1437#define HOOK_POST_STRING "hookpost-"
1438#define HOOK_POST_LEN 9
1439
adb483fe
DJ
1440 comfull = comname;
1441 list = validate_comname (&comname);
d318976c
FN
1442
1443 /* Look it up, and verify that we got an exact match. */
0b39b52e
TT
1444 tem = comname;
1445 c = lookup_cmd (&tem, *list, "", -1, 1);
5cb316ef 1446 if (c && strcmp (comname, c->name) != 0)
d318976c
FN
1447 c = 0;
1448
1449 if (c)
1450 {
ab4e3d93 1451 int q;
cdb27c12 1452
fe978cb0 1453 if (c->theclass == class_user || c->theclass == class_alias)
e2e0b3e5 1454 q = query (_("Redefine command \"%s\"? "), c->name);
d318976c 1455 else
e2e0b3e5 1456 q = query (_("Really redefine built-in command \"%s\"? "), c->name);
ab4e3d93 1457 if (!q)
8a3fe4f8 1458 error (_("Command \"%s\" not redefined."), c->name);
d318976c
FN
1459 }
1460
1461 /* If this new command is a hook, then mark the command which it
1462 is hooking. Note that we allow hooking `help' commands, so that
1463 we can hook the `stop' pseudo-command. */
1464
1465 if (!strncmp (comname, HOOK_STRING, HOOK_LEN))
1466 {
1467 hook_type = CMD_PRE_HOOK;
1468 hook_name_size = HOOK_LEN;
1469 }
1470 else if (!strncmp (comname, HOOK_POST_STRING, HOOK_POST_LEN))
1471 {
1472 hook_type = CMD_POST_HOOK;
1473 hook_name_size = HOOK_POST_LEN;
1474 }
1475
1476 if (hook_type != CMD_NO_HOOK)
1477 {
1478 /* Look up cmd it hooks, and verify that we got an exact match. */
0b39b52e
TT
1479 tem = comname + hook_name_size;
1480 hookc = lookup_cmd (&tem, *list, "", -1, 0);
5cb316ef 1481 if (hookc && strcmp (comname + hook_name_size, hookc->name) != 0)
d318976c
FN
1482 hookc = 0;
1483 if (!hookc)
1484 {
9a2b4c1b
MS
1485 warning (_("Your new `%s' command does not "
1486 "hook any existing command."),
adb483fe 1487 comfull);
9e2f0ad4 1488 if (!query (_("Proceed? ")))
8a3fe4f8 1489 error (_("Not confirmed."));
d318976c
FN
1490 }
1491 }
1492
1b36a34b 1493 comname = xstrdup (comname);
d318976c 1494
8c042590
PM
1495 xsnprintf (tmpbuf, sizeof (tmpbuf),
1496 "Type commands for definition of \"%s\".", comfull);
93921405 1497 command_line_up cmds = read_command_lines (tmpbuf, from_tty, 1, 0, 0);
d318976c 1498
fe978cb0 1499 if (c && c->theclass == class_user)
d318976c
FN
1500 free_command_lines (&c->user_commands);
1501
1502 newc = add_cmd (comname, class_user, user_defined_command,
fe978cb0 1503 (c && c->theclass == class_user)
1b36a34b 1504 ? c->doc : xstrdup ("User-defined."), list);
93921405 1505 newc->user_commands = cmds.release ();
d318976c
FN
1506
1507 /* If this new command is a hook, then mark both commands as being
1508 tied. */
1509 if (hookc)
1510 {
1511 switch (hook_type)
1512 {
1513 case CMD_PRE_HOOK:
1514 hookc->hook_pre = newc; /* Target gets hooked. */
ebcd3b23 1515 newc->hookee_pre = hookc; /* We are marked as hooking target cmd. */
d318976c
FN
1516 break;
1517 case CMD_POST_HOOK:
f48ff60a 1518 hookc->hook_post = newc; /* Target gets hooked. */
9a2b4c1b
MS
1519 newc->hookee_post = hookc; /* We are marked as hooking
1520 target cmd. */
d318976c
FN
1521 break;
1522 default:
ebcd3b23 1523 /* Should never come here as hookc would be 0. */
e2e0b3e5 1524 internal_error (__FILE__, __LINE__, _("bad switch"));
d318976c
FN
1525 }
1526 }
1527}
1528
2370e853 1529static void
0b39b52e 1530document_command (const char *comname, int from_tty)
d318976c 1531{
adb483fe 1532 struct cmd_list_element *c, **list;
6f937416 1533 const char *tem;
0b39b52e 1534 const char *comfull;
d318976c
FN
1535 char tmpbuf[128];
1536
adb483fe
DJ
1537 comfull = comname;
1538 list = validate_comname (&comname);
d318976c 1539
adb483fe
DJ
1540 tem = comname;
1541 c = lookup_cmd (&tem, *list, "", 0, 1);
d318976c 1542
fe978cb0 1543 if (c->theclass != class_user)
adb483fe 1544 error (_("Command \"%s\" is built-in."), comfull);
d318976c 1545
8c042590
PM
1546 xsnprintf (tmpbuf, sizeof (tmpbuf), "Type documentation for \"%s\".",
1547 comfull);
93921405 1548 command_line_up doclines = read_command_lines (tmpbuf, from_tty, 0, 0, 0);
d318976c
FN
1549
1550 if (c->doc)
1947513d 1551 xfree ((char *) c->doc);
d318976c
FN
1552
1553 {
d5b5ac79
AC
1554 struct command_line *cl1;
1555 int len = 0;
1947513d 1556 char *doc;
d318976c 1557
93921405 1558 for (cl1 = doclines.get (); cl1; cl1 = cl1->next)
d318976c
FN
1559 len += strlen (cl1->line) + 1;
1560
1947513d
TT
1561 doc = (char *) xmalloc (len + 1);
1562 *doc = 0;
d318976c 1563
93921405 1564 for (cl1 = doclines.get (); cl1; cl1 = cl1->next)
d318976c 1565 {
1947513d 1566 strcat (doc, cl1->line);
d318976c 1567 if (cl1->next)
1947513d 1568 strcat (doc, "\n");
d318976c 1569 }
1947513d
TT
1570
1571 c->doc = doc;
d318976c 1572 }
d318976c
FN
1573}
1574\f
ebcd3b23 1575/* Used to implement source_command. */
d318976c
FN
1576
1577void
05159abe 1578script_from_file (FILE *stream, const char *file)
d318976c 1579{
d318976c 1580 if (stream == NULL)
e2e0b3e5 1581 internal_error (__FILE__, __LINE__, _("called with NULL file pointer!"));
d318976c 1582
2ec845e7
TT
1583 scoped_restore restore_line_number
1584 = make_scoped_restore (&source_line_number, 0);
1585 scoped_restore resotre_file
1586 = make_scoped_restore (&source_file_name, file);
cdb27c12 1587
2ec845e7 1588 scoped_restore save_async = make_scoped_restore (&current_ui->async, 0);
d318976c 1589
2ec845e7
TT
1590 TRY
1591 {
1592 read_command_file (stream);
1593 }
1594 CATCH (e, RETURN_MASK_ERROR)
1595 {
1596 /* Re-throw the error, but with the file name information
1597 prepended. */
1598 throw_error (e.error,
1599 _("%s:%d: Error in sourced command file:\n%s"),
1600 source_file_name, source_line_number, e.message);
1601 }
1602 END_CATCH
d318976c
FN
1603}
1604
adb483fe
DJ
1605/* Print the definition of user command C to STREAM. Or, if C is a
1606 prefix command, show the definitions of all user commands under C
1607 (recursively). PREFIX and NAME combined are the name of the
1608 current command. */
d318976c 1609void
6f937416 1610show_user_1 (struct cmd_list_element *c, const char *prefix, const char *name,
adb483fe 1611 struct ui_file *stream)
d318976c 1612{
d5b5ac79 1613 struct command_line *cmdlines;
d318976c 1614
adb483fe
DJ
1615 if (c->prefixlist != NULL)
1616 {
64e61d29 1617 const char *prefixname = c->prefixname;
cdb27c12 1618
adb483fe 1619 for (c = *c->prefixlist; c != NULL; c = c->next)
fe978cb0 1620 if (c->theclass == class_user || c->prefixlist != NULL)
adb483fe
DJ
1621 show_user_1 (c, prefixname, c->name, gdb_stdout);
1622 return;
1623 }
1624
d318976c 1625 cmdlines = c->user_commands;
adb483fe 1626 fprintf_filtered (stream, "User command \"%s%s\":\n", prefix, name);
d318976c 1627
a9f116cb
GKB
1628 if (!cmdlines)
1629 return;
79a45e25 1630 print_command_lines (current_uiout, cmdlines, 1);
d318976c 1631 fputs_filtered ("\n", stream);
d318976c
FN
1632}
1633
2370e853
TT
1634void
1635_initialize_cli_script (void)
1636{
1637 add_com ("document", class_support, document_command, _("\
1638Document a user-defined command.\n\
1639Give command name as argument. Give documentation on following lines.\n\
1640End with a line of just \"end\"."));
1641 add_com ("define", class_support, define_command, _("\
1642Define a new command name. Command name is argument.\n\
1643Definition appears on following lines, one command per line.\n\
1644End with a line of just \"end\".\n\
1645Use the \"document\" command to give documentation for the new command.\n\
1646Commands defined in this way may have up to ten arguments."));
1647
1648 add_com ("while", class_support, while_command, _("\
1649Execute nested commands WHILE the conditional expression is non zero.\n\
1650The conditional expression must follow the word `while' and must in turn be\n\
1651followed by a new line. The nested commands must be entered one per line,\n\
1652and should be terminated by the word `end'."));
1653
1654 add_com ("if", class_support, if_command, _("\
1655Execute nested commands once IF the conditional expression is non zero.\n\
1656The conditional expression must follow the word `if' and must in turn be\n\
1657followed by a new line. The nested commands must be entered one per line,\n\
1658and should be terminated by the word 'else' or `end'. If an else clause\n\
1659is used, the same rules apply to its nested commands as to the first ones."));
1660}