1 /* Handle lists of commands, their decoding and documentation, for GDB.
3 Copyright 1986, 1989, 1990, 1991, 1998, 2000, 2001, 2002, 2004 Free
4 Software Foundation, Inc.
6 This program is free software; you can redistribute it and/or modify
7 it under the terms of the GNU General Public License as published by
8 the Free Software Foundation; either version 2 of the License, or
9 (at your option) any later version.
11 This program is distributed in the hope that it will be useful,
12 but WITHOUT ANY WARRANTY; without even the implied warranty of
13 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 GNU General Public License for more details.
16 You should have received a copy of the GNU General Public License
17 along with this program; if not, write to the Free Software
18 Foundation, Inc., 59 Temple Place - Suite 330,
19 Boston, MA 02111-1307, USA. */
24 #include "gdb_regex.h"
25 #include "gdb_string.h"
29 #include "cli/cli-cmds.h"
30 #include "cli/cli-decode.h"
33 #include "tui/tui.h" /* For tui_active et.al. */
36 #include "gdb_assert.h"
38 /* Prototypes for local functions */
40 static void undef_cmd_error (char *, char *);
42 static struct cmd_list_element *find_cmd (char *command,
44 struct cmd_list_element *clist,
45 int ignore_help_classes,
48 static void help_all (struct ui_file *stream);
50 /* Set the callback function for the specified command. For each both
51 the commands callback and func() are set. The latter set to a
52 bounce function (unless cfunc / sfunc is NULL that is). */
55 do_cfunc (struct cmd_list_element *c, char *args, int from_tty)
57 c->function.cfunc (args, from_tty); /* Ok. */
61 set_cmd_cfunc (struct cmd_list_element *cmd, cmd_cfunc_ftype *cfunc)
67 cmd->function.cfunc = cfunc; /* Ok. */
71 do_sfunc (struct cmd_list_element *c, char *args, int from_tty)
73 c->function.sfunc (args, from_tty, c); /* Ok. */
77 set_cmd_sfunc (struct cmd_list_element *cmd, cmd_sfunc_ftype *sfunc)
83 cmd->function.sfunc = sfunc; /* Ok. */
87 cmd_cfunc_eq (struct cmd_list_element *cmd,
88 void (*cfunc) (char *args, int from_tty))
90 return cmd->func == do_cfunc && cmd->function.cfunc == cfunc;
94 set_cmd_context (struct cmd_list_element *cmd, void *context)
96 cmd->context = context;
100 get_cmd_context (struct cmd_list_element *cmd)
106 cmd_type (struct cmd_list_element *cmd)
112 set_cmd_completer (struct cmd_list_element *cmd,
113 char **(*completer) (char *text, char *word))
115 cmd->completer = completer; /* Ok. */
119 /* Add element named NAME.
120 CLASS is the top level category into which commands are broken down
122 FUN should be the function to execute the command;
123 it will get a character string as argument, with leading
124 and trailing blanks already eliminated.
126 DOC is a documentation string for the command.
127 Its first line should be a complete sentence.
128 It should start with ? for a command that is an abbreviation
129 or with * for a command that most users don't need to know about.
131 Add this command to command list *LIST.
133 Returns a pointer to the added command (not necessarily the head
136 struct cmd_list_element *
137 add_cmd (char *name, enum command_class class, void (*fun) (char *, int),
138 char *doc, struct cmd_list_element **list)
140 struct cmd_list_element *c
141 = (struct cmd_list_element *) xmalloc (sizeof (struct cmd_list_element));
142 struct cmd_list_element *p;
144 delete_cmd (name, list);
146 if (*list == NULL || strcmp ((*list)->name, name) >= 0)
154 while (p->next && strcmp (p->next->name, name) <= 0)
164 set_cmd_cfunc (c, fun);
165 set_cmd_context (c, NULL);
168 c->replacement = NULL;
169 c->pre_show_hook = NULL;
173 c->prefixlist = NULL;
174 c->prefixname = NULL;
175 c->allow_unknown = 0;
177 set_cmd_completer (c, make_symbol_completion_list);
178 c->type = not_set_cmd;
180 c->var_type = var_boolean;
182 c->user_commands = NULL;
183 c->hookee_pre = NULL;
184 c->hookee_post = NULL;
185 c->cmd_pointer = NULL;
190 /* Deprecates a command CMD.
191 REPLACEMENT is the name of the command which should be used in place
192 of this command, or NULL if no such command exists.
194 This function does not check to see if command REPLACEMENT exists
195 since gdb may not have gotten around to adding REPLACEMENT when this
198 Returns a pointer to the deprecated command. */
200 struct cmd_list_element *
201 deprecate_cmd (struct cmd_list_element *cmd, char *replacement)
203 cmd->flags |= (CMD_DEPRECATED | DEPRECATED_WARN_USER);
205 if (replacement != NULL)
206 cmd->replacement = replacement;
208 cmd->replacement = NULL;
213 struct cmd_list_element *
214 add_alias_cmd (char *name, char *oldname, enum command_class class,
215 int abbrev_flag, struct cmd_list_element **list)
217 /* Must do this since lookup_cmd tries to side-effect its first arg */
219 struct cmd_list_element *old;
220 struct cmd_list_element *c;
221 copied_name = (char *) alloca (strlen (oldname) + 1);
222 strcpy (copied_name, oldname);
223 old = lookup_cmd (&copied_name, *list, "", 1, 1);
227 delete_cmd (name, list);
231 c = add_cmd (name, class, NULL, old->doc, list);
232 /* NOTE: Both FUNC and all the FUNCTIONs need to be copied. */
234 c->function = old->function;
235 c->prefixlist = old->prefixlist;
236 c->prefixname = old->prefixname;
237 c->allow_unknown = old->allow_unknown;
238 c->abbrev_flag = abbrev_flag;
239 c->cmd_pointer = old;
243 /* Like add_cmd but adds an element for a command prefix:
244 a name that should be followed by a subcommand to be looked up
245 in another command list. PREFIXLIST should be the address
246 of the variable containing that list. */
248 struct cmd_list_element *
249 add_prefix_cmd (char *name, enum command_class class, void (*fun) (char *, int),
250 char *doc, struct cmd_list_element **prefixlist,
251 char *prefixname, int allow_unknown,
252 struct cmd_list_element **list)
254 struct cmd_list_element *c = add_cmd (name, class, fun, doc, list);
255 c->prefixlist = prefixlist;
256 c->prefixname = prefixname;
257 c->allow_unknown = allow_unknown;
261 /* Like add_prefix_cmd but sets the abbrev_flag on the new command. */
263 struct cmd_list_element *
264 add_abbrev_prefix_cmd (char *name, enum command_class class,
265 void (*fun) (char *, int), char *doc,
266 struct cmd_list_element **prefixlist, char *prefixname,
267 int allow_unknown, struct cmd_list_element **list)
269 struct cmd_list_element *c = add_cmd (name, class, fun, doc, list);
270 c->prefixlist = prefixlist;
271 c->prefixname = prefixname;
272 c->allow_unknown = allow_unknown;
277 /* This is an empty "cfunc". */
279 not_just_help_class_command (char *args, int from_tty)
283 /* This is an empty "sfunc". */
284 static void empty_sfunc (char *, int, struct cmd_list_element *);
287 empty_sfunc (char *args, int from_tty, struct cmd_list_element *c)
291 /* Add element named NAME to command list LIST (the list for set/show
292 or some sublist thereof).
293 TYPE is set_cmd or show_cmd.
294 CLASS is as in add_cmd.
295 VAR_TYPE is the kind of thing we are setting.
296 VAR is address of the variable being controlled by this command.
297 DOC is the documentation string. */
299 static struct cmd_list_element *
300 add_set_or_show_cmd (char *name,
302 enum command_class class,
306 struct cmd_list_element **list)
308 struct cmd_list_element *c = add_cmd (name, class, NULL, doc, list);
309 gdb_assert (type == set_cmd || type == show_cmd);
311 c->var_type = var_type;
313 /* This needs to be something besides NULL so that this isn't
314 treated as a help class. */
315 set_cmd_sfunc (c, empty_sfunc);
319 /* Add element named NAME to both the command SET_LIST and SHOW_LIST.
320 CLASS is as in add_cmd. VAR_TYPE is the kind of thing we are
321 setting. VAR is address of the variable being controlled by this
322 command. SET_FUNC and SHOW_FUNC are the callback functions (if
323 non-NULL). SET_DOC, SHOW_DOC and HELP_DOC are the documentation
324 strings. PRINT the format string to print the value. SET_RESULT
325 and SHOW_RESULT, if not NULL, are set to the resulting command
329 add_setshow_cmd_full (char *name,
330 enum command_class class,
331 var_types var_type, void *var,
332 const char *set_doc, const char *show_doc,
333 const char *help_doc, const char *print,
334 cmd_sfunc_ftype *set_func,
335 cmd_sfunc_ftype *show_func,
336 struct cmd_list_element **set_list,
337 struct cmd_list_element **show_list,
338 struct cmd_list_element **set_result,
339 struct cmd_list_element **show_result)
341 struct cmd_list_element *set;
342 struct cmd_list_element *show;
346 if (help_doc != NULL)
348 full_set_doc = xstrprintf ("%s\n%s", set_doc, help_doc);
349 full_show_doc = xstrprintf ("%s\n%s", show_doc, help_doc);
353 full_set_doc = xstrdup (set_doc);
354 full_show_doc = xstrdup (show_doc);
356 set = add_set_or_show_cmd (name, set_cmd, class, var_type, var,
357 full_set_doc, set_list);
358 if (set_func != NULL)
359 set_cmd_sfunc (set, set_func);
360 show = add_set_or_show_cmd (name, show_cmd, class, var_type, var,
361 full_show_doc, show_list);
362 if (show_func != NULL)
363 set_cmd_sfunc (show, show_func);
365 if (set_result != NULL)
367 if (show_result != NULL)
371 struct cmd_list_element *
372 add_set_cmd (char *name,
373 enum command_class class,
377 struct cmd_list_element **list)
379 return add_set_or_show_cmd (name, set_cmd, class, var_type, var, doc, list);
382 /* Add element named NAME to command list LIST (the list for set
383 or some sublist thereof).
384 CLASS is as in add_cmd.
385 ENUMLIST is a list of strings which may follow NAME.
386 VAR is address of the variable which will contain the matching string
388 DOC is the documentation string. */
390 struct cmd_list_element *
391 add_set_enum_cmd (char *name,
392 enum command_class class,
393 const char *enumlist[],
396 struct cmd_list_element **list)
398 struct cmd_list_element *c
399 = add_set_cmd (name, class, var_enum, var, doc, list);
405 /* Add element named NAME to command list LIST (the list for set or
406 some sublist thereof). CLASS is as in add_cmd. ENUMLIST is a list
407 of strings which may follow NAME. VAR is address of the variable
408 which will contain the matching string (from ENUMLIST). */
411 add_setshow_enum_cmd (char *name,
412 enum command_class class,
413 const char *enumlist[],
416 const char *show_doc,
417 const char *help_doc,
419 cmd_sfunc_ftype *set_func,
420 cmd_sfunc_ftype *show_func,
421 struct cmd_list_element **set_list,
422 struct cmd_list_element **show_list)
424 struct cmd_list_element *c;
425 add_setshow_cmd_full (name, class, var_enum, var,
426 set_doc, show_doc, help_doc, print,
433 /* Add an auto-boolean command named NAME to both the set and show
434 command list lists. CLASS is as in add_cmd. VAR is address of the
435 variable which will contain the value. DOC is the documentation
436 string. FUNC is the corresponding callback. */
438 add_setshow_auto_boolean_cmd (char *name,
439 enum command_class class,
440 enum auto_boolean *var,
441 const char *set_doc, const char *show_doc,
442 const char *help_doc, const char *print,
443 cmd_sfunc_ftype *set_func,
444 cmd_sfunc_ftype *show_func,
445 struct cmd_list_element **set_list,
446 struct cmd_list_element **show_list)
448 static const char *auto_boolean_enums[] = { "on", "off", "auto", NULL };
449 struct cmd_list_element *c;
450 add_setshow_cmd_full (name, class, var_auto_boolean, var,
451 set_doc, show_doc, help_doc, print,
455 c->enums = auto_boolean_enums;
458 /* Add element named NAME to both the set and show command LISTs (the
459 list for set/show or some sublist thereof). CLASS is as in
460 add_cmd. VAR is address of the variable which will contain the
461 value. SET_DOC and SHOW_DOC are the documentation strings. */
463 add_setshow_boolean_cmd (char *name, enum command_class class, int *var,
464 const char *set_doc, const char *show_doc,
465 const char *help_doc, const char *print,
466 cmd_sfunc_ftype *set_func,
467 cmd_sfunc_ftype *show_func,
468 struct cmd_list_element **set_list,
469 struct cmd_list_element **show_list)
471 static const char *boolean_enums[] = { "on", "off", NULL };
472 struct cmd_list_element *c;
473 add_setshow_cmd_full (name, class, var_boolean, var,
474 set_doc, show_doc, help_doc, print,
478 c->enums = boolean_enums;
481 /* Add element named NAME to both the set and show command LISTs (the
482 list for set/show or some sublist thereof). */
484 add_setshow_filename_cmd (char *name, enum command_class class,
486 const char *set_doc, const char *show_doc,
487 const char *help_doc, const char *print,
488 cmd_sfunc_ftype *set_func,
489 cmd_sfunc_ftype *show_func,
490 struct cmd_list_element **set_list,
491 struct cmd_list_element **show_list)
493 add_setshow_cmd_full (name, class, var_filename, var,
494 set_doc, show_doc, help_doc, print,
500 /* Add element named NAME to both the set and show command LISTs (the
501 list for set/show or some sublist thereof). */
503 add_setshow_string_cmd (char *name, enum command_class class,
505 const char *set_doc, const char *show_doc,
506 const char *help_doc, const char *print,
507 cmd_sfunc_ftype *set_func,
508 cmd_sfunc_ftype *show_func,
509 struct cmd_list_element **set_list,
510 struct cmd_list_element **show_list)
512 add_setshow_cmd_full (name, class, var_string, var,
513 set_doc, show_doc, help_doc, print,
519 /* Add element named NAME to both the set and show command LISTs (the
520 list for set/show or some sublist thereof). CLASS is as in
521 add_cmd. VAR is address of the variable which will contain the
522 value. SET_DOC and SHOW_DOC are the documentation strings. */
524 add_setshow_uinteger_cmd (char *name, enum command_class class,
526 const char *set_doc, const char *show_doc,
527 const char *help_doc, const char *print,
528 cmd_sfunc_ftype *set_func,
529 cmd_sfunc_ftype *show_func,
530 struct cmd_list_element **set_list,
531 struct cmd_list_element **show_list)
533 add_setshow_cmd_full (name, class, var_uinteger, var,
534 set_doc, show_doc, help_doc, print,
540 /* Add element named NAME to both the set and show command LISTs (the
541 list for set/show or some sublist thereof). CLASS is as in
542 add_cmd. VAR is address of the variable which will contain the
543 value. SET_DOC and SHOW_DOC are the documentation strings. */
545 add_setshow_zinteger_cmd (char *name, enum command_class class,
547 const char *set_doc, const char *show_doc,
548 const char *help_doc, const char *print,
549 cmd_sfunc_ftype *set_func,
550 cmd_sfunc_ftype *show_func,
551 struct cmd_list_element **set_list,
552 struct cmd_list_element **show_list)
554 add_setshow_cmd_full (name, class, var_zinteger, var,
555 set_doc, show_doc, help_doc, print,
561 /* Where SETCMD has already been added, add the corresponding show
562 command to LIST and return a pointer to the added command (not
563 necessarily the head of LIST). */
564 /* NOTE: cagney/2002-03-17: The original version of
565 deprecated_add_show_from_set used memcpy() to clone `set' into
566 `show'. This meant that in addition to all the needed fields (var,
567 name, et.al.) some unnecessary fields were copied (namely the
568 callback function). The function explictly copies relevant fields.
569 For a `set' and `show' command to share the same callback, the
570 caller must set both explicitly. */
571 struct cmd_list_element *
572 deprecated_add_show_from_set (struct cmd_list_element *setcmd,
573 struct cmd_list_element **list)
576 const static char setstring[] = "Set ";
578 /* Create a doc string by replacing "Set " at the start of the
579 `set'' command's doco with "Show ". */
580 gdb_assert (strncmp (setcmd->doc, setstring, sizeof (setstring) - 1) == 0);
581 doc = concat ("Show ", setcmd->doc + sizeof (setstring) - 1, NULL);
583 /* Insert the basic command. */
584 return add_set_or_show_cmd (setcmd->name, show_cmd, setcmd->class,
585 setcmd->var_type, setcmd->var, doc, list);
588 /* Remove the command named NAME from the command list. */
591 delete_cmd (char *name, struct cmd_list_element **list)
593 struct cmd_list_element *c;
594 struct cmd_list_element *p;
596 while (*list && strcmp ((*list)->name, name) == 0)
598 if ((*list)->hookee_pre)
599 (*list)->hookee_pre->hook_pre = 0; /* Hook slips out of its mouth */
600 if ((*list)->hookee_post)
601 (*list)->hookee_post->hook_post = 0; /* Hook slips out of its bottom */
608 for (c = *list; c->next;)
610 if (strcmp (c->next->name, name) == 0)
612 if (c->next->hookee_pre)
613 c->next->hookee_pre->hook_pre = 0; /* hooked cmd gets away. */
614 if (c->next->hookee_post)
615 c->next->hookee_post->hook_post = 0; /* remove post hook */
616 /* :( no fishing metaphore */
626 /* Shorthands to the commands above. */
628 /* Add an element to the list of info subcommands. */
630 struct cmd_list_element *
631 add_info (char *name, void (*fun) (char *, int), char *doc)
633 return add_cmd (name, no_class, fun, doc, &infolist);
636 /* Add an alias to the list of info subcommands. */
638 struct cmd_list_element *
639 add_info_alias (char *name, char *oldname, int abbrev_flag)
641 return add_alias_cmd (name, oldname, 0, abbrev_flag, &infolist);
644 /* Add an element to the list of commands. */
646 struct cmd_list_element *
647 add_com (char *name, enum command_class class, void (*fun) (char *, int),
650 return add_cmd (name, class, fun, doc, &cmdlist);
653 /* Add an alias or abbreviation command to the list of commands. */
655 struct cmd_list_element *
656 add_com_alias (char *name, char *oldname, enum command_class class,
659 return add_alias_cmd (name, oldname, class, abbrev_flag, &cmdlist);
662 /* Recursively walk the commandlist structures, and print out the
663 documentation of commands that match our regex in either their
664 name, or their documentation.
667 apropos_cmd (struct ui_file *stream, struct cmd_list_element *commandlist,
668 struct re_pattern_buffer *regex, char *prefix)
670 struct cmd_list_element *c;
671 int returnvalue=1; /*Needed to avoid double printing*/
672 /* Walk through the commands */
673 for (c=commandlist;c;c=c->next)
677 /* Try to match against the name*/
678 returnvalue=re_search(regex,c->name,strlen(c->name),0,strlen(c->name),NULL);
679 if (returnvalue >= 0)
681 /* Stolen from help_cmd_list. We don't directly use
682 * help_cmd_list because it doesn't let us print out
685 fprintf_filtered (stream, "%s%s -- ", prefix, c->name);
686 print_doc_line (stream, c->doc);
687 fputs_filtered ("\n", stream);
688 returnvalue=0; /*Set this so we don't print it again.*/
691 if (c->doc != NULL && returnvalue != 0)
693 /* Try to match against documentation */
694 if (re_search(regex,c->doc,strlen(c->doc),0,strlen(c->doc),NULL) >=0)
696 /* Stolen from help_cmd_list. We don't directly use
697 * help_cmd_list because it doesn't let us print out
700 fprintf_filtered (stream, "%s%s -- ", prefix, c->name);
701 print_doc_line (stream, c->doc);
702 fputs_filtered ("\n", stream);
705 /* Check if this command has subcommands */
706 if (c->prefixlist != NULL)
708 /* Recursively call ourselves on the subcommand list,
709 passing the right prefix in.
711 apropos_cmd (stream,*c->prefixlist,regex,c->prefixname);
716 /* This command really has to deal with two things:
717 * 1) I want documentation on *this string* (usually called by
718 * "help commandname").
719 * 2) I want documentation on *this list* (usually called by
720 * giving a command that requires subcommands. Also called by saying
723 * I am going to split this into two seperate comamnds, help_cmd and
728 help_cmd (char *command, struct ui_file *stream)
730 struct cmd_list_element *c;
731 extern struct cmd_list_element *cmdlist;
735 help_list (cmdlist, "", all_classes, stream);
739 if (strcmp (command, "all") == 0)
745 c = lookup_cmd (&command, cmdlist, "", 0, 0);
750 /* There are three cases here.
751 If c->prefixlist is nonzero, we have a prefix command.
752 Print its documentation, then list its subcommands.
754 If c->func is non NULL, we really have a command. Print its
755 documentation and return.
757 If c->func is NULL, we have a class name. Print its
758 documentation (as if it were a command) and then set class to the
759 number of this class so that the commands in the class will be
762 fputs_filtered (c->doc, stream);
763 fputs_filtered ("\n", stream);
765 if (c->prefixlist == 0 && c->func != NULL)
767 fprintf_filtered (stream, "\n");
769 /* If this is a prefix command, print it's subcommands */
771 help_list (*c->prefixlist, c->prefixname, all_commands, stream);
773 /* If this is a class name, print all of the commands in the class */
775 help_list (cmdlist, "", c->class, stream);
777 if (c->hook_pre || c->hook_post)
778 fprintf_filtered (stream,
779 "\nThis command has a hook (or hooks) defined:\n");
782 fprintf_filtered (stream,
783 "\tThis command is run after : %s (pre hook)\n",
786 fprintf_filtered (stream,
787 "\tThis command is run before : %s (post hook)\n",
792 * Get a specific kind of help on a command list.
795 * CMDTYPE is the prefix to use in the title string.
796 * CLASS is the class with which to list the nodes of this list (see
797 * documentation for help_cmd_list below), As usual, ALL_COMMANDS for
798 * everything, ALL_CLASSES for just classes, and non-negative for only things
799 * in a specific class.
800 * and STREAM is the output stream on which to print things.
801 * If you call this routine with a class >= 0, it recurses.
804 help_list (struct cmd_list_element *list, char *cmdtype,
805 enum command_class class, struct ui_file *stream)
808 char *cmdtype1, *cmdtype2;
810 /* If CMDTYPE is "foo ", CMDTYPE1 gets " foo" and CMDTYPE2 gets "foo sub" */
811 len = strlen (cmdtype);
812 cmdtype1 = (char *) alloca (len + 1);
814 cmdtype2 = (char *) alloca (len + 4);
819 strncpy (cmdtype1 + 1, cmdtype, len - 1);
821 strncpy (cmdtype2, cmdtype, len - 1);
822 strcpy (cmdtype2 + len - 1, " sub");
825 if (class == all_classes)
826 fprintf_filtered (stream, "List of classes of %scommands:\n\n", cmdtype2);
828 fprintf_filtered (stream, "List of %scommands:\n\n", cmdtype2);
830 help_cmd_list (list, class, cmdtype, (int) class >= 0, stream);
832 if (class == all_classes)
834 fprintf_filtered (stream, "\n\
835 Type \"help%s\" followed by a class name for a list of commands in ",
838 fprintf_filtered (stream, "that class.");
841 fprintf_filtered (stream, "\nType \"help%s\" followed by %scommand name ",
844 fputs_filtered ("for ", stream);
846 fputs_filtered ("full ", stream);
848 fputs_filtered ("documentation.\n", stream);
849 fputs_filtered ("Command name abbreviations are allowed if unambiguous.\n",
854 help_all (struct ui_file *stream)
856 struct cmd_list_element *c;
857 extern struct cmd_list_element *cmdlist;
859 for (c = cmdlist; c; c = c->next)
863 /* If this is a prefix command, print it's subcommands */
865 help_cmd_list (*c->prefixlist, all_commands, c->prefixname, 0, stream);
867 /* If this is a class name, print all of the commands in the class */
868 else if (c->func == NULL)
869 help_cmd_list (cmdlist, c->class, "", 0, stream);
873 /* Print only the first line of STR on STREAM. */
875 print_doc_line (struct ui_file *stream, char *str)
877 static char *line_buffer = 0;
878 static int line_size;
884 line_buffer = (char *) xmalloc (line_size);
888 while (*p && *p != '\n' && *p != '.' && *p != ',')
890 if (p - str > line_size - 1)
892 line_size = p - str + 1;
894 line_buffer = (char *) xmalloc (line_size);
896 strncpy (line_buffer, str, p - str);
897 line_buffer[p - str] = '\0';
898 if (islower (line_buffer[0]))
899 line_buffer[0] = toupper (line_buffer[0]);
900 ui_out_text (uiout, line_buffer);
904 * Implement a help command on command list LIST.
905 * RECURSE should be non-zero if this should be done recursively on
906 * all sublists of LIST.
907 * PREFIX is the prefix to print before each command name.
908 * STREAM is the stream upon which the output should be written.
910 * A non-negative class number to list only commands in that
912 * ALL_COMMANDS to list all commands in list.
913 * ALL_CLASSES to list all classes in list.
915 * Note that RECURSE will be active on *all* sublists, not just the
916 * ones selected by the criteria above (ie. the selection mechanism
917 * is at the low level, not the high-level).
920 help_cmd_list (struct cmd_list_element *list, enum command_class class,
921 char *prefix, int recurse, struct ui_file *stream)
923 struct cmd_list_element *c;
925 for (c = list; c; c = c->next)
927 if (c->abbrev_flag == 0 &&
928 (class == all_commands
929 || (class == all_classes && c->func == NULL)
930 || (class == c->class && c->func != NULL)))
932 fprintf_filtered (stream, "%s%s -- ", prefix, c->name);
933 print_doc_line (stream, c->doc);
934 fputs_filtered ("\n", stream);
937 && c->prefixlist != 0
938 && c->abbrev_flag == 0)
939 help_cmd_list (*c->prefixlist, class, c->prefixname, 1, stream);
944 /* Search the input clist for 'command'. Return the command if
945 found (or NULL if not), and return the number of commands
948 static struct cmd_list_element *
949 find_cmd (char *command, int len, struct cmd_list_element *clist,
950 int ignore_help_classes, int *nfound)
952 struct cmd_list_element *found, *c;
954 found = (struct cmd_list_element *) NULL;
956 for (c = clist; c; c = c->next)
957 if (!strncmp (command, c->name, len)
958 && (!ignore_help_classes || c->func))
962 if (c->name[len] == '\0')
971 /* This routine takes a line of TEXT and a CLIST in which to start the
972 lookup. When it returns it will have incremented the text pointer past
973 the section of text it matched, set *RESULT_LIST to point to the list in
974 which the last word was matched, and will return a pointer to the cmd
975 list element which the text matches. It will return NULL if no match at
976 all was possible. It will return -1 (cast appropriately, ick) if ambigous
977 matches are possible; in this case *RESULT_LIST will be set to point to
978 the list in which there are ambiguous choices (and *TEXT will be set to
979 the ambiguous text string).
981 If the located command was an abbreviation, this routine returns the base
982 command of the abbreviation.
984 It does no error reporting whatsoever; control will always return
985 to the superior routine.
987 In the case of an ambiguous return (-1), *RESULT_LIST will be set to point
988 at the prefix_command (ie. the best match) *or* (special case) will be NULL
989 if no prefix command was ever found. For example, in the case of "info a",
990 "info" matches without ambiguity, but "a" could be "args" or "address", so
991 *RESULT_LIST is set to the cmd_list_element for "info". So in this case
992 RESULT_LIST should not be interpeted as a pointer to the beginning of a
993 list; it simply points to a specific command. In the case of an ambiguous
994 return *TEXT is advanced past the last non-ambiguous prefix (e.g.
995 "info t" can be "info types" or "info target"; upon return *TEXT has been
996 advanced past "info ").
998 If RESULT_LIST is NULL, don't set *RESULT_LIST (but don't otherwise
999 affect the operation).
1001 This routine does *not* modify the text pointed to by TEXT.
1003 If IGNORE_HELP_CLASSES is nonzero, ignore any command list elements which
1004 are actually help classes rather than commands (i.e. the function field of
1005 the struct cmd_list_element is NULL). */
1007 struct cmd_list_element *
1008 lookup_cmd_1 (char **text, struct cmd_list_element *clist,
1009 struct cmd_list_element **result_list, int ignore_help_classes)
1012 int len, tmp, nfound;
1013 struct cmd_list_element *found, *c;
1016 while (**text == ' ' || **text == '\t')
1019 /* Treating underscores as part of command words is important
1020 so that "set args_foo()" doesn't get interpreted as
1021 "set args _foo()". */
1022 /* NOTE: cagney/2003-02-13 The `tui_active' was previously
1025 *p && (isalnum (*p) || *p == '-' || *p == '_' ||
1028 (*p == '+' || *p == '<' || *p == '>' || *p == '$')) ||
1030 (xdb_commands && (*p == '!' || *p == '/' || *p == '?')));
1034 /* If nothing but whitespace, return 0. */
1040 /* *text and p now bracket the first command word to lookup (and
1041 it's length is len). We copy this into a local temporary */
1044 command = (char *) alloca (len + 1);
1045 for (tmp = 0; tmp < len; tmp++)
1047 char x = (*text)[tmp];
1050 command[len] = '\0';
1055 found = find_cmd (command, len, clist, ignore_help_classes, &nfound);
1058 ** We didn't find the command in the entered case, so lower case it
1059 ** and search again.
1061 if (!found || nfound == 0)
1063 for (tmp = 0; tmp < len; tmp++)
1065 char x = command[tmp];
1066 command[tmp] = isupper (x) ? tolower (x) : x;
1068 found = find_cmd (command, len, clist, ignore_help_classes, &nfound);
1071 /* If nothing matches, we have a simple failure. */
1077 if (result_list != NULL)
1078 /* Will be modified in calling routine
1079 if we know what the prefix command is. */
1081 return (struct cmd_list_element *) -1; /* Ambiguous. */
1084 /* We've matched something on this list. Move text pointer forward. */
1088 if (found->cmd_pointer)
1090 /* We drop the alias (abbreviation) in favor of the command it is
1091 pointing to. If the alias is deprecated, though, we need to
1092 warn the user about it before we drop it. Note that while we
1093 are warning about the alias, we may also warn about the command
1094 itself and we will adjust the appropriate DEPRECATED_WARN_USER
1097 if (found->flags & DEPRECATED_WARN_USER)
1098 deprecated_cmd_warning (&line);
1099 found = found->cmd_pointer;
1101 /* If we found a prefix command, keep looking. */
1103 if (found->prefixlist)
1105 c = lookup_cmd_1 (text, *found->prefixlist, result_list,
1106 ignore_help_classes);
1109 /* Didn't find anything; this is as far as we got. */
1110 if (result_list != NULL)
1111 *result_list = clist;
1114 else if (c == (struct cmd_list_element *) -1)
1116 /* We've gotten this far properly, but the next step
1117 is ambiguous. We need to set the result list to the best
1118 we've found (if an inferior hasn't already set it). */
1119 if (result_list != NULL)
1121 /* This used to say *result_list = *found->prefixlist
1122 If that was correct, need to modify the documentation
1123 at the top of this function to clarify what is supposed
1125 *result_list = found;
1136 if (result_list != NULL)
1137 *result_list = clist;
1142 /* All this hair to move the space to the front of cmdtype */
1145 undef_cmd_error (char *cmdtype, char *q)
1147 error ("Undefined %scommand: \"%s\". Try \"help%s%.*s\".",
1150 *cmdtype ? " " : "",
1151 (int) strlen (cmdtype) - 1,
1155 /* Look up the contents of *LINE as a command in the command list LIST.
1156 LIST is a chain of struct cmd_list_element's.
1157 If it is found, return the struct cmd_list_element for that command
1158 and update *LINE to point after the command name, at the first argument.
1159 If not found, call error if ALLOW_UNKNOWN is zero
1160 otherwise (or if error returns) return zero.
1161 Call error if specified command is ambiguous,
1162 unless ALLOW_UNKNOWN is negative.
1163 CMDTYPE precedes the word "command" in the error message.
1165 If INGNORE_HELP_CLASSES is nonzero, ignore any command list
1166 elements which are actually help classes rather than commands (i.e.
1167 the function field of the struct cmd_list_element is 0). */
1169 struct cmd_list_element *
1170 lookup_cmd (char **line, struct cmd_list_element *list, char *cmdtype,
1171 int allow_unknown, int ignore_help_classes)
1173 struct cmd_list_element *last_list = 0;
1174 struct cmd_list_element *c =
1175 lookup_cmd_1 (line, list, &last_list, ignore_help_classes);
1177 /* Note: Do not remove trailing whitespace here because this
1178 would be wrong for complete_command. Jim Kingdon */
1185 error ("Lack of needed %scommand", cmdtype);
1188 char *p = *line, *q;
1190 while (isalnum (*p) || *p == '-')
1193 q = (char *) alloca (p - *line + 1);
1194 strncpy (q, *line, p - *line);
1195 q[p - *line] = '\0';
1196 undef_cmd_error (cmdtype, q);
1202 else if (c == (struct cmd_list_element *) -1)
1204 /* Ambigous. Local values should be off prefixlist or called
1206 int local_allow_unknown = (last_list ? last_list->allow_unknown :
1208 char *local_cmdtype = last_list ? last_list->prefixname : cmdtype;
1209 struct cmd_list_element *local_list =
1210 (last_list ? *(last_list->prefixlist) : list);
1212 if (local_allow_unknown < 0)
1215 return last_list; /* Found something. */
1217 return 0; /* Found nothing. */
1221 /* Report as error. */
1226 ((*line)[amb_len] && (*line)[amb_len] != ' '
1227 && (*line)[amb_len] != '\t');
1232 for (c = local_list; c; c = c->next)
1233 if (!strncmp (*line, c->name, amb_len))
1235 if (strlen (ambbuf) + strlen (c->name) + 6 < (int) sizeof ambbuf)
1237 if (strlen (ambbuf))
1238 strcat (ambbuf, ", ");
1239 strcat (ambbuf, c->name);
1243 strcat (ambbuf, "..");
1247 error ("Ambiguous %scommand \"%s\": %s.", local_cmdtype,
1249 return 0; /* lint */
1254 /* We've got something. It may still not be what the caller
1255 wants (if this command *needs* a subcommand). */
1256 while (**line == ' ' || **line == '\t')
1259 if (c->prefixlist && **line && !c->allow_unknown)
1260 undef_cmd_error (c->prefixname, *line);
1262 /* Seems to be what he wants. Return it. */
1268 /* We are here presumably because an alias or command in *TEXT is
1269 deprecated and a warning message should be generated. This function
1270 decodes *TEXT and potentially generates a warning message as outlined
1273 Example for 'set endian big' which has a fictitious alias 'seb'.
1275 If alias wasn't used in *TEXT, and the command is deprecated:
1276 "warning: 'set endian big' is deprecated."
1278 If alias was used, and only the alias is deprecated:
1279 "warning: 'seb' an alias for the command 'set endian big' is deprecated."
1281 If alias was used and command is deprecated (regardless of whether the
1282 alias itself is deprecated:
1284 "warning: 'set endian big' (seb) is deprecated."
1286 After the message has been sent, clear the appropriate flags in the
1287 command and/or the alias so the user is no longer bothered.
1291 deprecated_cmd_warning (char **text)
1293 struct cmd_list_element *alias = NULL;
1294 struct cmd_list_element *prefix_cmd = NULL;
1295 struct cmd_list_element *cmd = NULL;
1296 struct cmd_list_element *c;
1299 if (!lookup_cmd_composition (*text, &alias, &prefix_cmd, &cmd))
1300 /* return if text doesn't evaluate to a command */
1303 if (!((alias ? (alias->flags & DEPRECATED_WARN_USER) : 0)
1304 || (cmd->flags & DEPRECATED_WARN_USER) ) )
1305 /* return if nothing is deprecated */
1308 printf_filtered ("Warning:");
1310 if (alias && !(cmd->flags & CMD_DEPRECATED))
1311 printf_filtered (" '%s', an alias for the", alias->name);
1313 printf_filtered (" command '");
1316 printf_filtered ("%s", prefix_cmd->prefixname);
1318 printf_filtered ("%s", cmd->name);
1320 if (alias && (cmd->flags & CMD_DEPRECATED))
1321 printf_filtered ("' (%s) is deprecated.\n", alias->name);
1323 printf_filtered ("' is deprecated.\n");
1326 /* if it is only the alias that is deprecated, we want to indicate the
1327 new alias, otherwise we'll indicate the new command */
1329 if (alias && !(cmd->flags & CMD_DEPRECATED))
1331 if (alias->replacement)
1332 printf_filtered ("Use '%s'.\n\n", alias->replacement);
1334 printf_filtered ("No alternative known.\n\n");
1338 if (cmd->replacement)
1339 printf_filtered ("Use '%s'.\n\n", cmd->replacement);
1341 printf_filtered ("No alternative known.\n\n");
1344 /* We've warned you, now we'll keep quiet */
1346 alias->flags &= ~DEPRECATED_WARN_USER;
1348 cmd->flags &= ~DEPRECATED_WARN_USER;
1353 /* Look up the contents of LINE as a command in the command list 'cmdlist'.
1354 Return 1 on success, 0 on failure.
1356 If LINE refers to an alias, *alias will point to that alias.
1358 If LINE is a postfix command (i.e. one that is preceeded by a prefix
1359 command) set *prefix_cmd.
1361 Set *cmd to point to the command LINE indicates.
1363 If any of *alias, *prefix_cmd, or *cmd cannot be determined or do not
1364 exist, they are NULL when we return.
1368 lookup_cmd_composition (char *text,
1369 struct cmd_list_element **alias,
1370 struct cmd_list_element **prefix_cmd,
1371 struct cmd_list_element **cmd)
1374 int len, tmp, nfound;
1375 struct cmd_list_element *cur_list;
1376 struct cmd_list_element *prev_cmd;
1385 /* Go through as many command lists as we need to
1386 to find the command TEXT refers to. */
1390 while (*text == ' ' || *text == '\t')
1393 /* Treating underscores as part of command words is important
1394 so that "set args_foo()" doesn't get interpreted as
1395 "set args _foo()". */
1396 /* NOTE: cagney/2003-02-13 The `tui_active' was previously
1399 *p && (isalnum (*p) || *p == '-' || *p == '_' ||
1402 (*p == '+' || *p == '<' || *p == '>' || *p == '$')) ||
1404 (xdb_commands && (*p == '!' || *p == '/' || *p == '?')));
1408 /* If nothing but whitespace, return. */
1414 /* text and p now bracket the first command word to lookup (and
1415 it's length is len). We copy this into a local temporary */
1417 command = (char *) alloca (len + 1);
1418 for (tmp = 0; tmp < len; tmp++)
1423 command[len] = '\0';
1428 *cmd = find_cmd (command, len, cur_list, 1, &nfound);
1430 /* We didn't find the command in the entered case, so lower case it
1433 if (!*cmd || nfound == 0)
1435 for (tmp = 0; tmp < len; tmp++)
1437 char x = command[tmp];
1438 command[tmp] = isupper (x) ? tolower (x) : x;
1440 *cmd = find_cmd (command, len, cur_list, 1, &nfound);
1443 if (*cmd == (struct cmd_list_element *) -1)
1445 return 0; /* ambiguous */
1449 return 0; /* nothing found */
1452 if ((*cmd)->cmd_pointer)
1454 /* cmd was actually an alias, we note that an alias was used
1455 (by assigning *alais) and we set *cmd.
1458 *cmd = (*cmd)->cmd_pointer;
1460 *prefix_cmd = prev_cmd;
1462 if ((*cmd)->prefixlist)
1463 cur_list = *(*cmd)->prefixlist;
1471 /* Helper function for SYMBOL_COMPLETION_FUNCTION. */
1473 /* Return a vector of char pointers which point to the different
1474 possible completions in LIST of TEXT.
1476 WORD points in the same buffer as TEXT, and completions should be
1477 returned relative to this position. For example, suppose TEXT is "foo"
1478 and we want to complete to "foobar". If WORD is "oo", return
1479 "oobar"; if WORD is "baz/foo", return "baz/foobar". */
1482 complete_on_cmdlist (struct cmd_list_element *list, char *text, char *word)
1484 struct cmd_list_element *ptr;
1486 int sizeof_matchlist;
1488 int textlen = strlen (text);
1490 sizeof_matchlist = 10;
1491 matchlist = (char **) xmalloc (sizeof_matchlist * sizeof (char *));
1494 for (ptr = list; ptr; ptr = ptr->next)
1495 if (!strncmp (ptr->name, text, textlen)
1496 && !ptr->abbrev_flag
1498 || ptr->prefixlist))
1500 if (matches == sizeof_matchlist)
1502 sizeof_matchlist *= 2;
1503 matchlist = (char **) xrealloc ((char *) matchlist,
1505 * sizeof (char *)));
1508 matchlist[matches] = (char *)
1509 xmalloc (strlen (word) + strlen (ptr->name) + 1);
1511 strcpy (matchlist[matches], ptr->name);
1512 else if (word > text)
1514 /* Return some portion of ptr->name. */
1515 strcpy (matchlist[matches], ptr->name + (word - text));
1519 /* Return some of text plus ptr->name. */
1520 strncpy (matchlist[matches], word, text - word);
1521 matchlist[matches][text - word] = '\0';
1522 strcat (matchlist[matches], ptr->name);
1534 matchlist = (char **) xrealloc ((char *) matchlist, ((matches + 1)
1535 * sizeof (char *)));
1536 matchlist[matches] = (char *) 0;
1542 /* Helper function for SYMBOL_COMPLETION_FUNCTION. */
1544 /* Return a vector of char pointers which point to the different
1545 possible completions in CMD of TEXT.
1547 WORD points in the same buffer as TEXT, and completions should be
1548 returned relative to this position. For example, suppose TEXT is "foo"
1549 and we want to complete to "foobar". If WORD is "oo", return
1550 "oobar"; if WORD is "baz/foo", return "baz/foobar". */
1553 complete_on_enum (const char *enumlist[],
1558 int sizeof_matchlist;
1560 int textlen = strlen (text);
1564 sizeof_matchlist = 10;
1565 matchlist = (char **) xmalloc (sizeof_matchlist * sizeof (char *));
1568 for (i = 0; (name = enumlist[i]) != NULL; i++)
1569 if (strncmp (name, text, textlen) == 0)
1571 if (matches == sizeof_matchlist)
1573 sizeof_matchlist *= 2;
1574 matchlist = (char **) xrealloc ((char *) matchlist,
1576 * sizeof (char *)));
1579 matchlist[matches] = (char *)
1580 xmalloc (strlen (word) + strlen (name) + 1);
1582 strcpy (matchlist[matches], name);
1583 else if (word > text)
1585 /* Return some portion of name. */
1586 strcpy (matchlist[matches], name + (word - text));
1590 /* Return some of text plus name. */
1591 strncpy (matchlist[matches], word, text - word);
1592 matchlist[matches][text - word] = '\0';
1593 strcat (matchlist[matches], name);
1605 matchlist = (char **) xrealloc ((char *) matchlist, ((matches + 1)
1606 * sizeof (char *)));
1607 matchlist[matches] = (char *) 0;
1614 /* check function pointer */
1616 cmd_func_p (struct cmd_list_element *cmd)
1618 return (cmd->func != NULL);
1622 /* call the command function */
1624 cmd_func (struct cmd_list_element *cmd, char *args, int from_tty)
1626 if (cmd_func_p (cmd))
1627 (*cmd->func) (cmd, args, from_tty);
1629 error ("Invalid command");