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