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