2 Copyright 2000, 2001 Free Software Foundation, Inc.
4 This file is part of GDB.
6 This program is free software; you can redistribute it and/or modify
7 it under the terms of the GNU General Public License as published by
8 the Free Software Foundation; either version 2 of the License, or
9 (at your option) any later version.
11 This program is distributed in the hope that it will be useful,
12 but WITHOUT ANY WARRANTY; without even the implied warranty of
13 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 GNU General Public License for more details.
16 You should have received a copy of the GNU General Public License
17 along with this program; if not, write to the Free Software
18 Foundation, Inc., 59 Temple Place - Suite 330,
19 Boston, MA 02111-1307, USA. */
22 #include "completer.h"
23 #include "target.h" /* For baud_rate, remote_debug and remote_timeout */
24 #include "gdb_wait.h" /* For shell escape implementation */
25 #include "gdb_regex.h" /* Used by apropos_command */
26 #include "filenames.h" /* for DOSish file names */
33 #include "cli/cli-decode.h"
34 #include "cli/cli-script.h"
35 #include "cli/cli-setshow.h"
36 #include "cli/cli-cmds.h"
38 #ifndef GDBINIT_FILENAME
39 #define GDBINIT_FILENAME ".gdbinit"
44 extern void dont_repeat (void);
46 extern void set_verbose (char *, int, struct cmd_list_element
*);
48 extern void show_history (char *, int);
50 extern void set_history (char *, int);
52 extern void show_commands (char *, int);
54 /* Prototypes for local functions */
56 static void complete_command (char *, int);
58 static void echo_command (char *, int);
60 static void pwd_command (char *, int);
62 static void show_version (char *, int);
64 static void validate_comname (char *);
66 static void help_command (char *, int);
68 static void show_command (char *, int);
70 static void info_command (char *, int);
72 static void show_debug (char *, int);
74 static void set_debug (char *, int);
76 static void show_user (char *, int);
78 static void make_command (char *, int);
80 static void shell_escape (char *, int);
82 void apropos_command (char *, int);
84 /* Define all cmd_list_elements. */
86 /* Chain containing all defined commands. */
88 struct cmd_list_element
*cmdlist
;
90 /* Chain containing all defined info subcommands. */
92 struct cmd_list_element
*infolist
;
94 /* Chain containing all defined enable subcommands. */
96 struct cmd_list_element
*enablelist
;
98 /* Chain containing all defined disable subcommands. */
100 struct cmd_list_element
*disablelist
;
102 /* Chain containing all defined toggle subcommands. */
104 struct cmd_list_element
*togglelist
;
106 /* Chain containing all defined stop subcommands. */
108 struct cmd_list_element
*stoplist
;
110 /* Chain containing all defined delete subcommands. */
112 struct cmd_list_element
*deletelist
;
114 /* Chain containing all defined "enable breakpoint" subcommands. */
116 struct cmd_list_element
*enablebreaklist
;
118 /* Chain containing all defined set subcommands */
120 struct cmd_list_element
*setlist
;
122 /* Chain containing all defined unset subcommands */
124 struct cmd_list_element
*unsetlist
;
126 /* Chain containing all defined show subcommands. */
128 struct cmd_list_element
*showlist
;
130 /* Chain containing all defined \"set history\". */
132 struct cmd_list_element
*sethistlist
;
134 /* Chain containing all defined \"show history\". */
136 struct cmd_list_element
*showhistlist
;
138 /* Chain containing all defined \"unset history\". */
140 struct cmd_list_element
*unsethistlist
;
142 /* Chain containing all defined maintenance subcommands. */
144 struct cmd_list_element
*maintenancelist
;
146 /* Chain containing all defined "maintenance info" subcommands. */
148 struct cmd_list_element
*maintenanceinfolist
;
150 /* Chain containing all defined "maintenance print" subcommands. */
152 struct cmd_list_element
*maintenanceprintlist
;
154 struct cmd_list_element
*setprintlist
;
156 struct cmd_list_element
*showprintlist
;
158 struct cmd_list_element
*setdebuglist
;
160 struct cmd_list_element
*showdebuglist
;
162 struct cmd_list_element
*setchecklist
;
164 struct cmd_list_element
*showchecklist
;
166 /* Utility used everywhere when at least one argument is needed and
170 error_no_arg (char *why
)
172 error ("Argument required (%s).", why
);
175 /* The "info" command is defined as a prefix, with allow_unknown = 0.
176 Therefore, its own definition is called only for "info" with no args. */
180 info_command (char *arg
, int from_tty
)
182 printf_unfiltered ("\"info\" must be followed by the name of an info command.\n");
183 help_list (infolist
, "info ", -1, gdb_stdout
);
186 /* The "show" command with no arguments shows all the settings. */
190 show_command (char *arg
, int from_tty
)
192 cmd_show_list (showlist
, from_tty
, "");
195 /* Provide documentation on command or list given by COMMAND. FROM_TTY
200 help_command (char *command
, int from_tty
)
202 help_cmd (command
, gdb_stdout
);
205 /* The "complete" command is used by Emacs to implement completion. */
209 complete_command (char *arg
, int from_tty
)
219 argpoint
= strlen (arg
);
221 for (completion
= line_completion_function (arg
, i
= 0, arg
, argpoint
);
223 completion
= line_completion_function (arg
, ++i
, arg
, argpoint
))
225 printf_unfiltered ("%s\n", completion
);
230 int is_complete_command (void (*func
) (char *args
, int from_tty
))
232 return func
== complete_command
;
237 show_version (char *args
, int from_tty
)
240 print_gdb_version (gdb_stdout
);
241 printf_filtered ("\n");
245 /* Handle the quit command. */
248 quit_command (char *args
, int from_tty
)
250 if (!quit_confirm ())
251 error ("Not confirmed.");
252 quit_force (args
, from_tty
);
257 pwd_command (char *args
, int from_tty
)
260 error ("The \"pwd\" command does not take an argument: %s", args
);
261 getcwd (gdb_dirbuf
, sizeof (gdb_dirbuf
));
263 if (!STREQ (gdb_dirbuf
, current_directory
))
264 printf_unfiltered ("Working directory %s\n (canonically %s).\n",
265 current_directory
, gdb_dirbuf
);
267 printf_unfiltered ("Working directory %s.\n", current_directory
);
271 cd_command (char *dir
, int from_tty
)
274 /* Found something other than leading repetitions of "/..". */
278 /* If the new directory is absolute, repeat is a no-op; if relative,
279 repeat might be useful but is more likely to be a mistake. */
283 error_no_arg ("new working directory");
285 dir
= tilde_expand (dir
);
286 make_cleanup (xfree
, dir
);
289 perror_with_name (dir
);
291 #ifdef HAVE_DOS_BASED_FILE_SYSTEM
292 /* There's too much mess with DOSish names like "d:", "d:.",
293 "d:./foo" etc. Instead of having lots of special #ifdef'ed code,
294 simply get the canonicalized name of the current directory. */
295 dir
= getcwd (gdb_dirbuf
, sizeof (gdb_dirbuf
));
299 if (IS_DIR_SEPARATOR (dir
[len
- 1]))
301 /* Remove the trailing slash unless this is a root directory
302 (including a drive letter on non-Unix systems). */
303 if (!(len
== 1) /* "/" */
304 #ifdef HAVE_DOS_BASED_FILE_SYSTEM
305 && !(len
== 3 && dir
[1] == ':') /* "d:/" */
311 dir
= savestring (dir
, len
);
312 if (IS_ABSOLUTE_PATH (dir
))
313 current_directory
= dir
;
316 if (IS_DIR_SEPARATOR (current_directory
[strlen (current_directory
) - 1]))
317 current_directory
= concat (current_directory
, dir
, NULL
);
319 current_directory
= concat (current_directory
, SLASH_STRING
, dir
, NULL
);
323 /* Now simplify any occurrences of `.' and `..' in the pathname. */
326 for (p
= current_directory
; *p
;)
328 if (IS_DIR_SEPARATOR (p
[0]) && p
[1] == '.'
329 && (p
[2] == 0 || IS_DIR_SEPARATOR (p
[2])))
331 else if (IS_DIR_SEPARATOR (p
[0]) && p
[1] == '.' && p
[2] == '.'
332 && (p
[3] == 0 || IS_DIR_SEPARATOR (p
[3])))
336 /* Search backwards for the directory just before the "/.."
337 and obliterate it and the "/..". */
339 while (q
!= current_directory
&& !IS_DIR_SEPARATOR (q
[-1]))
342 if (q
== current_directory
)
343 /* current_directory is
344 a relative pathname ("can't happen"--leave it alone). */
348 strcpy (q
- 1, p
+ 3);
353 /* We are dealing with leading repetitions of "/..", for example
354 "/../..", which is the Mach super-root. */
364 forget_cached_source_info ();
367 pwd_command ((char *) 0, 1);
371 source_command (char *args
, int from_tty
)
374 struct cleanup
*old_cleanups
;
379 error ("source command requires pathname of file to source.");
382 file
= tilde_expand (file
);
383 old_cleanups
= make_cleanup (xfree
, file
);
385 stream
= fopen (file
, FOPEN_RT
);
389 perror_with_name (file
);
394 script_from_file (stream
, file
);
396 do_cleanups (old_cleanups
);
401 echo_command (char *text
, int from_tty
)
407 while ((c
= *p
++) != '\0')
411 /* \ at end of argument is used after spaces
412 so they won't be lost. */
416 c
= parse_escape (&p
);
418 printf_filtered ("%c", c
);
421 printf_filtered ("%c", c
);
424 /* Force this output to appear now. */
426 gdb_flush (gdb_stdout
);
431 shell_escape (char *arg
, int from_tty
)
434 /* If ARG is NULL, they want an inferior shell, but `system' just
435 reports if the shell is available when passed a NULL arg. */
436 int rc
= system (arg
? arg
: "");
439 arg
= "inferior shell";
443 fprintf_unfiltered (gdb_stderr
, "Cannot execute %s: %s\n", arg
,
444 safe_strerror (errno
));
445 gdb_flush (gdb_stderr
);
449 fprintf_unfiltered (gdb_stderr
, "%s exited with status %d\n", arg
, rc
);
450 gdb_flush (gdb_stderr
);
453 /* Make sure to return to the directory GDB thinks it is, in case the
454 shell command we just ran changed it. */
455 chdir (current_directory
);
457 #else /* Can fork. */
459 char *p
, *user_shell
;
461 if ((user_shell
= (char *) getenv ("SHELL")) == NULL
)
462 user_shell
= "/bin/sh";
464 /* Get the name of the shell for arg0 */
465 if ((p
= strrchr (user_shell
, '/')) == NULL
)
468 p
++; /* Get past '/' */
470 if ((pid
= fork ()) == 0)
473 execl (user_shell
, p
, 0);
475 execl (user_shell
, p
, "-c", arg
, 0);
477 fprintf_unfiltered (gdb_stderr
, "Cannot execute %s: %s\n", user_shell
,
478 safe_strerror (errno
));
479 gdb_flush (gdb_stderr
);
484 while ((rc
= wait (&status
)) != pid
&& rc
!= -1)
487 error ("Fork failed");
488 #endif /* Can fork. */
492 make_command (char *arg
, int from_tty
)
500 p
= xmalloc (sizeof ("make ") + strlen (arg
));
502 strcpy (p
+ sizeof ("make ") - 1, arg
);
505 shell_escape (p
, from_tty
);
510 show_user (char *args
, int from_tty
)
512 struct cmd_list_element
*c
;
513 extern struct cmd_list_element
*cmdlist
;
517 c
= lookup_cmd (&args
, cmdlist
, "", 0, 1);
518 if (c
->class != class_user
)
519 error ("Not a user command.");
520 show_user_1 (c
, gdb_stdout
);
524 for (c
= cmdlist
; c
; c
= c
->next
)
526 if (c
->class == class_user
)
527 show_user_1 (c
, gdb_stdout
);
532 /* Search through names of commands and documentations for a certain
536 apropos_command (char *searchstr
, int from_tty
)
538 extern struct cmd_list_element
*cmdlist
; /*This is the main command list*/
540 char *pattern_fastmap
;
541 char errorbuffer
[512];
542 pattern_fastmap
= xcalloc (256, sizeof (char));
543 if (searchstr
== NULL
)
544 error("REGEXP string is empty");
546 if (regcomp(&pattern
,searchstr
,REG_ICASE
) == 0)
548 pattern
.fastmap
=pattern_fastmap
;
549 re_compile_fastmap(&pattern
);
550 apropos_cmd (gdb_stdout
,cmdlist
,&pattern
,"");
554 regerror(regcomp(&pattern
,searchstr
,REG_ICASE
),NULL
,errorbuffer
,512);
555 error("Error in regular expression:%s",errorbuffer
);
557 xfree (pattern_fastmap
);
561 set_debug (char *arg
, int from_tty
)
563 printf_unfiltered ("\"set debug\" must be followed by the name of a print subcommand.\n");
564 help_list (setdebuglist
, "set debug ", -1, gdb_stdout
);
568 show_debug (char *args
, int from_tty
)
570 cmd_show_list (showdebuglist
, from_tty
, "");
574 init_cmd_lists (void)
583 enablebreaklist
= NULL
;
589 unsethistlist
= NULL
;
590 maintenancelist
= NULL
;
591 maintenanceinfolist
= NULL
;
592 maintenanceprintlist
= NULL
;
594 showprintlist
= NULL
;
596 showchecklist
= NULL
;
603 struct cmd_list_element
*c
;
605 /* Define the classes of commands.
606 They will appear in the help list in the reverse of this order. */
608 add_cmd ("internals", class_maintenance
, NO_FUNCTION
,
609 "Maintenance commands.\n\
610 Some gdb commands are provided just for use by gdb maintainers.\n\
611 These commands are subject to frequent change, and may not be as\n\
612 well documented as user commands.",
614 add_cmd ("obscure", class_obscure
, NO_FUNCTION
, "Obscure features.", &cmdlist
);
615 add_cmd ("aliases", class_alias
, NO_FUNCTION
, "Aliases of other commands.", &cmdlist
);
616 add_cmd ("user-defined", class_user
, NO_FUNCTION
, "User-defined commands.\n\
617 The commands in this class are those defined by the user.\n\
618 Use the \"define\" command to define a command.", &cmdlist
);
619 add_cmd ("support", class_support
, NO_FUNCTION
, "Support facilities.", &cmdlist
);
621 add_cmd ("status", class_info
, NO_FUNCTION
, "Status inquiries.", &cmdlist
);
622 add_cmd ("files", class_files
, NO_FUNCTION
, "Specifying and examining files.", &cmdlist
);
623 add_cmd ("breakpoints", class_breakpoint
, NO_FUNCTION
, "Making program stop at certain points.", &cmdlist
);
624 add_cmd ("data", class_vars
, NO_FUNCTION
, "Examining data.", &cmdlist
);
625 add_cmd ("stack", class_stack
, NO_FUNCTION
, "Examining the stack.\n\
626 The stack is made up of stack frames. Gdb assigns numbers to stack frames\n\
627 counting from zero for the innermost (currently executing) frame.\n\n\
628 At any time gdb identifies one frame as the \"selected\" frame.\n\
629 Variable lookups are done with respect to the selected frame.\n\
630 When the program being debugged stops, gdb selects the innermost frame.\n\
631 The commands below can be used to select other frames by number or address.",
633 add_cmd ("running", class_run
, NO_FUNCTION
, "Running the program.", &cmdlist
);
635 /* Define general commands. */
637 add_com ("pwd", class_files
, pwd_command
,
638 "Print working directory. This is used for your program as well.");
639 c
= add_cmd ("cd", class_files
, cd_command
,
640 "Set working directory to DIR for debugger and program being debugged.\n\
641 The change does not take effect for the program being debugged\n\
642 until the next time it is started.", &cmdlist
);
643 c
->completer
= filename_completer
;
645 add_com ("echo", class_support
, echo_command
,
646 "Print a constant string. Give string as argument.\n\
647 C escape sequences may be used in the argument.\n\
648 No newline is added at the end of the argument;\n\
649 use \"\\n\" if you want a newline to be printed.\n\
650 Since leading and trailing whitespace are ignored in command arguments,\n\
651 if you want to print some you must use \"\\\" before leading whitespace\n\
652 to be printed or after trailing whitespace.");
653 add_com ("document", class_support
, document_command
,
654 "Document a user-defined command.\n\
655 Give command name as argument. Give documentation on following lines.\n\
656 End with a line of just \"end\".");
657 add_com ("define", class_support
, define_command
,
658 "Define a new command name. Command name is argument.\n\
659 Definition appears on following lines, one command per line.\n\
660 End with a line of just \"end\".\n\
661 Use the \"document\" command to give documentation for the new command.\n\
662 Commands defined in this way may have up to ten arguments.");
664 c
= add_cmd ("source", class_support
, source_command
,
665 "Read commands from a file named FILE.\n\
666 Note that the file \"" GDBINIT_FILENAME
"\" is read automatically in this way\n\
667 when gdb is started.", &cmdlist
);
668 c
->completer
= filename_completer
;
670 add_com ("quit", class_support
, quit_command
, "Exit gdb.");
671 add_com ("help", class_support
, help_command
, "Print list of commands.");
672 add_com_alias ("q", "quit", class_support
, 1);
673 add_com_alias ("h", "help", class_support
, 1);
675 c
= add_set_cmd ("verbose", class_support
, var_boolean
, (char *) &info_verbose
,
678 add_show_from_set (c
, &showlist
);
679 c
->function
.sfunc
= set_verbose
;
680 set_verbose (NULL
, 0, c
);
682 add_prefix_cmd ("history", class_support
, set_history
,
683 "Generic command for setting command history parameters.",
684 &sethistlist
, "set history ", 0, &setlist
);
685 add_prefix_cmd ("history", class_support
, show_history
,
686 "Generic command for showing command history parameters.",
687 &showhistlist
, "show history ", 0, &showlist
);
690 (add_set_cmd ("expansion", no_class
, var_boolean
, (char *) &history_expansion_p
,
691 "Set history expansion on command input.\n\
692 Without an argument, history expansion is enabled.", &sethistlist
),
695 add_prefix_cmd ("info", class_info
, info_command
,
696 "Generic command for showing things about the program being debugged.",
697 &infolist
, "info ", 0, &cmdlist
);
698 add_com_alias ("i", "info", class_info
, 1);
700 add_com ("complete", class_obscure
, complete_command
,
701 "List the completions for the rest of the line as a command.");
703 add_prefix_cmd ("show", class_info
, show_command
,
704 "Generic command for showing things about the debugger.",
705 &showlist
, "show ", 0, &cmdlist
);
706 /* Another way to get at the same thing. */
707 add_info ("set", show_command
, "Show all GDB settings.");
709 add_cmd ("commands", no_class
, show_commands
,
710 "Show the history of commands you typed.\n\
711 You can supply a command number to start with, or a `+' to start after\n\
712 the previous command number shown.",
715 add_cmd ("version", no_class
, show_version
,
716 "Show what version of GDB this is.", &showlist
);
718 add_com ("while", class_support
, while_command
,
719 "Execute nested commands WHILE the conditional expression is non zero.\n\
720 The conditional expression must follow the word `while' and must in turn be\n\
721 followed by a new line. The nested commands must be entered one per line,\n\
722 and should be terminated by the word `end'.");
724 add_com ("if", class_support
, if_command
,
725 "Execute nested commands once IF the conditional expression is non zero.\n\
726 The conditional expression must follow the word `if' and must in turn be\n\
727 followed by a new line. The nested commands must be entered one per line,\n\
728 and should be terminated by the word 'else' or `end'. If an else clause\n\
729 is used, the same rules apply to its nested commands as to the first ones.");
731 /* If target is open when baud changes, it doesn't take effect until the
732 next open (I think, not sure). */
733 add_show_from_set (add_set_cmd ("remotebaud", no_class
,
734 var_zinteger
, (char *) &baud_rate
,
735 "Set baud rate for remote serial I/O.\n\
736 This value is used to set the speed of the serial port when debugging\n\
737 using remote targets.", &setlist
),
740 c
= add_set_cmd ("remotedebug", no_class
, var_zinteger
,
741 (char *) &remote_debug
,
742 "Set debugging of remote protocol.\n\
743 When enabled, each packet sent or received with the remote target\n\
744 is displayed.", &setlist
);
745 deprecate_cmd (c
, "set debug remote");
746 deprecate_cmd (add_show_from_set (c
, &showlist
), "show debug remote");
748 add_show_from_set (add_set_cmd ("remote", no_class
, var_zinteger
,
749 (char *) &remote_debug
,
750 "Set debugging of remote protocol.\n\
751 When enabled, each packet sent or received with the remote target\n\
752 is displayed.", &setdebuglist
),
756 add_set_cmd ("remotetimeout", no_class
, var_integer
, (char *) &remote_timeout
,
757 "Set timeout limit to wait for target to respond.\n\
758 This value is used to set the time limit for gdb to wait for a response\n\
759 from the target.", &setlist
),
762 add_prefix_cmd ("debug", no_class
, set_debug
,
763 "Generic command for setting gdb debugging flags",
764 &setdebuglist
, "set debug ", 0, &setlist
);
766 add_prefix_cmd ("debug", no_class
, show_debug
,
767 "Generic command for showing gdb debugging flags",
768 &showdebuglist
, "show debug ", 0, &showlist
);
770 c
= add_com ("shell", class_support
, shell_escape
,
771 "Execute the rest of the line as a shell command. \n\
772 With no arguments, run an inferior shell.");
773 c
->completer
= filename_completer
;
775 /* NOTE: cagney/2000-03-20: Being able to enter ``(gdb) !ls'' would
776 be a really useful feature. Unfortunately, the below wont do
777 this. Instead it adds support for the form ``(gdb) ! ls''
778 (i.e. the space is required). If the ``!'' command below is
779 added the complains about no ``!'' command would be replaced by
780 complains about how the ``!'' command is broken :-) */
782 add_com_alias ("!", "shell", class_support
, 0);
784 c
= add_com ("make", class_support
, make_command
,
785 "Run the ``make'' program using the rest of the line as arguments.");
786 c
->completer
= filename_completer
;
787 add_cmd ("user", no_class
, show_user
,
788 "Show definitions of user defined commands.\n\
789 Argument is the name of the user defined command.\n\
790 With no argument, show definitions of all user defined commands.", &showlist
);
791 add_com ("apropos", class_support
, apropos_command
, "Search for commands matching a REGEXP");
This page took 0.057441 seconds and 4 git commands to generate.