2003-06-21 Andrew Cagney <cagney@redhat.com>
[deliverable/binutils-gdb.git] / gdb / cli / cli-cmds.c
CommitLineData
d318976c 1/* GDB CLI commands.
8926118c 2
de5ad195 3 Copyright 2000, 2001, 2002, 2003 Free Software Foundation, Inc.
d318976c
FN
4
5 This file is part of GDB.
6
7 This program is free software; you can redistribute it and/or modify
8 it under the terms of the GNU General Public License as published by
9 the Free Software Foundation; either version 2 of the License, or
10 (at your option) any later version.
11
12 This program is distributed in the hope that it will be useful,
13 but WITHOUT ANY WARRANTY; without even the implied warranty of
14 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 GNU General Public License for more details.
16
17 You should have received a copy of the GNU General Public License
18 along with this program; if not, write to the Free Software
19 Foundation, Inc., 59 Temple Place - Suite 330,
20 Boston, MA 02111-1307, USA. */
21
22#include "defs.h"
808013d1 23#include <readline/tilde.h>
d318976c
FN
24#include "completer.h"
25#include "target.h" /* For baud_rate, remote_debug and remote_timeout */
26#include "gdb_wait.h" /* For shell escape implementation */
f77b92bf 27#include "gdb_regex.h" /* Used by apropos_command */
5f8a3188 28#include "gdb_string.h"
0378c332
FN
29#include "linespec.h"
30#include "expression.h"
83c31e7d
FN
31#include "frame.h"
32#include "value.h"
0378c332 33#include "language.h"
fe4e3eb8 34#include "filenames.h" /* for DOSish file names */
0378c332
FN
35#include "objfiles.h"
36#include "source.h"
83c31e7d 37#include "disasm.h"
d318976c 38
d318976c 39#include "ui-out.h"
d318976c
FN
40
41#include "top.h"
42#include "cli/cli-decode.h"
43#include "cli/cli-script.h"
44#include "cli/cli-setshow.h"
45#include "cli/cli-cmds.h"
46
47#ifndef GDBINIT_FILENAME
48#define GDBINIT_FILENAME ".gdbinit"
49#endif
50
0378c332 51/* Prototypes for local command functions */
d318976c
FN
52
53static void complete_command (char *, int);
54
55static void echo_command (char *, int);
56
57static void pwd_command (char *, int);
58
59static void show_version (char *, int);
60
61static void validate_comname (char *);
62
63static void help_command (char *, int);
64
65static void show_command (char *, int);
66
67static void info_command (char *, int);
68
69static void show_debug (char *, int);
70
71static void set_debug (char *, int);
72
73static void show_user (char *, int);
74
75static void make_command (char *, int);
76
77static void shell_escape (char *, int);
78
0378c332
FN
79static void edit_command (char *, int);
80
81static void list_command (char *, int);
82
d318976c 83void apropos_command (char *, int);
0378c332
FN
84
85/* Prototypes for local utility functions */
86
87static void ambiguous_line_spec (struct symtabs_and_lines *);
d318976c 88\f
20f01a46
DH
89/* Limit the call depth of user-defined commands */
90int max_user_call_depth;
91
d318976c
FN
92/* Define all cmd_list_elements. */
93
94/* Chain containing all defined commands. */
95
96struct cmd_list_element *cmdlist;
97
98/* Chain containing all defined info subcommands. */
99
100struct cmd_list_element *infolist;
101
102/* Chain containing all defined enable subcommands. */
103
104struct cmd_list_element *enablelist;
105
106/* Chain containing all defined disable subcommands. */
107
108struct cmd_list_element *disablelist;
109
110/* Chain containing all defined toggle subcommands. */
111
112struct cmd_list_element *togglelist;
113
114/* Chain containing all defined stop subcommands. */
115
116struct cmd_list_element *stoplist;
117
118/* Chain containing all defined delete subcommands. */
119
120struct cmd_list_element *deletelist;
121
122/* Chain containing all defined "enable breakpoint" subcommands. */
123
124struct cmd_list_element *enablebreaklist;
125
126/* Chain containing all defined set subcommands */
127
128struct cmd_list_element *setlist;
129
130/* Chain containing all defined unset subcommands */
131
132struct cmd_list_element *unsetlist;
133
134/* Chain containing all defined show subcommands. */
135
136struct cmd_list_element *showlist;
137
138/* Chain containing all defined \"set history\". */
139
140struct cmd_list_element *sethistlist;
141
142/* Chain containing all defined \"show history\". */
143
144struct cmd_list_element *showhistlist;
145
146/* Chain containing all defined \"unset history\". */
147
148struct cmd_list_element *unsethistlist;
149
150/* Chain containing all defined maintenance subcommands. */
151
152struct cmd_list_element *maintenancelist;
153
154/* Chain containing all defined "maintenance info" subcommands. */
155
156struct cmd_list_element *maintenanceinfolist;
157
158/* Chain containing all defined "maintenance print" subcommands. */
159
160struct cmd_list_element *maintenanceprintlist;
161
162struct cmd_list_element *setprintlist;
163
164struct cmd_list_element *showprintlist;
165
166struct cmd_list_element *setdebuglist;
167
168struct cmd_list_element *showdebuglist;
169
170struct cmd_list_element *setchecklist;
171
172struct cmd_list_element *showchecklist;
173\f
174/* Utility used everywhere when at least one argument is needed and
175 none is supplied. */
176
177void
178error_no_arg (char *why)
179{
180 error ("Argument required (%s).", why);
181}
182
183/* The "info" command is defined as a prefix, with allow_unknown = 0.
184 Therefore, its own definition is called only for "info" with no args. */
185
186/* ARGSUSED */
187static void
188info_command (char *arg, int from_tty)
189{
190 printf_unfiltered ("\"info\" must be followed by the name of an info command.\n");
191 help_list (infolist, "info ", -1, gdb_stdout);
192}
193
194/* The "show" command with no arguments shows all the settings. */
195
196/* ARGSUSED */
197static void
198show_command (char *arg, int from_tty)
199{
200 cmd_show_list (showlist, from_tty, "");
201}
202\f
203/* Provide documentation on command or list given by COMMAND. FROM_TTY
204 is ignored. */
205
206/* ARGSUSED */
207static void
208help_command (char *command, int from_tty)
209{
210 help_cmd (command, gdb_stdout);
211}
212\f
83d31a92
TT
213/* String compare function for qsort. */
214static int
215compare_strings (const void *arg1, const void *arg2)
216{
217 const char **s1 = (const char **) arg1;
218 const char **s2 = (const char **) arg2;
219 return strcmp (*s1, *s2);
220}
221
d318976c
FN
222/* The "complete" command is used by Emacs to implement completion. */
223
224/* ARGSUSED */
225static void
226complete_command (char *arg, int from_tty)
227{
228 int i;
229 int argpoint;
83d31a92 230 char **completions;
d318976c
FN
231
232 dont_repeat ();
233
234 if (arg == NULL)
235 arg = "";
236 argpoint = strlen (arg);
237
83d31a92
TT
238 completions = complete_line (arg, arg, argpoint);
239
240 if (completions)
d318976c 241 {
83d31a92
TT
242 int item, size;
243
244 for (size = 0; completions[size]; ++size)
245 ;
246 qsort (completions, size, sizeof (char *), compare_strings);
247
248 /* We do extra processing here since we only want to print each
249 unique item once. */
250 item = 0;
251 while (item < size)
252 {
253 int next_item;
254 printf_unfiltered ("%s\n", completions[item]);
255 next_item = item + 1;
256 while (next_item < size
257 && ! strcmp (completions[item], completions[next_item]))
258 {
259 xfree (completions[next_item]);
260 ++next_item;
261 }
262
263 xfree (completions[item]);
264 item = next_item;
265 }
266
267 xfree (completions);
d318976c
FN
268 }
269}
270
bbaca940
AC
271int
272is_complete_command (struct cmd_list_element *c)
d318976c 273{
bbaca940 274 return cmd_cfunc_eq (c, complete_command);
d318976c
FN
275}
276
277/* ARGSUSED */
278static void
279show_version (char *args, int from_tty)
280{
281 immediate_quit++;
282 print_gdb_version (gdb_stdout);
283 printf_filtered ("\n");
284 immediate_quit--;
285}
286
287/* Handle the quit command. */
288
289void
290quit_command (char *args, int from_tty)
291{
292 if (!quit_confirm ())
293 error ("Not confirmed.");
294 quit_force (args, from_tty);
295}
296
297/* ARGSUSED */
298static void
299pwd_command (char *args, int from_tty)
300{
301 if (args)
302 error ("The \"pwd\" command does not take an argument: %s", args);
303 getcwd (gdb_dirbuf, sizeof (gdb_dirbuf));
304
305 if (!STREQ (gdb_dirbuf, current_directory))
306 printf_unfiltered ("Working directory %s\n (canonically %s).\n",
307 current_directory, gdb_dirbuf);
308 else
309 printf_unfiltered ("Working directory %s.\n", current_directory);
310}
311
312void
313cd_command (char *dir, int from_tty)
314{
315 int len;
316 /* Found something other than leading repetitions of "/..". */
317 int found_real_path;
318 char *p;
319
320 /* If the new directory is absolute, repeat is a no-op; if relative,
321 repeat might be useful but is more likely to be a mistake. */
322 dont_repeat ();
323
324 if (dir == 0)
325 error_no_arg ("new working directory");
326
327 dir = tilde_expand (dir);
b8c9b27d 328 make_cleanup (xfree, dir);
d318976c
FN
329
330 if (chdir (dir) < 0)
331 perror_with_name (dir);
332
c3690141 333#ifdef HAVE_DOS_BASED_FILE_SYSTEM
d318976c
FN
334 /* There's too much mess with DOSish names like "d:", "d:.",
335 "d:./foo" etc. Instead of having lots of special #ifdef'ed code,
336 simply get the canonicalized name of the current directory. */
337 dir = getcwd (gdb_dirbuf, sizeof (gdb_dirbuf));
338#endif
339
340 len = strlen (dir);
fe4e3eb8 341 if (IS_DIR_SEPARATOR (dir[len - 1]))
d318976c
FN
342 {
343 /* Remove the trailing slash unless this is a root directory
344 (including a drive letter on non-Unix systems). */
345 if (!(len == 1) /* "/" */
c3690141 346#ifdef HAVE_DOS_BASED_FILE_SYSTEM
fe4e3eb8 347 && !(len == 3 && dir[1] == ':') /* "d:/" */
d318976c
FN
348#endif
349 )
350 len--;
351 }
352
353 dir = savestring (dir, len);
fe4e3eb8 354 if (IS_ABSOLUTE_PATH (dir))
d318976c
FN
355 current_directory = dir;
356 else
357 {
fe4e3eb8 358 if (IS_DIR_SEPARATOR (current_directory[strlen (current_directory) - 1]))
d318976c
FN
359 current_directory = concat (current_directory, dir, NULL);
360 else
361 current_directory = concat (current_directory, SLASH_STRING, dir, NULL);
b8c9b27d 362 xfree (dir);
d318976c
FN
363 }
364
365 /* Now simplify any occurrences of `.' and `..' in the pathname. */
366
367 found_real_path = 0;
368 for (p = current_directory; *p;)
369 {
fe4e3eb8
EZ
370 if (IS_DIR_SEPARATOR (p[0]) && p[1] == '.'
371 && (p[2] == 0 || IS_DIR_SEPARATOR (p[2])))
d318976c 372 strcpy (p, p + 2);
fe4e3eb8
EZ
373 else if (IS_DIR_SEPARATOR (p[0]) && p[1] == '.' && p[2] == '.'
374 && (p[3] == 0 || IS_DIR_SEPARATOR (p[3])))
d318976c
FN
375 {
376 if (found_real_path)
377 {
378 /* Search backwards for the directory just before the "/.."
379 and obliterate it and the "/..". */
380 char *q = p;
fe4e3eb8 381 while (q != current_directory && !IS_DIR_SEPARATOR (q[-1]))
d318976c
FN
382 --q;
383
384 if (q == current_directory)
385 /* current_directory is
386 a relative pathname ("can't happen"--leave it alone). */
387 ++p;
388 else
389 {
390 strcpy (q - 1, p + 3);
391 p = q - 1;
392 }
393 }
394 else
395 /* We are dealing with leading repetitions of "/..", for example
396 "/../..", which is the Mach super-root. */
397 p += 3;
398 }
399 else
400 {
401 found_real_path = 1;
402 ++p;
403 }
404 }
405
406 forget_cached_source_info ();
407
408 if (from_tty)
409 pwd_command ((char *) 0, 1);
410}
411\f
412void
413source_command (char *args, int from_tty)
414{
415 FILE *stream;
416 struct cleanup *old_cleanups;
417 char *file = args;
418
419 if (file == NULL)
420 {
421 error ("source command requires pathname of file to source.");
422 }
423
424 file = tilde_expand (file);
b8c9b27d 425 old_cleanups = make_cleanup (xfree, file);
d318976c
FN
426
427 stream = fopen (file, FOPEN_RT);
428 if (!stream)
429 {
430 if (from_tty)
431 perror_with_name (file);
432 else
433 return;
434 }
435
436 script_from_file (stream, file);
437
438 do_cleanups (old_cleanups);
439}
440
441/* ARGSUSED */
442static void
443echo_command (char *text, int from_tty)
444{
445 char *p = text;
446 register int c;
447
448 if (text)
449 while ((c = *p++) != '\0')
450 {
451 if (c == '\\')
452 {
453 /* \ at end of argument is used after spaces
454 so they won't be lost. */
455 if (*p == 0)
456 return;
457
458 c = parse_escape (&p);
459 if (c >= 0)
460 printf_filtered ("%c", c);
461 }
462 else
463 printf_filtered ("%c", c);
464 }
465
466 /* Force this output to appear now. */
467 wrap_here ("");
468 gdb_flush (gdb_stdout);
469}
470
471/* ARGSUSED */
472static void
473shell_escape (char *arg, int from_tty)
474{
475#ifdef CANT_FORK
476 /* If ARG is NULL, they want an inferior shell, but `system' just
477 reports if the shell is available when passed a NULL arg. */
478 int rc = system (arg ? arg : "");
479
480 if (!arg)
481 arg = "inferior shell";
482
483 if (rc == -1)
484 {
485 fprintf_unfiltered (gdb_stderr, "Cannot execute %s: %s\n", arg,
486 safe_strerror (errno));
487 gdb_flush (gdb_stderr);
488 }
489 else if (rc)
490 {
491 fprintf_unfiltered (gdb_stderr, "%s exited with status %d\n", arg, rc);
492 gdb_flush (gdb_stderr);
493 }
2584159e 494#ifdef GLOBAL_CURDIR
d318976c
FN
495 /* Make sure to return to the directory GDB thinks it is, in case the
496 shell command we just ran changed it. */
497 chdir (current_directory);
498#endif
499#else /* Can fork. */
500 int rc, status, pid;
501 char *p, *user_shell;
502
503 if ((user_shell = (char *) getenv ("SHELL")) == NULL)
504 user_shell = "/bin/sh";
505
506 /* Get the name of the shell for arg0 */
507 if ((p = strrchr (user_shell, '/')) == NULL)
508 p = user_shell;
509 else
510 p++; /* Get past '/' */
511
512 if ((pid = fork ()) == 0)
513 {
514 if (!arg)
515 execl (user_shell, p, 0);
516 else
517 execl (user_shell, p, "-c", arg, 0);
518
519 fprintf_unfiltered (gdb_stderr, "Cannot execute %s: %s\n", user_shell,
520 safe_strerror (errno));
521 gdb_flush (gdb_stderr);
522 _exit (0177);
523 }
524
525 if (pid != -1)
526 while ((rc = wait (&status)) != pid && rc != -1)
527 ;
528 else
529 error ("Fork failed");
530#endif /* Can fork. */
531}
532
0378c332
FN
533static void
534edit_command (char *arg, int from_tty)
535{
536 struct symtabs_and_lines sals;
537 struct symtab_and_line sal;
538 struct symbol *sym;
539 char *arg1;
540 int cmdlen, log10;
541 unsigned m;
542 char *editor;
543 char *p;
544
545 /* Pull in the current default source line if necessary */
546 if (arg == 0)
53cb0458
FN
547 {
548 set_default_source_symtab_and_line ();
549 sal = get_current_source_symtab_and_line ();
550 }
0378c332
FN
551
552 /* bare "edit" edits file with present line. */
553
554 if (arg == 0)
555 {
556 if (sal.symtab == 0)
557 error ("No default source file yet.");
558 sal.line += get_lines_to_list () / 2;
559 }
560 else
561 {
562
563 /* Now should only be one argument -- decode it in SAL */
564
565 arg1 = arg;
566 sals = decode_line_1 (&arg1, 0, 0, 0, 0);
567
568 if (! sals.nelts) return; /* C++ */
569 if (sals.nelts > 1) {
570 ambiguous_line_spec (&sals);
571 xfree (sals.sals);
572 return;
573 }
574
575 sal = sals.sals[0];
576 xfree (sals.sals);
577
578 if (*arg1)
579 error ("Junk at end of line specification.");
580
581 /* if line was specified by address,
582 first print exactly which line, and which file.
583 In this case, sal.symtab == 0 means address is outside
584 of all known source files, not that user failed to give a filename. */
585 if (*arg == '*')
586 {
587 if (sal.symtab == 0)
588 /* FIXME-32x64--assumes sal.pc fits in long. */
589 error ("No source file for address %s.",
590 local_hex_string((unsigned long) sal.pc));
591 sym = find_pc_function (sal.pc);
592 if (sym)
593 {
594 print_address_numeric (sal.pc, 1, gdb_stdout);
595 printf_filtered (" is in ");
de5ad195 596 fputs_filtered (SYMBOL_PRINT_NAME (sym), gdb_stdout);
0378c332
FN
597 printf_filtered (" (%s:%d).\n", sal.symtab->filename, sal.line);
598 }
599 else
600 {
601 print_address_numeric (sal.pc, 1, gdb_stdout);
602 printf_filtered (" is at %s:%d.\n",
603 sal.symtab->filename, sal.line);
604 }
605 }
606
607 /* If what was given does not imply a symtab, it must be an undebuggable
608 symbol which means no source code. */
609
610 if (sal.symtab == 0)
611 error ("No line number known for %s.", arg);
612 }
613
614 if ((editor = (char *) getenv ("EDITOR")) == NULL)
615 editor = "/bin/ex";
616
617 /* Approximate base-10 log of line to 1 unit for digit count */
618 for(log10=32, m=0x80000000; !(sal.line & m) && log10>0; log10--, m=m>>1);
619 log10 = 1 + (int)((log10 + (0 == ((m-1) & sal.line)))/3.32192809);
620
621 cmdlen = strlen(editor) + 1
622 + (NULL == sal.symtab->dirname ? 0 : strlen(sal.symtab->dirname) + 1)
623 + (NULL == sal.symtab->filename? 0 : strlen(sal.symtab->filename)+ 1)
624 + log10 + 2;
625
626 p = xmalloc(cmdlen);
627 sprintf(p,"%s +%d %s%s",editor,sal.line,
628 (NULL == sal.symtab->dirname ? "./" :
629 (NULL != sal.symtab->filename && *(sal.symtab->filename) != '/') ?
630 sal.symtab->dirname : ""),
631 (NULL == sal.symtab->filename ? "unknown" : sal.symtab->filename)
632 );
633 shell_escape(p, from_tty);
634
635 xfree(p);
636}
637
638static void
639list_command (char *arg, int from_tty)
640{
641 struct symtabs_and_lines sals, sals_end;
642 struct symtab_and_line sal, sal_end, cursal;
643 struct symbol *sym;
644 char *arg1;
645 int no_end = 1;
646 int dummy_end = 0;
647 int dummy_beg = 0;
648 int linenum_beg = 0;
649 char *p;
650
651 /* Pull in the current default source line if necessary */
652 if (arg == 0 || arg[0] == '+' || arg[0] == '-')
53cb0458
FN
653 {
654 set_default_source_symtab_and_line ();
655 cursal = get_current_source_symtab_and_line ();
656 }
0378c332
FN
657
658 /* "l" or "l +" lists next ten lines. */
659
660 if (arg == 0 || STREQ (arg, "+"))
661 {
662 print_source_lines (cursal.symtab, cursal.line,
663 cursal.line + get_lines_to_list (), 0);
664 return;
665 }
666
667 /* "l -" lists previous ten lines, the ones before the ten just listed. */
668 if (STREQ (arg, "-"))
669 {
670 print_source_lines (cursal.symtab,
671 max (get_first_line_listed () - get_lines_to_list (), 1),
672 get_first_line_listed (), 0);
673 return;
674 }
675
676 /* Now if there is only one argument, decode it in SAL
677 and set NO_END.
678 If there are two arguments, decode them in SAL and SAL_END
679 and clear NO_END; however, if one of the arguments is blank,
680 set DUMMY_BEG or DUMMY_END to record that fact. */
681
682 if (!have_full_symbols () && !have_partial_symbols ())
683 error ("No symbol table is loaded. Use the \"file\" command.");
684
685 arg1 = arg;
686 if (*arg1 == ',')
687 dummy_beg = 1;
688 else
689 {
690 sals = decode_line_1 (&arg1, 0, 0, 0, 0);
691
692 if (!sals.nelts)
693 return; /* C++ */
694 if (sals.nelts > 1)
695 {
696 ambiguous_line_spec (&sals);
697 xfree (sals.sals);
698 return;
699 }
700
701 sal = sals.sals[0];
702 xfree (sals.sals);
703 }
704
705 /* Record whether the BEG arg is all digits. */
706
707 for (p = arg; p != arg1 && *p >= '0' && *p <= '9'; p++);
708 linenum_beg = (p == arg1);
709
710 while (*arg1 == ' ' || *arg1 == '\t')
711 arg1++;
712 if (*arg1 == ',')
713 {
714 no_end = 0;
715 arg1++;
716 while (*arg1 == ' ' || *arg1 == '\t')
717 arg1++;
718 if (*arg1 == 0)
719 dummy_end = 1;
720 else
721 {
722 if (dummy_beg)
723 sals_end = decode_line_1 (&arg1, 0, 0, 0, 0);
724 else
725 sals_end = decode_line_1 (&arg1, 0, sal.symtab, sal.line, 0);
726 if (sals_end.nelts == 0)
727 return;
728 if (sals_end.nelts > 1)
729 {
730 ambiguous_line_spec (&sals_end);
731 xfree (sals_end.sals);
732 return;
733 }
734 sal_end = sals_end.sals[0];
735 xfree (sals_end.sals);
736 }
737 }
738
739 if (*arg1)
740 error ("Junk at end of line specification.");
741
742 if (!no_end && !dummy_beg && !dummy_end
743 && sal.symtab != sal_end.symtab)
744 error ("Specified start and end are in different files.");
745 if (dummy_beg && dummy_end)
746 error ("Two empty args do not say what lines to list.");
747
748 /* if line was specified by address,
749 first print exactly which line, and which file.
750 In this case, sal.symtab == 0 means address is outside
751 of all known source files, not that user failed to give a filename. */
752 if (*arg == '*')
753 {
754 if (sal.symtab == 0)
755 /* FIXME-32x64--assumes sal.pc fits in long. */
756 error ("No source file for address %s.",
757 local_hex_string ((unsigned long) sal.pc));
758 sym = find_pc_function (sal.pc);
759 if (sym)
760 {
761 print_address_numeric (sal.pc, 1, gdb_stdout);
762 printf_filtered (" is in ");
de5ad195 763 fputs_filtered (SYMBOL_PRINT_NAME (sym), gdb_stdout);
0378c332
FN
764 printf_filtered (" (%s:%d).\n", sal.symtab->filename, sal.line);
765 }
766 else
767 {
768 print_address_numeric (sal.pc, 1, gdb_stdout);
769 printf_filtered (" is at %s:%d.\n",
770 sal.symtab->filename, sal.line);
771 }
772 }
773
774 /* If line was not specified by just a line number,
775 and it does not imply a symtab, it must be an undebuggable symbol
776 which means no source code. */
777
778 if (!linenum_beg && sal.symtab == 0)
779 error ("No line number known for %s.", arg);
780
781 /* If this command is repeated with RET,
782 turn it into the no-arg variant. */
783
784 if (from_tty)
785 *arg = 0;
786
787 if (dummy_beg && sal_end.symtab == 0)
788 error ("No default source file yet. Do \"help list\".");
789 if (dummy_beg)
790 print_source_lines (sal_end.symtab,
791 max (sal_end.line - (get_lines_to_list () - 1), 1),
792 sal_end.line + 1, 0);
793 else if (sal.symtab == 0)
794 error ("No default source file yet. Do \"help list\".");
795 else if (no_end)
796 {
797 int first_line = sal.line - get_lines_to_list () / 2;
798
799 if (first_line < 1) first_line = 1;
800
801 print_source_lines (sal.symtab,
802 first_line,
803 first_line + get_lines_to_list (),
804 0);
805 }
806 else
807 print_source_lines (sal.symtab, sal.line,
808 (dummy_end
809 ? sal.line + get_lines_to_list ()
810 : sal_end.line + 1),
811 0);
812}
813
83c31e7d
FN
814/* Dump a specified section of assembly code. With no command line
815 arguments, this command will dump the assembly code for the
816 function surrounding the pc value in the selected frame. With one
817 argument, it will dump the assembly code surrounding that pc value.
818 Two arguments are interpeted as bounds within which to dump
819 assembly. */
820
821/* ARGSUSED */
822static void
823disassemble_command (char *arg, int from_tty)
824{
825 CORE_ADDR low, high;
826 char *name;
827 CORE_ADDR pc, pc_masked;
828 char *space_index;
829#if 0
830 asection *section;
831#endif
832
833 name = NULL;
834 if (!arg)
835 {
6e7f8b9c 836 if (!deprecated_selected_frame)
83c31e7d
FN
837 error ("No frame selected.\n");
838
6e7f8b9c 839 pc = get_frame_pc (deprecated_selected_frame);
83c31e7d
FN
840 if (find_pc_partial_function (pc, &name, &low, &high) == 0)
841 error ("No function contains program counter for selected frame.\n");
842#if defined(TUI)
021e7609
AC
843 /* NOTE: cagney/2003-02-13 The `tui_active' was previously
844 `tui_version'. */
845 else if (tui_active)
83c31e7d
FN
846 low = tuiGetLowDisassemblyAddress (low, pc);
847#endif
848 low += FUNCTION_START_OFFSET;
849 }
850 else if (!(space_index = (char *) strchr (arg, ' ')))
851 {
852 /* One argument. */
853 pc = parse_and_eval_address (arg);
854 if (find_pc_partial_function (pc, &name, &low, &high) == 0)
855 error ("No function contains specified address.\n");
856#if defined(TUI)
021e7609
AC
857 /* NOTE: cagney/2003-02-13 The `tui_active' was previously
858 `tui_version'. */
859 else if (tui_active)
83c31e7d
FN
860 low = tuiGetLowDisassemblyAddress (low, pc);
861#endif
862 low += FUNCTION_START_OFFSET;
863 }
864 else
865 {
866 /* Two arguments. */
867 *space_index = '\0';
868 low = parse_and_eval_address (arg);
869 high = parse_and_eval_address (space_index + 1);
870 }
871
872#if defined(TUI)
873 if (!tui_is_window_visible (DISASSEM_WIN))
874#endif
875 {
876 printf_filtered ("Dump of assembler code ");
877 if (name != NULL)
878 {
879 printf_filtered ("for function %s:\n", name);
880 }
881 else
882 {
883 printf_filtered ("from ");
884 print_address_numeric (low, 1, gdb_stdout);
885 printf_filtered (" to ");
886 print_address_numeric (high, 1, gdb_stdout);
887 printf_filtered (":\n");
888 }
889
890 /* Dump the specified range. */
891 gdb_disassembly (uiout, 0, 0, 0, -1, low, high);
892
893 printf_filtered ("End of assembler dump.\n");
894 gdb_flush (gdb_stdout);
895 }
896#if defined(TUI)
897 else
898 {
899 tui_show_assembly (low);
900 }
901#endif
902}
903
d318976c
FN
904static void
905make_command (char *arg, int from_tty)
906{
907 char *p;
908
909 if (arg == 0)
910 p = "make";
911 else
912 {
913 p = xmalloc (sizeof ("make ") + strlen (arg));
914 strcpy (p, "make ");
915 strcpy (p + sizeof ("make ") - 1, arg);
916 }
917
918 shell_escape (p, from_tty);
919}
920
921/* ARGSUSED */
922static void
923show_user (char *args, int from_tty)
924{
925 struct cmd_list_element *c;
926 extern struct cmd_list_element *cmdlist;
927
928 if (args)
929 {
930 c = lookup_cmd (&args, cmdlist, "", 0, 1);
931 if (c->class != class_user)
932 error ("Not a user command.");
933 show_user_1 (c, gdb_stdout);
934 }
935 else
936 {
937 for (c = cmdlist; c; c = c->next)
938 {
939 if (c->class == class_user)
940 show_user_1 (c, gdb_stdout);
941 }
942 }
943}
944
945/* Search through names of commands and documentations for a certain
946 regular expression.
947*/
948void
949apropos_command (char *searchstr, int from_tty)
950{
951 extern struct cmd_list_element *cmdlist; /*This is the main command list*/
952 regex_t pattern;
953 char *pattern_fastmap;
954 char errorbuffer[512];
2e94c453 955 pattern_fastmap = xcalloc (256, sizeof (char));
d318976c
FN
956 if (searchstr == NULL)
957 error("REGEXP string is empty");
958
959 if (regcomp(&pattern,searchstr,REG_ICASE) == 0)
960 {
961 pattern.fastmap=pattern_fastmap;
962 re_compile_fastmap(&pattern);
963 apropos_cmd (gdb_stdout,cmdlist,&pattern,"");
964 }
965 else
966 {
967 regerror(regcomp(&pattern,searchstr,REG_ICASE),NULL,errorbuffer,512);
968 error("Error in regular expression:%s",errorbuffer);
969 }
2b5436af 970 xfree (pattern_fastmap);
d318976c
FN
971}
972\f
0378c332
FN
973/* Print a list of files and line numbers which a user may choose from
974 in order to list a function which was specified ambiguously (as with
975 `list classname::overloadedfuncname', for example). The vector in
976 SALS provides the filenames and line numbers. */
977
978static void
979ambiguous_line_spec (struct symtabs_and_lines *sals)
980{
981 int i;
982
983 for (i = 0; i < sals->nelts; ++i)
984 printf_filtered ("file: \"%s\", line number: %d\n",
985 sals->sals[i].symtab->filename, sals->sals[i].line);
986}
987
d318976c
FN
988static void
989set_debug (char *arg, int from_tty)
990{
991 printf_unfiltered ("\"set debug\" must be followed by the name of a print subcommand.\n");
992 help_list (setdebuglist, "set debug ", -1, gdb_stdout);
993}
994
995static void
996show_debug (char *args, int from_tty)
997{
998 cmd_show_list (showdebuglist, from_tty, "");
999}
1000
1001void
1002init_cmd_lists (void)
1003{
20f01a46
DH
1004 max_user_call_depth = 1024;
1005
d318976c
FN
1006 cmdlist = NULL;
1007 infolist = NULL;
1008 enablelist = NULL;
1009 disablelist = NULL;
1010 togglelist = NULL;
1011 stoplist = NULL;
1012 deletelist = NULL;
1013 enablebreaklist = NULL;
1014 setlist = NULL;
1015 unsetlist = NULL;
1016 showlist = NULL;
1017 sethistlist = NULL;
1018 showhistlist = NULL;
1019 unsethistlist = NULL;
1020 maintenancelist = NULL;
1021 maintenanceinfolist = NULL;
1022 maintenanceprintlist = NULL;
1023 setprintlist = NULL;
1024 showprintlist = NULL;
1025 setchecklist = NULL;
1026 showchecklist = NULL;
1027}
1028
1029\f
1030void
1031init_cli_cmds (void)
1032{
1033 struct cmd_list_element *c;
1034
1035 /* Define the classes of commands.
1036 They will appear in the help list in the reverse of this order. */
1037
e00d1dc8 1038 add_cmd ("internals", class_maintenance, NULL,
d318976c
FN
1039 "Maintenance commands.\n\
1040Some gdb commands are provided just for use by gdb maintainers.\n\
1041These commands are subject to frequent change, and may not be as\n\
1042well documented as user commands.",
1043 &cmdlist);
e00d1dc8
AC
1044 add_cmd ("obscure", class_obscure, NULL, "Obscure features.", &cmdlist);
1045 add_cmd ("aliases", class_alias, NULL, "Aliases of other commands.", &cmdlist);
1046 add_cmd ("user-defined", class_user, NULL, "User-defined commands.\n\
d318976c
FN
1047The commands in this class are those defined by the user.\n\
1048Use the \"define\" command to define a command.", &cmdlist);
e00d1dc8 1049 add_cmd ("support", class_support, NULL, "Support facilities.", &cmdlist);
d318976c 1050 if (!dbx_commands)
e00d1dc8
AC
1051 add_cmd ("status", class_info, NULL, "Status inquiries.", &cmdlist);
1052 add_cmd ("files", class_files, NULL, "Specifying and examining files.", &cmdlist);
1053 add_cmd ("breakpoints", class_breakpoint, NULL, "Making program stop at certain points.", &cmdlist);
1054 add_cmd ("data", class_vars, NULL, "Examining data.", &cmdlist);
1055 add_cmd ("stack", class_stack, NULL, "Examining the stack.\n\
d318976c
FN
1056The stack is made up of stack frames. Gdb assigns numbers to stack frames\n\
1057counting from zero for the innermost (currently executing) frame.\n\n\
1058At any time gdb identifies one frame as the \"selected\" frame.\n\
1059Variable lookups are done with respect to the selected frame.\n\
1060When the program being debugged stops, gdb selects the innermost frame.\n\
1061The commands below can be used to select other frames by number or address.",
1062 &cmdlist);
e00d1dc8 1063 add_cmd ("running", class_run, NULL, "Running the program.", &cmdlist);
d318976c
FN
1064
1065 /* Define general commands. */
1066
1067 add_com ("pwd", class_files, pwd_command,
1068 "Print working directory. This is used for your program as well.");
1069 c = add_cmd ("cd", class_files, cd_command,
1070 "Set working directory to DIR for debugger and program being debugged.\n\
1071The change does not take effect for the program being debugged\n\
1072until the next time it is started.", &cmdlist);
5ba2abeb 1073 set_cmd_completer (c, filename_completer);
d318976c
FN
1074
1075 add_com ("echo", class_support, echo_command,
1076 "Print a constant string. Give string as argument.\n\
1077C escape sequences may be used in the argument.\n\
1078No newline is added at the end of the argument;\n\
1079use \"\\n\" if you want a newline to be printed.\n\
1080Since leading and trailing whitespace are ignored in command arguments,\n\
1081if you want to print some you must use \"\\\" before leading whitespace\n\
1082to be printed or after trailing whitespace.");
1083 add_com ("document", class_support, document_command,
1084 "Document a user-defined command.\n\
1085Give command name as argument. Give documentation on following lines.\n\
1086End with a line of just \"end\".");
1087 add_com ("define", class_support, define_command,
1088 "Define a new command name. Command name is argument.\n\
1089Definition appears on following lines, one command per line.\n\
1090End with a line of just \"end\".\n\
1091Use the \"document\" command to give documentation for the new command.\n\
1092Commands defined in this way may have up to ten arguments.");
1093
d318976c
FN
1094 c = add_cmd ("source", class_support, source_command,
1095 "Read commands from a file named FILE.\n\
1096Note that the file \"" GDBINIT_FILENAME "\" is read automatically in this way\n\
1097when gdb is started.", &cmdlist);
5ba2abeb 1098 set_cmd_completer (c, filename_completer);
d318976c
FN
1099
1100 add_com ("quit", class_support, quit_command, "Exit gdb.");
db60ec62 1101 c = add_com ("help", class_support, help_command, "Print list of commands.");
5ba2abeb 1102 set_cmd_completer (c, command_completer);
d318976c
FN
1103 add_com_alias ("q", "quit", class_support, 1);
1104 add_com_alias ("h", "help", class_support, 1);
1105
1106 c = add_set_cmd ("verbose", class_support, var_boolean, (char *) &info_verbose,
1107 "Set ",
1108 &setlist),
1109 add_show_from_set (c, &showlist);
9f60d481 1110 set_cmd_sfunc (c, set_verbose);
d318976c
FN
1111 set_verbose (NULL, 0, c);
1112
1113 add_prefix_cmd ("history", class_support, set_history,
1114 "Generic command for setting command history parameters.",
1115 &sethistlist, "set history ", 0, &setlist);
1116 add_prefix_cmd ("history", class_support, show_history,
1117 "Generic command for showing command history parameters.",
1118 &showhistlist, "show history ", 0, &showlist);
1119
1120 add_show_from_set
1121 (add_set_cmd ("expansion", no_class, var_boolean, (char *) &history_expansion_p,
1122 "Set history expansion on command input.\n\
1123Without an argument, history expansion is enabled.", &sethistlist),
1124 &showhistlist);
1125
1126 add_prefix_cmd ("info", class_info, info_command,
1127 "Generic command for showing things about the program being debugged.",
1128 &infolist, "info ", 0, &cmdlist);
1129 add_com_alias ("i", "info", class_info, 1);
1130
1131 add_com ("complete", class_obscure, complete_command,
1132 "List the completions for the rest of the line as a command.");
1133
1134 add_prefix_cmd ("show", class_info, show_command,
1135 "Generic command for showing things about the debugger.",
1136 &showlist, "show ", 0, &cmdlist);
1137 /* Another way to get at the same thing. */
1138 add_info ("set", show_command, "Show all GDB settings.");
1139
1140 add_cmd ("commands", no_class, show_commands,
1141 "Show the history of commands you typed.\n\
1142You can supply a command number to start with, or a `+' to start after\n\
1143the previous command number shown.",
1144 &showlist);
1145
1146 add_cmd ("version", no_class, show_version,
1147 "Show what version of GDB this is.", &showlist);
1148
1149 add_com ("while", class_support, while_command,
1150 "Execute nested commands WHILE the conditional expression is non zero.\n\
1151The conditional expression must follow the word `while' and must in turn be\n\
1152followed by a new line. The nested commands must be entered one per line,\n\
1153and should be terminated by the word `end'.");
1154
1155 add_com ("if", class_support, if_command,
1156 "Execute nested commands once IF the conditional expression is non zero.\n\
1157The conditional expression must follow the word `if' and must in turn be\n\
1158followed by a new line. The nested commands must be entered one per line,\n\
1159and should be terminated by the word 'else' or `end'. If an else clause\n\
1160is used, the same rules apply to its nested commands as to the first ones.");
1161
1162 /* If target is open when baud changes, it doesn't take effect until the
1163 next open (I think, not sure). */
1164 add_show_from_set (add_set_cmd ("remotebaud", no_class,
1165 var_zinteger, (char *) &baud_rate,
1166 "Set baud rate for remote serial I/O.\n\
1167This value is used to set the speed of the serial port when debugging\n\
1168using remote targets.", &setlist),
1169 &showlist);
1170
1171 c = add_set_cmd ("remotedebug", no_class, var_zinteger,
1172 (char *) &remote_debug,
1173 "Set debugging of remote protocol.\n\
1174When enabled, each packet sent or received with the remote target\n\
1175is displayed.", &setlist);
1176 deprecate_cmd (c, "set debug remote");
1177 deprecate_cmd (add_show_from_set (c, &showlist), "show debug remote");
1178
1179 add_show_from_set (add_set_cmd ("remote", no_class, var_zinteger,
1180 (char *) &remote_debug,
1181 "Set debugging of remote protocol.\n\
1182When enabled, each packet sent or received with the remote target\n\
1183is displayed.", &setdebuglist),
1184 &showdebuglist);
1185
1186 add_show_from_set (
1187 add_set_cmd ("remotetimeout", no_class, var_integer, (char *) &remote_timeout,
1188 "Set timeout limit to wait for target to respond.\n\
1189This value is used to set the time limit for gdb to wait for a response\n\
1190from the target.", &setlist),
1191 &showlist);
1192
1193 add_prefix_cmd ("debug", no_class, set_debug,
1194 "Generic command for setting gdb debugging flags",
1195 &setdebuglist, "set debug ", 0, &setlist);
1196
1197 add_prefix_cmd ("debug", no_class, show_debug,
1198 "Generic command for showing gdb debugging flags",
1199 &showdebuglist, "show debug ", 0, &showlist);
1200
fa58ee11 1201 c = add_com ("shell", class_support, shell_escape,
d4654627 1202 "Execute the rest of the line as a shell command.\n\
d318976c 1203With no arguments, run an inferior shell.");
5ba2abeb 1204 set_cmd_completer (c, filename_completer);
d318976c 1205
0378c332
FN
1206 c = add_com ("edit", class_files, edit_command,
1207 concat ("Edit specified file or function.\n\
1208With no argument, edits file containing most recent line listed.\n\
1209", "\
1210Editing targets can be specified in these ways:\n\
1211 FILE:LINENUM, to edit at that line in that file,\n\
1212 FUNCTION, to edit at the beginning of that function,\n\
1213 FILE:FUNCTION, to distinguish among like-named static functions.\n\
1214 *ADDRESS, to edit at the line containing that address.\n\
1215Uses EDITOR environment variable contents as editor (or ex as default).",NULL));
1216
1217 c->completer = location_completer;
1218
1219 add_com ("list", class_files, list_command,
1220 concat ("List specified function or line.\n\
1221With no argument, lists ten more lines after or around previous listing.\n\
1222\"list -\" lists the ten lines before a previous ten-line listing.\n\
1223One argument specifies a line, and ten lines are listed around that line.\n\
1224Two arguments with comma between specify starting and ending lines to list.\n\
1225", "\
1226Lines can be specified in these ways:\n\
1227 LINENUM, to list around that line in current file,\n\
1228 FILE:LINENUM, to list around that line in that file,\n\
1229 FUNCTION, to list around beginning of that function,\n\
1230 FILE:FUNCTION, to distinguish among like-named static functions.\n\
1231 *ADDRESS, to list around the line containing that address.\n\
1232With two args if one is empty it stands for ten lines away from the other arg.", NULL));
1233
1234 if (!xdb_commands)
1235 add_com_alias ("l", "list", class_files, 1);
1236 else
1237 add_com_alias ("v", "list", class_files, 1);
1238
1239 if (dbx_commands)
1240 add_com_alias ("file", "list", class_files, 1);
1241
83c31e7d
FN
1242 c = add_com ("disassemble", class_vars, disassemble_command,
1243 "Disassemble a specified section of memory.\n\
1244Default is the function surrounding the pc of the selected frame.\n\
1245With a single argument, the function surrounding that address is dumped.\n\
1246Two arguments are taken as a range of memory to dump.");
1247 set_cmd_completer (c, location_completer);
1248 if (xdb_commands)
1249 add_com_alias ("va", "disassemble", class_xdb, 0);
0378c332 1250
d318976c
FN
1251 /* NOTE: cagney/2000-03-20: Being able to enter ``(gdb) !ls'' would
1252 be a really useful feature. Unfortunately, the below wont do
1253 this. Instead it adds support for the form ``(gdb) ! ls''
1254 (i.e. the space is required). If the ``!'' command below is
1255 added the complains about no ``!'' command would be replaced by
1256 complains about how the ``!'' command is broken :-) */
1257 if (xdb_commands)
1258 add_com_alias ("!", "shell", class_support, 0);
1259
fa58ee11
EZ
1260 c = add_com ("make", class_support, make_command,
1261 "Run the ``make'' program using the rest of the line as arguments.");
5ba2abeb 1262 set_cmd_completer (c, filename_completer);
d318976c
FN
1263 add_cmd ("user", no_class, show_user,
1264 "Show definitions of user defined commands.\n\
1265Argument is the name of the user defined command.\n\
1266With no argument, show definitions of all user defined commands.", &showlist);
1267 add_com ("apropos", class_support, apropos_command, "Search for commands matching a REGEXP");
20f01a46
DH
1268
1269 add_show_from_set (
1270 add_set_cmd ("max-user-call-depth", no_class, var_integer,
1271 (char *) &max_user_call_depth,
1272 "Set the max call depth for user-defined commands.\n",
1273 &setlist),
1274 &showlist);
d318976c 1275}
This page took 0.244367 seconds and 4 git commands to generate.