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