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