Replace do_restore_instream_cleanup with scoped_restore
[deliverable/binutils-gdb.git] / gdb / cli / cli-script.c
1 /* GDB CLI command scripting.
2
3 Copyright (C) 1986-2017 Free Software Foundation, Inc.
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
9 the Free Software Foundation; either version 3 of the License, or
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
18 along with this program. If not, see <http://www.gnu.org/licenses/>. */
19
20 #include "defs.h"
21 #include "value.h"
22 #include "language.h" /* For value_true */
23 #include <ctype.h>
24
25 #include "ui-out.h"
26 #include "top.h"
27 #include "breakpoint.h"
28 #include "cli/cli-cmds.h"
29 #include "cli/cli-decode.h"
30 #include "cli/cli-script.h"
31
32 #include "extension.h"
33 #include "interps.h"
34 #include "compile/compile.h"
35
36 #include <vector>
37
38 /* Prototypes for local functions. */
39
40 static enum command_control_type
41 recurse_read_control_structure (char * (*read_next_line_func) (void),
42 struct command_line *current_cmd,
43 void (*validator)(char *, void *),
44 void *closure);
45
46 static char *read_next_line (void);
47
48 /* Level of control structure when reading. */
49 static int control_level;
50
51 /* Level of control structure when executing. */
52 static int command_nest_depth = 1;
53
54 /* This is to prevent certain commands being printed twice. */
55 static int suppress_next_print_command_trace = 0;
56
57 /* A non-owning slice of a string. */
58
59 struct 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
69 /* Structure for arguments to user defined functions. */
70
71 class user_args
72 {
73 public:
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
82 private:
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. */
100 static 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. */
104 struct 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)
109 {
110 user_args_stack.emplace_back (new user_args (line));
111 }
112
113 /* Pop the current user arguments from the stack. */
114 ~scoped_user_args_level ()
115 {
116 user_args_stack.pop_back ();
117 }
118 };
119
120 \f
121 /* Return non-zero if TYPE is a multi-line command (i.e., is terminated
122 by "end"). */
123
124 static int
125 multi_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:
133 case compile_control:
134 case python_control:
135 case guile_control:
136 return 1;
137 default:
138 return 0;
139 }
140 }
141
142 /* Allocate, initialize a new command line structure for one of the
143 control commands (if/while). */
144
145 static struct command_line *
146 build_command_line (enum command_control_type type, const char *args)
147 {
148 struct command_line *cmd;
149
150 if (args == NULL && (type == if_control || type == while_control))
151 error (_("if/while commands require arguments."));
152 gdb_assert (args != NULL);
153
154 cmd = XNEW (struct command_line);
155 cmd->next = NULL;
156 cmd->control_type = type;
157
158 cmd->body_count = 1;
159 cmd->body_list = XCNEWVEC (struct command_line *, cmd->body_count);
160 cmd->line = xstrdup (args);
161
162 return cmd;
163 }
164
165 /* Build and return a new command structure for the control commands
166 such as "if" and "while". */
167
168 command_line_up
169 get_command_line (enum command_control_type type, const char *arg)
170 {
171 /* Allocate and build a new command line structure. */
172 command_line_up cmd (build_command_line (type, arg));
173
174 /* Read in the body of this command. */
175 if (recurse_read_control_structure (read_next_line, cmd.get (), 0, 0)
176 == invalid_control)
177 {
178 warning (_("Error reading in canned sequence of commands."));
179 return NULL;
180 }
181
182 return cmd;
183 }
184
185 /* Recursively print a command (including full control structures). */
186
187 void
188 print_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 {
196 if (depth)
197 uiout->spaces (2 * depth);
198
199 /* A simple command, print it and continue. */
200 if (list->control_type == simple_control)
201 {
202 uiout->field_string (NULL, list->line);
203 uiout->text ("\n");
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 {
212 uiout->field_string (NULL, "loop_continue");
213 uiout->text ("\n");
214 list = list->next;
215 continue;
216 }
217
218 /* loop_break to break out of a while loop, print it and
219 continue. */
220 if (list->control_type == break_control)
221 {
222 uiout->field_string (NULL, "loop_break");
223 uiout->text ("\n");
224 list = list->next;
225 continue;
226 }
227
228 /* A while command. Recursively print its subcommands and
229 continue. */
230 if (list->control_type == while_control
231 || list->control_type == while_stepping_control)
232 {
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. */
236 if (list->control_type == while_control)
237 uiout->field_fmt (NULL, "while %s", list->line);
238 else
239 uiout->field_string (NULL, list->line);
240 uiout->text ("\n");
241 print_command_lines (uiout, *list->body_list, depth + 1);
242 if (depth)
243 uiout->spaces (2 * depth);
244 uiout->field_string (NULL, "end");
245 uiout->text ("\n");
246 list = list->next;
247 continue;
248 }
249
250 /* An if command. Recursively print both arms before
251 continueing. */
252 if (list->control_type == if_control)
253 {
254 uiout->field_fmt (NULL, "if %s", list->line);
255 uiout->text ("\n");
256 /* The true arm. */
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)
263 uiout->spaces (2 * depth);
264 uiout->field_string (NULL, "else");
265 uiout->text ("\n");
266 print_command_lines (uiout, list->body_list[1], depth + 1);
267 }
268
269 if (depth)
270 uiout->spaces (2 * depth);
271 uiout->field_string (NULL, "end");
272 uiout->text ("\n");
273 list = list->next;
274 continue;
275 }
276
277 /* A commands command. Print the breakpoint commands and
278 continue. */
279 if (list->control_type == commands_control)
280 {
281 if (*(list->line))
282 uiout->field_fmt (NULL, "commands %s", list->line);
283 else
284 uiout->field_string (NULL, "commands");
285 uiout->text ("\n");
286 print_command_lines (uiout, *list->body_list, depth + 1);
287 if (depth)
288 uiout->spaces (2 * depth);
289 uiout->field_string (NULL, "end");
290 uiout->text ("\n");
291 list = list->next;
292 continue;
293 }
294
295 if (list->control_type == python_control)
296 {
297 uiout->field_string (NULL, "python");
298 uiout->text ("\n");
299 /* Don't indent python code at all. */
300 print_command_lines (uiout, *list->body_list, 0);
301 if (depth)
302 uiout->spaces (2 * depth);
303 uiout->field_string (NULL, "end");
304 uiout->text ("\n");
305 list = list->next;
306 continue;
307 }
308
309 if (list->control_type == compile_control)
310 {
311 uiout->field_string (NULL, "compile expression");
312 uiout->text ("\n");
313 print_command_lines (uiout, *list->body_list, 0);
314 if (depth)
315 uiout->spaces (2 * depth);
316 uiout->field_string (NULL, "end");
317 uiout->text ("\n");
318 list = list->next;
319 continue;
320 }
321
322 if (list->control_type == guile_control)
323 {
324 uiout->field_string (NULL, "guile");
325 uiout->text ("\n");
326 print_command_lines (uiout, *list->body_list, depth + 1);
327 if (depth)
328 uiout->spaces (2 * depth);
329 uiout->field_string (NULL, "end");
330 uiout->text ("\n");
331 list = list->next;
332 continue;
333 }
334
335 /* Ignore illegal command type and try next. */
336 list = list->next;
337 } /* while (list) */
338 }
339
340 /* Handle pre-post hooks. */
341
342 static void
343 clear_hook_in_cleanup (void *data)
344 {
345 struct cmd_list_element *c = (struct cmd_list_element *) data;
346
347 c->hook_in = 0; /* Allow hook to work again once it is complete. */
348 }
349
350 void
351 execute_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);
356 c->hook_in = 1; /* Prevent recursive hooking. */
357 execute_user_command (c->hook_pre, (char *) 0);
358 do_cleanups (cleanups);
359 }
360 }
361
362 void
363 execute_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);
368
369 c->hook_in = 1; /* Prevent recursive hooking. */
370 execute_user_command (c->hook_post, (char *) 0);
371 do_cleanups (cleanups);
372 }
373 }
374
375 void
376 execute_user_command (struct cmd_list_element *c, char *args)
377 {
378 struct ui *ui = current_ui;
379 struct command_line *cmdlines;
380 enum command_control_type ret;
381 extern unsigned int max_user_call_depth;
382
383 cmdlines = c->user_commands;
384 if (cmdlines == 0)
385 /* Null command */
386 return;
387
388 scoped_user_args_level push_user_args (args);
389
390 if (user_args_stack.size () > max_user_call_depth)
391 error (_("Max user call depth exceeded -- command aborted."));
392
393 /* Set the instream to 0, indicating execution of a
394 user-defined function. */
395 scoped_restore restore_instream
396 = make_scoped_restore (&ui->instream, nullptr);
397
398 scoped_restore save_async = make_scoped_restore (&current_ui->async, 0);
399
400 scoped_restore save_nesting
401 = make_scoped_restore (&command_nest_depth, command_nest_depth + 1);
402 while (cmdlines)
403 {
404 ret = execute_control_command (cmdlines);
405 if (ret != simple_control && ret != break_control)
406 {
407 warning (_("Error executing canned sequence of commands."));
408 break;
409 }
410 cmdlines = cmdlines->next;
411 }
412 }
413
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. */
416
417 void
418 reset_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. */
434 void
435 print_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
454 enum command_control_type
455 execute_control_command (struct command_line *cmd)
456 {
457 struct command_line *current;
458 struct value *val;
459 struct value *val_mark;
460 int loop;
461 enum command_control_type ret;
462
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
467 switch (cmd->control_type)
468 {
469 case simple_control:
470 {
471 /* A simple command, execute it and return. */
472 std::string new_line = insert_user_defined_cmd_args (cmd->line);
473 execute_command (&new_line[0], 0);
474 ret = cmd->control_type;
475 break;
476 }
477
478 case continue_control:
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
486 case break_control:
487 print_command_trace ("loop_break");
488
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 {
496 int len = strlen (cmd->line) + 7;
497 char *buffer = (char *) alloca (len);
498
499 xsnprintf (buffer, len, "while %s", cmd->line);
500 print_command_trace (buffer);
501
502 /* Parse the loop control expression for the while statement. */
503 std::string new_line = insert_user_defined_cmd_args (cmd->line);
504 expression_up expr = parse_expression (new_line.c_str ());
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 ();
518 val = evaluate_expression (expr.get ());
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 {
530 scoped_restore save_nesting
531 = make_scoped_restore (&command_nest_depth, command_nest_depth + 1);
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 {
561 int len = strlen (cmd->line) + 4;
562 char *buffer = (char *) alloca (len);
563
564 xsnprintf (buffer, len, "if %s", cmd->line);
565 print_command_trace (buffer);
566
567 /* Parse the conditional for the if statement. */
568 std::string new_line = insert_user_defined_cmd_args (cmd->line);
569 expression_up expr = parse_expression (new_line.c_str ());
570
571 current = NULL;
572 ret = simple_control;
573
574 /* Evaluate the conditional. */
575 val_mark = value_mark ();
576 val = evaluate_expression (expr.get ());
577
578 /* Choose which arm to take commands from based on the value
579 of the conditional expression. */
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 {
589 scoped_restore save_nesting
590 = make_scoped_restore (&command_nest_depth, command_nest_depth + 1);
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 }
603
604 case commands_control:
605 {
606 /* Breakpoint commands list, record the commands in the
607 breakpoint's command list and return. */
608 std::string new_line = insert_user_defined_cmd_args (cmd->line);
609 ret = commands_from_control_command (new_line.c_str (), cmd);
610 break;
611 }
612
613 case compile_control:
614 eval_compile_command (cmd, NULL, cmd->control_u.compile.scope,
615 cmd->control_u.compile.scope_data);
616 ret = simple_control;
617 break;
618
619 case python_control:
620 case guile_control:
621 {
622 eval_ext_lang_from_control_command (cmd);
623 ret = simple_control;
624 break;
625 }
626
627 default:
628 warning (_("Invalid control type in canned commands structure."));
629 break;
630 }
631
632 return ret;
633 }
634
635 /* Like execute_control_command, but first set
636 suppress_next_print_command_trace. */
637
638 enum command_control_type
639 execute_control_command_untraced (struct command_line *cmd)
640 {
641 suppress_next_print_command_trace = 1;
642 return execute_control_command (cmd);
643 }
644
645
646 /* "while" command support. Executes a body of statements while the
647 loop condition is nonzero. */
648
649 static void
650 while_command (char *arg, int from_tty)
651 {
652 control_level = 1;
653 command_line_up command = get_command_line (while_control, arg);
654
655 if (command == NULL)
656 return;
657
658 scoped_restore save_async = make_scoped_restore (&current_ui->async, 0);
659
660 execute_control_command_untraced (command.get ());
661 }
662
663 /* "if" command support. Execute either the true or false arm depending
664 on the value of the if conditional. */
665
666 static void
667 if_command (char *arg, int from_tty)
668 {
669 control_level = 1;
670 command_line_up command = get_command_line (if_control, arg);
671
672 if (command == NULL)
673 return;
674
675 scoped_restore save_async = make_scoped_restore (&current_ui->async, 0);
676
677 execute_control_command_untraced (command.get ());
678 }
679
680 /* Bind the incoming arguments for a user defined command to $arg0,
681 $arg1 ... $argN. */
682
683 user_args::user_args (const char *command_line)
684 {
685 const char *p;
686
687 if (command_line == NULL)
688 return;
689
690 m_command_line = command_line;
691 p = m_command_line.c_str ();
692
693 while (*p)
694 {
695 const char *start_arg;
696 int squote = 0;
697 int dquote = 0;
698 int bsquote = 0;
699
700 /* Strip whitespace. */
701 while (*p == ' ' || *p == '\t')
702 p++;
703
704 /* P now points to an argument. */
705 start_arg = p;
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
739 m_args.emplace_back (start_arg, p - start_arg);
740 }
741 }
742
743 /* Given character string P, return a point to the first argument
744 ($arg), or NULL if P contains no arguments. */
745
746 static const char *
747 locate_arg (const char *p)
748 {
749 while ((p = strchr (p, '$')))
750 {
751 if (startswith (p, "$arg")
752 && (isdigit (p[4]) || p[4] == 'c'))
753 return p;
754 p++;
755 }
756 return NULL;
757 }
758
759 /* See cli-script.h. */
760
761 std::string
762 insert_user_defined_cmd_args (const char *line)
763 {
764 /* If we are not in a user-defined command, treat $argc, $arg0, et
765 cetera as normal convenience variables. */
766 if (user_args_stack.empty ())
767 return line;
768
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
776 std::string
777 user_args::insert_args (const char *line) const
778 {
779 std::string new_line;
780 const char *p;
781
782 while ((p = locate_arg (line)))
783 {
784 new_line.append (line, p - line);
785
786 if (p[4] == 'c')
787 {
788 new_line += std::to_string (m_args.size ());
789 line = p + 5;
790 }
791 else
792 {
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 }
807 }
808 }
809 /* Don't forget the tail. */
810 new_line.append (line);
811
812 return new_line;
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
820 static void
821 realloc_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
832 body_list = XCNEWVEC (struct command_line *, new_length);
833
834 memcpy (body_list, command->body_list, sizeof (struct command_line *) * n);
835
836 xfree (command->body_list);
837 command->body_list = body_list;
838 command->body_count = new_length;
839 }
840
841 /* Read next line from stdin. Passed to read_command_line_1 and
842 recurse_read_control_structure whenever we need to read commands
843 from stdin. */
844
845 static char *
846 read_next_line (void)
847 {
848 struct ui *ui = current_ui;
849 char *prompt_ptr, control_prompt[256];
850 int i = 0;
851 int from_tty = ui->instream == ui->stdin_stream;
852
853 if (control_level >= 254)
854 error (_("Control nesting too deep!"));
855
856 /* Set a prompt based on the nesting of the control commands. */
857 if (from_tty
858 || (ui->instream == 0 && deprecated_readline_hook != NULL))
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
869 return command_line_input (prompt_ptr, from_tty, "commands");
870 }
871
872 /* Return true if CMD's name is NAME. */
873
874 static bool
875 command_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
885 static const char *
886 line_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
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
899 Otherwise, only "end" is recognized. */
900
901 static enum misc_command_type
902 process_next_line (char *p, struct command_line **command, int parse_commands,
903 void (*validator)(char *, void *), void *closure)
904 {
905 char *p_end;
906 char *p_start;
907 int not_handled = 0;
908
909 /* Not sure what to do here. */
910 if (p == NULL)
911 return end_command;
912
913 /* Strip trailing whitespace. */
914 p_end = p + strlen (p);
915 while (p_end > p && (p_end[-1] == ' ' || p_end[-1] == '\t'))
916 p_end--;
917
918 p_start = p;
919 /* Strip leading whitespace. */
920 while (p_start < p_end && (*p_start == ' ' || *p_start == '\t'))
921 p_start++;
922
923 /* 'end' is always recognized, regardless of parse_commands value.
924 We also permit whitespace before end and after. */
925 if (p_end - p_start == 3 && startswith (p_start, "end"))
926 return end_command;
927
928 if (parse_commands)
929 {
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);
934 cmd_name = skip_spaces_const (cmd_name);
935 bool inline_cmd = *cmd_name != '\0';
936
937 /* If commands are parsed, we skip initial spaces. Otherwise,
938 which is the case for Python commands and documentation
939 (see the 'document' command), spaces are preserved. */
940 p = p_start;
941
942 /* Blanks and comments don't really do anything, but we need to
943 distinguish them from else, end and other commands which can
944 be executed. */
945 if (p_end == p || p[0] == '#')
946 return nop_command;
947
948 /* Is the else clause of an if control structure? */
949 if (p_end - p == 4 && startswith (p, "else"))
950 return else_command;
951
952 /* Check for while, if, break, continue, etc and build a new
953 command line structure for them. */
954 if (command_name_equals (cmd, "while-stepping"))
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
961 to 'while-stepping'. This is intentional -- we don't
962 really want frontend to send a command list with 'ws',
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. */
967 *command = build_command_line (while_stepping_control, p);
968 }
969 else if (command_name_equals (cmd, "while"))
970 {
971 *command = build_command_line (while_control, line_first_arg (p));
972 }
973 else if (command_name_equals (cmd, "if"))
974 {
975 *command = build_command_line (if_control, line_first_arg (p));
976 }
977 else if (command_name_equals (cmd, "commands"))
978 {
979 *command = build_command_line (commands_control, line_first_arg (p));
980 }
981 else if (command_name_equals (cmd, "python") && !inline_cmd)
982 {
983 /* Note that we ignore the inline "python command" form
984 here. */
985 *command = build_command_line (python_control, "");
986 }
987 else if (command_name_equals (cmd, "compile") && !inline_cmd)
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 }
994 else if (command_name_equals (cmd, "guile") && !inline_cmd)
995 {
996 /* Note that we ignore the inline "guile command" form here. */
997 *command = build_command_line (guile_control, "");
998 }
999 else if (p_end - p == 10 && startswith (p, "loop_break"))
1000 {
1001 *command = XNEW (struct command_line);
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 }
1008 else if (p_end - p == 13 && startswith (p, "loop_continue"))
1009 {
1010 *command = XNEW (struct command_line);
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;
1019 }
1020
1021 if (!parse_commands || not_handled)
1022 {
1023 /* A normal command. */
1024 *command = XNEW (struct command_line);
1025 (*command)->next = NULL;
1026 (*command)->line = savestring (p, p_end - p);
1027 (*command)->control_type = simple_control;
1028 (*command)->body_count = 0;
1029 (*command)->body_list = NULL;
1030 }
1031
1032 if (validator)
1033 {
1034
1035 TRY
1036 {
1037 validator ((*command)->line, closure);
1038 }
1039 CATCH (ex, RETURN_MASK_ALL)
1040 {
1041 xfree (*command);
1042 throw_exception (ex);
1043 }
1044 END_CATCH
1045 }
1046
1047 /* Nothing special. */
1048 return ok_command;
1049 }
1050
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. */
1054
1055 static enum command_control_type
1056 recurse_read_control_structure (char * (*read_next_line_func) (void),
1057 struct command_line *current_cmd,
1058 void (*validator)(char *, void *),
1059 void *closure)
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)
1071 error (_("Recursed on a simple control type."));
1072
1073 if (current_body > current_cmd->body_count)
1074 error (_("Allocated body is smaller than this command type needs."));
1075
1076 /* Read lines from the input stream and build control structures. */
1077 while (1)
1078 {
1079 dont_repeat ();
1080
1081 next = NULL;
1082 val = process_next_line (read_next_line_func (), &next,
1083 current_cmd->control_type != python_control
1084 && current_cmd->control_type != guile_control
1085 && current_cmd->control_type != compile_control,
1086 validator, closure);
1087
1088 /* Just skip blanks and comments. */
1089 if (val == nop_command)
1090 continue;
1091
1092 if (val == end_command)
1093 {
1094 if (multi_line_command_p (current_cmd->control_type))
1095 {
1096 /* Success reading an entire canned sequence of commands. */
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. */
1143 if (multi_line_command_p (next->control_type))
1144 {
1145 control_level++;
1146 ret = recurse_read_control_structure (read_next_line_func, next,
1147 validator, closure);
1148 control_level--;
1149
1150 if (ret != simple_control)
1151 break;
1152 }
1153 }
1154
1155 dont_repeat ();
1156
1157 return ret;
1158 }
1159
1160 static void
1161 restore_interp (void *arg)
1162 {
1163 interp_set_temp (interp_name ((struct interp *)arg));
1164 }
1165
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
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. */
1174
1175 #define END_MESSAGE "End with a line saying just \"end\"."
1176
1177 command_line_up
1178 read_command_lines (char *prompt_arg, int from_tty, int parse_commands,
1179 void (*validator)(char *, void *), void *closure)
1180 {
1181 if (from_tty && input_interactive_p (current_ui))
1182 {
1183 if (deprecated_readline_begin_hook)
1184 {
1185 /* Note - intentional to merge messages with no newline. */
1186 (*deprecated_readline_begin_hook) ("%s %s\n", prompt_arg,
1187 END_MESSAGE);
1188 }
1189 else
1190 {
1191 printf_unfiltered ("%s\n%s\n", prompt_arg, END_MESSAGE);
1192 gdb_flush (gdb_stdout);
1193 }
1194 }
1195
1196
1197 /* Reading commands assumes the CLI behavior, so temporarily
1198 override the current interpreter with CLI. */
1199 command_line_up head;
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 }
1212
1213 if (from_tty && input_interactive_p (current_ui)
1214 && deprecated_readline_end_hook)
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
1224 command_line_up
1225 read_command_lines_1 (char * (*read_next_line_func) (void), int parse_commands,
1226 void (*validator)(char *, void *), void *closure)
1227 {
1228 struct command_line *tail, *next;
1229 command_line_up head;
1230 enum command_control_type ret;
1231 enum misc_command_type val;
1232
1233 control_level = 0;
1234 tail = NULL;
1235
1236 while (1)
1237 {
1238 dont_repeat ();
1239 val = process_next_line (read_next_line_func (), &next, parse_commands,
1240 validator, closure);
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
1258 if (multi_line_command_p (next->control_type))
1259 {
1260 control_level++;
1261 ret = recurse_read_control_structure (read_next_line_func, next,
1262 validator, closure);
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 {
1275 head.reset (next);
1276 }
1277 tail = next;
1278 }
1279
1280 dont_repeat ();
1281
1282 if (ret == invalid_control)
1283 return NULL;
1284
1285 return head;
1286 }
1287
1288 /* Free a chain of struct command_line's. */
1289
1290 void
1291 free_command_lines (struct command_line **lptr)
1292 {
1293 struct command_line *l = *lptr;
1294 struct command_line *next;
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;
1307 xfree (l->line);
1308 xfree (l);
1309 l = next;
1310 }
1311 *lptr = NULL;
1312 }
1313
1314 command_line_up
1315 copy_command_lines (struct command_line *cmds)
1316 {
1317 struct command_line *result = NULL;
1318
1319 if (cmds)
1320 {
1321 result = XNEW (struct command_line);
1322
1323 result->next = copy_command_lines (cmds->next).release ();
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
1331 result->body_list = XNEWVEC (struct command_line *, cmds->body_count);
1332
1333 for (i = 0; i < cmds->body_count; i++)
1334 result->body_list[i]
1335 = copy_command_lines (cmds->body_list[i]).release ();
1336 }
1337 else
1338 result->body_list = NULL;
1339 }
1340
1341 return command_line_up (result);
1342 }
1343 \f
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
1350 static struct cmd_list_element **
1351 validate_comname (char **comname)
1352 {
1353 struct cmd_list_element **list = &cmdlist;
1354 char *p, *last_word;
1355
1356 if (*comname == 0)
1357 error_no_arg (_("name of command to define"));
1358
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;
1371 char saved_char;
1372 const char *tem = *comname;
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;
1388 while (*p)
1389 {
1390 if (!isalnum (*p) && *p != '-' && *p != '_')
1391 error (_("Junk in argument list: \"%s\""), p);
1392 p++;
1393 }
1394
1395 return list;
1396 }
1397
1398 /* This is just a placeholder in the command data structures. */
1399 static void
1400 user_defined_command (char *ignore, int from_tty)
1401 {
1402 }
1403
1404 static void
1405 define_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 };
1414 struct cmd_list_element *c, *newc, *hookc = 0, **list;
1415 char *tem, *comfull;
1416 const char *tem_c;
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
1426 comfull = comname;
1427 list = validate_comname (&comname);
1428
1429 /* Look it up, and verify that we got an exact match. */
1430 tem_c = comname;
1431 c = lookup_cmd (&tem_c, *list, "", -1, 1);
1432 if (c && strcmp (comname, c->name) != 0)
1433 c = 0;
1434
1435 if (c)
1436 {
1437 int q;
1438
1439 if (c->theclass == class_user || c->theclass == class_alias)
1440 q = query (_("Redefine command \"%s\"? "), c->name);
1441 else
1442 q = query (_("Really redefine built-in command \"%s\"? "), c->name);
1443 if (!q)
1444 error (_("Command \"%s\" not redefined."), c->name);
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. */
1465 tem_c = comname + hook_name_size;
1466 hookc = lookup_cmd (&tem_c, *list, "", -1, 0);
1467 if (hookc && strcmp (comname + hook_name_size, hookc->name) != 0)
1468 hookc = 0;
1469 if (!hookc)
1470 {
1471 warning (_("Your new `%s' command does not "
1472 "hook any existing command."),
1473 comfull);
1474 if (!query (_("Proceed? ")))
1475 error (_("Not confirmed."));
1476 }
1477 }
1478
1479 comname = xstrdup (comname);
1480
1481 /* If the rest of the commands will be case insensitive, this one
1482 should behave in the same manner. */
1483 for (tem = comname; *tem; tem++)
1484 if (isupper (*tem))
1485 *tem = tolower (*tem);
1486
1487 xsnprintf (tmpbuf, sizeof (tmpbuf),
1488 "Type commands for definition of \"%s\".", comfull);
1489 command_line_up cmds = read_command_lines (tmpbuf, from_tty, 1, 0, 0);
1490
1491 if (c && c->theclass == class_user)
1492 free_command_lines (&c->user_commands);
1493
1494 newc = add_cmd (comname, class_user, user_defined_command,
1495 (c && c->theclass == class_user)
1496 ? c->doc : xstrdup ("User-defined."), list);
1497 newc->user_commands = cmds.release ();
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. */
1507 newc->hookee_pre = hookc; /* We are marked as hooking target cmd. */
1508 break;
1509 case CMD_POST_HOOK:
1510 hookc->hook_post = newc; /* Target gets hooked. */
1511 newc->hookee_post = hookc; /* We are marked as hooking
1512 target cmd. */
1513 break;
1514 default:
1515 /* Should never come here as hookc would be 0. */
1516 internal_error (__FILE__, __LINE__, _("bad switch"));
1517 }
1518 }
1519 }
1520
1521 static void
1522 document_command (char *comname, int from_tty)
1523 {
1524 struct cmd_list_element *c, **list;
1525 const char *tem;
1526 char *comfull;
1527 char tmpbuf[128];
1528
1529 comfull = comname;
1530 list = validate_comname (&comname);
1531
1532 tem = comname;
1533 c = lookup_cmd (&tem, *list, "", 0, 1);
1534
1535 if (c->theclass != class_user)
1536 error (_("Command \"%s\" is built-in."), comfull);
1537
1538 xsnprintf (tmpbuf, sizeof (tmpbuf), "Type documentation for \"%s\".",
1539 comfull);
1540 command_line_up doclines = read_command_lines (tmpbuf, from_tty, 0, 0, 0);
1541
1542 if (c->doc)
1543 xfree ((char *) c->doc);
1544
1545 {
1546 struct command_line *cl1;
1547 int len = 0;
1548 char *doc;
1549
1550 for (cl1 = doclines.get (); cl1; cl1 = cl1->next)
1551 len += strlen (cl1->line) + 1;
1552
1553 doc = (char *) xmalloc (len + 1);
1554 *doc = 0;
1555
1556 for (cl1 = doclines.get (); cl1; cl1 = cl1->next)
1557 {
1558 strcat (doc, cl1->line);
1559 if (cl1->next)
1560 strcat (doc, "\n");
1561 }
1562
1563 c->doc = doc;
1564 }
1565 }
1566 \f
1567 /* Used to implement source_command. */
1568
1569 void
1570 script_from_file (FILE *stream, const char *file)
1571 {
1572 if (stream == NULL)
1573 internal_error (__FILE__, __LINE__, _("called with NULL file pointer!"));
1574
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);
1579
1580 scoped_restore save_async = make_scoped_restore (&current_ui->async, 0);
1581
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
1595 }
1596
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. */
1601 void
1602 show_user_1 (struct cmd_list_element *c, const char *prefix, const char *name,
1603 struct ui_file *stream)
1604 {
1605 struct command_line *cmdlines;
1606
1607 if (c->prefixlist != NULL)
1608 {
1609 const char *prefixname = c->prefixname;
1610
1611 for (c = *c->prefixlist; c != NULL; c = c->next)
1612 if (c->theclass == class_user || c->prefixlist != NULL)
1613 show_user_1 (c, prefixname, c->name, gdb_stdout);
1614 return;
1615 }
1616
1617 cmdlines = c->user_commands;
1618 fprintf_filtered (stream, "User command \"%s%s\":\n", prefix, name);
1619
1620 if (!cmdlines)
1621 return;
1622 print_command_lines (current_uiout, cmdlines, 1);
1623 fputs_filtered ("\n", stream);
1624 }
1625
1626 \f
1627
1628 initialize_file_ftype _initialize_cli_script;
1629
1630 void
1631 _initialize_cli_script (void)
1632 {
1633 add_com ("document", class_support, document_command, _("\
1634 Document a user-defined command.\n\
1635 Give command name as argument. Give documentation on following lines.\n\
1636 End with a line of just \"end\"."));
1637 add_com ("define", class_support, define_command, _("\
1638 Define a new command name. Command name is argument.\n\
1639 Definition appears on following lines, one command per line.\n\
1640 End with a line of just \"end\".\n\
1641 Use the \"document\" command to give documentation for the new command.\n\
1642 Commands defined in this way may have up to ten arguments."));
1643
1644 add_com ("while", class_support, while_command, _("\
1645 Execute nested commands WHILE the conditional expression is non zero.\n\
1646 The conditional expression must follow the word `while' and must in turn be\n\
1647 followed by a new line. The nested commands must be entered one per line,\n\
1648 and should be terminated by the word `end'."));
1649
1650 add_com ("if", class_support, if_command, _("\
1651 Execute nested commands once IF the conditional expression is non zero.\n\
1652 The conditional expression must follow the word `if' and must in turn be\n\
1653 followed by a new line. The nested commands must be entered one per line,\n\
1654 and should be terminated by the word 'else' or `end'. If an else clause\n\
1655 is used, the same rules apply to its nested commands as to the first ones."));
1656 }
This page took 0.115681 seconds and 4 git commands to generate.