]> git.ipfire.org Git - thirdparty/binutils-gdb.git/blob - gdb/cli/cli-decode.c
2002-04-12 Michael Snyder <msnyder@redhat.com>
[thirdparty/binutils-gdb.git] / gdb / cli / cli-decode.c
1 /* Handle lists of commands, their decoding and documentation, for GDB.
2
3 Copyright 1986, 1989, 1990, 1991, 1998, 2000, 2001, 2002 Free
4 Software Foundation, Inc.
5
6 This program is free software; you can redistribute it and/or modify
7 it under the terms of the GNU General Public License as published by
8 the Free Software Foundation; either version 2 of the License, or
9 (at your option) any later version.
10
11 This program is distributed in the hope that it will be useful,
12 but WITHOUT ANY WARRANTY; without even the implied warranty of
13 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 GNU General Public License for more details.
15
16 You should have received a copy of the GNU General Public License
17 along with this program; if not, write to the Free Software
18 Foundation, Inc., 59 Temple Place - Suite 330,
19 Boston, MA 02111-1307, USA. */
20
21 #include "defs.h"
22 #include "symtab.h"
23 #include <ctype.h>
24 #include "gdb_regex.h"
25
26 #include "ui-out.h"
27
28 #include "cli/cli-cmds.h"
29 #include "cli/cli-decode.h"
30
31 #include "gdb_assert.h"
32
33 /* Prototypes for local functions */
34
35 static void undef_cmd_error (char *, char *);
36
37 static struct cmd_list_element *find_cmd (char *command,
38 int len,
39 struct cmd_list_element *clist,
40 int ignore_help_classes,
41 int *nfound);
42
43 static void help_all (struct ui_file *stream);
44 \f
45 /* Set the callback function for the specified command. For each both
46 the commands callback and func() are set. The latter set to a
47 bounce function (unless cfunc / sfunc is NULL that is). */
48
49 static void
50 do_cfunc (struct cmd_list_element *c, char *args, int from_tty)
51 {
52 c->function.cfunc (args, from_tty); /* Ok. */
53 }
54
55 void
56 set_cmd_cfunc (struct cmd_list_element *cmd,
57 void (*cfunc) (char *args, int from_tty))
58 {
59 if (cfunc == NULL)
60 cmd->func = NULL;
61 else
62 cmd->func = do_cfunc;
63 cmd->function.cfunc = cfunc; /* Ok. */
64 }
65
66 static void
67 do_sfunc (struct cmd_list_element *c, char *args, int from_tty)
68 {
69 c->function.sfunc (args, from_tty, c); /* Ok. */
70 }
71
72 void
73 set_cmd_sfunc (struct cmd_list_element *cmd,
74 void (*sfunc) (char *args, int from_tty,
75 struct cmd_list_element * c))
76 {
77 if (sfunc == NULL)
78 cmd->func = NULL;
79 else
80 cmd->func = do_sfunc;
81 cmd->function.sfunc = sfunc; /* Ok. */
82 }
83
84 int
85 cmd_cfunc_eq (struct cmd_list_element *cmd,
86 void (*cfunc) (char *args, int from_tty))
87 {
88 return cmd->func == do_cfunc && cmd->function.cfunc == cfunc;
89 }
90
91 void
92 set_cmd_context (struct cmd_list_element *cmd, void *context)
93 {
94 cmd->context = context;
95 }
96
97 void *
98 get_cmd_context (struct cmd_list_element *cmd)
99 {
100 return cmd->context;
101 }
102
103 enum cmd_types
104 cmd_type (struct cmd_list_element *cmd)
105 {
106 return cmd->type;
107 }
108
109 void
110 set_cmd_completer (struct cmd_list_element *cmd,
111 char **(*completer) (char *text, char *word))
112 {
113 cmd->completer = completer; /* Ok. */
114 }
115
116
117 /* Add element named NAME.
118 CLASS is the top level category into which commands are broken down
119 for "help" purposes.
120 FUN should be the function to execute the command;
121 it will get a character string as argument, with leading
122 and trailing blanks already eliminated.
123
124 DOC is a documentation string for the command.
125 Its first line should be a complete sentence.
126 It should start with ? for a command that is an abbreviation
127 or with * for a command that most users don't need to know about.
128
129 Add this command to command list *LIST.
130
131 Returns a pointer to the added command (not necessarily the head
132 of *LIST). */
133
134 struct cmd_list_element *
135 add_cmd (char *name, enum command_class class, void (*fun) (char *, int),
136 char *doc, struct cmd_list_element **list)
137 {
138 register struct cmd_list_element *c
139 = (struct cmd_list_element *) xmalloc (sizeof (struct cmd_list_element));
140 struct cmd_list_element *p;
141
142 delete_cmd (name, list);
143
144 if (*list == NULL || strcmp ((*list)->name, name) >= 0)
145 {
146 c->next = *list;
147 *list = c;
148 }
149 else
150 {
151 p = *list;
152 while (p->next && strcmp (p->next->name, name) <= 0)
153 {
154 p = p->next;
155 }
156 c->next = p->next;
157 p->next = c;
158 }
159
160 c->name = name;
161 c->class = class;
162 set_cmd_cfunc (c, fun);
163 set_cmd_context (c, NULL);
164 c->doc = doc;
165 c->flags = 0;
166 c->replacement = NULL;
167 c->pre_show_hook = NULL;
168 c->hook_pre = NULL;
169 c->hook_post = NULL;
170 c->hook_in = 0;
171 c->prefixlist = NULL;
172 c->prefixname = NULL;
173 c->allow_unknown = 0;
174 c->abbrev_flag = 0;
175 set_cmd_completer (c, make_symbol_completion_list);
176 c->type = not_set_cmd;
177 c->var = NULL;
178 c->var_type = var_boolean;
179 c->enums = NULL;
180 c->user_commands = NULL;
181 c->hookee_pre = NULL;
182 c->hookee_post = NULL;
183 c->cmd_pointer = NULL;
184
185 return c;
186 }
187
188 /* Same as above, except that the abbrev_flag is set. */
189 /* Note: Doesn't seem to be used anywhere currently. */
190
191 struct cmd_list_element *
192 add_abbrev_cmd (char *name, enum command_class class, void (*fun) (char *, int),
193 char *doc, struct cmd_list_element **list)
194 {
195 register struct cmd_list_element *c
196 = add_cmd (name, class, fun, doc, list);
197
198 c->abbrev_flag = 1;
199 return c;
200 }
201
202 /* Deprecates a command CMD.
203 REPLACEMENT is the name of the command which should be used in place
204 of this command, or NULL if no such command exists.
205
206 This function does not check to see if command REPLACEMENT exists
207 since gdb may not have gotten around to adding REPLACEMENT when this
208 function is called.
209
210 Returns a pointer to the deprecated command. */
211
212 struct cmd_list_element *
213 deprecate_cmd (struct cmd_list_element *cmd, char *replacement)
214 {
215 cmd->flags |= (CMD_DEPRECATED | DEPRECATED_WARN_USER);
216
217 if (replacement != NULL)
218 cmd->replacement = replacement;
219 else
220 cmd->replacement = NULL;
221
222 return cmd;
223 }
224
225 struct cmd_list_element *
226 add_alias_cmd (char *name, char *oldname, enum command_class class,
227 int abbrev_flag, struct cmd_list_element **list)
228 {
229 /* Must do this since lookup_cmd tries to side-effect its first arg */
230 char *copied_name;
231 register struct cmd_list_element *old;
232 register struct cmd_list_element *c;
233 copied_name = (char *) alloca (strlen (oldname) + 1);
234 strcpy (copied_name, oldname);
235 old = lookup_cmd (&copied_name, *list, "", 1, 1);
236
237 if (old == 0)
238 {
239 delete_cmd (name, list);
240 return 0;
241 }
242
243 c = add_cmd (name, class, NULL, old->doc, list);
244 /* NOTE: Both FUNC and all the FUNCTIONs need to be copied. */
245 c->func = old->func;
246 c->function = old->function;
247 c->prefixlist = old->prefixlist;
248 c->prefixname = old->prefixname;
249 c->allow_unknown = old->allow_unknown;
250 c->abbrev_flag = abbrev_flag;
251 c->cmd_pointer = old;
252 return c;
253 }
254
255 /* Like add_cmd but adds an element for a command prefix:
256 a name that should be followed by a subcommand to be looked up
257 in another command list. PREFIXLIST should be the address
258 of the variable containing that list. */
259
260 struct cmd_list_element *
261 add_prefix_cmd (char *name, enum command_class class, void (*fun) (char *, int),
262 char *doc, struct cmd_list_element **prefixlist,
263 char *prefixname, int allow_unknown,
264 struct cmd_list_element **list)
265 {
266 register struct cmd_list_element *c = add_cmd (name, class, fun, doc, list);
267 c->prefixlist = prefixlist;
268 c->prefixname = prefixname;
269 c->allow_unknown = allow_unknown;
270 return c;
271 }
272
273 /* Like add_prefix_cmd but sets the abbrev_flag on the new command. */
274
275 struct cmd_list_element *
276 add_abbrev_prefix_cmd (char *name, enum command_class class,
277 void (*fun) (char *, int), char *doc,
278 struct cmd_list_element **prefixlist, char *prefixname,
279 int allow_unknown, struct cmd_list_element **list)
280 {
281 register struct cmd_list_element *c = add_cmd (name, class, fun, doc, list);
282 c->prefixlist = prefixlist;
283 c->prefixname = prefixname;
284 c->allow_unknown = allow_unknown;
285 c->abbrev_flag = 1;
286 return c;
287 }
288
289 /* This is an empty "cfunc". */
290 void
291 not_just_help_class_command (char *args, int from_tty)
292 {
293 }
294
295 /* This is an empty "sfunc". */
296 static void empty_sfunc (char *, int, struct cmd_list_element *);
297
298 static void
299 empty_sfunc (char *args, int from_tty, struct cmd_list_element *c)
300 {
301 }
302
303 /* Add element named NAME to command list LIST (the list for set/show
304 or some sublist thereof).
305 TYPE is set_cmd or show_cmd.
306 CLASS is as in add_cmd.
307 VAR_TYPE is the kind of thing we are setting.
308 VAR is address of the variable being controlled by this command.
309 DOC is the documentation string. */
310
311 static struct cmd_list_element *
312 add_set_or_show_cmd (char *name,
313 enum cmd_types type,
314 enum command_class class,
315 var_types var_type,
316 void *var,
317 char *doc,
318 struct cmd_list_element **list)
319 {
320 struct cmd_list_element *c = add_cmd (name, class, NULL, doc, list);
321 gdb_assert (type == set_cmd || type == show_cmd);
322 c->type = type;
323 c->var_type = var_type;
324 c->var = var;
325 /* This needs to be something besides NULL so that this isn't
326 treated as a help class. */
327 set_cmd_sfunc (c, empty_sfunc);
328 return c;
329 }
330
331
332 struct cmd_list_element *
333 add_set_cmd (char *name,
334 enum command_class class,
335 var_types var_type,
336 void *var,
337 char *doc,
338 struct cmd_list_element **list)
339 {
340 return add_set_or_show_cmd (name, set_cmd, class, var_type, var, doc, list);
341 }
342
343 /* Add element named NAME to command list LIST (the list for set
344 or some sublist thereof).
345 CLASS is as in add_cmd.
346 ENUMLIST is a list of strings which may follow NAME.
347 VAR is address of the variable which will contain the matching string
348 (from ENUMLIST).
349 DOC is the documentation string. */
350
351 struct cmd_list_element *
352 add_set_enum_cmd (char *name,
353 enum command_class class,
354 const char *enumlist[],
355 const char **var,
356 char *doc,
357 struct cmd_list_element **list)
358 {
359 struct cmd_list_element *c
360 = add_set_cmd (name, class, var_enum, var, doc, list);
361 c->enums = enumlist;
362
363 return c;
364 }
365
366 /* Add element named NAME to command list LIST (the list for set
367 or some sublist thereof).
368 CLASS is as in add_cmd.
369 VAR is address of the variable which will contain the value.
370 DOC is the documentation string. */
371 struct cmd_list_element *
372 add_set_auto_boolean_cmd (char *name,
373 enum command_class class,
374 enum cmd_auto_boolean *var,
375 char *doc,
376 struct cmd_list_element **list)
377 {
378 static const char *auto_boolean_enums[] = { "on", "off", "auto", NULL };
379 struct cmd_list_element *c;
380 c = add_set_cmd (name, class, var_auto_boolean, var, doc, list);
381 c->enums = auto_boolean_enums;
382 return c;
383 }
384
385 /* Add element named NAME to command list LIST (the list for set
386 or some sublist thereof).
387 CLASS is as in add_cmd.
388 VAR is address of the variable which will contain the value.
389 DOC is the documentation string. */
390 struct cmd_list_element *
391 add_set_boolean_cmd (char *name,
392 enum command_class class,
393 int *var,
394 char *doc,
395 struct cmd_list_element **list)
396 {
397 static const char *boolean_enums[] = { "on", "off", NULL };
398 struct cmd_list_element *c;
399 c = add_set_cmd (name, class, var_boolean, var, doc, list);
400 c->enums = boolean_enums;
401 return c;
402 }
403
404 /* Where SETCMD has already been added, add the corresponding show
405 command to LIST and return a pointer to the added command (not
406 necessarily the head of LIST). */
407 /* NOTE: cagney/2002-03-17: The original version of add_show_from_set
408 used memcpy() to clone `set' into `show'. This ment that in
409 addition to all the needed fields (var, name, et.al.) some
410 unnecessary fields were copied (namely the callback function). The
411 function explictly copies relevant fields. For a `set' and `show'
412 command to share the same callback, the caller must set both
413 explicitly. */
414 struct cmd_list_element *
415 add_show_from_set (struct cmd_list_element *setcmd,
416 struct cmd_list_element **list)
417 {
418 char *doc;
419 const static char setstring[] = "Set ";
420
421 /* Create a doc string by replacing "Set " at the start of the
422 `set'' command's doco with "Show ". */
423 gdb_assert (strncmp (setcmd->doc, setstring, sizeof (setstring) - 1) == 0);
424 doc = concat ("Show ", setcmd->doc + sizeof (setstring) - 1, NULL);
425
426 /* Insert the basic command. */
427 return add_set_or_show_cmd (setcmd->name, show_cmd, setcmd->class,
428 setcmd->var_type, setcmd->var, doc, list);
429 }
430
431 /* Remove the command named NAME from the command list. */
432
433 void
434 delete_cmd (char *name, struct cmd_list_element **list)
435 {
436 register struct cmd_list_element *c;
437 struct cmd_list_element *p;
438
439 while (*list && STREQ ((*list)->name, name))
440 {
441 if ((*list)->hookee_pre)
442 (*list)->hookee_pre->hook_pre = 0; /* Hook slips out of its mouth */
443 if ((*list)->hookee_post)
444 (*list)->hookee_post->hook_post = 0; /* Hook slips out of its bottom */
445 p = (*list)->next;
446 xfree (* list);
447 *list = p;
448 }
449
450 if (*list)
451 for (c = *list; c->next;)
452 {
453 if (STREQ (c->next->name, name))
454 {
455 if (c->next->hookee_pre)
456 c->next->hookee_pre->hook_pre = 0; /* hooked cmd gets away. */
457 if (c->next->hookee_post)
458 c->next->hookee_post->hook_post = 0; /* remove post hook */
459 /* :( no fishing metaphore */
460 p = c->next->next;
461 xfree (c->next);
462 c->next = p;
463 }
464 else
465 c = c->next;
466 }
467 }
468 \f
469 /* Shorthands to the commands above. */
470
471 /* Add an element to the list of info subcommands. */
472
473 struct cmd_list_element *
474 add_info (char *name, void (*fun) (char *, int), char *doc)
475 {
476 return add_cmd (name, no_class, fun, doc, &infolist);
477 }
478
479 /* Add an alias to the list of info subcommands. */
480
481 struct cmd_list_element *
482 add_info_alias (char *name, char *oldname, int abbrev_flag)
483 {
484 return add_alias_cmd (name, oldname, 0, abbrev_flag, &infolist);
485 }
486
487 /* Add an element to the list of commands. */
488
489 struct cmd_list_element *
490 add_com (char *name, enum command_class class, void (*fun) (char *, int),
491 char *doc)
492 {
493 return add_cmd (name, class, fun, doc, &cmdlist);
494 }
495
496 /* Add an alias or abbreviation command to the list of commands. */
497
498 struct cmd_list_element *
499 add_com_alias (char *name, char *oldname, enum command_class class,
500 int abbrev_flag)
501 {
502 return add_alias_cmd (name, oldname, class, abbrev_flag, &cmdlist);
503 }
504 \f
505 /* Recursively walk the commandlist structures, and print out the
506 documentation of commands that match our regex in either their
507 name, or their documentation.
508 */
509 void
510 apropos_cmd (struct ui_file *stream, struct cmd_list_element *commandlist,
511 struct re_pattern_buffer *regex, char *prefix)
512 {
513 register struct cmd_list_element *c;
514 int returnvalue=1; /*Needed to avoid double printing*/
515 /* Walk through the commands */
516 for (c=commandlist;c;c=c->next)
517 {
518 if (c->name != NULL)
519 {
520 /* Try to match against the name*/
521 returnvalue=re_search(regex,c->name,strlen(c->name),0,strlen(c->name),NULL);
522 if (returnvalue >= 0)
523 {
524 /* Stolen from help_cmd_list. We don't directly use
525 * help_cmd_list because it doesn't let us print out
526 * single commands
527 */
528 fprintf_filtered (stream, "%s%s -- ", prefix, c->name);
529 print_doc_line (stream, c->doc);
530 fputs_filtered ("\n", stream);
531 returnvalue=0; /*Set this so we don't print it again.*/
532 }
533 }
534 if (c->doc != NULL && returnvalue != 0)
535 {
536 /* Try to match against documentation */
537 if (re_search(regex,c->doc,strlen(c->doc),0,strlen(c->doc),NULL) >=0)
538 {
539 /* Stolen from help_cmd_list. We don't directly use
540 * help_cmd_list because it doesn't let us print out
541 * single commands
542 */
543 fprintf_filtered (stream, "%s%s -- ", prefix, c->name);
544 print_doc_line (stream, c->doc);
545 fputs_filtered ("\n", stream);
546 }
547 }
548 /* Check if this command has subcommands */
549 if (c->prefixlist != NULL)
550 {
551 /* Recursively call ourselves on the subcommand list,
552 passing the right prefix in.
553 */
554 apropos_cmd (stream,*c->prefixlist,regex,c->prefixname);
555 }
556 }
557 }
558
559 /* This command really has to deal with two things:
560 * 1) I want documentation on *this string* (usually called by
561 * "help commandname").
562 * 2) I want documentation on *this list* (usually called by
563 * giving a command that requires subcommands. Also called by saying
564 * just "help".)
565 *
566 * I am going to split this into two seperate comamnds, help_cmd and
567 * help_list.
568 */
569
570 void
571 help_cmd (char *command, struct ui_file *stream)
572 {
573 struct cmd_list_element *c;
574 extern struct cmd_list_element *cmdlist;
575
576 if (!command)
577 {
578 help_list (cmdlist, "", all_classes, stream);
579 return;
580 }
581
582 if (strcmp (command, "all") == 0)
583 {
584 help_all (stream);
585 return;
586 }
587
588 c = lookup_cmd (&command, cmdlist, "", 0, 0);
589
590 if (c == 0)
591 return;
592
593 /* There are three cases here.
594 If c->prefixlist is nonzero, we have a prefix command.
595 Print its documentation, then list its subcommands.
596
597 If c->func is non NULL, we really have a command. Print its
598 documentation and return.
599
600 If c->func is NULL, we have a class name. Print its
601 documentation (as if it were a command) and then set class to the
602 number of this class so that the commands in the class will be
603 listed. */
604
605 fputs_filtered (c->doc, stream);
606 fputs_filtered ("\n", stream);
607
608 if (c->prefixlist == 0 && c->func != NULL)
609 return;
610 fprintf_filtered (stream, "\n");
611
612 /* If this is a prefix command, print it's subcommands */
613 if (c->prefixlist)
614 help_list (*c->prefixlist, c->prefixname, all_commands, stream);
615
616 /* If this is a class name, print all of the commands in the class */
617 if (c->func == NULL)
618 help_list (cmdlist, "", c->class, stream);
619
620 if (c->hook_pre || c->hook_post)
621 fprintf_filtered (stream,
622 "\nThis command has a hook (or hooks) defined:\n");
623
624 if (c->hook_pre)
625 fprintf_filtered (stream,
626 "\tThis command is run after : %s (pre hook)\n",
627 c->hook_pre->name);
628 if (c->hook_post)
629 fprintf_filtered (stream,
630 "\tThis command is run before : %s (post hook)\n",
631 c->hook_post->name);
632 }
633
634 /*
635 * Get a specific kind of help on a command list.
636 *
637 * LIST is the list.
638 * CMDTYPE is the prefix to use in the title string.
639 * CLASS is the class with which to list the nodes of this list (see
640 * documentation for help_cmd_list below), As usual, ALL_COMMANDS for
641 * everything, ALL_CLASSES for just classes, and non-negative for only things
642 * in a specific class.
643 * and STREAM is the output stream on which to print things.
644 * If you call this routine with a class >= 0, it recurses.
645 */
646 void
647 help_list (struct cmd_list_element *list, char *cmdtype,
648 enum command_class class, struct ui_file *stream)
649 {
650 int len;
651 char *cmdtype1, *cmdtype2;
652
653 /* If CMDTYPE is "foo ", CMDTYPE1 gets " foo" and CMDTYPE2 gets "foo sub" */
654 len = strlen (cmdtype);
655 cmdtype1 = (char *) alloca (len + 1);
656 cmdtype1[0] = 0;
657 cmdtype2 = (char *) alloca (len + 4);
658 cmdtype2[0] = 0;
659 if (len)
660 {
661 cmdtype1[0] = ' ';
662 strncpy (cmdtype1 + 1, cmdtype, len - 1);
663 cmdtype1[len] = 0;
664 strncpy (cmdtype2, cmdtype, len - 1);
665 strcpy (cmdtype2 + len - 1, " sub");
666 }
667
668 if (class == all_classes)
669 fprintf_filtered (stream, "List of classes of %scommands:\n\n", cmdtype2);
670 else
671 fprintf_filtered (stream, "List of %scommands:\n\n", cmdtype2);
672
673 help_cmd_list (list, class, cmdtype, (int) class >= 0, stream);
674
675 if (class == all_classes)
676 {
677 fprintf_filtered (stream, "\n\
678 Type \"help%s\" followed by a class name for a list of commands in ",
679 cmdtype1);
680 wrap_here ("");
681 fprintf_filtered (stream, "that class.");
682 }
683
684 fprintf_filtered (stream, "\nType \"help%s\" followed by %scommand name ",
685 cmdtype1, cmdtype2);
686 wrap_here ("");
687 fputs_filtered ("for ", stream);
688 wrap_here ("");
689 fputs_filtered ("full ", stream);
690 wrap_here ("");
691 fputs_filtered ("documentation.\n", stream);
692 fputs_filtered ("Command name abbreviations are allowed if unambiguous.\n",
693 stream);
694 }
695
696 static void
697 help_all (struct ui_file *stream)
698 {
699 struct cmd_list_element *c;
700 extern struct cmd_list_element *cmdlist;
701
702 for (c = cmdlist; c; c = c->next)
703 {
704 if (c->abbrev_flag)
705 continue;
706 /* If this is a prefix command, print it's subcommands */
707 if (c->prefixlist)
708 help_cmd_list (*c->prefixlist, all_commands, c->prefixname, 0, stream);
709
710 /* If this is a class name, print all of the commands in the class */
711 else if (c->func == NULL)
712 help_cmd_list (cmdlist, c->class, "", 0, stream);
713 }
714 }
715
716 /* Print only the first line of STR on STREAM. */
717 void
718 print_doc_line (struct ui_file *stream, char *str)
719 {
720 static char *line_buffer = 0;
721 static int line_size;
722 register char *p;
723
724 if (!line_buffer)
725 {
726 line_size = 80;
727 line_buffer = (char *) xmalloc (line_size);
728 }
729
730 p = str;
731 while (*p && *p != '\n' && *p != '.' && *p != ',')
732 p++;
733 if (p - str > line_size - 1)
734 {
735 line_size = p - str + 1;
736 xfree (line_buffer);
737 line_buffer = (char *) xmalloc (line_size);
738 }
739 strncpy (line_buffer, str, p - str);
740 line_buffer[p - str] = '\0';
741 if (islower (line_buffer[0]))
742 line_buffer[0] = toupper (line_buffer[0]);
743 ui_out_text (uiout, line_buffer);
744 }
745
746 /*
747 * Implement a help command on command list LIST.
748 * RECURSE should be non-zero if this should be done recursively on
749 * all sublists of LIST.
750 * PREFIX is the prefix to print before each command name.
751 * STREAM is the stream upon which the output should be written.
752 * CLASS should be:
753 * A non-negative class number to list only commands in that
754 * class.
755 * ALL_COMMANDS to list all commands in list.
756 * ALL_CLASSES to list all classes in list.
757 *
758 * Note that RECURSE will be active on *all* sublists, not just the
759 * ones selected by the criteria above (ie. the selection mechanism
760 * is at the low level, not the high-level).
761 */
762 void
763 help_cmd_list (struct cmd_list_element *list, enum command_class class,
764 char *prefix, int recurse, struct ui_file *stream)
765 {
766 register struct cmd_list_element *c;
767
768 for (c = list; c; c = c->next)
769 {
770 if (c->abbrev_flag == 0 &&
771 (class == all_commands
772 || (class == all_classes && c->func == NULL)
773 || (class == c->class && c->func != NULL)))
774 {
775 fprintf_filtered (stream, "%s%s -- ", prefix, c->name);
776 print_doc_line (stream, c->doc);
777 fputs_filtered ("\n", stream);
778 }
779 if (recurse
780 && c->prefixlist != 0
781 && c->abbrev_flag == 0)
782 help_cmd_list (*c->prefixlist, class, c->prefixname, 1, stream);
783 }
784 }
785 \f
786
787 /* Search the input clist for 'command'. Return the command if
788 found (or NULL if not), and return the number of commands
789 found in nfound */
790
791 static struct cmd_list_element *
792 find_cmd (char *command, int len, struct cmd_list_element *clist,
793 int ignore_help_classes, int *nfound)
794 {
795 struct cmd_list_element *found, *c;
796
797 found = (struct cmd_list_element *) NULL;
798 *nfound = 0;
799 for (c = clist; c; c = c->next)
800 if (!strncmp (command, c->name, len)
801 && (!ignore_help_classes || c->func))
802 {
803 found = c;
804 (*nfound)++;
805 if (c->name[len] == '\0')
806 {
807 *nfound = 1;
808 break;
809 }
810 }
811 return found;
812 }
813
814 /* This routine takes a line of TEXT and a CLIST in which to start the
815 lookup. When it returns it will have incremented the text pointer past
816 the section of text it matched, set *RESULT_LIST to point to the list in
817 which the last word was matched, and will return a pointer to the cmd
818 list element which the text matches. It will return NULL if no match at
819 all was possible. It will return -1 (cast appropriately, ick) if ambigous
820 matches are possible; in this case *RESULT_LIST will be set to point to
821 the list in which there are ambiguous choices (and *TEXT will be set to
822 the ambiguous text string).
823
824 If the located command was an abbreviation, this routine returns the base
825 command of the abbreviation.
826
827 It does no error reporting whatsoever; control will always return
828 to the superior routine.
829
830 In the case of an ambiguous return (-1), *RESULT_LIST will be set to point
831 at the prefix_command (ie. the best match) *or* (special case) will be NULL
832 if no prefix command was ever found. For example, in the case of "info a",
833 "info" matches without ambiguity, but "a" could be "args" or "address", so
834 *RESULT_LIST is set to the cmd_list_element for "info". So in this case
835 RESULT_LIST should not be interpeted as a pointer to the beginning of a
836 list; it simply points to a specific command. In the case of an ambiguous
837 return *TEXT is advanced past the last non-ambiguous prefix (e.g.
838 "info t" can be "info types" or "info target"; upon return *TEXT has been
839 advanced past "info ").
840
841 If RESULT_LIST is NULL, don't set *RESULT_LIST (but don't otherwise
842 affect the operation).
843
844 This routine does *not* modify the text pointed to by TEXT.
845
846 If IGNORE_HELP_CLASSES is nonzero, ignore any command list elements which
847 are actually help classes rather than commands (i.e. the function field of
848 the struct cmd_list_element is NULL). */
849
850 struct cmd_list_element *
851 lookup_cmd_1 (char **text, struct cmd_list_element *clist,
852 struct cmd_list_element **result_list, int ignore_help_classes)
853 {
854 char *p, *command;
855 int len, tmp, nfound;
856 struct cmd_list_element *found, *c;
857 char *line = *text;
858
859 while (**text == ' ' || **text == '\t')
860 (*text)++;
861
862 /* Treating underscores as part of command words is important
863 so that "set args_foo()" doesn't get interpreted as
864 "set args _foo()". */
865 for (p = *text;
866 *p && (isalnum (*p) || *p == '-' || *p == '_' ||
867 (tui_version &&
868 (*p == '+' || *p == '<' || *p == '>' || *p == '$')) ||
869 (xdb_commands && (*p == '!' || *p == '/' || *p == '?')));
870 p++)
871 ;
872
873 /* If nothing but whitespace, return 0. */
874 if (p == *text)
875 return 0;
876
877 len = p - *text;
878
879 /* *text and p now bracket the first command word to lookup (and
880 it's length is len). We copy this into a local temporary */
881
882
883 command = (char *) alloca (len + 1);
884 for (tmp = 0; tmp < len; tmp++)
885 {
886 char x = (*text)[tmp];
887 command[tmp] = x;
888 }
889 command[len] = '\0';
890
891 /* Look it up. */
892 found = 0;
893 nfound = 0;
894 found = find_cmd (command, len, clist, ignore_help_classes, &nfound);
895
896 /*
897 ** We didn't find the command in the entered case, so lower case it
898 ** and search again.
899 */
900 if (!found || nfound == 0)
901 {
902 for (tmp = 0; tmp < len; tmp++)
903 {
904 char x = command[tmp];
905 command[tmp] = isupper (x) ? tolower (x) : x;
906 }
907 found = find_cmd (command, len, clist, ignore_help_classes, &nfound);
908 }
909
910 /* If nothing matches, we have a simple failure. */
911 if (nfound == 0)
912 return 0;
913
914 if (nfound > 1)
915 {
916 if (result_list != NULL)
917 /* Will be modified in calling routine
918 if we know what the prefix command is. */
919 *result_list = 0;
920 return (struct cmd_list_element *) -1; /* Ambiguous. */
921 }
922
923 /* We've matched something on this list. Move text pointer forward. */
924
925 *text = p;
926
927 if (found->cmd_pointer)
928 {
929 /* We drop the alias (abbreviation) in favor of the command it is
930 pointing to. If the alias is deprecated, though, we need to
931 warn the user about it before we drop it. Note that while we
932 are warning about the alias, we may also warn about the command
933 itself and we will adjust the appropriate DEPRECATED_WARN_USER
934 flags */
935
936 if (found->flags & DEPRECATED_WARN_USER)
937 deprecated_cmd_warning (&line);
938 found = found->cmd_pointer;
939 }
940 /* If we found a prefix command, keep looking. */
941
942 if (found->prefixlist)
943 {
944 c = lookup_cmd_1 (text, *found->prefixlist, result_list,
945 ignore_help_classes);
946 if (!c)
947 {
948 /* Didn't find anything; this is as far as we got. */
949 if (result_list != NULL)
950 *result_list = clist;
951 return found;
952 }
953 else if (c == (struct cmd_list_element *) -1)
954 {
955 /* We've gotten this far properly, but the next step
956 is ambiguous. We need to set the result list to the best
957 we've found (if an inferior hasn't already set it). */
958 if (result_list != NULL)
959 if (!*result_list)
960 /* This used to say *result_list = *found->prefixlist
961 If that was correct, need to modify the documentation
962 at the top of this function to clarify what is supposed
963 to be going on. */
964 *result_list = found;
965 return c;
966 }
967 else
968 {
969 /* We matched! */
970 return c;
971 }
972 }
973 else
974 {
975 if (result_list != NULL)
976 *result_list = clist;
977 return found;
978 }
979 }
980
981 /* All this hair to move the space to the front of cmdtype */
982
983 static void
984 undef_cmd_error (char *cmdtype, char *q)
985 {
986 error ("Undefined %scommand: \"%s\". Try \"help%s%.*s\".",
987 cmdtype,
988 q,
989 *cmdtype ? " " : "",
990 (int) strlen (cmdtype) - 1,
991 cmdtype);
992 }
993
994 /* Look up the contents of *LINE as a command in the command list LIST.
995 LIST is a chain of struct cmd_list_element's.
996 If it is found, return the struct cmd_list_element for that command
997 and update *LINE to point after the command name, at the first argument.
998 If not found, call error if ALLOW_UNKNOWN is zero
999 otherwise (or if error returns) return zero.
1000 Call error if specified command is ambiguous,
1001 unless ALLOW_UNKNOWN is negative.
1002 CMDTYPE precedes the word "command" in the error message.
1003
1004 If INGNORE_HELP_CLASSES is nonzero, ignore any command list
1005 elements which are actually help classes rather than commands (i.e.
1006 the function field of the struct cmd_list_element is 0). */
1007
1008 struct cmd_list_element *
1009 lookup_cmd (char **line, struct cmd_list_element *list, char *cmdtype,
1010 int allow_unknown, int ignore_help_classes)
1011 {
1012 struct cmd_list_element *last_list = 0;
1013 struct cmd_list_element *c =
1014 lookup_cmd_1 (line, list, &last_list, ignore_help_classes);
1015
1016 /* Note: Do not remove trailing whitespace here because this
1017 would be wrong for complete_command. Jim Kingdon */
1018
1019 if (!c)
1020 {
1021 if (!allow_unknown)
1022 {
1023 if (!*line)
1024 error ("Lack of needed %scommand", cmdtype);
1025 else
1026 {
1027 char *p = *line, *q;
1028
1029 while (isalnum (*p) || *p == '-')
1030 p++;
1031
1032 q = (char *) alloca (p - *line + 1);
1033 strncpy (q, *line, p - *line);
1034 q[p - *line] = '\0';
1035 undef_cmd_error (cmdtype, q);
1036 }
1037 }
1038 else
1039 return 0;
1040 }
1041 else if (c == (struct cmd_list_element *) -1)
1042 {
1043 /* Ambigous. Local values should be off prefixlist or called
1044 values. */
1045 int local_allow_unknown = (last_list ? last_list->allow_unknown :
1046 allow_unknown);
1047 char *local_cmdtype = last_list ? last_list->prefixname : cmdtype;
1048 struct cmd_list_element *local_list =
1049 (last_list ? *(last_list->prefixlist) : list);
1050
1051 if (local_allow_unknown < 0)
1052 {
1053 if (last_list)
1054 return last_list; /* Found something. */
1055 else
1056 return 0; /* Found nothing. */
1057 }
1058 else
1059 {
1060 /* Report as error. */
1061 int amb_len;
1062 char ambbuf[100];
1063
1064 for (amb_len = 0;
1065 ((*line)[amb_len] && (*line)[amb_len] != ' '
1066 && (*line)[amb_len] != '\t');
1067 amb_len++)
1068 ;
1069
1070 ambbuf[0] = 0;
1071 for (c = local_list; c; c = c->next)
1072 if (!strncmp (*line, c->name, amb_len))
1073 {
1074 if (strlen (ambbuf) + strlen (c->name) + 6 < (int) sizeof ambbuf)
1075 {
1076 if (strlen (ambbuf))
1077 strcat (ambbuf, ", ");
1078 strcat (ambbuf, c->name);
1079 }
1080 else
1081 {
1082 strcat (ambbuf, "..");
1083 break;
1084 }
1085 }
1086 error ("Ambiguous %scommand \"%s\": %s.", local_cmdtype,
1087 *line, ambbuf);
1088 return 0; /* lint */
1089 }
1090 }
1091 else
1092 {
1093 /* We've got something. It may still not be what the caller
1094 wants (if this command *needs* a subcommand). */
1095 while (**line == ' ' || **line == '\t')
1096 (*line)++;
1097
1098 if (c->prefixlist && **line && !c->allow_unknown)
1099 undef_cmd_error (c->prefixname, *line);
1100
1101 /* Seems to be what he wants. Return it. */
1102 return c;
1103 }
1104 return 0;
1105 }
1106
1107 /* We are here presumably because an alias or command in *TEXT is
1108 deprecated and a warning message should be generated. This function
1109 decodes *TEXT and potentially generates a warning message as outlined
1110 below.
1111
1112 Example for 'set endian big' which has a fictitious alias 'seb'.
1113
1114 If alias wasn't used in *TEXT, and the command is deprecated:
1115 "warning: 'set endian big' is deprecated."
1116
1117 If alias was used, and only the alias is deprecated:
1118 "warning: 'seb' an alias for the command 'set endian big' is deprecated."
1119
1120 If alias was used and command is deprecated (regardless of whether the
1121 alias itself is deprecated:
1122
1123 "warning: 'set endian big' (seb) is deprecated."
1124
1125 After the message has been sent, clear the appropriate flags in the
1126 command and/or the alias so the user is no longer bothered.
1127
1128 */
1129 void
1130 deprecated_cmd_warning (char **text)
1131 {
1132 struct cmd_list_element *alias = NULL;
1133 struct cmd_list_element *prefix_cmd = NULL;
1134 struct cmd_list_element *cmd = NULL;
1135 struct cmd_list_element *c;
1136 char *type;
1137
1138 if (!lookup_cmd_composition (*text, &alias, &prefix_cmd, &cmd))
1139 /* return if text doesn't evaluate to a command */
1140 return;
1141
1142 if (!((alias ? (alias->flags & DEPRECATED_WARN_USER) : 0)
1143 || (cmd->flags & DEPRECATED_WARN_USER) ) )
1144 /* return if nothing is deprecated */
1145 return;
1146
1147 printf_filtered ("Warning:");
1148
1149 if (alias && !(cmd->flags & CMD_DEPRECATED))
1150 printf_filtered (" '%s', an alias for the", alias->name);
1151
1152 printf_filtered (" command '");
1153
1154 if (prefix_cmd)
1155 printf_filtered ("%s", prefix_cmd->prefixname);
1156
1157 printf_filtered ("%s", cmd->name);
1158
1159 if (alias && (cmd->flags & CMD_DEPRECATED))
1160 printf_filtered ("' (%s) is deprecated.\n", alias->name);
1161 else
1162 printf_filtered ("' is deprecated.\n");
1163
1164
1165 /* if it is only the alias that is deprecated, we want to indicate the
1166 new alias, otherwise we'll indicate the new command */
1167
1168 if (alias && !(cmd->flags & CMD_DEPRECATED))
1169 {
1170 if (alias->replacement)
1171 printf_filtered ("Use '%s'.\n\n", alias->replacement);
1172 else
1173 printf_filtered ("No alternative known.\n\n");
1174 }
1175 else
1176 {
1177 if (cmd->replacement)
1178 printf_filtered ("Use '%s'.\n\n", cmd->replacement);
1179 else
1180 printf_filtered ("No alternative known.\n\n");
1181 }
1182
1183 /* We've warned you, now we'll keep quiet */
1184 if (alias)
1185 alias->flags &= ~DEPRECATED_WARN_USER;
1186
1187 cmd->flags &= ~DEPRECATED_WARN_USER;
1188 }
1189
1190
1191
1192 /* Look up the contents of LINE as a command in the command list 'cmdlist'.
1193 Return 1 on success, 0 on failure.
1194
1195 If LINE refers to an alias, *alias will point to that alias.
1196
1197 If LINE is a postfix command (i.e. one that is preceeded by a prefix
1198 command) set *prefix_cmd.
1199
1200 Set *cmd to point to the command LINE indicates.
1201
1202 If any of *alias, *prefix_cmd, or *cmd cannot be determined or do not
1203 exist, they are NULL when we return.
1204
1205 */
1206 int
1207 lookup_cmd_composition (char *text,
1208 struct cmd_list_element **alias,
1209 struct cmd_list_element **prefix_cmd,
1210 struct cmd_list_element **cmd)
1211 {
1212 char *p, *command;
1213 int len, tmp, nfound;
1214 struct cmd_list_element *cur_list;
1215 struct cmd_list_element *prev_cmd;
1216 *alias = NULL;
1217 *prefix_cmd = NULL;
1218 *cmd = NULL;
1219
1220 cur_list = cmdlist;
1221
1222 while (1)
1223 {
1224 /* Go through as many command lists as we need to
1225 to find the command TEXT refers to. */
1226
1227 prev_cmd = *cmd;
1228
1229 while (*text == ' ' || *text == '\t')
1230 (text)++;
1231
1232 /* Treating underscores as part of command words is important
1233 so that "set args_foo()" doesn't get interpreted as
1234 "set args _foo()". */
1235 for (p = text;
1236 *p && (isalnum (*p) || *p == '-' || *p == '_' ||
1237 (tui_version &&
1238 (*p == '+' || *p == '<' || *p == '>' || *p == '$')) ||
1239 (xdb_commands && (*p == '!' || *p == '/' || *p == '?')));
1240 p++)
1241 ;
1242
1243 /* If nothing but whitespace, return. */
1244 if (p == text)
1245 return 0;
1246
1247 len = p - text;
1248
1249 /* text and p now bracket the first command word to lookup (and
1250 it's length is len). We copy this into a local temporary */
1251
1252 command = (char *) alloca (len + 1);
1253 for (tmp = 0; tmp < len; tmp++)
1254 {
1255 char x = text[tmp];
1256 command[tmp] = x;
1257 }
1258 command[len] = '\0';
1259
1260 /* Look it up. */
1261 *cmd = 0;
1262 nfound = 0;
1263 *cmd = find_cmd (command, len, cur_list, 1, &nfound);
1264
1265 /* We didn't find the command in the entered case, so lower case it
1266 and search again.
1267 */
1268 if (!*cmd || nfound == 0)
1269 {
1270 for (tmp = 0; tmp < len; tmp++)
1271 {
1272 char x = command[tmp];
1273 command[tmp] = isupper (x) ? tolower (x) : x;
1274 }
1275 *cmd = find_cmd (command, len, cur_list, 1, &nfound);
1276 }
1277
1278 if (*cmd == (struct cmd_list_element *) -1)
1279 {
1280 return 0; /* ambiguous */
1281 }
1282
1283 if (*cmd == NULL)
1284 return 0; /* nothing found */
1285 else
1286 {
1287 if ((*cmd)->cmd_pointer)
1288 {
1289 /* cmd was actually an alias, we note that an alias was used
1290 (by assigning *alais) and we set *cmd.
1291 */
1292 *alias = *cmd;
1293 *cmd = (*cmd)->cmd_pointer;
1294 }
1295 *prefix_cmd = prev_cmd;
1296 }
1297 if ((*cmd)->prefixlist)
1298 cur_list = *(*cmd)->prefixlist;
1299 else
1300 return 1;
1301
1302 text = p;
1303 }
1304 }
1305
1306 /* Helper function for SYMBOL_COMPLETION_FUNCTION. */
1307
1308 /* Return a vector of char pointers which point to the different
1309 possible completions in LIST of TEXT.
1310
1311 WORD points in the same buffer as TEXT, and completions should be
1312 returned relative to this position. For example, suppose TEXT is "foo"
1313 and we want to complete to "foobar". If WORD is "oo", return
1314 "oobar"; if WORD is "baz/foo", return "baz/foobar". */
1315
1316 char **
1317 complete_on_cmdlist (struct cmd_list_element *list, char *text, char *word)
1318 {
1319 struct cmd_list_element *ptr;
1320 char **matchlist;
1321 int sizeof_matchlist;
1322 int matches;
1323 int textlen = strlen (text);
1324
1325 sizeof_matchlist = 10;
1326 matchlist = (char **) xmalloc (sizeof_matchlist * sizeof (char *));
1327 matches = 0;
1328
1329 for (ptr = list; ptr; ptr = ptr->next)
1330 if (!strncmp (ptr->name, text, textlen)
1331 && !ptr->abbrev_flag
1332 && (ptr->func
1333 || ptr->prefixlist))
1334 {
1335 if (matches == sizeof_matchlist)
1336 {
1337 sizeof_matchlist *= 2;
1338 matchlist = (char **) xrealloc ((char *) matchlist,
1339 (sizeof_matchlist
1340 * sizeof (char *)));
1341 }
1342
1343 matchlist[matches] = (char *)
1344 xmalloc (strlen (word) + strlen (ptr->name) + 1);
1345 if (word == text)
1346 strcpy (matchlist[matches], ptr->name);
1347 else if (word > text)
1348 {
1349 /* Return some portion of ptr->name. */
1350 strcpy (matchlist[matches], ptr->name + (word - text));
1351 }
1352 else
1353 {
1354 /* Return some of text plus ptr->name. */
1355 strncpy (matchlist[matches], word, text - word);
1356 matchlist[matches][text - word] = '\0';
1357 strcat (matchlist[matches], ptr->name);
1358 }
1359 ++matches;
1360 }
1361
1362 if (matches == 0)
1363 {
1364 xfree (matchlist);
1365 matchlist = 0;
1366 }
1367 else
1368 {
1369 matchlist = (char **) xrealloc ((char *) matchlist, ((matches + 1)
1370 * sizeof (char *)));
1371 matchlist[matches] = (char *) 0;
1372 }
1373
1374 return matchlist;
1375 }
1376
1377 /* Helper function for SYMBOL_COMPLETION_FUNCTION. */
1378
1379 /* Return a vector of char pointers which point to the different
1380 possible completions in CMD of TEXT.
1381
1382 WORD points in the same buffer as TEXT, and completions should be
1383 returned relative to this position. For example, suppose TEXT is "foo"
1384 and we want to complete to "foobar". If WORD is "oo", return
1385 "oobar"; if WORD is "baz/foo", return "baz/foobar". */
1386
1387 char **
1388 complete_on_enum (const char *enumlist[],
1389 char *text,
1390 char *word)
1391 {
1392 char **matchlist;
1393 int sizeof_matchlist;
1394 int matches;
1395 int textlen = strlen (text);
1396 int i;
1397 const char *name;
1398
1399 sizeof_matchlist = 10;
1400 matchlist = (char **) xmalloc (sizeof_matchlist * sizeof (char *));
1401 matches = 0;
1402
1403 for (i = 0; (name = enumlist[i]) != NULL; i++)
1404 if (strncmp (name, text, textlen) == 0)
1405 {
1406 if (matches == sizeof_matchlist)
1407 {
1408 sizeof_matchlist *= 2;
1409 matchlist = (char **) xrealloc ((char *) matchlist,
1410 (sizeof_matchlist
1411 * sizeof (char *)));
1412 }
1413
1414 matchlist[matches] = (char *)
1415 xmalloc (strlen (word) + strlen (name) + 1);
1416 if (word == text)
1417 strcpy (matchlist[matches], name);
1418 else if (word > text)
1419 {
1420 /* Return some portion of name. */
1421 strcpy (matchlist[matches], name + (word - text));
1422 }
1423 else
1424 {
1425 /* Return some of text plus name. */
1426 strncpy (matchlist[matches], word, text - word);
1427 matchlist[matches][text - word] = '\0';
1428 strcat (matchlist[matches], name);
1429 }
1430 ++matches;
1431 }
1432
1433 if (matches == 0)
1434 {
1435 xfree (matchlist);
1436 matchlist = 0;
1437 }
1438 else
1439 {
1440 matchlist = (char **) xrealloc ((char *) matchlist, ((matches + 1)
1441 * sizeof (char *)));
1442 matchlist[matches] = (char *) 0;
1443 }
1444
1445 return matchlist;
1446 }
1447