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