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