xref: /dragonfly/contrib/gdb-7/gdb/cli/cli-decode.c (revision c1543a89)
1 /* Handle lists of commands, their decoding and documentation, for GDB.
2 
3    Copyright (c) 1986, 1989, 1990, 1991, 1998, 2000, 2001, 2002, 2004, 2007,
4    2008, 2009 Free Software Foundation, Inc.
5 
6    This program is free software; you can redistribute it and/or modify
7    it under the terms of the GNU General Public License as published by
8    the Free Software Foundation; either version 3 of the License, or
9    (at your option) any later version.
10 
11    This program is distributed in the hope that it will be useful,
12    but WITHOUT ANY WARRANTY; without even the implied warranty of
13    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
14    GNU General Public License for more details.
15 
16    You should have received a copy of the GNU General Public License
17    along with this program.  If not, see <http://www.gnu.org/licenses/>.  */
18 
19 #include "defs.h"
20 #include "symtab.h"
21 #include <ctype.h>
22 #include "gdb_regex.h"
23 #include "gdb_string.h"
24 #include "completer.h"
25 #include "ui-out.h"
26 
27 #include "cli/cli-cmds.h"
28 #include "cli/cli-decode.h"
29 
30 #ifdef TUI
31 #include "tui/tui.h"		/* For tui_active et.al.   */
32 #endif
33 
34 #include "gdb_assert.h"
35 
36 /* Prototypes for local functions */
37 
38 static void undef_cmd_error (char *, char *);
39 
40 static struct cmd_list_element *delete_cmd (char *name,
41 					    struct cmd_list_element **list,
42 					    struct cmd_list_element **prehook,
43 					    struct cmd_list_element **prehookee,
44 					    struct cmd_list_element **posthook,
45 					    struct cmd_list_element **posthookee);
46 
47 static struct cmd_list_element *find_cmd (char *command,
48 					  int len,
49 					  struct cmd_list_element *clist,
50 					  int ignore_help_classes,
51 					  int *nfound);
52 
53 static void help_all (struct ui_file *stream);
54 
55 static void
56 print_help_for_command (struct cmd_list_element *c, char *prefix, int recurse,
57 			struct ui_file *stream);
58 
59 
60 /* Set the callback function for the specified command.  For each both
61    the commands callback and func() are set.  The latter set to a
62    bounce function (unless cfunc / sfunc is NULL that is).  */
63 
64 static void
65 do_cfunc (struct cmd_list_element *c, char *args, int from_tty)
66 {
67   c->function.cfunc (args, from_tty); /* Ok.  */
68 }
69 
70 void
71 set_cmd_cfunc (struct cmd_list_element *cmd, cmd_cfunc_ftype *cfunc)
72 {
73   if (cfunc == NULL)
74     cmd->func = NULL;
75   else
76     cmd->func = do_cfunc;
77   cmd->function.cfunc = cfunc; /* Ok.  */
78 }
79 
80 static void
81 do_sfunc (struct cmd_list_element *c, char *args, int from_tty)
82 {
83   c->function.sfunc (args, from_tty, c); /* Ok.  */
84 }
85 
86 void
87 set_cmd_sfunc (struct cmd_list_element *cmd, cmd_sfunc_ftype *sfunc)
88 {
89   if (sfunc == NULL)
90     cmd->func = NULL;
91   else
92     cmd->func = do_sfunc;
93   cmd->function.sfunc = sfunc; /* Ok.  */
94 }
95 
96 int
97 cmd_cfunc_eq (struct cmd_list_element *cmd,
98 	      void (*cfunc) (char *args, int from_tty))
99 {
100   return cmd->func == do_cfunc && cmd->function.cfunc == cfunc;
101 }
102 
103 void
104 set_cmd_context (struct cmd_list_element *cmd, void *context)
105 {
106   cmd->context = context;
107 }
108 
109 void *
110 get_cmd_context (struct cmd_list_element *cmd)
111 {
112   return cmd->context;
113 }
114 
115 enum cmd_types
116 cmd_type (struct cmd_list_element *cmd)
117 {
118   return cmd->type;
119 }
120 
121 void
122 set_cmd_completer (struct cmd_list_element *cmd,
123 		   char **(*completer) (struct cmd_list_element *self,
124 					char *text, char *word))
125 {
126   cmd->completer = completer; /* Ok.  */
127 }
128 
129 
130 /* Add element named NAME.
131    CLASS is the top level category into which commands are broken down
132    for "help" purposes.
133    FUN should be the function to execute the command;
134    it will get a character string as argument, with leading
135    and trailing blanks already eliminated.
136 
137    DOC is a documentation string for the command.
138    Its first line should be a complete sentence.
139    It should start with ? for a command that is an abbreviation
140    or with * for a command that most users don't need to know about.
141 
142    Add this command to command list *LIST.
143 
144    Returns a pointer to the added command (not necessarily the head
145    of *LIST). */
146 
147 struct cmd_list_element *
148 add_cmd (char *name, enum command_class class, void (*fun) (char *, int),
149 	 char *doc, struct cmd_list_element **list)
150 {
151   struct cmd_list_element *c
152   = (struct cmd_list_element *) xmalloc (sizeof (struct cmd_list_element));
153   struct cmd_list_element *p, *iter;
154 
155   /* Turn each alias of the old command into an alias of the new
156      command.  */
157   c->aliases = delete_cmd (name, list, &c->hook_pre, &c->hookee_pre,
158 			   &c->hook_post, &c->hookee_post);
159   for (iter = c->aliases; iter; iter = iter->alias_chain)
160     iter->cmd_pointer = c;
161   if (c->hook_pre)
162     c->hook_pre->hookee_pre = c;
163   if (c->hookee_pre)
164     c->hookee_pre->hook_pre = c;
165   if (c->hook_post)
166     c->hook_post->hookee_post = c;
167   if (c->hookee_post)
168     c->hookee_post->hook_post = c;
169 
170   if (*list == NULL || strcmp ((*list)->name, name) >= 0)
171     {
172       c->next = *list;
173       *list = c;
174     }
175   else
176     {
177       p = *list;
178       while (p->next && strcmp (p->next->name, name) <= 0)
179 	{
180 	  p = p->next;
181 	}
182       c->next = p->next;
183       p->next = c;
184     }
185 
186   c->name = name;
187   c->class = class;
188   set_cmd_cfunc (c, fun);
189   set_cmd_context (c, NULL);
190   c->doc = doc;
191   c->flags = 0;
192   c->replacement = NULL;
193   c->pre_show_hook = NULL;
194   c->hook_in = 0;
195   c->prefixlist = NULL;
196   c->prefixname = NULL;
197   c->allow_unknown = 0;
198   c->abbrev_flag = 0;
199   set_cmd_completer (c, make_symbol_completion_list_fn);
200   c->destroyer = NULL;
201   c->type = not_set_cmd;
202   c->var = NULL;
203   c->var_type = var_boolean;
204   c->enums = NULL;
205   c->user_commands = NULL;
206   c->cmd_pointer = NULL;
207   c->alias_chain = NULL;
208 
209   return c;
210 }
211 
212 /* Deprecates a command CMD.
213    REPLACEMENT is the name of the command which should be used in place
214    of this command, or NULL if no such command exists.
215 
216    This function does not check to see if command REPLACEMENT exists
217    since gdb may not have gotten around to adding REPLACEMENT when this
218    function is called.
219 
220    Returns a pointer to the deprecated command.  */
221 
222 struct cmd_list_element *
223 deprecate_cmd (struct cmd_list_element *cmd, char *replacement)
224 {
225   cmd->flags |= (CMD_DEPRECATED | DEPRECATED_WARN_USER);
226 
227   if (replacement != NULL)
228     cmd->replacement = replacement;
229   else
230     cmd->replacement = NULL;
231 
232   return cmd;
233 }
234 
235 struct cmd_list_element *
236 add_alias_cmd (char *name, char *oldname, enum command_class class,
237 	       int abbrev_flag, struct cmd_list_element **list)
238 {
239   /* Must do this since lookup_cmd tries to side-effect its first arg */
240   char *copied_name;
241   struct cmd_list_element *old;
242   struct cmd_list_element *c;
243   copied_name = (char *) alloca (strlen (oldname) + 1);
244   strcpy (copied_name, oldname);
245   old = lookup_cmd (&copied_name, *list, "", 1, 1);
246 
247   if (old == 0)
248     {
249       struct cmd_list_element *prehook, *prehookee, *posthook, *posthookee;
250       struct cmd_list_element *aliases = delete_cmd (name, list,
251 						     &prehook, &prehookee,
252 						     &posthook, &posthookee);
253       /* If this happens, it means a programmer error somewhere.  */
254       gdb_assert (!aliases && !prehook && !prehookee
255 		  && !posthook && ! posthookee);
256       return 0;
257     }
258 
259   c = add_cmd (name, class, NULL, old->doc, list);
260   /* NOTE: Both FUNC and all the FUNCTIONs need to be copied.  */
261   c->func = old->func;
262   c->function = old->function;
263   c->prefixlist = old->prefixlist;
264   c->prefixname = old->prefixname;
265   c->allow_unknown = old->allow_unknown;
266   c->abbrev_flag = abbrev_flag;
267   c->cmd_pointer = old;
268   c->alias_chain = old->aliases;
269   old->aliases = c;
270   return c;
271 }
272 
273 /* Like add_cmd but adds an element for a command prefix:
274    a name that should be followed by a subcommand to be looked up
275    in another command list.  PREFIXLIST should be the address
276    of the variable containing that list.  */
277 
278 struct cmd_list_element *
279 add_prefix_cmd (char *name, enum command_class class, void (*fun) (char *, int),
280 		char *doc, struct cmd_list_element **prefixlist,
281 		char *prefixname, int allow_unknown,
282 		struct cmd_list_element **list)
283 {
284   struct cmd_list_element *c = add_cmd (name, class, fun, doc, list);
285   c->prefixlist = prefixlist;
286   c->prefixname = prefixname;
287   c->allow_unknown = allow_unknown;
288   return c;
289 }
290 
291 /* Like add_prefix_cmd but sets the abbrev_flag on the new command. */
292 
293 struct cmd_list_element *
294 add_abbrev_prefix_cmd (char *name, enum command_class class,
295 		       void (*fun) (char *, int), char *doc,
296 		       struct cmd_list_element **prefixlist, char *prefixname,
297 		       int allow_unknown, struct cmd_list_element **list)
298 {
299   struct cmd_list_element *c = add_cmd (name, class, fun, doc, list);
300   c->prefixlist = prefixlist;
301   c->prefixname = prefixname;
302   c->allow_unknown = allow_unknown;
303   c->abbrev_flag = 1;
304   return c;
305 }
306 
307 /* This is an empty "cfunc".  */
308 void
309 not_just_help_class_command (char *args, int from_tty)
310 {
311 }
312 
313 /* This is an empty "sfunc".  */
314 static void empty_sfunc (char *, int, struct cmd_list_element *);
315 
316 static void
317 empty_sfunc (char *args, int from_tty, struct cmd_list_element *c)
318 {
319 }
320 
321 /* Add element named NAME to command list LIST (the list for set/show
322    or some sublist thereof).
323    TYPE is set_cmd or show_cmd.
324    CLASS is as in add_cmd.
325    VAR_TYPE is the kind of thing we are setting.
326    VAR is address of the variable being controlled by this command.
327    DOC is the documentation string.  */
328 
329 static struct cmd_list_element *
330 add_set_or_show_cmd (char *name,
331 		     enum cmd_types type,
332 		     enum command_class class,
333 		     var_types var_type,
334 		     void *var,
335 		     char *doc,
336 		     struct cmd_list_element **list)
337 {
338   struct cmd_list_element *c = add_cmd (name, class, NULL, doc, list);
339   gdb_assert (type == set_cmd || type == show_cmd);
340   c->type = type;
341   c->var_type = var_type;
342   c->var = var;
343   /* This needs to be something besides NULL so that this isn't
344      treated as a help class.  */
345   set_cmd_sfunc (c, empty_sfunc);
346   return c;
347 }
348 
349 /* Add element named NAME to both the command SET_LIST and SHOW_LIST.
350    CLASS is as in add_cmd.  VAR_TYPE is the kind of thing we are
351    setting.  VAR is address of the variable being controlled by this
352    command.  SET_FUNC and SHOW_FUNC are the callback functions (if
353    non-NULL).  SET_DOC, SHOW_DOC and HELP_DOC are the documentation
354    strings.  PRINT the format string to print the value.  SET_RESULT
355    and SHOW_RESULT, if not NULL, are set to the resulting command
356    structures.  */
357 
358 static void
359 add_setshow_cmd_full (char *name,
360 		      enum command_class class,
361 		      var_types var_type, void *var,
362 		      const char *set_doc, const char *show_doc,
363 		      const char *help_doc,
364 		      cmd_sfunc_ftype *set_func,
365 		      show_value_ftype *show_func,
366 		      struct cmd_list_element **set_list,
367 		      struct cmd_list_element **show_list,
368 		      struct cmd_list_element **set_result,
369 		      struct cmd_list_element **show_result)
370 {
371   struct cmd_list_element *set;
372   struct cmd_list_element *show;
373   char *full_set_doc;
374   char *full_show_doc;
375 
376   if (help_doc != NULL)
377     {
378       full_set_doc = xstrprintf ("%s\n%s", set_doc, help_doc);
379       full_show_doc = xstrprintf ("%s\n%s", show_doc, help_doc);
380     }
381   else
382     {
383       full_set_doc = xstrdup (set_doc);
384       full_show_doc = xstrdup (show_doc);
385     }
386   set = add_set_or_show_cmd (name, set_cmd, class, var_type, var,
387 			     full_set_doc, set_list);
388   if (set_func != NULL)
389     set_cmd_sfunc (set, set_func);
390   show = add_set_or_show_cmd (name, show_cmd, class, var_type, var,
391 			      full_show_doc, show_list);
392   show->show_value_func = show_func;
393 
394   if (set_result != NULL)
395     *set_result = set;
396   if (show_result != NULL)
397     *show_result = show;
398 }
399 
400 /* Add element named NAME to command list LIST (the list for set or
401    some sublist thereof).  CLASS is as in add_cmd.  ENUMLIST is a list
402    of strings which may follow NAME.  VAR is address of the variable
403    which will contain the matching string (from ENUMLIST).  */
404 
405 void
406 add_setshow_enum_cmd (char *name,
407 		      enum command_class class,
408 		      const char *enumlist[],
409 		      const char **var,
410 		      const char *set_doc,
411 		      const char *show_doc,
412 		      const char *help_doc,
413 		      cmd_sfunc_ftype *set_func,
414 		      show_value_ftype *show_func,
415 		      struct cmd_list_element **set_list,
416 		      struct cmd_list_element **show_list)
417 {
418   struct cmd_list_element *c;
419   add_setshow_cmd_full (name, class, var_enum, var,
420 			set_doc, show_doc, help_doc,
421 			set_func, show_func,
422 			set_list, show_list,
423 			&c, NULL);
424   c->enums = enumlist;
425 }
426 
427 /* Add an auto-boolean command named NAME to both the set and show
428    command list lists.  CLASS is as in add_cmd.  VAR is address of the
429    variable which will contain the value.  DOC is the documentation
430    string.  FUNC is the corresponding callback.  */
431 void
432 add_setshow_auto_boolean_cmd (char *name,
433 			      enum command_class class,
434 			      enum auto_boolean *var,
435 			      const char *set_doc, const char *show_doc,
436 			      const char *help_doc,
437 			      cmd_sfunc_ftype *set_func,
438 			      show_value_ftype *show_func,
439 			      struct cmd_list_element **set_list,
440 			      struct cmd_list_element **show_list)
441 {
442   static const char *auto_boolean_enums[] = { "on", "off", "auto", NULL };
443   struct cmd_list_element *c;
444   add_setshow_cmd_full (name, class, var_auto_boolean, var,
445 			set_doc, show_doc, help_doc,
446 			set_func, show_func,
447 			set_list, show_list,
448 			&c, NULL);
449   c->enums = auto_boolean_enums;
450 }
451 
452 /* Add element named NAME to both the set and show command LISTs (the
453    list for set/show or some sublist thereof).  CLASS is as in
454    add_cmd.  VAR is address of the variable which will contain the
455    value.  SET_DOC and SHOW_DOC are the documentation strings.  */
456 void
457 add_setshow_boolean_cmd (char *name, enum command_class class, int *var,
458 			 const char *set_doc, const char *show_doc,
459 			 const char *help_doc,
460 			 cmd_sfunc_ftype *set_func,
461 			 show_value_ftype *show_func,
462 			 struct cmd_list_element **set_list,
463 			 struct cmd_list_element **show_list)
464 {
465   static const char *boolean_enums[] = { "on", "off", NULL };
466   struct cmd_list_element *c;
467   add_setshow_cmd_full (name, class, var_boolean, var,
468 			set_doc, show_doc, help_doc,
469 			set_func, show_func,
470 			set_list, show_list,
471 			&c, NULL);
472   c->enums = boolean_enums;
473 }
474 
475 /* Add element named NAME to both the set and show command LISTs (the
476    list for set/show or some sublist thereof).  */
477 void
478 add_setshow_filename_cmd (char *name, enum command_class class,
479 			  char **var,
480 			  const char *set_doc, const char *show_doc,
481 			  const char *help_doc,
482 			  cmd_sfunc_ftype *set_func,
483 			  show_value_ftype *show_func,
484 			  struct cmd_list_element **set_list,
485 			  struct cmd_list_element **show_list)
486 {
487   struct cmd_list_element *set_result;
488   add_setshow_cmd_full (name, class, var_filename, var,
489 			set_doc, show_doc, help_doc,
490 			set_func, show_func,
491 			set_list, show_list,
492 			&set_result, NULL);
493   set_cmd_completer (set_result, filename_completer);
494 }
495 
496 /* Add element named NAME to both the set and show command LISTs (the
497    list for set/show or some sublist thereof).  */
498 void
499 add_setshow_string_cmd (char *name, enum command_class class,
500 			char **var,
501 			const char *set_doc, const char *show_doc,
502 			const char *help_doc,
503 			cmd_sfunc_ftype *set_func,
504 			show_value_ftype *show_func,
505 			struct cmd_list_element **set_list,
506 			struct cmd_list_element **show_list)
507 {
508   add_setshow_cmd_full (name, class, var_string, var,
509 			set_doc, show_doc, help_doc,
510 			set_func, show_func,
511 			set_list, show_list,
512 			NULL, NULL);
513 }
514 
515 /* Add element named NAME to both the set and show command LISTs (the
516    list for set/show or some sublist thereof).  */
517 void
518 add_setshow_string_noescape_cmd (char *name, enum command_class class,
519 				 char **var,
520 				 const char *set_doc, const char *show_doc,
521 				 const char *help_doc,
522 				 cmd_sfunc_ftype *set_func,
523 				 show_value_ftype *show_func,
524 				 struct cmd_list_element **set_list,
525 				 struct cmd_list_element **show_list)
526 {
527   add_setshow_cmd_full (name, class, var_string_noescape, var,
528 			set_doc, show_doc, help_doc,
529 			set_func, show_func,
530 			set_list, show_list,
531 			NULL, NULL);
532 }
533 
534 /* Add element named NAME to both the set and show command LISTs (the
535    list for set/show or some sublist thereof).  */
536 void
537 add_setshow_optional_filename_cmd (char *name, enum command_class class,
538 				   char **var,
539 				   const char *set_doc, const char *show_doc,
540 				   const char *help_doc,
541 				   cmd_sfunc_ftype *set_func,
542 				   show_value_ftype *show_func,
543 				   struct cmd_list_element **set_list,
544 				   struct cmd_list_element **show_list)
545 {
546   struct cmd_list_element *set_result;
547 
548   add_setshow_cmd_full (name, class, var_optional_filename, var,
549 			set_doc, show_doc, help_doc,
550 			set_func, show_func,
551 			set_list, show_list,
552 			&set_result, NULL);
553 
554   set_cmd_completer (set_result, filename_completer);
555 
556 }
557 
558 /* Add element named NAME to both the set and show command LISTs (the
559    list for set/show or some sublist thereof).  CLASS is as in
560    add_cmd.  VAR is address of the variable which will contain the
561    value.  SET_DOC and SHOW_DOC are the documentation strings.  */
562 void
563 add_setshow_integer_cmd (char *name, enum command_class class,
564 			 int *var,
565 			 const char *set_doc, const char *show_doc,
566 			 const char *help_doc,
567 			 cmd_sfunc_ftype *set_func,
568 			 show_value_ftype *show_func,
569 			 struct cmd_list_element **set_list,
570 			 struct cmd_list_element **show_list)
571 {
572   add_setshow_cmd_full (name, class, var_integer, var,
573 			set_doc, show_doc, help_doc,
574 			set_func, show_func,
575 			set_list, show_list,
576 			NULL, NULL);
577 }
578 
579 /* Add element named NAME to both the set and show command LISTs (the
580    list for set/show or some sublist thereof).  CLASS is as in
581    add_cmd.  VAR is address of the variable which will contain the
582    value.  SET_DOC and SHOW_DOC are the documentation strings.  */
583 void
584 add_setshow_uinteger_cmd (char *name, enum command_class class,
585 			  unsigned int *var,
586 			  const char *set_doc, const char *show_doc,
587 			  const char *help_doc,
588 			  cmd_sfunc_ftype *set_func,
589 			  show_value_ftype *show_func,
590 			  struct cmd_list_element **set_list,
591 			  struct cmd_list_element **show_list)
592 {
593   add_setshow_cmd_full (name, class, var_uinteger, var,
594 			set_doc, show_doc, help_doc,
595 			set_func, show_func,
596 			set_list, show_list,
597 			NULL, NULL);
598 }
599 
600 /* Add element named NAME to both the set and show command LISTs (the
601    list for set/show or some sublist thereof).  CLASS is as in
602    add_cmd.  VAR is address of the variable which will contain the
603    value.  SET_DOC and SHOW_DOC are the documentation strings.  */
604 void
605 add_setshow_zinteger_cmd (char *name, enum command_class class,
606 			  int *var,
607 			  const char *set_doc, const char *show_doc,
608 			  const char *help_doc,
609 			  cmd_sfunc_ftype *set_func,
610 			  show_value_ftype *show_func,
611 			  struct cmd_list_element **set_list,
612 			  struct cmd_list_element **show_list)
613 {
614   add_setshow_cmd_full (name, class, var_zinteger, var,
615 			set_doc, show_doc, help_doc,
616 			set_func, show_func,
617 			set_list, show_list,
618 			NULL, NULL);
619 }
620 
621 /* Add element named NAME to both the set and show command LISTs (the
622    list for set/show or some sublist thereof).  CLASS is as in
623    add_cmd.  VAR is address of the variable which will contain the
624    value.  SET_DOC and SHOW_DOC are the documentation strings.  */
625 void
626 add_setshow_zuinteger_cmd (char *name, enum command_class class,
627 			   unsigned int *var,
628 			   const char *set_doc, const char *show_doc,
629 			   const char *help_doc,
630 			   cmd_sfunc_ftype *set_func,
631 			   show_value_ftype *show_func,
632 			   struct cmd_list_element **set_list,
633 			   struct cmd_list_element **show_list)
634 {
635   add_setshow_cmd_full (name, class, var_zuinteger, var,
636 			set_doc, show_doc, help_doc,
637 			set_func, show_func,
638 			set_list, show_list,
639 			NULL, NULL);
640 }
641 
642 /* Remove the command named NAME from the command list.  Return the
643    list commands which were aliased to the deleted command.  If the
644    command had no aliases, return NULL.  The various *HOOKs are set to
645    the pre- and post-hook commands for the deleted command.  If the
646    command does not have a hook, the corresponding out parameter is
647    set to NULL.  */
648 
649 static struct cmd_list_element *
650 delete_cmd (char *name, struct cmd_list_element **list,
651 	    struct cmd_list_element **prehook,
652 	    struct cmd_list_element **prehookee,
653 	    struct cmd_list_element **posthook,
654 	    struct cmd_list_element **posthookee)
655 {
656   struct cmd_list_element *iter;
657   struct cmd_list_element **previous_chain_ptr;
658   struct cmd_list_element *aliases = NULL;
659 
660   *prehook = NULL;
661   *prehookee = NULL;
662   *posthook = NULL;
663   *posthookee = NULL;
664   previous_chain_ptr = list;
665 
666   for (iter = *previous_chain_ptr; iter; iter = *previous_chain_ptr)
667     {
668       if (strcmp (iter->name, name) == 0)
669 	{
670 	  if (iter->destroyer)
671 	    iter->destroyer (iter, iter->context);
672 	  if (iter->hookee_pre)
673 	    iter->hookee_pre->hook_pre = 0;
674 	  *prehook = iter->hook_pre;
675 	  *prehookee = iter->hookee_pre;
676 	  if (iter->hookee_post)
677 	    iter->hookee_post->hook_post = 0;
678 	  *posthook = iter->hook_post;
679 	  *posthookee = iter->hookee_post;
680 
681 	  /* Update the link.  */
682 	  *previous_chain_ptr = iter->next;
683 
684 	  aliases = iter->aliases;
685 
686 	  /* If this command was an alias, remove it from the list of
687 	     aliases.  */
688 	  if (iter->cmd_pointer)
689 	    {
690 	      struct cmd_list_element **prevp = &iter->cmd_pointer->aliases;
691 	      struct cmd_list_element *a = *prevp;
692 
693 	      while (a != iter)
694 		{
695 		  prevp = &a->alias_chain;
696 		  a = *prevp;
697 		}
698 	      *prevp = iter->alias_chain;
699 	    }
700 
701 	  xfree (iter);
702 
703 	  /* We won't see another command with the same name.  */
704 	  break;
705 	}
706       else
707 	previous_chain_ptr = &iter->next;
708     }
709 
710   return aliases;
711 }
712 
713 /* Shorthands to the commands above. */
714 
715 /* Add an element to the list of info subcommands.  */
716 
717 struct cmd_list_element *
718 add_info (char *name, void (*fun) (char *, int), char *doc)
719 {
720   return add_cmd (name, no_class, fun, doc, &infolist);
721 }
722 
723 /* Add an alias to the list of info subcommands.  */
724 
725 struct cmd_list_element *
726 add_info_alias (char *name, char *oldname, int abbrev_flag)
727 {
728   return add_alias_cmd (name, oldname, 0, abbrev_flag, &infolist);
729 }
730 
731 /* Add an element to the list of commands.  */
732 
733 struct cmd_list_element *
734 add_com (char *name, enum command_class class, void (*fun) (char *, int),
735 	 char *doc)
736 {
737   return add_cmd (name, class, fun, doc, &cmdlist);
738 }
739 
740 /* Add an alias or abbreviation command to the list of commands.  */
741 
742 struct cmd_list_element *
743 add_com_alias (char *name, char *oldname, enum command_class class,
744 	       int abbrev_flag)
745 {
746   return add_alias_cmd (name, oldname, class, abbrev_flag, &cmdlist);
747 }
748 
749 /* Recursively walk the commandlist structures, and print out the
750    documentation of commands that match our regex in either their
751    name, or their documentation.
752 */
753 void
754 apropos_cmd (struct ui_file *stream, struct cmd_list_element *commandlist,
755 			 struct re_pattern_buffer *regex, char *prefix)
756 {
757   struct cmd_list_element *c;
758   int returnvalue;
759   /* Walk through the commands */
760   for (c=commandlist;c;c=c->next)
761     {
762       returnvalue = -1; /*Needed to avoid double printing*/
763       if (c->name != NULL)
764 	{
765 	  /* Try to match against the name*/
766 	  returnvalue=re_search(regex,c->name,strlen(c->name),0,strlen(c->name),NULL);
767 	  if (returnvalue >= 0)
768 	    {
769 	      print_help_for_command (c, prefix,
770 				      0 /* don't recurse */, stream);
771 	    }
772 	}
773       if (c->doc != NULL && returnvalue < 0)
774 	{
775 	  /* Try to match against documentation */
776 	  if (re_search(regex,c->doc,strlen(c->doc),0,strlen(c->doc),NULL) >=0)
777 	    {
778 	      print_help_for_command (c, prefix,
779 				      0 /* don't recurse */, stream);
780 	    }
781 	}
782       /* Check if this command has subcommands and is not an abbreviation.
783 	 We skip listing subcommands of abbreviations in order to avoid
784 	 duplicates in the output.
785        */
786       if (c->prefixlist != NULL && !c->abbrev_flag)
787 	{
788 	  /* Recursively call ourselves on the subcommand list,
789 	     passing the right prefix in.
790 	  */
791 	  apropos_cmd (stream,*c->prefixlist,regex,c->prefixname);
792 	}
793     }
794 }
795 
796 /* This command really has to deal with two things:
797  *     1) I want documentation on *this string* (usually called by
798  * "help commandname").
799  *     2) I want documentation on *this list* (usually called by
800  * giving a command that requires subcommands.  Also called by saying
801  * just "help".)
802  *
803  *   I am going to split this into two seperate comamnds, help_cmd and
804  * help_list.
805  */
806 
807 void
808 help_cmd (char *command, struct ui_file *stream)
809 {
810   struct cmd_list_element *c;
811   extern struct cmd_list_element *cmdlist;
812 
813   if (!command)
814     {
815       help_list (cmdlist, "", all_classes, stream);
816       return;
817     }
818 
819   if (strcmp (command, "all") == 0)
820     {
821       help_all (stream);
822       return;
823     }
824 
825   c = lookup_cmd (&command, cmdlist, "", 0, 0);
826 
827   if (c == 0)
828     return;
829 
830   /* There are three cases here.
831      If c->prefixlist is nonzero, we have a prefix command.
832      Print its documentation, then list its subcommands.
833 
834      If c->func is non NULL, we really have a command.  Print its
835      documentation and return.
836 
837      If c->func is NULL, we have a class name.  Print its
838      documentation (as if it were a command) and then set class to the
839      number of this class so that the commands in the class will be
840      listed.  */
841 
842   fputs_filtered (c->doc, stream);
843   fputs_filtered ("\n", stream);
844 
845   if (c->prefixlist == 0 && c->func != NULL)
846     return;
847   fprintf_filtered (stream, "\n");
848 
849   /* If this is a prefix command, print it's subcommands */
850   if (c->prefixlist)
851     help_list (*c->prefixlist, c->prefixname, all_commands, stream);
852 
853   /* If this is a class name, print all of the commands in the class */
854   if (c->func == NULL)
855     help_list (cmdlist, "", c->class, stream);
856 
857   if (c->hook_pre || c->hook_post)
858     fprintf_filtered (stream,
859                       "\nThis command has a hook (or hooks) defined:\n");
860 
861   if (c->hook_pre)
862     fprintf_filtered (stream,
863                       "\tThis command is run after  : %s (pre hook)\n",
864                     c->hook_pre->name);
865   if (c->hook_post)
866     fprintf_filtered (stream,
867                       "\tThis command is run before : %s (post hook)\n",
868                     c->hook_post->name);
869 }
870 
871 /*
872  * Get a specific kind of help on a command list.
873  *
874  * LIST is the list.
875  * CMDTYPE is the prefix to use in the title string.
876  * CLASS is the class with which to list the nodes of this list (see
877  * documentation for help_cmd_list below),  As usual, ALL_COMMANDS for
878  * everything, ALL_CLASSES for just classes, and non-negative for only things
879  * in a specific class.
880  * and STREAM is the output stream on which to print things.
881  * If you call this routine with a class >= 0, it recurses.
882  */
883 void
884 help_list (struct cmd_list_element *list, char *cmdtype,
885 	   enum command_class class, struct ui_file *stream)
886 {
887   int len;
888   char *cmdtype1, *cmdtype2;
889 
890   /* If CMDTYPE is "foo ", CMDTYPE1 gets " foo" and CMDTYPE2 gets "foo sub"  */
891   len = strlen (cmdtype);
892   cmdtype1 = (char *) alloca (len + 1);
893   cmdtype1[0] = 0;
894   cmdtype2 = (char *) alloca (len + 4);
895   cmdtype2[0] = 0;
896   if (len)
897     {
898       cmdtype1[0] = ' ';
899       strncpy (cmdtype1 + 1, cmdtype, len - 1);
900       cmdtype1[len] = 0;
901       strncpy (cmdtype2, cmdtype, len - 1);
902       strcpy (cmdtype2 + len - 1, " sub");
903     }
904 
905   if (class == all_classes)
906     fprintf_filtered (stream, "List of classes of %scommands:\n\n", cmdtype2);
907   else
908     fprintf_filtered (stream, "List of %scommands:\n\n", cmdtype2);
909 
910   help_cmd_list (list, class, cmdtype, (int) class >= 0, stream);
911 
912   if (class == all_classes)
913     {
914       fprintf_filtered (stream, "\n\
915 Type \"help%s\" followed by a class name for a list of commands in ",
916 			cmdtype1);
917       wrap_here ("");
918       fprintf_filtered (stream, "that class.");
919 
920       fprintf_filtered (stream, "\n\
921 Type \"help all\" for the list of all commands.");
922     }
923 
924   fprintf_filtered (stream, "\nType \"help%s\" followed by %scommand name ",
925 		    cmdtype1, cmdtype2);
926   wrap_here ("");
927   fputs_filtered ("for ", stream);
928   wrap_here ("");
929   fputs_filtered ("full ", stream);
930   wrap_here ("");
931   fputs_filtered ("documentation.\n", stream);
932   fputs_filtered ("Type \"apropos word\" to search "
933 		  "for commands related to \"word\".\n", stream);
934   fputs_filtered ("Command name abbreviations are allowed if unambiguous.\n",
935 		  stream);
936 }
937 
938 static void
939 help_all (struct ui_file *stream)
940 {
941   struct cmd_list_element *c;
942   extern struct cmd_list_element *cmdlist;
943   int seen_unclassified = 0;
944 
945   for (c = cmdlist; c; c = c->next)
946     {
947       if (c->abbrev_flag)
948         continue;
949       /* If this is a class name, print all of the commands in the class */
950 
951       if (c->func == NULL)
952 	{
953 	  fprintf_filtered (stream, "\nCommand class: %s\n\n", c->name);
954 	  help_cmd_list (cmdlist, c->class, "", 1, stream);
955 	}
956     }
957 
958   /* While it's expected that all commands are in some class,
959      as a safety measure, we'll print commands outside of any
960      class at the end.  */
961 
962   for (c = cmdlist; c; c = c->next)
963     {
964       if (c->abbrev_flag)
965         continue;
966 
967       if (c->class == no_class)
968 	{
969 	  if (!seen_unclassified)
970 	    {
971 	      fprintf_filtered (stream, "\nUnclassified commands\n\n");
972 	      seen_unclassified = 1;
973 	    }
974 	  print_help_for_command (c, "", 1, stream);
975 	}
976     }
977 
978 }
979 
980 /* Print only the first line of STR on STREAM.  */
981 void
982 print_doc_line (struct ui_file *stream, char *str)
983 {
984   static char *line_buffer = 0;
985   static int line_size;
986   char *p;
987 
988   if (!line_buffer)
989     {
990       line_size = 80;
991       line_buffer = (char *) xmalloc (line_size);
992     }
993 
994   p = str;
995   while (*p && *p != '\n' && *p != '.' && *p != ',')
996     p++;
997   if (p - str > line_size - 1)
998     {
999       line_size = p - str + 1;
1000       xfree (line_buffer);
1001       line_buffer = (char *) xmalloc (line_size);
1002     }
1003   strncpy (line_buffer, str, p - str);
1004   line_buffer[p - str] = '\0';
1005   if (islower (line_buffer[0]))
1006     line_buffer[0] = toupper (line_buffer[0]);
1007   ui_out_text (uiout, line_buffer);
1008 }
1009 
1010 /* Print one-line help for command C.
1011    If RECURSE is non-zero, also print one-line descriptions
1012    of all prefixed subcommands. */
1013 static void
1014 print_help_for_command (struct cmd_list_element *c, char *prefix, int recurse,
1015 			struct ui_file *stream)
1016 {
1017   fprintf_filtered (stream, "%s%s -- ", prefix, c->name);
1018   print_doc_line (stream, c->doc);
1019   fputs_filtered ("\n", stream);
1020 
1021   if (recurse
1022       && c->prefixlist != 0
1023       && c->abbrev_flag == 0)
1024     /* Subcommands of a prefix command typically have 'all_commands'
1025        as class.  If we pass CLASS to recursive invocation,
1026        most often we won't see anything. */
1027     help_cmd_list (*c->prefixlist, all_commands, c->prefixname, 1, stream);
1028 }
1029 
1030 /*
1031  * Implement a help command on command list LIST.
1032  * RECURSE should be non-zero if this should be done recursively on
1033  * all sublists of LIST.
1034  * PREFIX is the prefix to print before each command name.
1035  * STREAM is the stream upon which the output should be written.
1036  * CLASS should be:
1037  *      A non-negative class number to list only commands in that
1038  * class.
1039  *      ALL_COMMANDS to list all commands in list.
1040  *      ALL_CLASSES  to list all classes in list.
1041  *
1042  *   Note that RECURSE will be active on *all* sublists, not just the
1043  * ones selected by the criteria above (ie. the selection mechanism
1044  * is at the low level, not the high-level).
1045  */
1046 void
1047 help_cmd_list (struct cmd_list_element *list, enum command_class class,
1048 	       char *prefix, int recurse, struct ui_file *stream)
1049 {
1050   struct cmd_list_element *c;
1051 
1052   for (c = list; c; c = c->next)
1053     {
1054       if (c->abbrev_flag == 0 &&
1055 	  (class == all_commands
1056 	   || (class == all_classes && c->func == NULL)
1057 	   || (class == c->class && c->func != NULL)))
1058 	{
1059 	  print_help_for_command (c, prefix, recurse, stream);
1060 	}
1061       else if (c->abbrev_flag == 0 && recurse
1062 	       && class == class_user && c->prefixlist != NULL)
1063 	/* User-defined commands may be subcommands.  */
1064 	help_cmd_list (*c->prefixlist, class, c->prefixname, recurse, stream);
1065     }
1066 }
1067 
1068 
1069 /* Search the input clist for 'command'.  Return the command if
1070    found (or NULL if not), and return the number of commands
1071    found in nfound */
1072 
1073 static struct cmd_list_element *
1074 find_cmd (char *command, int len, struct cmd_list_element *clist,
1075 	  int ignore_help_classes, int *nfound)
1076 {
1077   struct cmd_list_element *found, *c;
1078 
1079   found = (struct cmd_list_element *) NULL;
1080   *nfound = 0;
1081   for (c = clist; c; c = c->next)
1082     if (!strncmp (command, c->name, len)
1083 	&& (!ignore_help_classes || c->func))
1084       {
1085 	found = c;
1086 	(*nfound)++;
1087 	if (c->name[len] == '\0')
1088 	  {
1089 	    *nfound = 1;
1090 	    break;
1091 	  }
1092       }
1093   return found;
1094 }
1095 
1096 static int
1097 find_command_name_length (const char *text)
1098 {
1099   const char *p = text;
1100 
1101   /* Treating underscores as part of command words is important
1102      so that "set args_foo()" doesn't get interpreted as
1103      "set args _foo()".  */
1104   /* Some characters are only used for TUI specific commands. However, they
1105      are always allowed for the sake of consistency.
1106      The XDB compatibility characters are only allowed when using the right
1107      mode because they clash with other GDB commands - specifically '/' is
1108      used as a suffix for print, examine and display.
1109      Note that this is larger than the character set allowed when creating
1110      user-defined commands.  */
1111   while (isalnum (*p) || *p == '-' || *p == '_' ||
1112 	 /* Characters used by TUI specific commands.  */
1113 	 *p == '+' || *p == '<' || *p == '>' || *p == '$' ||
1114 	 /* Characters used for XDB compatibility.  */
1115 	 (xdb_commands && (*p == '!' || *p == '/' || *p == '?')))
1116     p++;
1117 
1118   return p - text;
1119 }
1120 
1121 /* This routine takes a line of TEXT and a CLIST in which to start the
1122    lookup.  When it returns it will have incremented the text pointer past
1123    the section of text it matched, set *RESULT_LIST to point to the list in
1124    which the last word was matched, and will return a pointer to the cmd
1125    list element which the text matches.  It will return NULL if no match at
1126    all was possible.  It will return -1 (cast appropriately, ick) if ambigous
1127    matches are possible; in this case *RESULT_LIST will be set to point to
1128    the list in which there are ambiguous choices (and *TEXT will be set to
1129    the ambiguous text string).
1130 
1131    If the located command was an abbreviation, this routine returns the base
1132    command of the abbreviation.
1133 
1134    It does no error reporting whatsoever; control will always return
1135    to the superior routine.
1136 
1137    In the case of an ambiguous return (-1), *RESULT_LIST will be set to point
1138    at the prefix_command (ie. the best match) *or* (special case) will be NULL
1139    if no prefix command was ever found.  For example, in the case of "info a",
1140    "info" matches without ambiguity, but "a" could be "args" or "address", so
1141    *RESULT_LIST is set to the cmd_list_element for "info".  So in this case
1142    RESULT_LIST should not be interpeted as a pointer to the beginning of a
1143    list; it simply points to a specific command.  In the case of an ambiguous
1144    return *TEXT is advanced past the last non-ambiguous prefix (e.g.
1145    "info t" can be "info types" or "info target"; upon return *TEXT has been
1146    advanced past "info ").
1147 
1148    If RESULT_LIST is NULL, don't set *RESULT_LIST (but don't otherwise
1149    affect the operation).
1150 
1151    This routine does *not* modify the text pointed to by TEXT.
1152 
1153    If IGNORE_HELP_CLASSES is nonzero, ignore any command list elements which
1154    are actually help classes rather than commands (i.e. the function field of
1155    the struct cmd_list_element is NULL).  */
1156 
1157 struct cmd_list_element *
1158 lookup_cmd_1 (char **text, struct cmd_list_element *clist,
1159 	      struct cmd_list_element **result_list, int ignore_help_classes)
1160 {
1161   char *command;
1162   int len, tmp, nfound;
1163   struct cmd_list_element *found, *c;
1164   char *line = *text;
1165 
1166   while (**text == ' ' || **text == '\t')
1167     (*text)++;
1168 
1169   /* Identify the name of the command.  */
1170   len = find_command_name_length (*text);
1171 
1172   /* If nothing but whitespace, return 0.  */
1173   if (len == 0)
1174     return 0;
1175 
1176   /* *text and p now bracket the first command word to lookup (and
1177      it's length is len).  We copy this into a local temporary */
1178 
1179 
1180   command = (char *) alloca (len + 1);
1181   memcpy (command, *text, len);
1182   command[len] = '\0';
1183 
1184   /* Look it up.  */
1185   found = 0;
1186   nfound = 0;
1187   found = find_cmd (command, len, clist, ignore_help_classes, &nfound);
1188 
1189   /*
1190      ** We didn't find the command in the entered case, so lower case it
1191      ** and search again.
1192    */
1193   if (!found || nfound == 0)
1194     {
1195       for (tmp = 0; tmp < len; tmp++)
1196 	{
1197 	  char x = command[tmp];
1198 	  command[tmp] = isupper (x) ? tolower (x) : x;
1199 	}
1200       found = find_cmd (command, len, clist, ignore_help_classes, &nfound);
1201     }
1202 
1203   /* If nothing matches, we have a simple failure.  */
1204   if (nfound == 0)
1205     return 0;
1206 
1207   if (nfound > 1)
1208     {
1209       if (result_list != NULL)
1210 	/* Will be modified in calling routine
1211 	   if we know what the prefix command is.  */
1212 	*result_list = 0;
1213       return (struct cmd_list_element *) -1;	/* Ambiguous.  */
1214     }
1215 
1216   /* We've matched something on this list.  Move text pointer forward. */
1217 
1218   *text += len;
1219 
1220   if (found->cmd_pointer)
1221     {
1222       /* We drop the alias (abbreviation) in favor of the command it is
1223        pointing to.  If the alias is deprecated, though, we need to
1224        warn the user about it before we drop it.  Note that while we
1225        are warning about the alias, we may also warn about the command
1226        itself and we will adjust the appropriate DEPRECATED_WARN_USER
1227        flags */
1228 
1229       if (found->flags & DEPRECATED_WARN_USER)
1230 	deprecated_cmd_warning (&line);
1231       found = found->cmd_pointer;
1232     }
1233   /* If we found a prefix command, keep looking.  */
1234 
1235   if (found->prefixlist)
1236     {
1237       c = lookup_cmd_1 (text, *found->prefixlist, result_list,
1238 			ignore_help_classes);
1239       if (!c)
1240 	{
1241 	  /* Didn't find anything; this is as far as we got.  */
1242 	  if (result_list != NULL)
1243 	    *result_list = clist;
1244 	  return found;
1245 	}
1246       else if (c == (struct cmd_list_element *) -1)
1247 	{
1248 	  /* We've gotten this far properly, but the next step
1249 	     is ambiguous.  We need to set the result list to the best
1250 	     we've found (if an inferior hasn't already set it).  */
1251 	  if (result_list != NULL)
1252 	    if (!*result_list)
1253 	      /* This used to say *result_list = *found->prefixlist
1254 	         If that was correct, need to modify the documentation
1255 	         at the top of this function to clarify what is supposed
1256 	         to be going on.  */
1257 	      *result_list = found;
1258 	  return c;
1259 	}
1260       else
1261 	{
1262 	  /* We matched!  */
1263 	  return c;
1264 	}
1265     }
1266   else
1267     {
1268       if (result_list != NULL)
1269 	*result_list = clist;
1270       return found;
1271     }
1272 }
1273 
1274 /* All this hair to move the space to the front of cmdtype */
1275 
1276 static void
1277 undef_cmd_error (char *cmdtype, char *q)
1278 {
1279   error (_("Undefined %scommand: \"%s\".  Try \"help%s%.*s\"."),
1280 	 cmdtype,
1281 	 q,
1282 	 *cmdtype ? " " : "",
1283 	 (int) strlen (cmdtype) - 1,
1284 	 cmdtype);
1285 }
1286 
1287 /* Look up the contents of *LINE as a command in the command list LIST.
1288    LIST is a chain of struct cmd_list_element's.
1289    If it is found, return the struct cmd_list_element for that command
1290    and update *LINE to point after the command name, at the first argument.
1291    If not found, call error if ALLOW_UNKNOWN is zero
1292    otherwise (or if error returns) return zero.
1293    Call error if specified command is ambiguous,
1294    unless ALLOW_UNKNOWN is negative.
1295    CMDTYPE precedes the word "command" in the error message.
1296 
1297    If INGNORE_HELP_CLASSES is nonzero, ignore any command list
1298    elements which are actually help classes rather than commands (i.e.
1299    the function field of the struct cmd_list_element is 0).  */
1300 
1301 struct cmd_list_element *
1302 lookup_cmd (char **line, struct cmd_list_element *list, char *cmdtype,
1303 	    int allow_unknown, int ignore_help_classes)
1304 {
1305   struct cmd_list_element *last_list = 0;
1306   struct cmd_list_element *c;
1307 
1308   /* Note: Do not remove trailing whitespace here because this
1309      would be wrong for complete_command.  Jim Kingdon  */
1310 
1311   if (!*line)
1312     error (_("Lack of needed %scommand"), cmdtype);
1313 
1314   c = lookup_cmd_1 (line, list, &last_list, ignore_help_classes);
1315 
1316   if (!c)
1317     {
1318       if (!allow_unknown)
1319 	{
1320 	  char *q;
1321 	  int len = find_command_name_length (*line);
1322 
1323 	  q = (char *) alloca (len + 1);
1324 	  strncpy (q, *line, len);
1325 	  q[len] = '\0';
1326 	  undef_cmd_error (cmdtype, q);
1327 	}
1328       else
1329 	return 0;
1330     }
1331   else if (c == (struct cmd_list_element *) -1)
1332     {
1333       /* Ambigous.  Local values should be off prefixlist or called
1334          values.  */
1335       int local_allow_unknown = (last_list ? last_list->allow_unknown :
1336 				 allow_unknown);
1337       char *local_cmdtype = last_list ? last_list->prefixname : cmdtype;
1338       struct cmd_list_element *local_list =
1339       (last_list ? *(last_list->prefixlist) : list);
1340 
1341       if (local_allow_unknown < 0)
1342 	{
1343 	  if (last_list)
1344 	    return last_list;	/* Found something.  */
1345 	  else
1346 	    return 0;		/* Found nothing.  */
1347 	}
1348       else
1349 	{
1350 	  /* Report as error.  */
1351 	  int amb_len;
1352 	  char ambbuf[100];
1353 
1354 	  for (amb_len = 0;
1355 	       ((*line)[amb_len] && (*line)[amb_len] != ' '
1356 		&& (*line)[amb_len] != '\t');
1357 	       amb_len++)
1358 	    ;
1359 
1360 	  ambbuf[0] = 0;
1361 	  for (c = local_list; c; c = c->next)
1362 	    if (!strncmp (*line, c->name, amb_len))
1363 	      {
1364 		if (strlen (ambbuf) + strlen (c->name) + 6 < (int) sizeof ambbuf)
1365 		  {
1366 		    if (strlen (ambbuf))
1367 		      strcat (ambbuf, ", ");
1368 		    strcat (ambbuf, c->name);
1369 		  }
1370 		else
1371 		  {
1372 		    strcat (ambbuf, "..");
1373 		    break;
1374 		  }
1375 	      }
1376 	  error (_("Ambiguous %scommand \"%s\": %s."), local_cmdtype,
1377 		 *line, ambbuf);
1378 	  return 0;		/* lint */
1379 	}
1380     }
1381   else
1382     {
1383       /* We've got something.  It may still not be what the caller
1384          wants (if this command *needs* a subcommand).  */
1385       while (**line == ' ' || **line == '\t')
1386 	(*line)++;
1387 
1388       if (c->prefixlist && **line && !c->allow_unknown)
1389 	undef_cmd_error (c->prefixname, *line);
1390 
1391       /* Seems to be what he wants.  Return it.  */
1392       return c;
1393     }
1394   return 0;
1395 }
1396 
1397 /* We are here presumably because an alias or command in *TEXT is
1398    deprecated and a warning message should be generated.  This function
1399    decodes *TEXT and potentially generates a warning message as outlined
1400    below.
1401 
1402    Example for 'set endian big' which has a fictitious alias 'seb'.
1403 
1404    If alias wasn't used in *TEXT, and the command is deprecated:
1405    "warning: 'set endian big' is deprecated."
1406 
1407    If alias was used, and only the alias is deprecated:
1408    "warning: 'seb' an alias for the command 'set endian big' is deprecated."
1409 
1410    If alias was used and command is deprecated (regardless of whether the
1411    alias itself is deprecated:
1412 
1413    "warning: 'set endian big' (seb) is deprecated."
1414 
1415    After the message has been sent, clear the appropriate flags in the
1416    command and/or the alias so the user is no longer bothered.
1417 
1418 */
1419 void
1420 deprecated_cmd_warning (char **text)
1421 {
1422   struct cmd_list_element *alias = NULL;
1423   struct cmd_list_element *prefix_cmd = NULL;
1424   struct cmd_list_element *cmd = NULL;
1425   struct cmd_list_element *c;
1426   char *type;
1427 
1428   if (!lookup_cmd_composition (*text, &alias, &prefix_cmd, &cmd))
1429     /* return if text doesn't evaluate to a command */
1430     return;
1431 
1432   if (!((alias ? (alias->flags & DEPRECATED_WARN_USER) : 0)
1433       || (cmd->flags & DEPRECATED_WARN_USER) ) )
1434     /* return if nothing is deprecated */
1435     return;
1436 
1437   printf_filtered ("Warning:");
1438 
1439   if (alias && !(cmd->flags & CMD_DEPRECATED))
1440     printf_filtered (" '%s', an alias for the", alias->name);
1441 
1442   printf_filtered (" command '");
1443 
1444   if (prefix_cmd)
1445     printf_filtered ("%s", prefix_cmd->prefixname);
1446 
1447   printf_filtered ("%s", cmd->name);
1448 
1449   if (alias && (cmd->flags & CMD_DEPRECATED))
1450     printf_filtered ("' (%s) is deprecated.\n", alias->name);
1451   else
1452     printf_filtered ("' is deprecated.\n");
1453 
1454 
1455   /* if it is only the alias that is deprecated, we want to indicate the
1456      new alias, otherwise we'll indicate the new command */
1457 
1458   if (alias && !(cmd->flags & CMD_DEPRECATED))
1459     {
1460       if (alias->replacement)
1461       printf_filtered ("Use '%s'.\n\n", alias->replacement);
1462       else
1463       printf_filtered ("No alternative known.\n\n");
1464      }
1465   else
1466     {
1467       if (cmd->replacement)
1468       printf_filtered ("Use '%s'.\n\n", cmd->replacement);
1469       else
1470       printf_filtered ("No alternative known.\n\n");
1471     }
1472 
1473   /* We've warned you, now we'll keep quiet */
1474   if (alias)
1475     alias->flags &= ~DEPRECATED_WARN_USER;
1476 
1477   cmd->flags &= ~DEPRECATED_WARN_USER;
1478 }
1479 
1480 
1481 
1482 /* Look up the contents of LINE as a command in the command list 'cmdlist'.
1483    Return 1 on success, 0 on failure.
1484 
1485    If LINE refers to an alias, *alias will point to that alias.
1486 
1487    If LINE is a postfix command (i.e. one that is preceeded by a prefix
1488    command) set *prefix_cmd.
1489 
1490    Set *cmd to point to the command LINE indicates.
1491 
1492    If any of *alias, *prefix_cmd, or *cmd cannot be determined or do not
1493    exist, they are NULL when we return.
1494 
1495 */
1496 int
1497 lookup_cmd_composition (char *text,
1498                       struct cmd_list_element **alias,
1499                       struct cmd_list_element **prefix_cmd,
1500                       struct cmd_list_element **cmd)
1501 {
1502   char *command;
1503   int len, tmp, nfound;
1504   struct cmd_list_element *cur_list;
1505   struct cmd_list_element *prev_cmd;
1506   *alias = NULL;
1507   *prefix_cmd = NULL;
1508   *cmd = NULL;
1509 
1510   cur_list = cmdlist;
1511 
1512   while (1)
1513     {
1514       /* Go through as many command lists as we need to
1515        to find the command TEXT refers to. */
1516 
1517       prev_cmd = *cmd;
1518 
1519       while (*text == ' ' || *text == '\t')
1520       (text)++;
1521 
1522       /* Identify the name of the command.  */
1523       len = find_command_name_length (text);
1524 
1525       /* If nothing but whitespace, return.  */
1526       if (len == 0)
1527 	return 0;
1528 
1529       /* text is the start of the first command word to lookup (and
1530        it's length is len).  We copy this into a local temporary */
1531 
1532       command = (char *) alloca (len + 1);
1533       memcpy (command, text, len);
1534       command[len] = '\0';
1535 
1536       /* Look it up.  */
1537       *cmd = 0;
1538       nfound = 0;
1539       *cmd = find_cmd (command, len, cur_list, 1, &nfound);
1540 
1541       /* We didn't find the command in the entered case, so lower case it
1542        and search again.
1543       */
1544       if (!*cmd || nfound == 0)
1545       {
1546         for (tmp = 0; tmp < len; tmp++)
1547           {
1548             char x = command[tmp];
1549             command[tmp] = isupper (x) ? tolower (x) : x;
1550           }
1551         *cmd = find_cmd (command, len, cur_list, 1, &nfound);
1552       }
1553 
1554       if (*cmd == (struct cmd_list_element *) -1)
1555       {
1556         return 0;              /* ambiguous */
1557       }
1558 
1559       if (*cmd == NULL)
1560       return 0;                /* nothing found */
1561       else
1562       {
1563         if ((*cmd)->cmd_pointer)
1564           {
1565             /* cmd was actually an alias, we note that an alias was used
1566                (by assigning *alais) and we set *cmd.
1567              */
1568             *alias = *cmd;
1569             *cmd = (*cmd)->cmd_pointer;
1570           }
1571         *prefix_cmd = prev_cmd;
1572       }
1573       if ((*cmd)->prefixlist)
1574       cur_list = *(*cmd)->prefixlist;
1575       else
1576       return 1;
1577 
1578       text += len;
1579     }
1580 }
1581 
1582 /* Helper function for SYMBOL_COMPLETION_FUNCTION.  */
1583 
1584 /* Return a vector of char pointers which point to the different
1585    possible completions in LIST of TEXT.
1586 
1587    WORD points in the same buffer as TEXT, and completions should be
1588    returned relative to this position.  For example, suppose TEXT is "foo"
1589    and we want to complete to "foobar".  If WORD is "oo", return
1590    "oobar"; if WORD is "baz/foo", return "baz/foobar".  */
1591 
1592 char **
1593 complete_on_cmdlist (struct cmd_list_element *list, char *text, char *word)
1594 {
1595   struct cmd_list_element *ptr;
1596   char **matchlist;
1597   int sizeof_matchlist;
1598   int matches;
1599   int textlen = strlen (text);
1600 
1601   sizeof_matchlist = 10;
1602   matchlist = (char **) xmalloc (sizeof_matchlist * sizeof (char *));
1603   matches = 0;
1604 
1605   for (ptr = list; ptr; ptr = ptr->next)
1606     if (!strncmp (ptr->name, text, textlen)
1607 	&& !ptr->abbrev_flag
1608 	&& (ptr->func
1609 	    || ptr->prefixlist))
1610       {
1611 	if (matches == sizeof_matchlist)
1612 	  {
1613 	    sizeof_matchlist *= 2;
1614 	    matchlist = (char **) xrealloc ((char *) matchlist,
1615 					    (sizeof_matchlist
1616 					     * sizeof (char *)));
1617 	  }
1618 
1619 	matchlist[matches] = (char *)
1620 	  xmalloc (strlen (word) + strlen (ptr->name) + 1);
1621 	if (word == text)
1622 	  strcpy (matchlist[matches], ptr->name);
1623 	else if (word > text)
1624 	  {
1625 	    /* Return some portion of ptr->name.  */
1626 	    strcpy (matchlist[matches], ptr->name + (word - text));
1627 	  }
1628 	else
1629 	  {
1630 	    /* Return some of text plus ptr->name.  */
1631 	    strncpy (matchlist[matches], word, text - word);
1632 	    matchlist[matches][text - word] = '\0';
1633 	    strcat (matchlist[matches], ptr->name);
1634 	  }
1635 	++matches;
1636       }
1637 
1638   if (matches == 0)
1639     {
1640       xfree (matchlist);
1641       matchlist = 0;
1642     }
1643   else
1644     {
1645       matchlist = (char **) xrealloc ((char *) matchlist, ((matches + 1)
1646 							* sizeof (char *)));
1647       matchlist[matches] = (char *) 0;
1648     }
1649 
1650   return matchlist;
1651 }
1652 
1653 /* Helper function for SYMBOL_COMPLETION_FUNCTION.  */
1654 
1655 /* Return a vector of char pointers which point to the different
1656    possible completions in CMD of TEXT.
1657 
1658    WORD points in the same buffer as TEXT, and completions should be
1659    returned relative to this position.  For example, suppose TEXT is "foo"
1660    and we want to complete to "foobar".  If WORD is "oo", return
1661    "oobar"; if WORD is "baz/foo", return "baz/foobar".  */
1662 
1663 char **
1664 complete_on_enum (const char *enumlist[],
1665 		  char *text,
1666 		  char *word)
1667 {
1668   char **matchlist;
1669   int sizeof_matchlist;
1670   int matches;
1671   int textlen = strlen (text);
1672   int i;
1673   const char *name;
1674 
1675   sizeof_matchlist = 10;
1676   matchlist = (char **) xmalloc (sizeof_matchlist * sizeof (char *));
1677   matches = 0;
1678 
1679   for (i = 0; (name = enumlist[i]) != NULL; i++)
1680     if (strncmp (name, text, textlen) == 0)
1681       {
1682 	if (matches == sizeof_matchlist)
1683 	  {
1684 	    sizeof_matchlist *= 2;
1685 	    matchlist = (char **) xrealloc ((char *) matchlist,
1686 					    (sizeof_matchlist
1687 					     * sizeof (char *)));
1688 	  }
1689 
1690 	matchlist[matches] = (char *)
1691 	  xmalloc (strlen (word) + strlen (name) + 1);
1692 	if (word == text)
1693 	  strcpy (matchlist[matches], name);
1694 	else if (word > text)
1695 	  {
1696 	    /* Return some portion of name.  */
1697 	    strcpy (matchlist[matches], name + (word - text));
1698 	  }
1699 	else
1700 	  {
1701 	    /* Return some of text plus name.  */
1702 	    strncpy (matchlist[matches], word, text - word);
1703 	    matchlist[matches][text - word] = '\0';
1704 	    strcat (matchlist[matches], name);
1705 	  }
1706 	++matches;
1707       }
1708 
1709   if (matches == 0)
1710     {
1711       xfree (matchlist);
1712       matchlist = 0;
1713     }
1714   else
1715     {
1716       matchlist = (char **) xrealloc ((char *) matchlist, ((matches + 1)
1717 							* sizeof (char *)));
1718       matchlist[matches] = (char *) 0;
1719     }
1720 
1721   return matchlist;
1722 }
1723 
1724 
1725 /* check function pointer */
1726 int
1727 cmd_func_p (struct cmd_list_element *cmd)
1728 {
1729   return (cmd->func != NULL);
1730 }
1731 
1732 
1733 /* call the command function */
1734 void
1735 cmd_func (struct cmd_list_element *cmd, char *args, int from_tty)
1736 {
1737   if (cmd_func_p (cmd))
1738     (*cmd->func) (cmd, args, from_tty);
1739   else
1740     error (_("Invalid command"));
1741 }
1742