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