1 /* List lines of source files for GDB, the GNU debugger.
2 Copyright (C) 1986, 1987, 1988, 1989, 1991 Free Software Foundation, Inc.
4 This file is part of GDB.
6 This program is free software; you can redistribute it and/or modify
7 it under the terms of the GNU General Public License as published by
8 the Free Software Foundation; either version 2 of the License, or
9 (at your option) any later version.
11 This program is distributed in the hope that it will be useful,
12 but WITHOUT ANY WARRANTY; without even the implied warranty of
13 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 GNU General Public License for more details.
16 You should have received a copy of the GNU General Public License
17 along with this program; if not, write to the Free Software
18 Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */
22 #include "expression.h"
29 #include <sys/types.h>
33 #include <sys/param.h>
41 /* Prototypes for local functions. */
44 open_source_file PARAMS ((struct symtab *));
47 get_filename_and_charpos PARAMS ((struct symtab *, char **));
50 reverse_search_command PARAMS ((char *, int));
53 forward_search_command PARAMS ((char *, int));
56 line_info PARAMS ((char *, int));
59 list_command PARAMS ((char *, int));
62 ambiguous_line_spec PARAMS ((struct symtabs_and_lines *));
65 source_info PARAMS ((char *, int));
68 show_directories PARAMS ((char *, int));
71 find_source_lines PARAMS ((struct symtab *, int));
73 /* If we use this declaration, it breaks because of fucking ANSI "const" stuff
74 on some systems. We just have to not declare it at all, have it default
75 to int, and possibly botch on a few systems. Thanks, ANSIholes... */
76 /* extern char *strstr(); */
78 /* Path of directories to search for source files.
79 Same format as the PATH environment variable's value. */
83 /* Symtab of default file for listing lines of. */
85 struct symtab *current_source_symtab;
87 /* Default next line to list. */
89 int current_source_line;
91 /* Default number of lines to print with commands like "list".
92 This is based on guessing how many long (i.e. more than chars_per_line
93 characters) lines there will be. To be completely correct, "list"
94 and friends should be rewritten to count characters and see where
95 things are wrapping, but that would be a fair amount of work. */
97 int lines_to_list = 10;
99 /* Line number of last line printed. Default for various commands.
100 current_source_line is usually, but not always, the same as this. */
102 static int last_line_listed;
104 /* First line number listed by last listing command. */
106 static int first_line_listed;
109 /* Set the source file default for the "list" command to be S.
111 If S is NULL, and we don't have a default, find one. This
112 should only be called when the user actually tries to use the
113 default, since we produce an error if we can't find a reasonable
114 default. Also, since this can cause symbols to be read, doing it
115 before we need to would make things slower than necessary. */
118 select_source_symtab (s)
119 register struct symtab *s;
121 struct symtabs_and_lines sals;
122 struct symtab_and_line sal;
123 struct partial_symtab *ps;
124 struct partial_symtab *cs_pst = 0;
129 current_source_symtab = s;
130 current_source_line = 1;
134 if (current_source_symtab)
137 /* Make the default place to list be the function `main'
139 if (lookup_symbol ("main", 0, VAR_NAMESPACE, 0, NULL))
141 sals = decode_line_spec ("main", 1);
144 current_source_symtab = sal.symtab;
145 current_source_line = max (sal.line - (lines_to_list - 1), 1);
146 if (current_source_symtab)
150 /* All right; find the last file in the symtab list (ignoring .h's). */
152 current_source_line = 1;
154 for (ofp = object_files; ofp != NULL; ofp = ofp -> next)
156 for (s = ofp -> symtabs; s; s = s->next)
158 char *name = s -> filename;
159 int len = strlen (name);
160 if (! (len > 2 && (STREQ (&name[len - 2], ".h"))))
162 current_source_symtab = s;
166 if (current_source_symtab)
169 /* Howabout the partial symbol tables? */
171 for (ofp = object_files; ofp != NULL; ofp = ofp -> next)
173 for (ps = ofp -> psymtabs; ps != NULL; ps = ps -> next)
175 char *name = ps -> filename;
176 int len = strlen (name);
177 if (! (len > 2 && (STREQ (&name[len - 2], ".h"))))
185 if (cs_pst -> readin)
187 fatal ("Internal: select_source_symtab: readin pst found and no symtabs.");
191 current_source_symtab = PSYMTAB_TO_SYMTAB (cs_pst);
195 error ("Can't find a default source file");
199 show_directories (ignore, from_tty)
203 puts_filtered ("Source directories searched: ");
204 puts_filtered (source_path);
205 puts_filtered ("\n");
208 /* Forget what we learned about line positions in source files,
209 and which directories contain them;
210 must check again now since files may be found in
211 a different directory now. */
214 forget_cached_source_info ()
216 register struct symtab *s;
217 register struct objfile *objfile;
219 for (objfile = object_files; objfile != NULL; objfile = objfile -> next)
221 for (s = objfile -> symtabs; s != NULL; s = s -> next)
223 if (s -> line_charpos != NULL)
225 mfree (objfile -> md, s -> line_charpos);
226 s -> line_charpos = NULL;
228 if (s -> fullname != NULL)
230 mfree (objfile -> md, s -> fullname);
231 s -> fullname = NULL;
240 source_path = savestring ("$cdir:$cwd", /* strlen of it */ 10);
241 forget_cached_source_info ();
244 /* Add zero or more directories to the front of the source path. */
247 directory_command (dirname, from_tty)
252 /* FIXME, this goes to "delete dir"... */
255 if (query ("Reinitialize source path to empty? ", ""))
262 mod_path (dirname, &source_path);
264 show_directories ((char *)0, from_tty);
265 forget_cached_source_info ();
268 /* Add zero or more directories to the front of an arbitrary path. */
271 mod_path (dirname, which_path)
275 char *old = *which_path;
281 dirname = strsave (dirname);
282 make_cleanup (free, dirname);
286 char *name = dirname;
291 char *colon = strchr (name, ':');
292 char *space = strchr (name, ' ');
293 char *tab = strchr (name, '\t');
294 if (colon == 0 && space == 0 && tab == 0)
295 p = dirname = name + strlen (name);
299 if (colon != 0 && (p == 0 || colon < p))
301 if (space != 0 && (p == 0 || space < p))
303 if (tab != 0 && (p == 0 || tab < p))
306 while (*dirname == ':' || *dirname == ' ' || *dirname == '\t')
312 /* Sigh. "foo/" => "foo" */
320 /* "." => getwd (). */
321 name = current_directory;
324 else if (p[-2] == '/')
334 /* "...foo/." => "...foo". */
345 name = tilde_expand (name);
346 else if (name[0] != '/' && name[0] != '$')
347 name = concat (current_directory, "/", name, NULL);
349 name = savestring (name, p - name);
350 make_cleanup (free, name);
352 /* Unless it's a variable, check existence. */
353 if (name[0] != '$') {
354 if (stat (name, &st) < 0)
355 perror_with_name (name);
356 if ((st.st_mode & S_IFMT) != S_IFDIR)
357 error ("%s is not a directory.", name);
362 register unsigned int len = strlen (name);
367 if (!strncmp (p, name, len)
368 && (p[len] == '\0' || p[len] == ':'))
370 /* Found it in the search path, remove old copy */
372 p--; /* Back over leading colon */
373 if (prefix > p - *which_path)
374 goto skip_dup; /* Same dir twice in one cmd */
375 strcpy (p, &p[len+1]); /* Copy from next \0 or : */
385 /* If we have already tacked on a name(s) in this command, be sure they stay on the front as we tack on some more. */
392 temp = concat (old, ":", name, NULL);
394 *which_path = concat (temp, "", &old[prefix], NULL);
395 prefix = strlen (temp);
400 *which_path = concat (name, (old[0]? ":" : old), old, NULL);
401 prefix = strlen (name);
408 } while (*dirname != '\0');
413 source_info (ignore, from_tty)
417 register struct symtab *s = current_source_symtab;
421 printf_filtered("No current source file.\n");
424 printf_filtered ("Current source file is %s\n", s->filename);
426 printf_filtered ("Compilation directory is %s\n", s->dirname);
428 printf_filtered ("Located in %s\n", s->fullname);
430 printf_filtered ("Contains %d line%s.\n", s->nlines,
431 s->nlines == 1 ? "" : "s");
433 printf_filtered("Source language is %s.\n", language_str (s->language));
438 /* Open a file named STRING, searching path PATH (dir names sep by colons)
439 using mode MODE and protection bits PROT in the calls to open.
441 If TRY_CWD_FIRST, try to open ./STRING before searching PATH.
442 (ie pretend the first element of PATH is "."). This also indicates
443 that a slash in STRING disables searching of the path (this is
444 so that "exec-file ./foo" or "symbol-file ./foo" insures that you
445 get that particular version of foo or an error message).
447 If FILENAMED_OPENED is non-null, set it to a newly allocated string naming
448 the actual file opened (this string will always start with a "/". We
449 have to take special pains to avoid doubling the "/" between the directory
450 and the file, sigh! Emacs gets confuzzed by this when we print the
453 If a file is found, return the descriptor.
454 Otherwise, return -1, with errno set for the last name we tried to open. */
456 /* >>>> This should only allow files of certain types,
457 >>>> eg executable, non-directory */
459 openp (path, try_cwd_first, string, mode, prot, filename_opened)
465 char **filename_opened;
468 register char *filename;
469 register char *p, *p1;
476 if (try_cwd_first || string[0] == '/')
479 fd = open (filename, mode, prot);
480 if (fd >= 0 || string[0] == '/' || strchr (string, '/'))
485 while (string[0] == '.' && string[1] == '/')
488 alloclen = strlen (path) + strlen (string) + 2;
489 filename = (char *) alloca (alloclen);
491 for (p = path; p; p = p1 ? p1 + 1 : 0)
493 p1 = (char *) strchr (p, ':');
499 if (len == 4 && p[0] == '$' && p[1] == 'c'
500 && p[2] == 'w' && p[3] == 'd') {
501 /* Name is $cwd -- insert current directory name instead. */
504 /* First, realloc the filename buffer if too short. */
505 len = strlen (current_directory);
506 newlen = len + strlen (string) + 2;
507 if (newlen > alloclen) {
509 filename = (char *) alloca (alloclen);
511 strcpy (filename, current_directory);
513 /* Normal file name in path -- just use it. */
514 strncpy (filename, p, len);
518 /* Remove trailing slashes */
519 while (len > 0 && filename[len-1] == '/')
522 strcat (filename+len, "/");
523 strcat (filename, string);
525 fd = open (filename, mode, prot);
532 *filename_opened = (char *) 0;
533 else if (filename[0] == '/')
534 *filename_opened = savestring (filename, strlen (filename));
537 /* Beware the // my son, the Emacs barfs, the botch that catch... */
539 *filename_opened = concat (current_directory,
540 '/' == current_directory[strlen(current_directory)-1]? "": "/",
547 /* Open a source file given a symtab S. Returns a file descriptor
548 or negative number for error. */
554 char *path = source_path;
559 /* Quick way out if we already know its full name */
562 result = open (s->fullname, O_RDONLY);
565 /* Didn't work -- free old one, try again. */
566 mfree (s->objfile->md, s->fullname);
570 if (s->dirname != NULL)
572 /* Replace a path entry of $cdir with the compilation directory name */
574 /* We cast strstr's result in case an ANSIhole has made it const,
575 which produces a "required warning" when assigned to a nonconst. */
576 p = (char *)strstr (source_path, "$cdir");
577 if (p && (p == path || p[-1] == ':')
578 && (p[cdir_len] == ':' || p[cdir_len] == '\0')) {
582 alloca (strlen (source_path) + 1 + strlen (s->dirname) + 1);
583 len = p - source_path;
584 strncpy (path, source_path, len); /* Before $cdir */
585 strcpy (path + len, s->dirname); /* new stuff */
586 strcat (path + len, source_path + len + cdir_len); /* After $cdir */
590 result = openp (path, 0, s->filename, O_RDONLY, 0, &s->fullname);
593 /* Didn't work. Try using just the basename. */
594 p = basename (s->filename);
595 if (p != s->filename)
596 result = openp(path, 0, p, O_RDONLY,0, &s->fullname);
600 fullname = s -> fullname;
601 s -> fullname = mstrsave (s -> objfile -> md, s -> fullname);
608 /* Create and initialize the table S->line_charpos that records
609 the positions of the lines in the source file, which is assumed
610 to be open on descriptor DESC.
611 All set S->nlines to the number of such lines. */
614 find_source_lines (s, desc)
619 register char *data, *p, *end;
621 int lines_allocated = 1000;
625 #ifdef LSEEK_NOT_LINEAR
629 line_charpos = (int *) xmmalloc (s -> objfile -> md,
630 lines_allocated * sizeof (int));
631 if (fstat (desc, &st) < 0)
632 perror_with_name (s->filename);
635 exec_mtime = bfd_get_mtime(exec_bfd);
636 if (exec_mtime && exec_mtime < st.st_mtime)
637 printf_filtered ("Source file is more recent than executable.\n");
640 #ifdef LSEEK_NOT_LINEAR
641 /* Have to read it byte by byte to find out where the chars live */
643 line_charpos[0] = tell(desc);
645 while (myread(desc, &c, 1)>0)
649 if (nlines == lines_allocated)
651 lines_allocated *= 2;
653 (int *) xmrealloc (s -> objfile -> md, (char *) line_charpos,
654 sizeof (int) * lines_allocated);
656 line_charpos[nlines++] = tell(desc);
661 /* st_size might be a large type, but we only support source files whose
662 size fits in an int. FIXME. */
663 size = (int) st.st_size;
665 #ifdef BROKEN_LARGE_ALLOCA
666 data = (char *) xmalloc (size);
667 make_cleanup (free, data);
669 data = (char *) alloca (size);
671 if (myread (desc, data, size) < 0)
672 perror_with_name (s->filename);
680 /* A newline at the end does not start a new line. */
683 if (nlines == lines_allocated)
685 lines_allocated *= 2;
687 (int *) xmrealloc (s -> objfile -> md, (char *) line_charpos,
688 sizeof (int) * lines_allocated);
690 line_charpos[nlines++] = p - data;
696 (int *) xmrealloc (s -> objfile -> md, (char *) line_charpos,
697 nlines * sizeof (int));
701 /* Return the character position of a line LINE in symtab S.
702 Return 0 if anything is invalid. */
704 #if 0 /* Currently unused */
707 source_line_charpos (s, line)
712 if (!s->line_charpos || line <= 0) return 0;
713 if (line > s->nlines)
715 return s->line_charpos[line - 1];
718 /* Return the line number of character position POS in symtab S. */
721 source_charpos_line (s, chr)
722 register struct symtab *s;
725 register int line = 0;
728 if (s == 0 || s->line_charpos == 0) return 0;
729 lnp = s->line_charpos;
730 /* Files are usually short, so sequential search is Ok */
731 while (line < s->nlines && *lnp <= chr)
736 if (line >= s->nlines)
744 /* Get full pathname and line number positions for a symtab.
745 Return nonzero if line numbers may have changed.
746 Set *FULLNAME to actual name of the file as found by `openp',
747 or to 0 if the file is not found. */
750 get_filename_and_charpos (s, fullname)
754 register int desc, linenums_changed = 0;
756 desc = open_source_file (s);
764 *fullname = s->fullname;
765 if (s->line_charpos == 0) linenums_changed = 1;
766 if (linenums_changed) find_source_lines (s, desc);
768 return linenums_changed;
771 /* Print text describing the full name of the source file S
772 and the line number LINE and its corresponding character position.
773 The text starts with two Ctrl-z so that the Emacs-GDB interface
776 MID_STATEMENT is nonzero if the PC is not at the beginning of that line.
778 Return 1 if successful, 0 if could not find the file. */
781 identify_source_line (s, line, mid_statement, pc)
787 if (s->line_charpos == 0)
788 get_filename_and_charpos (s, (char **)NULL);
789 if (s->fullname == 0)
791 if (line >= s->nlines)
793 printf ("\032\032%s:%d:%d:%s:0x%x\n", s->fullname,
794 line, s->line_charpos[line - 1],
795 mid_statement ? "middle" : "beg",
797 current_source_line = line;
798 first_line_listed = line;
799 last_line_listed = line;
800 current_source_symtab = s;
804 /* Print source lines from the file of symtab S,
805 starting with line number LINE and stopping before line number STOPLINE. */
808 print_source_lines (s, line, stopline, noerror)
815 register FILE *stream;
816 int nlines = stopline - line;
818 /* Regardless of whether we can open the file, set current_source_symtab. */
819 current_source_symtab = s;
820 current_source_line = line;
821 first_line_listed = line;
823 desc = open_source_file (s);
827 char *name = alloca (strlen (s->filename) + 100);
828 sprintf (name, "%s:%d", s->filename, line);
829 print_sys_errmsg (name, errno);
834 if (s->line_charpos == 0)
835 find_source_lines (s, desc);
837 if (line < 1 || line > s->nlines)
840 error ("Line number %d out of range; %s has %d lines.",
841 line, s->filename, s->nlines);
844 if (lseek (desc, s->line_charpos[line - 1], 0) < 0)
847 perror_with_name (s->filename);
850 stream = fdopen (desc, FOPEN_RT);
857 last_line_listed = current_source_line;
858 printf_filtered ("%d\t", current_source_line++);
861 if (c < 040 && c != '\t' && c != '\n' && c != '\r')
862 printf_filtered ("^%c", c + 0100);
864 printf_filtered ("^?");
866 printf_filtered ("%c", c);
867 } while (c != '\n' && (c = fgetc (stream)) >= 0);
877 Print a list of files and line numbers which a user may choose from
878 in order to list a function which was specified ambiguously
879 (as with `list classname::overloadedfuncname', for example).
880 The vector in SALS provides the filenames and line numbers.
883 ambiguous_line_spec (sals)
884 struct symtabs_and_lines *sals;
888 for (i = 0; i < sals->nelts; ++i)
889 printf_filtered("file: \"%s\", line number: %d\n",
890 sals->sals[i].symtab->filename, sals->sals[i].line);
895 list_command (arg, from_tty)
899 struct symtabs_and_lines sals, sals_end;
900 struct symtab_and_line sal, sal_end;
909 if (!have_full_symbols () && !have_partial_symbols())
910 error ("No symbol table is loaded. Use the \"file\" command.");
912 /* Pull in a current source symtab if necessary */
913 if (current_source_symtab == 0 &&
914 (arg == 0 || arg[0] == '+' || arg[0] == '-'))
915 select_source_symtab (0);
917 /* "l" or "l +" lists next ten lines. */
919 if (arg == 0 || STREQ (arg, "+"))
921 if (current_source_symtab == 0)
922 error ("No default source file yet. Do \"help list\".");
923 print_source_lines (current_source_symtab, current_source_line,
924 current_source_line + lines_to_list, 0);
928 /* "l -" lists previous ten lines, the ones before the ten just listed. */
929 if (STREQ (arg, "-"))
931 if (current_source_symtab == 0)
932 error ("No default source file yet. Do \"help list\".");
933 print_source_lines (current_source_symtab,
934 max (first_line_listed - lines_to_list, 1),
935 first_line_listed, 0);
939 /* Now if there is only one argument, decode it in SAL
941 If there are two arguments, decode them in SAL and SAL_END
942 and clear NO_END; however, if one of the arguments is blank,
943 set DUMMY_BEG or DUMMY_END to record that fact. */
950 sals = decode_line_1 (&arg1, 0, 0, 0);
952 if (! sals.nelts) return; /* C++ */
955 ambiguous_line_spec (&sals);
964 /* Record whether the BEG arg is all digits. */
966 for (p = arg; p != arg1 && *p >= '0' && *p <= '9'; p++);
967 linenum_beg = (p == arg1);
969 while (*arg1 == ' ' || *arg1 == '\t')
975 while (*arg1 == ' ' || *arg1 == '\t')
982 sals_end = decode_line_1 (&arg1, 0, 0, 0);
984 sals_end = decode_line_1 (&arg1, 0, sal.symtab, sal.line);
985 if (sals_end.nelts == 0)
987 if (sals_end.nelts > 1)
989 ambiguous_line_spec (&sals_end);
990 free (sals_end.sals);
993 sal_end = sals_end.sals[0];
994 free (sals_end.sals);
999 error ("Junk at end of line specification.");
1001 if (!no_end && !dummy_beg && !dummy_end
1002 && sal.symtab != sal_end.symtab)
1003 error ("Specified start and end are in different files.");
1004 if (dummy_beg && dummy_end)
1005 error ("Two empty args do not say what lines to list.");
1007 /* if line was specified by address,
1008 first print exactly which line, and which file.
1009 In this case, sal.symtab == 0 means address is outside
1010 of all known source files, not that user failed to give a filename. */
1013 if (sal.symtab == 0)
1014 error ("No source file for address %s.", local_hex_string(sal.pc));
1015 sym = find_pc_function (sal.pc);
1018 printf_filtered ("%s is in ", local_hex_string(sal.pc));
1019 fputs_filtered (SYMBOL_SOURCE_NAME (sym), stdout);
1020 printf_filtered (" (%s:%d).\n", sal.symtab->filename, sal.line);
1023 printf_filtered ("%s is at %s:%d.\n",
1024 local_hex_string(sal.pc),
1025 sal.symtab->filename, sal.line);
1028 /* If line was not specified by just a line number,
1029 and it does not imply a symtab, it must be an undebuggable symbol
1030 which means no source code. */
1032 if (! linenum_beg && sal.symtab == 0)
1033 error ("No line number known for %s.", arg);
1035 /* If this command is repeated with RET,
1036 turn it into the no-arg variant. */
1041 if (dummy_beg && sal_end.symtab == 0)
1042 error ("No default source file yet. Do \"help list\".");
1044 print_source_lines (sal_end.symtab,
1045 max (sal_end.line - (lines_to_list - 1), 1),
1046 sal_end.line + 1, 0);
1047 else if (sal.symtab == 0)
1048 error ("No default source file yet. Do \"help list\".");
1050 print_source_lines (sal.symtab,
1051 max (sal.line - (lines_to_list / 2), 1),
1052 sal.line + (lines_to_list / 2), 0);
1054 print_source_lines (sal.symtab, sal.line,
1056 ? sal.line + lines_to_list
1057 : sal_end.line + 1),
1061 /* Print info on range of pc's in a specified line. */
1064 line_info (arg, from_tty)
1068 struct symtabs_and_lines sals;
1069 struct symtab_and_line sal;
1070 CORE_ADDR start_pc, end_pc;
1075 sal.symtab = current_source_symtab;
1076 sal.line = last_line_listed;
1078 sals.sals = (struct symtab_and_line *)
1079 xmalloc (sizeof (struct symtab_and_line));
1084 sals = decode_line_spec_1 (arg, 0);
1089 /* C++ More than one line may have been specified, as when the user
1090 specifies an overloaded function name. Print info on them all. */
1091 for (i = 0; i < sals.nelts; i++)
1095 if (sal.symtab == 0)
1097 printf_filtered ("No line number information available");
1100 /* This is useful for "info line *0x7f34". If we can't tell the
1101 user about a source line, at least let them have the symbolic
1103 printf_filtered (" for address ");
1105 print_address (sal.pc, stdout);
1108 printf_filtered (".");
1109 printf_filtered ("\n");
1111 else if (sal.line > 0
1112 && find_line_pc_range (sal.symtab, sal.line, &start_pc, &end_pc))
1114 if (start_pc == end_pc)
1115 printf_filtered ("Line %d of \"%s\" is at pc %s but contains no code.\n",
1116 sal.line, sal.symtab->filename, local_hex_string(start_pc));
1119 printf_filtered ("Line %d of \"%s\" starts at pc %s",
1120 sal.line, sal.symtab->filename,
1121 local_hex_string(start_pc));
1122 printf_filtered (" and ends at %s.\n",
1123 local_hex_string(end_pc));
1125 /* x/i should display this line's code. */
1126 set_next_address (start_pc);
1127 /* Repeating "info line" should do the following line. */
1128 last_line_listed = sal.line + 1;
1130 /* If this is the only line, show the source code. If it could
1131 not find the file, don't do anything special. */
1132 if (frame_file_full_name && sals.nelts == 1)
1133 identify_source_line (sal.symtab, sal.line, 0, start_pc);
1136 /* Is there any case in which we get here, and have an address
1137 which the user would want to see? If we have debugging symbols
1138 and no line numbers? */
1139 printf_filtered ("Line number %d is out of range for \"%s\".\n",
1140 sal.line, sal.symtab->filename);
1144 /* Commands to search the source file for a regexp. */
1148 forward_search_command (regex, from_tty)
1154 register FILE *stream;
1155 int line = last_line_listed + 1;
1158 msg = (char *) re_comp (regex);
1162 if (current_source_symtab == 0)
1163 select_source_symtab (0);
1165 /* Search from last_line_listed+1 in current_source_symtab */
1167 desc = open_source_file (current_source_symtab);
1169 perror_with_name (current_source_symtab->filename);
1171 if (current_source_symtab->line_charpos == 0)
1172 find_source_lines (current_source_symtab, desc);
1174 if (line < 1 || line > current_source_symtab->nlines)
1177 error ("Expression not found");
1180 if (lseek (desc, current_source_symtab->line_charpos[line - 1], 0) < 0)
1183 perror_with_name (current_source_symtab->filename);
1186 stream = fdopen (desc, FOPEN_RT);
1189 /* FIXME!!! We walk right off the end of buf if we get a long line!!! */
1190 char buf[4096]; /* Should be reasonable??? */
1191 register char *p = buf;
1198 } while (c != '\n' && (c = getc (stream)) >= 0);
1200 /* we now have a source line in buf, null terminate and match */
1202 if (re_exec (buf) > 0)
1206 print_source_lines (current_source_symtab,
1208 current_source_line = max (line - lines_to_list / 2, 1);
1214 printf_filtered ("Expression not found\n");
1220 reverse_search_command (regex, from_tty)
1226 register FILE *stream;
1227 int line = last_line_listed - 1;
1230 msg = (char *) re_comp (regex);
1234 if (current_source_symtab == 0)
1235 select_source_symtab (0);
1237 /* Search from last_line_listed-1 in current_source_symtab */
1239 desc = open_source_file (current_source_symtab);
1241 perror_with_name (current_source_symtab->filename);
1243 if (current_source_symtab->line_charpos == 0)
1244 find_source_lines (current_source_symtab, desc);
1246 if (line < 1 || line > current_source_symtab->nlines)
1249 error ("Expression not found");
1252 if (lseek (desc, current_source_symtab->line_charpos[line - 1], 0) < 0)
1255 perror_with_name (current_source_symtab->filename);
1258 stream = fdopen (desc, FOPEN_RT);
1262 /* FIXME!!! We walk right off the end of buf if we get a long line!!! */
1263 char buf[4096]; /* Should be reasonable??? */
1264 register char *p = buf;
1271 } while (c != '\n' && (c = getc (stream)) >= 0);
1273 /* We now have a source line in buf; null terminate and match. */
1275 if (re_exec (buf) > 0)
1279 print_source_lines (current_source_symtab,
1281 current_source_line = max (line - lines_to_list / 2, 1);
1285 if (fseek (stream, current_source_symtab->line_charpos[line - 1], 0) < 0)
1288 perror_with_name (current_source_symtab->filename);
1292 printf_filtered ("Expression not found\n");
1298 _initialize_source ()
1300 current_source_symtab = 0;
1301 init_source_path ();
1303 add_com ("directory", class_files, directory_command,
1304 "Add directory DIR to beginning of search path for source files.\n\
1305 Forget cached info on source file locations and line positions.\n\
1306 DIR can also be $cwd for the current working directory, or $cdir for the\n\
1307 directory in which the source file was compiled into object code.\n\
1308 With no argument, reset the search path to $cdir:$cwd, the default.");
1310 add_cmd ("directories", no_class, show_directories,
1311 "Current search path for finding source files.\n\
1312 $cwd in the path means the current working directory.\n\
1313 $cdir in the path means the compilation directory of the source file.",
1316 add_info ("source", source_info,
1317 "Information about the current source file.");
1319 add_info ("line", line_info,
1320 "Core addresses of the code for a source line.\n\
1321 Line can be specified as\n\
1322 LINENUM, to list around that line in current file,\n\
1323 FILE:LINENUM, to list around that line in that file,\n\
1324 FUNCTION, to list around beginning of that function,\n\
1325 FILE:FUNCTION, to distinguish among like-named static functions.\n\
1326 Default is to describe the last source line that was listed.\n\n\
1327 This sets the default address for \"x\" to the line's first instruction\n\
1328 so that \"x/i\" suffices to start examining the machine code.\n\
1329 The address is also stored as the value of \"$_\".");
1331 add_com ("forward-search", class_files, forward_search_command,
1332 "Search for regular expression (see regex(3)) from last line listed.");
1333 add_com_alias ("search", "forward-search", class_files, 0);
1335 add_com ("reverse-search", class_files, reverse_search_command,
1336 "Search backward for regular expression (see regex(3)) from last line listed.");
1338 add_com ("list", class_files, list_command,
1339 "List specified function or line.\n\
1340 With no argument, lists ten more lines after or around previous listing.\n\
1341 \"list -\" lists the ten lines before a previous ten-line listing.\n\
1342 One argument specifies a line, and ten lines are listed around that line.\n\
1343 Two arguments with comma between specify starting and ending lines to list.\n\
1344 Lines can be specified in these ways:\n\
1345 LINENUM, to list around that line in current file,\n\
1346 FILE:LINENUM, to list around that line in that file,\n\
1347 FUNCTION, to list around beginning of that function,\n\
1348 FILE:FUNCTION, to distinguish among like-named static functions.\n\
1349 *ADDRESS, to list around the line containing that address.\n\
1350 With two args if one is empty it stands for ten lines away from the other arg.");
1351 add_com_alias ("l", "list", class_files, 1);
1354 (add_set_cmd ("listsize", class_support, var_uinteger,
1355 (char *)&lines_to_list,
1356 "Set number of source lines gdb will list by default.",