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