2003-06-08 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 "linespec.h"
30 #include "expression.h"
31 #include "frame.h"
32 #include "value.h"
33 #include "language.h"
34 #include "filenames.h"          /* for DOSish file names */
35 #include "objfiles.h"
36 #include "source.h"
37 #include "disasm.h"
38
39 #include "ui-out.h"
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
51 /* Prototypes for local command functions */
52
53 static void complete_command (char *, int);
54
55 static void echo_command (char *, int);
56
57 static void pwd_command (char *, int);
58
59 static void show_version (char *, int);
60
61 static void validate_comname (char *);
62
63 static void help_command (char *, int);
64
65 static void show_command (char *, int);
66
67 static void info_command (char *, int);
68
69 static void show_debug (char *, int);
70
71 static void set_debug (char *, int);
72
73 static void show_user (char *, int);
74
75 static void make_command (char *, int);
76
77 static void shell_escape (char *, int);
78
79 static void edit_command (char *, int);
80
81 static void list_command (char *, int);
82
83 void apropos_command (char *, int);
84
85 /* Prototypes for local utility functions */
86
87 static void ambiguous_line_spec (struct symtabs_and_lines *);
88 \f
89 /* Limit the call depth of user-defined commands */
90 int max_user_call_depth;
91
92 /* Define all cmd_list_elements.  */
93
94 /* Chain containing all defined commands.  */
95
96 struct cmd_list_element *cmdlist;
97
98 /* Chain containing all defined info subcommands.  */
99
100 struct cmd_list_element *infolist;
101
102 /* Chain containing all defined enable subcommands. */
103
104 struct cmd_list_element *enablelist;
105
106 /* Chain containing all defined disable subcommands. */
107
108 struct cmd_list_element *disablelist;
109
110 /* Chain containing all defined toggle subcommands. */
111
112 struct cmd_list_element *togglelist;
113
114 /* Chain containing all defined stop subcommands. */
115
116 struct cmd_list_element *stoplist;
117
118 /* Chain containing all defined delete subcommands. */
119
120 struct cmd_list_element *deletelist;
121
122 /* Chain containing all defined "enable breakpoint" subcommands. */
123
124 struct cmd_list_element *enablebreaklist;
125
126 /* Chain containing all defined set subcommands */
127
128 struct cmd_list_element *setlist;
129
130 /* Chain containing all defined unset subcommands */
131
132 struct cmd_list_element *unsetlist;
133
134 /* Chain containing all defined show subcommands.  */
135
136 struct cmd_list_element *showlist;
137
138 /* Chain containing all defined \"set history\".  */
139
140 struct cmd_list_element *sethistlist;
141
142 /* Chain containing all defined \"show history\".  */
143
144 struct cmd_list_element *showhistlist;
145
146 /* Chain containing all defined \"unset history\".  */
147
148 struct cmd_list_element *unsethistlist;
149
150 /* Chain containing all defined maintenance subcommands. */
151
152 struct cmd_list_element *maintenancelist;
153
154 /* Chain containing all defined "maintenance info" subcommands. */
155
156 struct cmd_list_element *maintenanceinfolist;
157
158 /* Chain containing all defined "maintenance print" subcommands. */
159
160 struct cmd_list_element *maintenanceprintlist;
161
162 struct cmd_list_element *setprintlist;
163
164 struct cmd_list_element *showprintlist;
165
166 struct cmd_list_element *setdebuglist;
167
168 struct cmd_list_element *showdebuglist;
169
170 struct cmd_list_element *setchecklist;
171
172 struct cmd_list_element *showchecklist;
173 \f
174 /* Utility used everywhere when at least one argument is needed and
175    none is supplied. */
176
177 void
178 error_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 */
187 static void
188 info_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 */
197 static void
198 show_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 */
207 static void
208 help_command (char *command, int from_tty)
209 {
210   help_cmd (command, gdb_stdout);
211 }
212 \f
213 /* String compare function for qsort.  */
214 static int
215 compare_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
222 /* The "complete" command is used by Emacs to implement completion.  */
223
224 /* ARGSUSED */
225 static void
226 complete_command (char *arg, int from_tty)
227 {
228   int i;
229   int argpoint;
230   char **completions;
231
232   dont_repeat ();
233
234   if (arg == NULL)
235     arg = "";
236   argpoint = strlen (arg);
237
238   completions = complete_line (arg, arg, argpoint);
239
240   if (completions)
241     {
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);
268     }
269 }
270
271 int
272 is_complete_command (struct cmd_list_element *c)
273 {
274   return cmd_cfunc_eq (c, complete_command);
275 }
276
277 /* ARGSUSED */
278 static void
279 show_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
289 void
290 quit_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 */
298 static void
299 pwd_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
312 void
313 cd_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);
328   make_cleanup (xfree, dir);
329
330   if (chdir (dir) < 0)
331     perror_with_name (dir);
332
333 #ifdef HAVE_DOS_BASED_FILE_SYSTEM
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);
341   if (IS_DIR_SEPARATOR (dir[len - 1]))
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)           /* "/" */
346 #ifdef HAVE_DOS_BASED_FILE_SYSTEM
347           && !(len == 3 && dir[1] == ':') /* "d:/" */
348 #endif
349           )
350         len--;
351     }
352
353   dir = savestring (dir, len);
354   if (IS_ABSOLUTE_PATH (dir))
355     current_directory = dir;
356   else
357     {
358       if (IS_DIR_SEPARATOR (current_directory[strlen (current_directory) - 1]))
359         current_directory = concat (current_directory, dir, NULL);
360       else
361         current_directory = concat (current_directory, SLASH_STRING, dir, NULL);
362       xfree (dir);
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     {
370       if (IS_DIR_SEPARATOR (p[0]) && p[1] == '.'
371           && (p[2] == 0 || IS_DIR_SEPARATOR (p[2])))
372         strcpy (p, p + 2);
373       else if (IS_DIR_SEPARATOR (p[0]) && p[1] == '.' && p[2] == '.'
374                && (p[3] == 0 || IS_DIR_SEPARATOR (p[3])))
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;
381               while (q != current_directory && !IS_DIR_SEPARATOR (q[-1]))
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
412 void
413 source_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);
425   old_cleanups = make_cleanup (xfree, file);
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 */
442 static void
443 echo_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 */
472 static void
473 shell_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     }
494 #ifdef GLOBAL_CURDIR
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
533 static void
534 edit_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)
547     {
548       set_default_source_symtab_and_line ();
549       sal = get_current_source_symtab_and_line ();
550     }
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 ");
596               fputs_filtered (SYMBOL_PRINT_NAME (sym), gdb_stdout);
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
638 static void
639 list_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] == '-')
653     {
654       set_default_source_symtab_and_line ();
655       cursal = get_current_source_symtab_and_line ();
656     }
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 ");
763           fputs_filtered (SYMBOL_PRINT_NAME (sym), gdb_stdout);
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
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 */
822 static void
823 disassemble_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     {
836       if (!deprecated_selected_frame)
837         error ("No frame selected.\n");
838
839       pc = get_frame_pc (deprecated_selected_frame);
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)
843       /* NOTE: cagney/2003-02-13 The `tui_active' was previously
844          `tui_version'.  */
845       else if (tui_active)
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)
857       /* NOTE: cagney/2003-02-13 The `tui_active' was previously
858          `tui_version'.  */
859       else if (tui_active)
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
904 static void
905 make_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 */
922 static void
923 show_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 */
948 void 
949 apropos_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];
955   pattern_fastmap = xcalloc (256, sizeof (char));
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     }
970   xfree (pattern_fastmap);
971 }
972 \f
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
978 static void
979 ambiguous_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
988 static void
989 set_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
995 static void
996 show_debug (char *args, int from_tty)
997 {
998   cmd_show_list (showdebuglist, from_tty, "");
999 }
1000
1001 void
1002 init_cmd_lists (void)
1003 {
1004   max_user_call_depth = 1024;
1005
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
1030 void
1031 init_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
1038   add_cmd ("internals", class_maintenance, NULL,
1039            "Maintenance commands.\n\
1040 Some gdb commands are provided just for use by gdb maintainers.\n\
1041 These commands are subject to frequent change, and may not be as\n\
1042 well documented as user commands.",
1043            &cmdlist);
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\
1047 The commands in this class are those defined by the user.\n\
1048 Use the \"define\" command to define a command.", &cmdlist);
1049   add_cmd ("support", class_support, NULL, "Support facilities.", &cmdlist);
1050   if (!dbx_commands)
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\
1056 The stack is made up of stack frames.  Gdb assigns numbers to stack frames\n\
1057 counting from zero for the innermost (currently executing) frame.\n\n\
1058 At any time gdb identifies one frame as the \"selected\" frame.\n\
1059 Variable lookups are done with respect to the selected frame.\n\
1060 When the program being debugged stops, gdb selects the innermost frame.\n\
1061 The commands below can be used to select other frames by number or address.",
1062            &cmdlist);
1063   add_cmd ("running", class_run, NULL, "Running the program.", &cmdlist);
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\
1071 The change does not take effect for the program being debugged\n\
1072 until the next time it is started.", &cmdlist);
1073   set_cmd_completer (c, filename_completer);
1074
1075   add_com ("echo", class_support, echo_command,
1076            "Print a constant string.  Give string as argument.\n\
1077 C escape sequences may be used in the argument.\n\
1078 No newline is added at the end of the argument;\n\
1079 use \"\\n\" if you want a newline to be printed.\n\
1080 Since leading and trailing whitespace are ignored in command arguments,\n\
1081 if you want to print some you must use \"\\\" before leading whitespace\n\
1082 to be printed or after trailing whitespace.");
1083   add_com ("document", class_support, document_command,
1084            "Document a user-defined command.\n\
1085 Give command name as argument.  Give documentation on following lines.\n\
1086 End 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\
1089 Definition appears on following lines, one command per line.\n\
1090 End with a line of just \"end\".\n\
1091 Use the \"document\" command to give documentation for the new command.\n\
1092 Commands defined in this way may have up to ten arguments.");
1093
1094   c = add_cmd ("source", class_support, source_command,
1095                "Read commands from a file named FILE.\n\
1096 Note that the file \"" GDBINIT_FILENAME "\" is read automatically in this way\n\
1097 when gdb is started.", &cmdlist);
1098   set_cmd_completer (c, filename_completer);
1099
1100   add_com ("quit", class_support, quit_command, "Exit gdb.");
1101   c = add_com ("help", class_support, help_command, "Print list of commands.");
1102   set_cmd_completer (c, command_completer);
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);
1110   set_cmd_sfunc (c, set_verbose);
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\
1123 Without 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\
1142 You can supply a command number to start with, or a `+' to start after\n\
1143 the 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\
1151 The conditional expression must follow the word `while' and must in turn be\n\
1152 followed by a new line.  The nested commands must be entered one per line,\n\
1153 and 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\
1157 The conditional expression must follow the word `if' and must in turn be\n\
1158 followed by a new line.  The nested commands must be entered one per line,\n\
1159 and should be terminated by the word 'else' or `end'.  If an else clause\n\
1160 is 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\
1167 This value is used to set the speed of the serial port when debugging\n\
1168 using 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\
1174 When enabled, each packet sent or received with the remote target\n\
1175 is 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\
1182 When enabled, each packet sent or received with the remote target\n\
1183 is 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\
1189 This value is used to set the time limit for gdb to wait for a response\n\
1190 from 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
1201   c = add_com ("shell", class_support, shell_escape,
1202                "Execute the rest of the line as a shell command.\n\
1203 With no arguments, run an inferior shell.");
1204   set_cmd_completer (c, filename_completer);
1205
1206   c = add_com ("edit", class_files, edit_command,
1207            concat ("Edit specified file or function.\n\
1208 With no argument, edits file containing most recent line listed.\n\
1209 ", "\
1210 Editing 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\
1215 Uses 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\
1221 With 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\
1223 One argument specifies a line, and ten lines are listed around that line.\n\
1224 Two arguments with comma between specify starting and ending lines to list.\n\
1225 ", "\
1226 Lines 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\
1232 With 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
1242   c = add_com ("disassemble", class_vars, disassemble_command,
1243                "Disassemble a specified section of memory.\n\
1244 Default is the function surrounding the pc of the selected frame.\n\
1245 With a single argument, the function surrounding that address is dumped.\n\
1246 Two 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);
1250
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
1260   c = add_com ("make", class_support, make_command,
1261           "Run the ``make'' program using the rest of the line as arguments.");
1262   set_cmd_completer (c, filename_completer);
1263   add_cmd ("user", no_class, show_user,
1264            "Show definitions of user defined commands.\n\
1265 Argument is the name of the user defined command.\n\
1266 With no argument, show definitions of all user defined commands.", &showlist);
1267   add_com ("apropos", class_support, apropos_command, "Search for commands matching a REGEXP");
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);
1275 }