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