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