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