* Makefile.in (cli-cmds.o): Depend on $(gdb_vfork_h)
[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   register 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   char *p, *user_shell;
503
504   if ((user_shell = (char *) getenv ("SHELL")) == NULL)
505     user_shell = "/bin/sh";
506
507   /* Get the name of the shell for arg0 */
508   if ((p = strrchr (user_shell, '/')) == NULL)
509     p = user_shell;
510   else
511     p++;                        /* Get past '/' */
512
513   if ((pid = vfork ()) == 0)
514     {
515       if (!arg)
516         execl (user_shell, p, 0);
517       else
518         execl (user_shell, p, "-c", arg, 0);
519
520       fprintf_unfiltered (gdb_stderr, "Cannot execute %s: %s\n", user_shell,
521                           safe_strerror (errno));
522       gdb_flush (gdb_stderr);
523       _exit (0177);
524     }
525
526   if (pid != -1)
527     while ((rc = wait (&status)) != pid && rc != -1)
528       ;
529   else
530     error ("Fork failed");
531 #endif /* Can fork.  */
532 }
533
534 static void
535 edit_command (char *arg, int from_tty)
536 {
537   struct symtabs_and_lines sals;
538   struct symtab_and_line sal;
539   struct symbol *sym;
540   char *arg1;
541   int cmdlen, log10;
542   unsigned m;
543   char *editor;
544   char *p;
545
546   /* Pull in the current default source line if necessary */
547   if (arg == 0)
548     {
549       set_default_source_symtab_and_line ();
550       sal = get_current_source_symtab_and_line ();
551     }
552
553   /* bare "edit" edits file with present line.  */
554
555   if (arg == 0)
556     {
557       if (sal.symtab == 0)
558         error ("No default source file yet.");
559       sal.line += get_lines_to_list () / 2;
560     }
561   else
562     {
563
564       /* Now should only be one argument -- decode it in SAL */
565
566       arg1 = arg;
567       sals = decode_line_1 (&arg1, 0, 0, 0, 0);
568
569       if (! sals.nelts) return;  /*  C++  */
570       if (sals.nelts > 1) {
571         ambiguous_line_spec (&sals);
572         xfree (sals.sals);
573         return;
574       }
575
576       sal = sals.sals[0];
577       xfree (sals.sals);
578
579       if (*arg1)
580         error ("Junk at end of line specification.");
581
582       /* if line was specified by address,
583          first print exactly which line, and which file.
584          In this case, sal.symtab == 0 means address is outside
585          of all known source files, not that user failed to give a filename.  */
586       if (*arg == '*')
587         {
588           if (sal.symtab == 0)
589             /* FIXME-32x64--assumes sal.pc fits in long.  */
590             error ("No source file for address %s.",
591                    local_hex_string((unsigned long) sal.pc));
592           sym = find_pc_function (sal.pc);
593           if (sym)
594             {
595               print_address_numeric (sal.pc, 1, gdb_stdout);
596               printf_filtered (" is in ");
597               fputs_filtered (SYMBOL_PRINT_NAME (sym), gdb_stdout);
598               printf_filtered (" (%s:%d).\n", sal.symtab->filename, sal.line);
599             }
600           else
601             {
602               print_address_numeric (sal.pc, 1, gdb_stdout);
603               printf_filtered (" is at %s:%d.\n",
604                                sal.symtab->filename, sal.line);
605             }
606         }
607
608       /* If what was given does not imply a symtab, it must be an undebuggable
609          symbol which means no source code.  */
610
611       if (sal.symtab == 0)
612         error ("No line number known for %s.", arg);
613     }
614
615   if ((editor = (char *) getenv ("EDITOR")) == NULL)
616       editor = "/bin/ex";
617   
618   /* Approximate base-10 log of line to 1 unit for digit count */
619   for(log10=32, m=0x80000000; !(sal.line & m) && log10>0; log10--, m=m>>1);
620   log10 = 1 + (int)((log10 + (0 == ((m-1) & sal.line)))/3.32192809);
621
622   cmdlen = strlen(editor) + 1
623          + (NULL == sal.symtab->dirname ? 0 : strlen(sal.symtab->dirname) + 1)
624          + (NULL == sal.symtab->filename? 0 : strlen(sal.symtab->filename)+ 1)
625          + log10 + 2;
626   
627   p = xmalloc(cmdlen);
628   sprintf(p,"%s +%d %s%s",editor,sal.line,
629      (NULL == sal.symtab->dirname ? "./" :
630         (NULL != sal.symtab->filename && *(sal.symtab->filename) != '/') ?
631            sal.symtab->dirname : ""),
632      (NULL == sal.symtab->filename ? "unknown" : sal.symtab->filename)
633   );
634   shell_escape(p, from_tty);
635
636   xfree(p);
637 }
638
639 static void
640 list_command (char *arg, int from_tty)
641 {
642   struct symtabs_and_lines sals, sals_end;
643   struct symtab_and_line sal, sal_end, cursal;
644   struct symbol *sym;
645   char *arg1;
646   int no_end = 1;
647   int dummy_end = 0;
648   int dummy_beg = 0;
649   int linenum_beg = 0;
650   char *p;
651
652   /* Pull in the current default source line if necessary */
653   if (arg == 0 || arg[0] == '+' || arg[0] == '-')
654     {
655       set_default_source_symtab_and_line ();
656       cursal = get_current_source_symtab_and_line ();
657     }
658
659   /* "l" or "l +" lists next ten lines.  */
660
661   if (arg == 0 || STREQ (arg, "+"))
662     {
663       print_source_lines (cursal.symtab, cursal.line,
664                           cursal.line + get_lines_to_list (), 0);
665       return;
666     }
667
668   /* "l -" lists previous ten lines, the ones before the ten just listed.  */
669   if (STREQ (arg, "-"))
670     {
671       print_source_lines (cursal.symtab,
672                           max (get_first_line_listed () - get_lines_to_list (), 1),
673                           get_first_line_listed (), 0);
674       return;
675     }
676
677   /* Now if there is only one argument, decode it in SAL
678      and set NO_END.
679      If there are two arguments, decode them in SAL and SAL_END
680      and clear NO_END; however, if one of the arguments is blank,
681      set DUMMY_BEG or DUMMY_END to record that fact.  */
682
683   if (!have_full_symbols () && !have_partial_symbols ())
684     error ("No symbol table is loaded.  Use the \"file\" command.");
685
686   arg1 = arg;
687   if (*arg1 == ',')
688     dummy_beg = 1;
689   else
690     {
691       sals = decode_line_1 (&arg1, 0, 0, 0, 0);
692
693       if (!sals.nelts)
694         return;                 /*  C++  */
695       if (sals.nelts > 1)
696         {
697           ambiguous_line_spec (&sals);
698           xfree (sals.sals);
699           return;
700         }
701
702       sal = sals.sals[0];
703       xfree (sals.sals);
704     }
705
706   /* Record whether the BEG arg is all digits.  */
707
708   for (p = arg; p != arg1 && *p >= '0' && *p <= '9'; p++);
709   linenum_beg = (p == arg1);
710
711   while (*arg1 == ' ' || *arg1 == '\t')
712     arg1++;
713   if (*arg1 == ',')
714     {
715       no_end = 0;
716       arg1++;
717       while (*arg1 == ' ' || *arg1 == '\t')
718         arg1++;
719       if (*arg1 == 0)
720         dummy_end = 1;
721       else
722         {
723           if (dummy_beg)
724             sals_end = decode_line_1 (&arg1, 0, 0, 0, 0);
725           else
726             sals_end = decode_line_1 (&arg1, 0, sal.symtab, sal.line, 0);
727           if (sals_end.nelts == 0)
728             return;
729           if (sals_end.nelts > 1)
730             {
731               ambiguous_line_spec (&sals_end);
732               xfree (sals_end.sals);
733               return;
734             }
735           sal_end = sals_end.sals[0];
736           xfree (sals_end.sals);
737         }
738     }
739
740   if (*arg1)
741     error ("Junk at end of line specification.");
742
743   if (!no_end && !dummy_beg && !dummy_end
744       && sal.symtab != sal_end.symtab)
745     error ("Specified start and end are in different files.");
746   if (dummy_beg && dummy_end)
747     error ("Two empty args do not say what lines to list.");
748
749   /* if line was specified by address,
750      first print exactly which line, and which file.
751      In this case, sal.symtab == 0 means address is outside
752      of all known source files, not that user failed to give a filename.  */
753   if (*arg == '*')
754     {
755       if (sal.symtab == 0)
756         /* FIXME-32x64--assumes sal.pc fits in long.  */
757         error ("No source file for address %s.",
758                local_hex_string ((unsigned long) sal.pc));
759       sym = find_pc_function (sal.pc);
760       if (sym)
761         {
762           print_address_numeric (sal.pc, 1, gdb_stdout);
763           printf_filtered (" is in ");
764           fputs_filtered (SYMBOL_PRINT_NAME (sym), gdb_stdout);
765           printf_filtered (" (%s:%d).\n", sal.symtab->filename, sal.line);
766         }
767       else
768         {
769           print_address_numeric (sal.pc, 1, gdb_stdout);
770           printf_filtered (" is at %s:%d.\n",
771                            sal.symtab->filename, sal.line);
772         }
773     }
774
775   /* If line was not specified by just a line number,
776      and it does not imply a symtab, it must be an undebuggable symbol
777      which means no source code.  */
778
779   if (!linenum_beg && sal.symtab == 0)
780     error ("No line number known for %s.", arg);
781
782   /* If this command is repeated with RET,
783      turn it into the no-arg variant.  */
784
785   if (from_tty)
786     *arg = 0;
787
788   if (dummy_beg && sal_end.symtab == 0)
789     error ("No default source file yet.  Do \"help list\".");
790   if (dummy_beg)
791     print_source_lines (sal_end.symtab,
792                         max (sal_end.line - (get_lines_to_list () - 1), 1),
793                         sal_end.line + 1, 0);
794   else if (sal.symtab == 0)
795     error ("No default source file yet.  Do \"help list\".");
796   else if (no_end)
797     {
798       int first_line = sal.line - get_lines_to_list () / 2;
799
800       if (first_line < 1) first_line = 1;
801
802       print_source_lines (sal.symtab,
803                           first_line,
804                           first_line + get_lines_to_list (),
805                           0);
806     }
807   else
808     print_source_lines (sal.symtab, sal.line,
809                         (dummy_end
810                          ? sal.line + get_lines_to_list ()
811                          : sal_end.line + 1),
812                         0);
813 }
814
815 /* Dump a specified section of assembly code.  With no command line
816    arguments, this command will dump the assembly code for the
817    function surrounding the pc value in the selected frame.  With one
818    argument, it will dump the assembly code surrounding that pc value.
819    Two arguments are interpeted as bounds within which to dump
820    assembly.  */
821
822 /* ARGSUSED */
823 static void
824 disassemble_command (char *arg, int from_tty)
825 {
826   CORE_ADDR low, high;
827   char *name;
828   CORE_ADDR pc, pc_masked;
829   char *space_index;
830 #if 0
831   asection *section;
832 #endif
833
834   name = NULL;
835   if (!arg)
836     {
837       if (!deprecated_selected_frame)
838         error ("No frame selected.\n");
839
840       pc = get_frame_pc (deprecated_selected_frame);
841       if (find_pc_partial_function (pc, &name, &low, &high) == 0)
842         error ("No function contains program counter for selected frame.\n");
843 #if defined(TUI)
844       /* NOTE: cagney/2003-02-13 The `tui_active' was previously
845          `tui_version'.  */
846       else if (tui_active)
847         low = tuiGetLowDisassemblyAddress (low, pc);
848 #endif
849       low += FUNCTION_START_OFFSET;
850     }
851   else if (!(space_index = (char *) strchr (arg, ' ')))
852     {
853       /* One argument.  */
854       pc = parse_and_eval_address (arg);
855       if (find_pc_partial_function (pc, &name, &low, &high) == 0)
856         error ("No function contains specified address.\n");
857 #if defined(TUI)
858       /* NOTE: cagney/2003-02-13 The `tui_active' was previously
859          `tui_version'.  */
860       else if (tui_active)
861         low = tuiGetLowDisassemblyAddress (low, pc);
862 #endif
863       low += FUNCTION_START_OFFSET;
864     }
865   else
866     {
867       /* Two arguments.  */
868       *space_index = '\0';
869       low = parse_and_eval_address (arg);
870       high = parse_and_eval_address (space_index + 1);
871     }
872
873 #if defined(TUI)
874   if (!tui_is_window_visible (DISASSEM_WIN))
875 #endif
876     {
877       printf_filtered ("Dump of assembler code ");
878       if (name != NULL)
879         {
880           printf_filtered ("for function %s:\n", name);
881         }
882       else
883         {
884           printf_filtered ("from ");
885           print_address_numeric (low, 1, gdb_stdout);
886           printf_filtered (" to ");
887           print_address_numeric (high, 1, gdb_stdout);
888           printf_filtered (":\n");
889         }
890
891       /* Dump the specified range.  */
892       gdb_disassembly (uiout, 0, 0, 0, -1, low, high);
893
894       printf_filtered ("End of assembler dump.\n");
895       gdb_flush (gdb_stdout);
896     }
897 #if defined(TUI)
898   else
899     {
900       tui_show_assembly (low);
901     }
902 #endif
903 }
904
905 static void
906 make_command (char *arg, int from_tty)
907 {
908   char *p;
909
910   if (arg == 0)
911     p = "make";
912   else
913     {
914       p = xmalloc (sizeof ("make ") + strlen (arg));
915       strcpy (p, "make ");
916       strcpy (p + sizeof ("make ") - 1, arg);
917     }
918
919   shell_escape (p, from_tty);
920 }
921
922 /* ARGSUSED */
923 static void
924 show_user (char *args, int from_tty)
925 {
926   struct cmd_list_element *c;
927   extern struct cmd_list_element *cmdlist;
928
929   if (args)
930     {
931       c = lookup_cmd (&args, cmdlist, "", 0, 1);
932       if (c->class != class_user)
933         error ("Not a user command.");
934       show_user_1 (c, gdb_stdout);
935     }
936   else
937     {
938       for (c = cmdlist; c; c = c->next)
939         {
940           if (c->class == class_user)
941             show_user_1 (c, gdb_stdout);
942         }
943     }
944 }
945
946 /* Search through names of commands and documentations for a certain
947    regular expression.
948 */
949 void 
950 apropos_command (char *searchstr, int from_tty)
951 {
952   extern struct cmd_list_element *cmdlist; /*This is the main command list*/
953   regex_t pattern;
954   char *pattern_fastmap;
955   char errorbuffer[512];
956   pattern_fastmap = xcalloc (256, sizeof (char));
957   if (searchstr == NULL)
958       error("REGEXP string is empty");
959
960   if (regcomp(&pattern,searchstr,REG_ICASE) == 0)
961     {
962       pattern.fastmap=pattern_fastmap;
963       re_compile_fastmap(&pattern);
964       apropos_cmd (gdb_stdout,cmdlist,&pattern,"");
965     }
966   else
967     {
968       regerror(regcomp(&pattern,searchstr,REG_ICASE),NULL,errorbuffer,512);
969       error("Error in regular expression:%s",errorbuffer);
970     }
971   xfree (pattern_fastmap);
972 }
973 \f
974 /* Print a list of files and line numbers which a user may choose from
975    in order to list a function which was specified ambiguously (as with
976    `list classname::overloadedfuncname', for example).  The vector in
977    SALS provides the filenames and line numbers.  */
978
979 static void
980 ambiguous_line_spec (struct symtabs_and_lines *sals)
981 {
982   int i;
983
984   for (i = 0; i < sals->nelts; ++i)
985     printf_filtered ("file: \"%s\", line number: %d\n",
986                      sals->sals[i].symtab->filename, sals->sals[i].line);
987 }
988
989 static void
990 set_debug (char *arg, int from_tty)
991 {
992   printf_unfiltered ("\"set debug\" must be followed by the name of a print subcommand.\n");
993   help_list (setdebuglist, "set debug ", -1, gdb_stdout);
994 }
995
996 static void
997 show_debug (char *args, int from_tty)
998 {
999   cmd_show_list (showdebuglist, from_tty, "");
1000 }
1001
1002 void
1003 init_cmd_lists (void)
1004 {
1005   max_user_call_depth = 1024;
1006
1007   cmdlist = NULL;
1008   infolist = NULL;
1009   enablelist = NULL;
1010   disablelist = NULL;
1011   togglelist = NULL;
1012   stoplist = NULL;
1013   deletelist = NULL;
1014   enablebreaklist = NULL;
1015   setlist = NULL;
1016   unsetlist = NULL;
1017   showlist = NULL;
1018   sethistlist = NULL;
1019   showhistlist = NULL;
1020   unsethistlist = NULL;
1021   maintenancelist = NULL;
1022   maintenanceinfolist = NULL;
1023   maintenanceprintlist = NULL;
1024   setprintlist = NULL;
1025   showprintlist = NULL;
1026   setchecklist = NULL;
1027   showchecklist = NULL;
1028 }
1029
1030 \f
1031 void
1032 init_cli_cmds (void)
1033 {
1034   struct cmd_list_element *c;
1035
1036   /* Define the classes of commands.
1037      They will appear in the help list in the reverse of this order.  */
1038
1039   add_cmd ("internals", class_maintenance, NULL,
1040            "Maintenance commands.\n\
1041 Some gdb commands are provided just for use by gdb maintainers.\n\
1042 These commands are subject to frequent change, and may not be as\n\
1043 well documented as user commands.",
1044            &cmdlist);
1045   add_cmd ("obscure", class_obscure, NULL, "Obscure features.", &cmdlist);
1046   add_cmd ("aliases", class_alias, NULL, "Aliases of other commands.", &cmdlist);
1047   add_cmd ("user-defined", class_user, NULL, "User-defined commands.\n\
1048 The commands in this class are those defined by the user.\n\
1049 Use the \"define\" command to define a command.", &cmdlist);
1050   add_cmd ("support", class_support, NULL, "Support facilities.", &cmdlist);
1051   if (!dbx_commands)
1052     add_cmd ("status", class_info, NULL, "Status inquiries.", &cmdlist);
1053   add_cmd ("files", class_files, NULL, "Specifying and examining files.", &cmdlist);
1054   add_cmd ("breakpoints", class_breakpoint, NULL, "Making program stop at certain points.", &cmdlist);
1055   add_cmd ("data", class_vars, NULL, "Examining data.", &cmdlist);
1056   add_cmd ("stack", class_stack, NULL, "Examining the stack.\n\
1057 The stack is made up of stack frames.  Gdb assigns numbers to stack frames\n\
1058 counting from zero for the innermost (currently executing) frame.\n\n\
1059 At any time gdb identifies one frame as the \"selected\" frame.\n\
1060 Variable lookups are done with respect to the selected frame.\n\
1061 When the program being debugged stops, gdb selects the innermost frame.\n\
1062 The commands below can be used to select other frames by number or address.",
1063            &cmdlist);
1064   add_cmd ("running", class_run, NULL, "Running the program.", &cmdlist);
1065
1066   /* Define general commands. */
1067
1068   add_com ("pwd", class_files, pwd_command,
1069         "Print working directory.  This is used for your program as well.");
1070   c = add_cmd ("cd", class_files, cd_command,
1071                "Set working directory to DIR for debugger and program being debugged.\n\
1072 The change does not take effect for the program being debugged\n\
1073 until the next time it is started.", &cmdlist);
1074   set_cmd_completer (c, filename_completer);
1075
1076   add_com ("echo", class_support, echo_command,
1077            "Print a constant string.  Give string as argument.\n\
1078 C escape sequences may be used in the argument.\n\
1079 No newline is added at the end of the argument;\n\
1080 use \"\\n\" if you want a newline to be printed.\n\
1081 Since leading and trailing whitespace are ignored in command arguments,\n\
1082 if you want to print some you must use \"\\\" before leading whitespace\n\
1083 to be printed or after trailing whitespace.");
1084   add_com ("document", class_support, document_command,
1085            "Document a user-defined command.\n\
1086 Give command name as argument.  Give documentation on following lines.\n\
1087 End with a line of just \"end\".");
1088   add_com ("define", class_support, define_command,
1089            "Define a new command name.  Command name is argument.\n\
1090 Definition appears on following lines, one command per line.\n\
1091 End with a line of just \"end\".\n\
1092 Use the \"document\" command to give documentation for the new command.\n\
1093 Commands defined in this way may have up to ten arguments.");
1094
1095   c = add_cmd ("source", class_support, source_command,
1096                "Read commands from a file named FILE.\n\
1097 Note that the file \"" GDBINIT_FILENAME "\" is read automatically in this way\n\
1098 when gdb is started.", &cmdlist);
1099   set_cmd_completer (c, filename_completer);
1100
1101   add_com ("quit", class_support, quit_command, "Exit gdb.");
1102   c = add_com ("help", class_support, help_command, "Print list of commands.");
1103   set_cmd_completer (c, command_completer);
1104   add_com_alias ("q", "quit", class_support, 1);
1105   add_com_alias ("h", "help", class_support, 1);
1106
1107   c = add_set_cmd ("verbose", class_support, var_boolean, (char *) &info_verbose,
1108                    "Set ",
1109                    &setlist),
1110     add_show_from_set (c, &showlist);
1111   set_cmd_sfunc (c, set_verbose);
1112   set_verbose (NULL, 0, c);
1113
1114   add_prefix_cmd ("history", class_support, set_history,
1115                   "Generic command for setting command history parameters.",
1116                   &sethistlist, "set history ", 0, &setlist);
1117   add_prefix_cmd ("history", class_support, show_history,
1118                   "Generic command for showing command history parameters.",
1119                   &showhistlist, "show history ", 0, &showlist);
1120
1121   add_show_from_set
1122     (add_set_cmd ("expansion", no_class, var_boolean, (char *) &history_expansion_p,
1123                   "Set history expansion on command input.\n\
1124 Without an argument, history expansion is enabled.", &sethistlist),
1125      &showhistlist);
1126
1127   add_prefix_cmd ("info", class_info, info_command,
1128      "Generic command for showing things about the program being debugged.",
1129                   &infolist, "info ", 0, &cmdlist);
1130   add_com_alias ("i", "info", class_info, 1);
1131
1132   add_com ("complete", class_obscure, complete_command,
1133            "List the completions for the rest of the line as a command.");
1134
1135   add_prefix_cmd ("show", class_info, show_command,
1136                   "Generic command for showing things about the debugger.",
1137                   &showlist, "show ", 0, &cmdlist);
1138   /* Another way to get at the same thing.  */
1139   add_info ("set", show_command, "Show all GDB settings.");
1140
1141   add_cmd ("commands", no_class, show_commands,
1142            "Show the history of commands you typed.\n\
1143 You can supply a command number to start with, or a `+' to start after\n\
1144 the previous command number shown.",
1145            &showlist);
1146
1147   add_cmd ("version", no_class, show_version,
1148            "Show what version of GDB this is.", &showlist);
1149
1150   add_com ("while", class_support, while_command,
1151            "Execute nested commands WHILE the conditional expression is non zero.\n\
1152 The conditional expression must follow the word `while' and must in turn be\n\
1153 followed by a new line.  The nested commands must be entered one per line,\n\
1154 and should be terminated by the word `end'.");
1155
1156   add_com ("if", class_support, if_command,
1157            "Execute nested commands once IF the conditional expression is non zero.\n\
1158 The conditional expression must follow the word `if' and must in turn be\n\
1159 followed by a new line.  The nested commands must be entered one per line,\n\
1160 and should be terminated by the word 'else' or `end'.  If an else clause\n\
1161 is used, the same rules apply to its nested commands as to the first ones.");
1162
1163   /* If target is open when baud changes, it doesn't take effect until the
1164      next open (I think, not sure).  */
1165   add_show_from_set (add_set_cmd ("remotebaud", no_class,
1166                                   var_zinteger, (char *) &baud_rate,
1167                                   "Set baud rate for remote serial I/O.\n\
1168 This value is used to set the speed of the serial port when debugging\n\
1169 using remote targets.", &setlist),
1170                      &showlist);
1171
1172   c = add_set_cmd ("remotedebug", no_class, var_zinteger,
1173                    (char *) &remote_debug,
1174                    "Set debugging of remote protocol.\n\
1175 When enabled, each packet sent or received with the remote target\n\
1176 is displayed.", &setlist);
1177   deprecate_cmd (c, "set debug remote");
1178   deprecate_cmd (add_show_from_set (c, &showlist), "show debug remote");
1179
1180   add_show_from_set (add_set_cmd ("remote", no_class, var_zinteger,
1181                                   (char *) &remote_debug,
1182                                   "Set debugging of remote protocol.\n\
1183 When enabled, each packet sent or received with the remote target\n\
1184 is displayed.", &setdebuglist),
1185                      &showdebuglist);
1186
1187   add_show_from_set (
1188                       add_set_cmd ("remotetimeout", no_class, var_integer, (char *) &remote_timeout,
1189                                    "Set timeout limit to wait for target to respond.\n\
1190 This value is used to set the time limit for gdb to wait for a response\n\
1191 from the target.", &setlist),
1192                       &showlist);
1193
1194   add_prefix_cmd ("debug", no_class, set_debug,
1195                   "Generic command for setting gdb debugging flags",
1196                   &setdebuglist, "set debug ", 0, &setlist);
1197
1198   add_prefix_cmd ("debug", no_class, show_debug,
1199                   "Generic command for showing gdb debugging flags",
1200                   &showdebuglist, "show debug ", 0, &showlist);
1201
1202   c = add_com ("shell", class_support, shell_escape,
1203                "Execute the rest of the line as a shell command.\n\
1204 With no arguments, run an inferior shell.");
1205   set_cmd_completer (c, filename_completer);
1206
1207   c = add_com ("edit", class_files, edit_command,
1208            concat ("Edit specified file or function.\n\
1209 With no argument, edits file containing most recent line listed.\n\
1210 ", "\
1211 Editing targets can be specified in these ways:\n\
1212   FILE:LINENUM, to edit at that line in that file,\n\
1213   FUNCTION, to edit at the beginning of that function,\n\
1214   FILE:FUNCTION, to distinguish among like-named static functions.\n\
1215   *ADDRESS, to edit at the line containing that address.\n\
1216 Uses EDITOR environment variable contents as editor (or ex as default).",NULL));
1217
1218   c->completer = location_completer;
1219
1220   add_com ("list", class_files, list_command,
1221            concat ("List specified function or line.\n\
1222 With no argument, lists ten more lines after or around previous listing.\n\
1223 \"list -\" lists the ten lines before a previous ten-line listing.\n\
1224 One argument specifies a line, and ten lines are listed around that line.\n\
1225 Two arguments with comma between specify starting and ending lines to list.\n\
1226 ", "\
1227 Lines can be specified in these ways:\n\
1228   LINENUM, to list around that line in current file,\n\
1229   FILE:LINENUM, to list around that line in that file,\n\
1230   FUNCTION, to list around beginning of that function,\n\
1231   FILE:FUNCTION, to distinguish among like-named static functions.\n\
1232   *ADDRESS, to list around the line containing that address.\n\
1233 With two args if one is empty it stands for ten lines away from the other arg.", NULL));
1234
1235   if (!xdb_commands)
1236     add_com_alias ("l", "list", class_files, 1);
1237   else
1238     add_com_alias ("v", "list", class_files, 1);
1239
1240   if (dbx_commands)
1241     add_com_alias ("file", "list", class_files, 1);
1242
1243   c = add_com ("disassemble", class_vars, disassemble_command,
1244                "Disassemble a specified section of memory.\n\
1245 Default is the function surrounding the pc of the selected frame.\n\
1246 With a single argument, the function surrounding that address is dumped.\n\
1247 Two arguments are taken as a range of memory to dump.");
1248   set_cmd_completer (c, location_completer);
1249   if (xdb_commands)
1250     add_com_alias ("va", "disassemble", class_xdb, 0);
1251
1252   /* NOTE: cagney/2000-03-20: Being able to enter ``(gdb) !ls'' would
1253      be a really useful feature.  Unfortunately, the below wont do
1254      this.  Instead it adds support for the form ``(gdb) ! ls''
1255      (i.e. the space is required).  If the ``!'' command below is
1256      added the complains about no ``!'' command would be replaced by
1257      complains about how the ``!'' command is broken :-) */
1258   if (xdb_commands)
1259     add_com_alias ("!", "shell", class_support, 0);
1260
1261   c = add_com ("make", class_support, make_command,
1262           "Run the ``make'' program using the rest of the line as arguments.");
1263   set_cmd_completer (c, filename_completer);
1264   add_cmd ("user", no_class, show_user,
1265            "Show definitions of user defined commands.\n\
1266 Argument is the name of the user defined command.\n\
1267 With no argument, show definitions of all user defined commands.", &showlist);
1268   add_com ("apropos", class_support, apropos_command, "Search for commands matching a REGEXP");
1269
1270   add_show_from_set (
1271                       add_set_cmd ("max-user-call-depth", no_class, var_integer, 
1272                                    (char *) &max_user_call_depth,
1273                                    "Set the max call depth for user-defined commands.\n", 
1274                                    &setlist),
1275                       &showlist);
1276 }