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