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 "gnu-regex.h" /* Used by apropos_command */
32 #include "cli/cli-decode.h"
33 #include "cli/cli-script.h"
34 #include "cli/cli-setshow.h"
35 #include "cli/cli-cmds.h"
37 #ifndef GDBINIT_FILENAME
38 #define GDBINIT_FILENAME ".gdbinit"
41 /* FIXME: this should be auto-configured! */
48 extern void dont_repeat (void);
50 extern void set_verbose (char *, int, struct cmd_list_element
*);
52 extern void show_history (char *, int);
54 extern void set_history (char *, int);
56 extern void show_commands (char *, int);
58 /* Prototypes for local functions */
60 static void complete_command (char *, int);
62 static void echo_command (char *, int);
64 static void pwd_command (char *, int);
66 static void show_version (char *, int);
68 static void validate_comname (char *);
70 static void help_command (char *, int);
72 static void show_command (char *, int);
74 static void info_command (char *, int);
76 static void show_debug (char *, int);
78 static void set_debug (char *, int);
80 static void show_user (char *, int);
82 static void make_command (char *, int);
84 static void shell_escape (char *, int);
86 void apropos_command (char *, int);
88 /* Define all cmd_list_elements. */
90 /* Chain containing all defined commands. */
92 struct cmd_list_element
*cmdlist
;
94 /* Chain containing all defined info subcommands. */
96 struct cmd_list_element
*infolist
;
98 /* Chain containing all defined enable subcommands. */
100 struct cmd_list_element
*enablelist
;
102 /* Chain containing all defined disable subcommands. */
104 struct cmd_list_element
*disablelist
;
106 /* Chain containing all defined toggle subcommands. */
108 struct cmd_list_element
*togglelist
;
110 /* Chain containing all defined stop subcommands. */
112 struct cmd_list_element
*stoplist
;
114 /* Chain containing all defined delete subcommands. */
116 struct cmd_list_element
*deletelist
;
118 /* Chain containing all defined "enable breakpoint" subcommands. */
120 struct cmd_list_element
*enablebreaklist
;
122 /* Chain containing all defined set subcommands */
124 struct cmd_list_element
*setlist
;
126 /* Chain containing all defined unset subcommands */
128 struct cmd_list_element
*unsetlist
;
130 /* Chain containing all defined show subcommands. */
132 struct cmd_list_element
*showlist
;
134 /* Chain containing all defined \"set history\". */
136 struct cmd_list_element
*sethistlist
;
138 /* Chain containing all defined \"show history\". */
140 struct cmd_list_element
*showhistlist
;
142 /* Chain containing all defined \"unset history\". */
144 struct cmd_list_element
*unsethistlist
;
146 /* Chain containing all defined maintenance subcommands. */
148 struct cmd_list_element
*maintenancelist
;
150 /* Chain containing all defined "maintenance info" subcommands. */
152 struct cmd_list_element
*maintenanceinfolist
;
154 /* Chain containing all defined "maintenance print" subcommands. */
156 struct cmd_list_element
*maintenanceprintlist
;
158 struct cmd_list_element
*setprintlist
;
160 struct cmd_list_element
*showprintlist
;
162 struct cmd_list_element
*setdebuglist
;
164 struct cmd_list_element
*showdebuglist
;
166 struct cmd_list_element
*setchecklist
;
168 struct cmd_list_element
*showchecklist
;
170 /* Utility used everywhere when at least one argument is needed and
174 error_no_arg (char *why
)
176 error ("Argument required (%s).", why
);
179 /* The "info" command is defined as a prefix, with allow_unknown = 0.
180 Therefore, its own definition is called only for "info" with no args. */
184 info_command (char *arg
, int from_tty
)
186 printf_unfiltered ("\"info\" must be followed by the name of an info command.\n");
187 help_list (infolist
, "info ", -1, gdb_stdout
);
190 /* The "show" command with no arguments shows all the settings. */
194 show_command (char *arg
, int from_tty
)
196 cmd_show_list (showlist
, from_tty
, "");
199 /* Provide documentation on command or list given by COMMAND. FROM_TTY
204 help_command (char *command
, int from_tty
)
206 help_cmd (command
, gdb_stdout
);
209 /* The "complete" command is used by Emacs to implement completion. */
213 complete_command (char *arg
, int from_tty
)
223 argpoint
= strlen (arg
);
225 for (completion
= line_completion_function (arg
, i
= 0, arg
, argpoint
);
227 completion
= line_completion_function (arg
, ++i
, arg
, argpoint
))
229 printf_unfiltered ("%s\n", completion
);
234 int is_complete_command (void (*func
) (char *args
, int from_tty
))
236 return func
== complete_command
;
241 show_version (char *args
, int from_tty
)
244 print_gdb_version (gdb_stdout
);
245 printf_filtered ("\n");
249 /* Handle the quit command. */
252 quit_command (char *args
, int from_tty
)
254 if (!quit_confirm ())
255 error ("Not confirmed.");
256 quit_force (args
, from_tty
);
261 pwd_command (char *args
, int from_tty
)
264 error ("The \"pwd\" command does not take an argument: %s", args
);
265 getcwd (gdb_dirbuf
, sizeof (gdb_dirbuf
));
267 if (!STREQ (gdb_dirbuf
, current_directory
))
268 printf_unfiltered ("Working directory %s\n (canonically %s).\n",
269 current_directory
, gdb_dirbuf
);
271 printf_unfiltered ("Working directory %s.\n", current_directory
);
275 cd_command (char *dir
, int from_tty
)
278 /* Found something other than leading repetitions of "/..". */
282 /* If the new directory is absolute, repeat is a no-op; if relative,
283 repeat might be useful but is more likely to be a mistake. */
287 error_no_arg ("new working directory");
289 dir
= tilde_expand (dir
);
290 make_cleanup (xfree
, dir
);
293 perror_with_name (dir
);
295 #if defined(_WIN32) || defined(__MSDOS__)
296 /* There's too much mess with DOSish names like "d:", "d:.",
297 "d:./foo" etc. Instead of having lots of special #ifdef'ed code,
298 simply get the canonicalized name of the current directory. */
299 dir
= getcwd (gdb_dirbuf
, sizeof (gdb_dirbuf
));
303 if (SLASH_P (dir
[len
- 1]))
305 /* Remove the trailing slash unless this is a root directory
306 (including a drive letter on non-Unix systems). */
307 if (!(len
== 1) /* "/" */
308 #if defined(_WIN32) || defined(__MSDOS__)
309 && !(!SLASH_P (*dir
) && ROOTED_P (dir
) && len
<= 3) /* "d:/" */
315 dir
= savestring (dir
, len
);
317 current_directory
= dir
;
320 if (SLASH_P (current_directory
[strlen (current_directory
) - 1]))
321 current_directory
= concat (current_directory
, dir
, NULL
);
323 current_directory
= concat (current_directory
, SLASH_STRING
, dir
, NULL
);
327 /* Now simplify any occurrences of `.' and `..' in the pathname. */
330 for (p
= current_directory
; *p
;)
332 if (SLASH_P (p
[0]) && p
[1] == '.' && (p
[2] == 0 || SLASH_P (p
[2])))
334 else if (SLASH_P (p
[0]) && p
[1] == '.' && p
[2] == '.'
335 && (p
[3] == 0 || SLASH_P (p
[3])))
339 /* Search backwards for the directory just before the "/.."
340 and obliterate it and the "/..". */
342 while (q
!= current_directory
&& !SLASH_P (q
[-1]))
345 if (q
== current_directory
)
346 /* current_directory is
347 a relative pathname ("can't happen"--leave it alone). */
351 strcpy (q
- 1, p
+ 3);
356 /* We are dealing with leading repetitions of "/..", for example
357 "/../..", which is the Mach super-root. */
367 forget_cached_source_info ();
370 pwd_command ((char *) 0, 1);
374 source_command (char *args
, int from_tty
)
377 struct cleanup
*old_cleanups
;
382 error ("source command requires pathname of file to source.");
385 file
= tilde_expand (file
);
386 old_cleanups
= make_cleanup (xfree
, file
);
388 stream
= fopen (file
, FOPEN_RT
);
392 perror_with_name (file
);
397 script_from_file (stream
, file
);
399 do_cleanups (old_cleanups
);
404 echo_command (char *text
, int from_tty
)
410 while ((c
= *p
++) != '\0')
414 /* \ at end of argument is used after spaces
415 so they won't be lost. */
419 c
= parse_escape (&p
);
421 printf_filtered ("%c", c
);
424 printf_filtered ("%c", c
);
427 /* Force this output to appear now. */
429 gdb_flush (gdb_stdout
);
434 shell_escape (char *arg
, int from_tty
)
437 /* If ARG is NULL, they want an inferior shell, but `system' just
438 reports if the shell is available when passed a NULL arg. */
439 int rc
= system (arg
? arg
: "");
442 arg
= "inferior shell";
446 fprintf_unfiltered (gdb_stderr
, "Cannot execute %s: %s\n", arg
,
447 safe_strerror (errno
));
448 gdb_flush (gdb_stderr
);
452 fprintf_unfiltered (gdb_stderr
, "%s exited with status %d\n", arg
, rc
);
453 gdb_flush (gdb_stderr
);
456 /* Make sure to return to the directory GDB thinks it is, in case the
457 shell command we just ran changed it. */
458 chdir (current_directory
);
460 #else /* Can fork. */
462 char *p
, *user_shell
;
464 if ((user_shell
= (char *) getenv ("SHELL")) == NULL
)
465 user_shell
= "/bin/sh";
467 /* Get the name of the shell for arg0 */
468 if ((p
= strrchr (user_shell
, '/')) == NULL
)
471 p
++; /* Get past '/' */
473 if ((pid
= fork ()) == 0)
476 execl (user_shell
, p
, 0);
478 execl (user_shell
, p
, "-c", arg
, 0);
480 fprintf_unfiltered (gdb_stderr
, "Cannot execute %s: %s\n", user_shell
,
481 safe_strerror (errno
));
482 gdb_flush (gdb_stderr
);
487 while ((rc
= wait (&status
)) != pid
&& rc
!= -1)
490 error ("Fork failed");
491 #endif /* Can fork. */
495 make_command (char *arg
, int from_tty
)
503 p
= xmalloc (sizeof ("make ") + strlen (arg
));
505 strcpy (p
+ sizeof ("make ") - 1, arg
);
508 shell_escape (p
, from_tty
);
513 show_user (char *args
, int from_tty
)
515 struct cmd_list_element
*c
;
516 extern struct cmd_list_element
*cmdlist
;
520 c
= lookup_cmd (&args
, cmdlist
, "", 0, 1);
521 if (c
->class != class_user
)
522 error ("Not a user command.");
523 show_user_1 (c
, gdb_stdout
);
527 for (c
= cmdlist
; c
; c
= c
->next
)
529 if (c
->class == class_user
)
530 show_user_1 (c
, gdb_stdout
);
535 /* Search through names of commands and documentations for a certain
539 apropos_command (char *searchstr
, int from_tty
)
541 extern struct cmd_list_element
*cmdlist
; /*This is the main command list*/
543 char *pattern_fastmap
;
544 char errorbuffer
[512];
545 pattern_fastmap
= xcalloc (256, sizeof (char));
546 if (searchstr
== NULL
)
547 error("REGEXP string is empty");
549 if (regcomp(&pattern
,searchstr
,REG_ICASE
) == 0)
551 pattern
.fastmap
=pattern_fastmap
;
552 re_compile_fastmap(&pattern
);
553 apropos_cmd (gdb_stdout
,cmdlist
,&pattern
,"");
557 regerror(regcomp(&pattern
,searchstr
,REG_ICASE
),NULL
,errorbuffer
,512);
558 error("Error in regular expression:%s",errorbuffer
);
560 xfree (pattern_fastmap
);
564 set_debug (char *arg
, int from_tty
)
566 printf_unfiltered ("\"set debug\" must be followed by the name of a print subcommand.\n");
567 help_list (setdebuglist
, "set debug ", -1, gdb_stdout
);
571 show_debug (char *args
, int from_tty
)
573 cmd_show_list (showdebuglist
, from_tty
, "");
577 init_cmd_lists (void)
586 enablebreaklist
= NULL
;
592 unsethistlist
= NULL
;
593 maintenancelist
= NULL
;
594 maintenanceinfolist
= NULL
;
595 maintenanceprintlist
= NULL
;
597 showprintlist
= NULL
;
599 showchecklist
= NULL
;
606 struct cmd_list_element
*c
;
608 /* Define the classes of commands.
609 They will appear in the help list in the reverse of this order. */
611 add_cmd ("internals", class_maintenance
, NO_FUNCTION
,
612 "Maintenance commands.\n\
613 Some gdb commands are provided just for use by gdb maintainers.\n\
614 These commands are subject to frequent change, and may not be as\n\
615 well documented as user commands.",
617 add_cmd ("obscure", class_obscure
, NO_FUNCTION
, "Obscure features.", &cmdlist
);
618 add_cmd ("aliases", class_alias
, NO_FUNCTION
, "Aliases of other commands.", &cmdlist
);
619 add_cmd ("user-defined", class_user
, NO_FUNCTION
, "User-defined commands.\n\
620 The commands in this class are those defined by the user.\n\
621 Use the \"define\" command to define a command.", &cmdlist
);
622 add_cmd ("support", class_support
, NO_FUNCTION
, "Support facilities.", &cmdlist
);
624 add_cmd ("status", class_info
, NO_FUNCTION
, "Status inquiries.", &cmdlist
);
625 add_cmd ("files", class_files
, NO_FUNCTION
, "Specifying and examining files.", &cmdlist
);
626 add_cmd ("breakpoints", class_breakpoint
, NO_FUNCTION
, "Making program stop at certain points.", &cmdlist
);
627 add_cmd ("data", class_vars
, NO_FUNCTION
, "Examining data.", &cmdlist
);
628 add_cmd ("stack", class_stack
, NO_FUNCTION
, "Examining the stack.\n\
629 The stack is made up of stack frames. Gdb assigns numbers to stack frames\n\
630 counting from zero for the innermost (currently executing) frame.\n\n\
631 At any time gdb identifies one frame as the \"selected\" frame.\n\
632 Variable lookups are done with respect to the selected frame.\n\
633 When the program being debugged stops, gdb selects the innermost frame.\n\
634 The commands below can be used to select other frames by number or address.",
636 add_cmd ("running", class_run
, NO_FUNCTION
, "Running the program.", &cmdlist
);
638 /* Define general commands. */
640 add_com ("pwd", class_files
, pwd_command
,
641 "Print working directory. This is used for your program as well.");
642 c
= add_cmd ("cd", class_files
, cd_command
,
643 "Set working directory to DIR for debugger and program being debugged.\n\
644 The change does not take effect for the program being debugged\n\
645 until the next time it is started.", &cmdlist
);
646 c
->completer
= filename_completer
;
648 add_com ("echo", class_support
, echo_command
,
649 "Print a constant string. Give string as argument.\n\
650 C escape sequences may be used in the argument.\n\
651 No newline is added at the end of the argument;\n\
652 use \"\\n\" if you want a newline to be printed.\n\
653 Since leading and trailing whitespace are ignored in command arguments,\n\
654 if you want to print some you must use \"\\\" before leading whitespace\n\
655 to be printed or after trailing whitespace.");
656 add_com ("document", class_support
, document_command
,
657 "Document a user-defined command.\n\
658 Give command name as argument. Give documentation on following lines.\n\
659 End with a line of just \"end\".");
660 add_com ("define", class_support
, define_command
,
661 "Define a new command name. Command name is argument.\n\
662 Definition appears on following lines, one command per line.\n\
663 End with a line of just \"end\".\n\
664 Use the \"document\" command to give documentation for the new command.\n\
665 Commands defined in this way may have up to ten arguments.");
667 c
= add_cmd ("source", class_support
, source_command
,
668 "Read commands from a file named FILE.\n\
669 Note that the file \"" GDBINIT_FILENAME
"\" is read automatically in this way\n\
670 when gdb is started.", &cmdlist
);
671 c
->completer
= filename_completer
;
673 add_com ("quit", class_support
, quit_command
, "Exit gdb.");
674 add_com ("help", class_support
, help_command
, "Print list of commands.");
675 add_com_alias ("q", "quit", class_support
, 1);
676 add_com_alias ("h", "help", class_support
, 1);
678 c
= add_set_cmd ("verbose", class_support
, var_boolean
, (char *) &info_verbose
,
681 add_show_from_set (c
, &showlist
);
682 c
->function
.sfunc
= set_verbose
;
683 set_verbose (NULL
, 0, c
);
685 add_prefix_cmd ("history", class_support
, set_history
,
686 "Generic command for setting command history parameters.",
687 &sethistlist
, "set history ", 0, &setlist
);
688 add_prefix_cmd ("history", class_support
, show_history
,
689 "Generic command for showing command history parameters.",
690 &showhistlist
, "show history ", 0, &showlist
);
693 (add_set_cmd ("expansion", no_class
, var_boolean
, (char *) &history_expansion_p
,
694 "Set history expansion on command input.\n\
695 Without an argument, history expansion is enabled.", &sethistlist
),
698 add_prefix_cmd ("info", class_info
, info_command
,
699 "Generic command for showing things about the program being debugged.",
700 &infolist
, "info ", 0, &cmdlist
);
701 add_com_alias ("i", "info", class_info
, 1);
703 add_com ("complete", class_obscure
, complete_command
,
704 "List the completions for the rest of the line as a command.");
706 add_prefix_cmd ("show", class_info
, show_command
,
707 "Generic command for showing things about the debugger.",
708 &showlist
, "show ", 0, &cmdlist
);
709 /* Another way to get at the same thing. */
710 add_info ("set", show_command
, "Show all GDB settings.");
712 add_cmd ("commands", no_class
, show_commands
,
713 "Show the history of commands you typed.\n\
714 You can supply a command number to start with, or a `+' to start after\n\
715 the previous command number shown.",
718 add_cmd ("version", no_class
, show_version
,
719 "Show what version of GDB this is.", &showlist
);
721 add_com ("while", class_support
, while_command
,
722 "Execute nested commands WHILE the conditional expression is non zero.\n\
723 The conditional expression must follow the word `while' and must in turn be\n\
724 followed by a new line. The nested commands must be entered one per line,\n\
725 and should be terminated by the word `end'.");
727 add_com ("if", class_support
, if_command
,
728 "Execute nested commands once IF the conditional expression is non zero.\n\
729 The conditional expression must follow the word `if' and must in turn be\n\
730 followed by a new line. The nested commands must be entered one per line,\n\
731 and should be terminated by the word 'else' or `end'. If an else clause\n\
732 is used, the same rules apply to its nested commands as to the first ones.");
734 /* If target is open when baud changes, it doesn't take effect until the
735 next open (I think, not sure). */
736 add_show_from_set (add_set_cmd ("remotebaud", no_class
,
737 var_zinteger
, (char *) &baud_rate
,
738 "Set baud rate for remote serial I/O.\n\
739 This value is used to set the speed of the serial port when debugging\n\
740 using remote targets.", &setlist
),
743 c
= add_set_cmd ("remotedebug", no_class
, var_zinteger
,
744 (char *) &remote_debug
,
745 "Set debugging of remote protocol.\n\
746 When enabled, each packet sent or received with the remote target\n\
747 is displayed.", &setlist
);
748 deprecate_cmd (c
, "set debug remote");
749 deprecate_cmd (add_show_from_set (c
, &showlist
), "show debug remote");
751 add_show_from_set (add_set_cmd ("remote", no_class
, var_zinteger
,
752 (char *) &remote_debug
,
753 "Set debugging of remote protocol.\n\
754 When enabled, each packet sent or received with the remote target\n\
755 is displayed.", &setdebuglist
),
759 add_set_cmd ("remotetimeout", no_class
, var_integer
, (char *) &remote_timeout
,
760 "Set timeout limit to wait for target to respond.\n\
761 This value is used to set the time limit for gdb to wait for a response\n\
762 from the target.", &setlist
),
765 add_prefix_cmd ("debug", no_class
, set_debug
,
766 "Generic command for setting gdb debugging flags",
767 &setdebuglist
, "set debug ", 0, &setlist
);
769 add_prefix_cmd ("debug", no_class
, show_debug
,
770 "Generic command for showing gdb debugging flags",
771 &showdebuglist
, "show debug ", 0, &showlist
);
773 c
= add_com ("shell", class_support
, shell_escape
,
774 "Execute the rest of the line as a shell command. \n\
775 With no arguments, run an inferior shell.");
776 c
->completer
= filename_completer
;
778 /* NOTE: cagney/2000-03-20: Being able to enter ``(gdb) !ls'' would
779 be a really useful feature. Unfortunately, the below wont do
780 this. Instead it adds support for the form ``(gdb) ! ls''
781 (i.e. the space is required). If the ``!'' command below is
782 added the complains about no ``!'' command would be replaced by
783 complains about how the ``!'' command is broken :-) */
785 add_com_alias ("!", "shell", class_support
, 0);
787 c
= add_com ("make", class_support
, make_command
,
788 "Run the ``make'' program using the rest of the line as arguments.");
789 c
->completer
= filename_completer
;
790 add_cmd ("user", no_class
, show_user
,
791 "Show definitions of user defined commands.\n\
792 Argument is the name of the user defined command.\n\
793 With no argument, show definitions of all user defined commands.", &showlist
);
794 add_com ("apropos", class_support
, apropos_command
, "Search for commands matching a REGEXP");
This page took 0.046068 seconds and 4 git commands to generate.