2000-11-30 Fernando Nasser <fnasser@redhat.com>
[deliverable/binutils-gdb.git] / gdb / source.c
CommitLineData
c906108c 1/* List lines of source files for GDB, the GNU debugger.
7be570e7 2 Copyright 1986-1989, 1991-1999 Free Software Foundation, Inc.
c906108c 3
c5aa993b 4 This file is part of GDB.
c906108c 5
c5aa993b
JM
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.
c906108c 10
c5aa993b
JM
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.
c906108c 15
c5aa993b
JM
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., 59 Temple Place - Suite 330,
19 Boston, MA 02111-1307, USA. */
c906108c
SS
20
21#include "defs.h"
22#include "symtab.h"
23#include "expression.h"
24#include "language.h"
25#include "command.h"
c2c6d25f 26#include "source.h"
c906108c
SS
27#include "gdbcmd.h"
28#include "frame.h"
29#include "value.h"
30
31#include <sys/types.h>
32#include "gdb_string.h"
33#include "gdb_stat.h"
34#include <fcntl.h>
c906108c 35#include "gdbcore.h"
88987551 36#include "gdb_regex.h"
c906108c
SS
37#include "symfile.h"
38#include "objfiles.h"
39#include "annotate.h"
40#include "gdbtypes.h"
c5f0f3d0
FN
41#include "linespec.h"
42#include "completer.h"
8b93c638
JM
43#ifdef UI_OUT
44#include "ui-out.h"
45#endif
c906108c
SS
46
47#ifdef CRLF_SOURCE_FILES
48
49/* Define CRLF_SOURCE_FILES in an xm-*.h file if source files on the
50 host use \r\n rather than just \n. Defining CRLF_SOURCE_FILES is
51 much faster than defining LSEEK_NOT_LINEAR. */
52
53#ifndef O_BINARY
54#define O_BINARY 0
55#endif
56
57#define OPEN_MODE (O_RDONLY | O_BINARY)
58#define FDOPEN_MODE FOPEN_RB
59
60#else /* ! defined (CRLF_SOURCE_FILES) */
61
62#define OPEN_MODE O_RDONLY
63#define FDOPEN_MODE FOPEN_RT
64
65#endif /* ! defined (CRLF_SOURCE_FILES) */
66
c906108c
SS
67/* Prototypes for exported functions. */
68
a14ed312 69void _initialize_source (void);
c906108c
SS
70
71/* Prototypes for local functions. */
72
a14ed312 73static int get_filename_and_charpos (struct symtab *, char **);
c906108c 74
a14ed312 75static void reverse_search_command (char *, int);
c906108c 76
a14ed312 77static void forward_search_command (char *, int);
c906108c 78
a14ed312 79static void line_info (char *, int);
c906108c 80
a14ed312 81static void list_command (char *, int);
c906108c 82
a14ed312 83static void ambiguous_line_spec (struct symtabs_and_lines *);
c906108c 84
a14ed312 85static void source_info (char *, int);
c906108c 86
a14ed312 87static void show_directories (char *, int);
c906108c
SS
88
89/* Path of directories to search for source files.
90 Same format as the PATH environment variable's value. */
91
92char *source_path;
93
94/* Symtab of default file for listing lines of. */
95
96struct symtab *current_source_symtab;
97
98/* Default next line to list. */
99
100int current_source_line;
101
102/* Default number of lines to print with commands like "list".
103 This is based on guessing how many long (i.e. more than chars_per_line
104 characters) lines there will be. To be completely correct, "list"
105 and friends should be rewritten to count characters and see where
106 things are wrapping, but that would be a fair amount of work. */
107
108int lines_to_list = 10;
109
110/* Line number of last line printed. Default for various commands.
111 current_source_line is usually, but not always, the same as this. */
112
113static int last_line_listed;
114
115/* First line number listed by last listing command. */
116
117static int first_line_listed;
118
119/* Saves the name of the last source file visited and a possible error code.
120 Used to prevent repeating annoying "No such file or directories" msgs */
121
122static struct symtab *last_source_visited = NULL;
123static int last_source_error = 0;
c906108c 124\f
c5aa993b 125
c906108c
SS
126/* Set the source file default for the "list" command to be S.
127
128 If S is NULL, and we don't have a default, find one. This
129 should only be called when the user actually tries to use the
130 default, since we produce an error if we can't find a reasonable
131 default. Also, since this can cause symbols to be read, doing it
132 before we need to would make things slower than necessary. */
133
134void
fba45db2 135select_source_symtab (register struct symtab *s)
c906108c
SS
136{
137 struct symtabs_and_lines sals;
138 struct symtab_and_line sal;
139 struct partial_symtab *ps;
140 struct partial_symtab *cs_pst = 0;
141 struct objfile *ofp;
c5aa993b 142
c906108c
SS
143 if (s)
144 {
145 current_source_symtab = s;
146 current_source_line = 1;
147 return;
148 }
149
150 if (current_source_symtab)
151 return;
152
153 /* Make the default place to list be the function `main'
154 if one exists. */
155 if (lookup_symbol ("main", 0, VAR_NAMESPACE, 0, NULL))
156 {
157 sals = decode_line_spec ("main", 1);
158 sal = sals.sals[0];
159 free (sals.sals);
160 current_source_symtab = sal.symtab;
161 current_source_line = max (sal.line - (lines_to_list - 1), 1);
162 if (current_source_symtab)
c5aa993b 163 return;
c906108c 164 }
c5aa993b 165
c906108c
SS
166 /* All right; find the last file in the symtab list (ignoring .h's). */
167
168 current_source_line = 1;
169
c5aa993b 170 for (ofp = object_files; ofp != NULL; ofp = ofp->next)
c906108c 171 {
c5aa993b 172 for (s = ofp->symtabs; s; s = s->next)
c906108c 173 {
c5aa993b 174 char *name = s->filename;
c906108c 175 int len = strlen (name);
c5aa993b 176 if (!(len > 2 && (STREQ (&name[len - 2], ".h"))))
c906108c
SS
177 {
178 current_source_symtab = s;
179 }
180 }
181 }
182 if (current_source_symtab)
183 return;
184
185 /* Howabout the partial symbol tables? */
186
c5aa993b 187 for (ofp = object_files; ofp != NULL; ofp = ofp->next)
c906108c 188 {
c5aa993b 189 for (ps = ofp->psymtabs; ps != NULL; ps = ps->next)
c906108c 190 {
c5aa993b 191 char *name = ps->filename;
c906108c 192 int len = strlen (name);
c5aa993b 193 if (!(len > 2 && (STREQ (&name[len - 2], ".h"))))
c906108c
SS
194 {
195 cs_pst = ps;
196 }
197 }
198 }
199 if (cs_pst)
200 {
c5aa993b 201 if (cs_pst->readin)
c906108c 202 {
96baa820 203 internal_error ("select_source_symtab: readin pst found and no symtabs.");
c906108c
SS
204 }
205 else
206 {
207 current_source_symtab = PSYMTAB_TO_SYMTAB (cs_pst);
208 }
209 }
210 if (current_source_symtab)
211 return;
212
213 error ("Can't find a default source file");
214}
215\f
216static void
fba45db2 217show_directories (char *ignore, int from_tty)
c906108c
SS
218{
219 puts_filtered ("Source directories searched: ");
220 puts_filtered (source_path);
221 puts_filtered ("\n");
222}
223
224/* Forget what we learned about line positions in source files, and
225 which directories contain them; must check again now since files
226 may be found in a different directory now. */
227
228void
fba45db2 229forget_cached_source_info (void)
c906108c
SS
230{
231 register struct symtab *s;
232 register struct objfile *objfile;
233
c5aa993b 234 for (objfile = object_files; objfile != NULL; objfile = objfile->next)
c906108c 235 {
c5aa993b 236 for (s = objfile->symtabs; s != NULL; s = s->next)
c906108c 237 {
c5aa993b 238 if (s->line_charpos != NULL)
c906108c 239 {
c5aa993b
JM
240 mfree (objfile->md, s->line_charpos);
241 s->line_charpos = NULL;
c906108c 242 }
c5aa993b 243 if (s->fullname != NULL)
c906108c 244 {
c5aa993b
JM
245 mfree (objfile->md, s->fullname);
246 s->fullname = NULL;
c906108c
SS
247 }
248 }
249 }
250}
251
252void
fba45db2 253init_source_path (void)
c906108c
SS
254{
255 char buf[20];
256
257 sprintf (buf, "$cdir%c$cwd", DIRNAME_SEPARATOR);
258 source_path = strsave (buf);
259 forget_cached_source_info ();
260}
261
262/* Add zero or more directories to the front of the source path. */
c5aa993b 263
c906108c 264void
fba45db2 265directory_command (char *dirname, int from_tty)
c906108c
SS
266{
267 dont_repeat ();
268 /* FIXME, this goes to "delete dir"... */
269 if (dirname == 0)
270 {
43ff13b4 271 if (from_tty && query ("Reinitialize source path to empty? "))
c906108c
SS
272 {
273 free (source_path);
274 init_source_path ();
275 }
276 }
277 else
278 {
279 mod_path (dirname, &source_path);
280 last_source_visited = NULL;
281 }
282 if (from_tty)
c5aa993b 283 show_directories ((char *) 0, from_tty);
c906108c
SS
284 forget_cached_source_info ();
285}
286
287/* Add zero or more directories to the front of an arbitrary path. */
288
289void
fba45db2 290mod_path (char *dirname, char **which_path)
c906108c
SS
291{
292 char *old = *which_path;
293 int prefix = 0;
294
295 if (dirname == 0)
296 return;
297
298 dirname = strsave (dirname);
299 make_cleanup (free, dirname);
300
301 do
302 {
303 char *name = dirname;
304 register char *p;
305 struct stat st;
306
307 {
308 char *separator = strchr (name, DIRNAME_SEPARATOR);
309 char *space = strchr (name, ' ');
310 char *tab = strchr (name, '\t');
311
c5aa993b 312 if (separator == 0 && space == 0 && tab == 0)
c906108c
SS
313 p = dirname = name + strlen (name);
314 else
315 {
316 p = 0;
317 if (separator != 0 && (p == 0 || separator < p))
318 p = separator;
319 if (space != 0 && (p == 0 || space < p))
320 p = space;
321 if (tab != 0 && (p == 0 || tab < p))
322 p = tab;
323 dirname = p + 1;
324 while (*dirname == DIRNAME_SEPARATOR
325 || *dirname == ' '
326 || *dirname == '\t')
327 ++dirname;
328 }
329 }
330
7be570e7
JM
331 if (!(SLASH_P (*name) && p <= name + 1) /* "/" */
332#if defined(_WIN32) || defined(__MSDOS__)
333 /* On MS-DOS and MS-Windows, h:\ is different from h: */
334 && !(!SLASH_P (*name) && ROOTED_P (name) && p <= name + 3) /* d:/ */
335#endif
336 && SLASH_P (p[-1]))
c906108c
SS
337 /* Sigh. "foo/" => "foo" */
338 --p;
c906108c
SS
339 *p = '\0';
340
7be570e7 341 while (p > name && p[-1] == '.')
c906108c
SS
342 {
343 if (p - name == 1)
344 {
345 /* "." => getwd (). */
346 name = current_directory;
347 goto append;
348 }
7be570e7 349 else if (p > name + 1 && SLASH_P (p[-2]))
c906108c
SS
350 {
351 if (p - name == 2)
352 {
353 /* "/." => "/". */
354 *--p = '\0';
355 goto append;
356 }
357 else
358 {
359 /* "...foo/." => "...foo". */
360 p -= 2;
361 *p = '\0';
362 continue;
363 }
364 }
365 else
366 break;
367 }
368
369 if (name[0] == '~')
370 name = tilde_expand (name);
7be570e7
JM
371#if defined(_WIN32) || defined(__MSDOS__)
372 else if (ROOTED_P (name) && p == name + 2) /* "d:" => "d:." */
373 name = concat (name, ".", NULL);
374#endif
c5aa993b
JM
375 else if (!ROOTED_P (name) && name[0] != '$')
376 name = concat (current_directory, SLASH_STRING, name, NULL);
c906108c
SS
377 else
378 name = savestring (name, p - name);
379 make_cleanup (free, name);
380
381 /* Unless it's a variable, check existence. */
c5aa993b
JM
382 if (name[0] != '$')
383 {
384 /* These are warnings, not errors, since we don't want a
385 non-existent directory in a .gdbinit file to stop processing
386 of the .gdbinit file.
387
388 Whether they get added to the path is more debatable. Current
389 answer is yes, in case the user wants to go make the directory
390 or whatever. If the directory continues to not exist/not be
391 a directory/etc, then having them in the path should be
392 harmless. */
393 if (stat (name, &st) < 0)
394 {
395 int save_errno = errno;
396 fprintf_unfiltered (gdb_stderr, "Warning: ");
397 print_sys_errmsg (name, save_errno);
398 }
399 else if ((st.st_mode & S_IFMT) != S_IFDIR)
400 warning ("%s is not a directory.", name);
401 }
c906108c
SS
402
403 append:
404 {
405 register unsigned int len = strlen (name);
406
407 p = *which_path;
408 while (1)
409 {
7be570e7
JM
410 /* FIXME: strncmp loses in interesting ways on MS-DOS and
411 MS-Windows because of case-insensitivity and two different
412 but functionally identical slash characters. We need a
413 special filesystem-dependent file-name comparison function.
414
415 Actually, even on Unix I would use realpath() or its work-
416 alike before comparing. Then all the code above which
417 removes excess slashes and dots could simply go away. */
c906108c
SS
418 if (!strncmp (p, name, len)
419 && (p[len] == '\0' || p[len] == DIRNAME_SEPARATOR))
420 {
421 /* Found it in the search path, remove old copy */
422 if (p > *which_path)
c5aa993b 423 p--; /* Back over leading separator */
c906108c
SS
424 if (prefix > p - *which_path)
425 goto skip_dup; /* Same dir twice in one cmd */
c5aa993b 426 strcpy (p, &p[len + 1]); /* Copy from next \0 or : */
c906108c
SS
427 }
428 p = strchr (p, DIRNAME_SEPARATOR);
429 if (p != 0)
430 ++p;
431 else
432 break;
433 }
434 if (p == 0)
435 {
436 char tinybuf[2];
437
438 tinybuf[0] = DIRNAME_SEPARATOR;
439 tinybuf[1] = '\0';
440
c5aa993b 441 /* 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. */
c906108c
SS
442 if (prefix)
443 {
444 char *temp, c;
445
446 c = old[prefix];
447 old[prefix] = '\0';
448 temp = concat (old, tinybuf, name, NULL);
449 old[prefix] = c;
450 *which_path = concat (temp, "", &old[prefix], NULL);
451 prefix = strlen (temp);
452 free (temp);
453 }
454 else
455 {
456 *which_path = concat (name, (old[0] ? tinybuf : old), old, NULL);
457 prefix = strlen (name);
458 }
459 free (old);
460 old = *which_path;
461 }
462 }
c5aa993b
JM
463 skip_dup:;
464 }
465 while (*dirname != '\0');
c906108c
SS
466}
467
468
469static void
fba45db2 470source_info (char *ignore, int from_tty)
c906108c
SS
471{
472 register struct symtab *s = current_source_symtab;
473
474 if (!s)
475 {
c5aa993b 476 printf_filtered ("No current source file.\n");
c906108c
SS
477 return;
478 }
479 printf_filtered ("Current source file is %s\n", s->filename);
480 if (s->dirname)
481 printf_filtered ("Compilation directory is %s\n", s->dirname);
482 if (s->fullname)
483 printf_filtered ("Located in %s\n", s->fullname);
484 if (s->nlines)
485 printf_filtered ("Contains %d line%s.\n", s->nlines,
486 s->nlines == 1 ? "" : "s");
487
488 printf_filtered ("Source language is %s.\n", language_str (s->language));
489 printf_filtered ("Compiled with %s debugging format.\n", s->debugformat);
490}
c5aa993b 491\f
c906108c
SS
492
493
c906108c
SS
494/* Open a file named STRING, searching path PATH (dir names sep by some char)
495 using mode MODE and protection bits PROT in the calls to open.
496
497 If TRY_CWD_FIRST, try to open ./STRING before searching PATH.
498 (ie pretend the first element of PATH is "."). This also indicates
499 that a slash in STRING disables searching of the path (this is
500 so that "exec-file ./foo" or "symbol-file ./foo" insures that you
501 get that particular version of foo or an error message).
502
503 If FILENAMED_OPENED is non-null, set it to a newly allocated string naming
504 the actual file opened (this string will always start with a "/". We
505 have to take special pains to avoid doubling the "/" between the directory
506 and the file, sigh! Emacs gets confuzzed by this when we print the
507 source file name!!!
508
509 If a file is found, return the descriptor.
510 Otherwise, return -1, with errno set for the last name we tried to open. */
511
512/* >>>> This should only allow files of certain types,
c5aa993b 513 >>>> eg executable, non-directory */
c906108c 514int
fba45db2
KB
515openp (char *path, int try_cwd_first, char *string, int mode, int prot,
516 char **filename_opened)
c906108c
SS
517{
518 register int fd;
519 register char *filename;
520 register char *p, *p1;
521 register int len;
522 int alloclen;
523
524 if (!path)
525 path = ".";
526
527#ifdef _WIN32
528 mode |= O_BINARY;
529#endif
530
b83266a0 531 if (try_cwd_first || ROOTED_P (string))
c906108c
SS
532 {
533 int i;
534 filename = string;
535 fd = open (filename, mode, prot);
536 if (fd >= 0)
537 goto done;
538 for (i = 0; string[i]; i++)
539 if (SLASH_P (string[i]))
540 goto done;
541 }
542
543 /* ./foo => foo */
544 while (string[0] == '.' && SLASH_P (string[1]))
545 string += 2;
546
547 alloclen = strlen (path) + strlen (string) + 2;
548 filename = (char *) alloca (alloclen);
549 fd = -1;
550 for (p = path; p; p = p1 ? p1 + 1 : 0)
551 {
552 p1 = (char *) strchr (p, DIRNAME_SEPARATOR);
553 if (p1)
554 len = p1 - p;
555 else
556 len = strlen (p);
557
558 if (len == 4 && p[0] == '$' && p[1] == 'c'
c5aa993b
JM
559 && p[2] == 'w' && p[3] == 'd')
560 {
561 /* Name is $cwd -- insert current directory name instead. */
562 int newlen;
563
564 /* First, realloc the filename buffer if too short. */
565 len = strlen (current_directory);
566 newlen = len + strlen (string) + 2;
567 if (newlen > alloclen)
568 {
569 alloclen = newlen;
570 filename = (char *) alloca (alloclen);
571 }
572 strcpy (filename, current_directory);
573 }
574 else
575 {
576 /* Normal file name in path -- just use it. */
577 strncpy (filename, p, len);
578 filename[len] = 0;
c906108c 579 }
c906108c
SS
580
581 /* Remove trailing slashes */
c5aa993b 582 while (len > 0 && SLASH_P (filename[len - 1]))
c906108c
SS
583 filename[--len] = 0;
584
c5aa993b 585 strcat (filename + len, SLASH_STRING);
c906108c
SS
586 strcat (filename, string);
587
588 fd = open (filename, mode);
c5aa993b
JM
589 if (fd >= 0)
590 break;
c906108c
SS
591 }
592
c5aa993b 593done:
c906108c
SS
594 if (filename_opened)
595 {
596 if (fd < 0)
597 *filename_opened = (char *) 0;
598 else if (ROOTED_P (filename))
599 *filename_opened = savestring (filename, strlen (filename));
600 else
601 {
602 /* Beware the // my son, the Emacs barfs, the botch that catch... */
c5aa993b
JM
603
604 *filename_opened = concat (current_directory,
7be570e7 605 SLASH_P (current_directory[strlen (current_directory) - 1])
c5aa993b 606 ? "" : SLASH_STRING,
c906108c 607 filename, NULL);
c5aa993b 608 }
c906108c
SS
609 }
610#ifdef MPW
611 /* This is a debugging hack that can go away when all combinations
612 of Mac and Unix names are handled reasonably. */
613 {
614 extern int debug_openp;
615
616 if (debug_openp)
617 {
c5aa993b
JM
618 printf ("openp on %s, path %s mode %d prot %d\n returned %d",
619 string, path, mode, prot, fd);
c906108c 620 if (*filename_opened)
c5aa993b
JM
621 printf (" (filename is %s)", *filename_opened);
622 printf ("\n");
c906108c
SS
623 }
624 }
625#endif /* MPW */
626
627 return fd;
628}
629
c5aa993b 630
c906108c
SS
631/* This is essentially a convenience, for clients that want the behaviour
632 of openp, using source_path, but that really don't want the file to be
633 opened but want instead just to know what the full pathname is (as
634 qualified against source_path).
635
636 The current working directory is searched first.
637
638 If the file was found, this function returns 1, and FULL_PATHNAME is
639 set to the fully-qualified pathname.
640
641 Else, this functions returns 0, and FULL_PATHNAME is set to NULL.
c5aa993b 642 */
c906108c 643int
fba45db2 644source_full_path_of (char *filename, char **full_pathname)
c906108c 645{
c5aa993b 646 int fd;
c906108c
SS
647
648 fd = openp (source_path, 1, filename, O_RDONLY, 0, full_pathname);
649 if (fd < 0)
650 {
651 *full_pathname = NULL;
652 return 0;
653 }
654
655 close (fd);
656 return 1;
657}
658
659
660/* Open a source file given a symtab S. Returns a file descriptor or
661 negative number for error. */
662
663int
fba45db2 664open_source_file (struct symtab *s)
c906108c
SS
665{
666 char *path = source_path;
667 char *p;
668 int result;
669 char *fullname;
670
671 /* Quick way out if we already know its full name */
c5aa993b 672 if (s->fullname)
c906108c
SS
673 {
674 result = open (s->fullname, OPEN_MODE);
675 if (result >= 0)
c5aa993b 676 return result;
c906108c
SS
677 /* Didn't work -- free old one, try again. */
678 mfree (s->objfile->md, s->fullname);
679 s->fullname = NULL;
680 }
681
682 if (s->dirname != NULL)
683 {
684 /* Replace a path entry of $cdir with the compilation directory name */
685#define cdir_len 5
686 /* We cast strstr's result in case an ANSIhole has made it const,
c5aa993b
JM
687 which produces a "required warning" when assigned to a nonconst. */
688 p = (char *) strstr (source_path, "$cdir");
c906108c 689 if (p && (p == path || p[-1] == DIRNAME_SEPARATOR)
c5aa993b 690 && (p[cdir_len] == DIRNAME_SEPARATOR || p[cdir_len] == '\0'))
c906108c
SS
691 {
692 int len;
693
694 path = (char *)
695 alloca (strlen (source_path) + 1 + strlen (s->dirname) + 1);
696 len = p - source_path;
c5aa993b
JM
697 strncpy (path, source_path, len); /* Before $cdir */
698 strcpy (path + len, s->dirname); /* new stuff */
699 strcat (path + len, source_path + len + cdir_len); /* After $cdir */
c906108c
SS
700 }
701 }
702
703 result = openp (path, 0, s->filename, OPEN_MODE, 0, &s->fullname);
704 if (result < 0)
705 {
706 /* Didn't work. Try using just the basename. */
707 p = basename (s->filename);
708 if (p != s->filename)
709 result = openp (path, 0, p, OPEN_MODE, 0, &s->fullname);
710 }
711#ifdef MPW
712 if (result < 0)
713 {
714 /* Didn't work. Try using just the MPW basename. */
715 p = (char *) mpw_basename (s->filename);
716 if (p != s->filename)
717 result = openp (path, 0, p, OPEN_MODE, 0, &s->fullname);
718 }
719 if (result < 0)
720 {
721 /* Didn't work. Try using the mixed Unix/MPW basename. */
722 p = (char *) mpw_mixed_basename (s->filename);
723 if (p != s->filename)
724 result = openp (path, 0, p, OPEN_MODE, 0, &s->fullname);
725 }
726#endif /* MPW */
727
728 if (result >= 0)
729 {
730 fullname = s->fullname;
731 s->fullname = mstrsave (s->objfile->md, s->fullname);
732 free (fullname);
733 }
734 return result;
735}
736
737/* Return the path to the source file associated with symtab. Returns NULL
738 if no symtab. */
739
740char *
fba45db2 741symtab_to_filename (struct symtab *s)
c906108c
SS
742{
743 int fd;
744
745 if (!s)
746 return NULL;
747
748 /* If we've seen the file before, just return fullname. */
749
750 if (s->fullname)
751 return s->fullname;
752
753 /* Try opening the file to setup fullname */
754
755 fd = open_source_file (s);
756 if (fd < 0)
757 return s->filename; /* File not found. Just use short name */
758
759 /* Found the file. Cleanup and return the full name */
760
761 close (fd);
762 return s->fullname;
763}
c906108c 764\f
c5aa993b 765
c906108c
SS
766/* Create and initialize the table S->line_charpos that records
767 the positions of the lines in the source file, which is assumed
768 to be open on descriptor DESC.
769 All set S->nlines to the number of such lines. */
770
771void
fba45db2 772find_source_lines (struct symtab *s, int desc)
c906108c
SS
773{
774 struct stat st;
775 register char *data, *p, *end;
776 int nlines = 0;
777 int lines_allocated = 1000;
778 int *line_charpos;
779 long mtime = 0;
780 int size;
781
c5aa993b 782 line_charpos = (int *) xmmalloc (s->objfile->md,
c906108c
SS
783 lines_allocated * sizeof (int));
784 if (fstat (desc, &st) < 0)
785 perror_with_name (s->filename);
786
787 if (s && s->objfile && s->objfile->obfd)
c5aa993b 788 mtime = bfd_get_mtime (s->objfile->obfd);
c906108c 789 else if (exec_bfd)
c5aa993b 790 mtime = bfd_get_mtime (exec_bfd);
c906108c
SS
791
792 if (mtime && mtime < st.st_mtime)
793 {
794 if (tui_version)
795 printf_filtered ("\n");
c5aa993b 796 warning ("Source file is more recent than executable.\n");
c906108c
SS
797 }
798
799#ifdef LSEEK_NOT_LINEAR
800 {
801 char c;
802
803 /* Have to read it byte by byte to find out where the chars live */
804
805 line_charpos[0] = lseek (desc, 0, SEEK_CUR);
806 nlines = 1;
c5aa993b 807 while (myread (desc, &c, 1) > 0)
c906108c 808 {
c5aa993b 809 if (c == '\n')
c906108c 810 {
c5aa993b 811 if (nlines == lines_allocated)
c906108c
SS
812 {
813 lines_allocated *= 2;
814 line_charpos =
c5aa993b 815 (int *) xmrealloc (s->objfile->md, (char *) line_charpos,
c906108c
SS
816 sizeof (int) * lines_allocated);
817 }
818 line_charpos[nlines++] = lseek (desc, 0, SEEK_CUR);
819 }
820 }
821 }
822#else /* lseek linear. */
823 {
824 struct cleanup *old_cleanups;
825
826 /* st_size might be a large type, but we only support source files whose
827 size fits in an int. */
828 size = (int) st.st_size;
829
830 /* Use malloc, not alloca, because this may be pretty large, and we may
831 run into various kinds of limits on stack size. */
832 data = (char *) xmalloc (size);
833 old_cleanups = make_cleanup (free, data);
834
835 /* Reassign `size' to result of read for systems where \r\n -> \n. */
836 size = myread (desc, data, size);
837 if (size < 0)
838 perror_with_name (s->filename);
839 end = data + size;
840 p = data;
841 line_charpos[0] = 0;
842 nlines = 1;
843 while (p != end)
844 {
845 if (*p++ == '\n'
c5aa993b 846 /* A newline at the end does not start a new line. */
c906108c
SS
847 && p != end)
848 {
849 if (nlines == lines_allocated)
850 {
851 lines_allocated *= 2;
852 line_charpos =
c5aa993b 853 (int *) xmrealloc (s->objfile->md, (char *) line_charpos,
c906108c
SS
854 sizeof (int) * lines_allocated);
855 }
856 line_charpos[nlines++] = p - data;
857 }
858 }
859 do_cleanups (old_cleanups);
860 }
861#endif /* lseek linear. */
862 s->nlines = nlines;
863 s->line_charpos =
c5aa993b
JM
864 (int *) xmrealloc (s->objfile->md, (char *) line_charpos,
865 nlines * sizeof (int));
c906108c
SS
866
867}
868
869/* Return the character position of a line LINE in symtab S.
870 Return 0 if anything is invalid. */
871
c5aa993b 872#if 0 /* Currently unused */
c906108c
SS
873
874int
fba45db2 875source_line_charpos (struct symtab *s, int line)
c906108c 876{
c5aa993b
JM
877 if (!s)
878 return 0;
879 if (!s->line_charpos || line <= 0)
880 return 0;
c906108c
SS
881 if (line > s->nlines)
882 line = s->nlines;
883 return s->line_charpos[line - 1];
884}
885
886/* Return the line number of character position POS in symtab S. */
887
888int
fba45db2 889source_charpos_line (register struct symtab *s, register int chr)
c906108c
SS
890{
891 register int line = 0;
892 register int *lnp;
c5aa993b
JM
893
894 if (s == 0 || s->line_charpos == 0)
895 return 0;
c906108c
SS
896 lnp = s->line_charpos;
897 /* Files are usually short, so sequential search is Ok */
c5aa993b 898 while (line < s->nlines && *lnp <= chr)
c906108c
SS
899 {
900 line++;
901 lnp++;
902 }
903 if (line >= s->nlines)
904 line = s->nlines;
905 return line;
906}
907
c5aa993b 908#endif /* 0 */
c906108c 909\f
c5aa993b 910
c906108c
SS
911/* Get full pathname and line number positions for a symtab.
912 Return nonzero if line numbers may have changed.
913 Set *FULLNAME to actual name of the file as found by `openp',
914 or to 0 if the file is not found. */
915
916static int
fba45db2 917get_filename_and_charpos (struct symtab *s, char **fullname)
c906108c
SS
918{
919 register int desc, linenums_changed = 0;
c5aa993b 920
c906108c
SS
921 desc = open_source_file (s);
922 if (desc < 0)
923 {
924 if (fullname)
925 *fullname = NULL;
926 return 0;
c5aa993b 927 }
c906108c
SS
928 if (fullname)
929 *fullname = s->fullname;
c5aa993b
JM
930 if (s->line_charpos == 0)
931 linenums_changed = 1;
932 if (linenums_changed)
933 find_source_lines (s, desc);
c906108c
SS
934 close (desc);
935 return linenums_changed;
936}
937
938/* Print text describing the full name of the source file S
939 and the line number LINE and its corresponding character position.
940 The text starts with two Ctrl-z so that the Emacs-GDB interface
941 can easily find it.
942
943 MID_STATEMENT is nonzero if the PC is not at the beginning of that line.
944
945 Return 1 if successful, 0 if could not find the file. */
946
947int
fba45db2
KB
948identify_source_line (struct symtab *s, int line, int mid_statement,
949 CORE_ADDR pc)
c906108c
SS
950{
951 if (s->line_charpos == 0)
c5aa993b 952 get_filename_and_charpos (s, (char **) NULL);
c906108c
SS
953 if (s->fullname == 0)
954 return 0;
955 if (line > s->nlines)
956 /* Don't index off the end of the line_charpos array. */
957 return 0;
958 annotate_source (s->fullname, line, s->line_charpos[line - 1],
959 mid_statement, pc);
960
961 current_source_line = line;
962 first_line_listed = line;
963 last_line_listed = line;
964 current_source_symtab = s;
965 return 1;
966}
c906108c 967\f
c5aa993b 968
c906108c
SS
969/* Print source lines from the file of symtab S,
970 starting with line number LINE and stopping before line number STOPLINE. */
971
a14ed312
KB
972static void print_source_lines_base (struct symtab *s, int line, int stopline,
973 int noerror);
c906108c 974static void
fba45db2 975print_source_lines_base (struct symtab *s, int line, int stopline, int noerror)
c906108c
SS
976{
977 register int c;
978 register int desc;
979 register FILE *stream;
980 int nlines = stopline - line;
981
982 /* Regardless of whether we can open the file, set current_source_symtab. */
983 current_source_symtab = s;
984 current_source_line = line;
985 first_line_listed = line;
986
8b93c638
JM
987#ifdef UI_OUT
988 /* If printing of source lines is disabled, just print file and line number */
989 if (ui_out_test_flags (uiout, ui_source_list))
990 {
991#endif
c5aa993b
JM
992 /* Only prints "No such file or directory" once */
993 if ((s != last_source_visited) || (!last_source_error))
994 {
995 last_source_visited = s;
996 desc = open_source_file (s);
997 }
998 else
999 {
1000 desc = last_source_error;
1001 noerror = 1;
1002 }
8b93c638
JM
1003#ifdef UI_OUT
1004 }
1005 else
1006 {
1007 desc = -1;
1008 noerror = 1;
1009 }
1010#endif
c906108c
SS
1011
1012 if (desc < 0)
1013 {
1014 last_source_error = desc;
1015
c5aa993b
JM
1016 if (!noerror)
1017 {
c906108c
SS
1018 char *name = alloca (strlen (s->filename) + 100);
1019 sprintf (name, "%d\t%s", line, s->filename);
1020 print_sys_errmsg (name, errno);
1021 }
1022 else
8b93c638
JM
1023#ifdef UI_OUT
1024 ui_out_field_int (uiout, "line", line);
1025 ui_out_text (uiout, "\tin ");
1026 ui_out_field_string (uiout, "file", s->filename);
1027 ui_out_text (uiout, "\n");
1028#else
c906108c 1029 printf_filtered ("%d\tin %s\n", line, s->filename);
8b93c638 1030#endif
c906108c
SS
1031
1032 return;
1033 }
1034
1035 last_source_error = 0;
1036
1037 if (s->line_charpos == 0)
1038 find_source_lines (s, desc);
1039
1040 if (line < 1 || line > s->nlines)
1041 {
1042 close (desc);
1043 error ("Line number %d out of range; %s has %d lines.",
1044 line, s->filename, s->nlines);
1045 }
1046
1047 if (lseek (desc, s->line_charpos[line - 1], 0) < 0)
1048 {
1049 close (desc);
1050 perror_with_name (s->filename);
1051 }
1052
1053 stream = fdopen (desc, FDOPEN_MODE);
1054 clearerr (stream);
1055
1056 while (nlines-- > 0)
1057 {
8b93c638
JM
1058#ifdef UI_OUT
1059 char buf[20];
1060
1061 c = fgetc (stream);
1062 if (c == EOF)
1063 break;
1064 last_line_listed = current_source_line;
1065 sprintf (buf, "%d\t", current_source_line++);
1066 ui_out_text (uiout, buf);
1067 do
1068 {
1069 if (c < 040 && c != '\t' && c != '\n' && c != '\r')
1070 {
1071 sprintf (buf, "^%c", c + 0100);
1072 ui_out_text (uiout, buf);
1073 }
1074 else if (c == 0177)
1075 ui_out_text (uiout, "^?");
1076#ifdef CRLF_SOURCE_FILES
1077 else if (c == '\r')
1078 {
1079 /* Skip a \r character, but only before a \n. */
1080 int c1 = fgetc (stream);
1081
1082 if (c1 != '\n')
1083 printf_filtered ("^%c", c + 0100);
1084 if (c1 != EOF)
1085 ungetc (c1, stream);
1086 }
1087#endif
1088 else
1089 {
1090 sprintf (buf, "%c", c);
1091 ui_out_text (uiout, buf);
1092 }
1093 }
1094 while (c != '\n' && (c = fgetc (stream)) >= 0);
1095#else
c906108c 1096 c = fgetc (stream);
c5aa993b
JM
1097 if (c == EOF)
1098 break;
c906108c
SS
1099 last_line_listed = current_source_line;
1100 printf_filtered ("%d\t", current_source_line++);
1101 do
1102 {
1103 if (c < 040 && c != '\t' && c != '\n' && c != '\r')
1104 printf_filtered ("^%c", c + 0100);
1105 else if (c == 0177)
1106 printf_filtered ("^?");
1107#ifdef CRLF_SOURCE_FILES
1108 else if (c == '\r')
1109 {
1110 /* Just skip \r characters. */
1111 }
1112#endif
1113 else
1114 printf_filtered ("%c", c);
c5aa993b
JM
1115 }
1116 while (c != '\n' && (c = fgetc (stream)) >= 0);
8b93c638 1117#endif
c906108c
SS
1118 }
1119
1120 fclose (stream);
1121}
1122\f
1123/* Show source lines from the file of symtab S, starting with line
1124 number LINE and stopping before line number STOPLINE. If this is the
1125 not the command line version, then the source is shown in the source
1126 window otherwise it is simply printed */
1127
c5aa993b 1128void
fba45db2 1129print_source_lines (struct symtab *s, int line, int stopline, int noerror)
c906108c
SS
1130{
1131#if defined(TUI)
c5aa993b
JM
1132 if (!tui_version ||
1133 m_winPtrIsNull (srcWin) || !srcWin->generic.isVisible)
1134 print_source_lines_base (s, line, stopline, noerror);
c906108c
SS
1135 else
1136 {
c5aa993b 1137 TuiGenWinInfoPtr locator = locatorWinInfoPtr ();
a14ed312
KB
1138extern void tui_vAddWinToLayout (va_list);
1139extern void tui_vUpdateSourceWindowsWithLine (va_list);
c906108c 1140
c5aa993b
JM
1141 /* Regardless of whether we can open the file,
1142 set current_source_symtab. */
1143 current_source_symtab = s;
1144 current_source_line = line;
1145 first_line_listed = line;
c906108c 1146
c5aa993b
JM
1147 /* make sure that the source window is displayed */
1148 tuiDo ((TuiOpaqueFuncPtr) tui_vAddWinToLayout, SRC_WIN);
c906108c 1149
c5aa993b
JM
1150 tuiDo ((TuiOpaqueFuncPtr) tui_vUpdateSourceWindowsWithLine, s, line);
1151 tuiDo ((TuiOpaqueFuncPtr) tui_vUpdateLocatorFilename, s->filename);
1152 }
c906108c 1153#else
c5aa993b 1154 print_source_lines_base (s, line, stopline, noerror);
c906108c
SS
1155#endif
1156}
1157\f
1158
1159
1160/* Print a list of files and line numbers which a user may choose from
c5aa993b
JM
1161 in order to list a function which was specified ambiguously (as with
1162 `list classname::overloadedfuncname', for example). The vector in
1163 SALS provides the filenames and line numbers. */
c906108c
SS
1164
1165static void
fba45db2 1166ambiguous_line_spec (struct symtabs_and_lines *sals)
c906108c
SS
1167{
1168 int i;
1169
1170 for (i = 0; i < sals->nelts; ++i)
c5aa993b
JM
1171 printf_filtered ("file: \"%s\", line number: %d\n",
1172 sals->sals[i].symtab->filename, sals->sals[i].line);
c906108c
SS
1173}
1174
1175static void
fba45db2 1176list_command (char *arg, int from_tty)
c906108c
SS
1177{
1178 struct symtabs_and_lines sals, sals_end;
1179 struct symtab_and_line sal, sal_end;
1180 struct symbol *sym;
1181 char *arg1;
1182 int no_end = 1;
1183 int dummy_end = 0;
1184 int dummy_beg = 0;
1185 int linenum_beg = 0;
1186 char *p;
1187
c5aa993b 1188 if (!have_full_symbols () && !have_partial_symbols ())
c906108c
SS
1189 error ("No symbol table is loaded. Use the \"file\" command.");
1190
1191 /* Pull in a current source symtab if necessary */
1192 if (current_source_symtab == 0 &&
1193 (arg == 0 || arg[0] == '+' || arg[0] == '-'))
1194 select_source_symtab (0);
1195
1196 /* "l" or "l +" lists next ten lines. */
1197
1198 if (arg == 0 || STREQ (arg, "+"))
1199 {
1200 if (current_source_symtab == 0)
1201 error ("No default source file yet. Do \"help list\".");
1202 print_source_lines (current_source_symtab, current_source_line,
1203 current_source_line + lines_to_list, 0);
1204 return;
1205 }
1206
1207 /* "l -" lists previous ten lines, the ones before the ten just listed. */
1208 if (STREQ (arg, "-"))
1209 {
1210 if (current_source_symtab == 0)
1211 error ("No default source file yet. Do \"help list\".");
1212 print_source_lines (current_source_symtab,
1213 max (first_line_listed - lines_to_list, 1),
1214 first_line_listed, 0);
1215 return;
1216 }
1217
1218 /* Now if there is only one argument, decode it in SAL
1219 and set NO_END.
1220 If there are two arguments, decode them in SAL and SAL_END
1221 and clear NO_END; however, if one of the arguments is blank,
1222 set DUMMY_BEG or DUMMY_END to record that fact. */
1223
1224 arg1 = arg;
1225 if (*arg1 == ',')
1226 dummy_beg = 1;
1227 else
1228 {
1229 sals = decode_line_1 (&arg1, 0, 0, 0, 0);
1230
c5aa993b
JM
1231 if (!sals.nelts)
1232 return; /* C++ */
c906108c
SS
1233 if (sals.nelts > 1)
1234 {
1235 ambiguous_line_spec (&sals);
1236 free (sals.sals);
1237 return;
1238 }
1239
1240 sal = sals.sals[0];
1241 free (sals.sals);
1242 }
1243
1244 /* Record whether the BEG arg is all digits. */
1245
1246 for (p = arg; p != arg1 && *p >= '0' && *p <= '9'; p++);
1247 linenum_beg = (p == arg1);
1248
1249 while (*arg1 == ' ' || *arg1 == '\t')
1250 arg1++;
1251 if (*arg1 == ',')
1252 {
1253 no_end = 0;
1254 arg1++;
1255 while (*arg1 == ' ' || *arg1 == '\t')
1256 arg1++;
1257 if (*arg1 == 0)
1258 dummy_end = 1;
1259 else
1260 {
1261 if (dummy_beg)
1262 sals_end = decode_line_1 (&arg1, 0, 0, 0, 0);
1263 else
1264 sals_end = decode_line_1 (&arg1, 0, sal.symtab, sal.line, 0);
c5aa993b 1265 if (sals_end.nelts == 0)
c906108c
SS
1266 return;
1267 if (sals_end.nelts > 1)
1268 {
1269 ambiguous_line_spec (&sals_end);
1270 free (sals_end.sals);
1271 return;
1272 }
1273 sal_end = sals_end.sals[0];
1274 free (sals_end.sals);
1275 }
1276 }
1277
1278 if (*arg1)
1279 error ("Junk at end of line specification.");
1280
1281 if (!no_end && !dummy_beg && !dummy_end
1282 && sal.symtab != sal_end.symtab)
1283 error ("Specified start and end are in different files.");
1284 if (dummy_beg && dummy_end)
1285 error ("Two empty args do not say what lines to list.");
c5aa993b 1286
c906108c
SS
1287 /* if line was specified by address,
1288 first print exactly which line, and which file.
1289 In this case, sal.symtab == 0 means address is outside
1290 of all known source files, not that user failed to give a filename. */
1291 if (*arg == '*')
1292 {
1293 if (sal.symtab == 0)
1294 /* FIXME-32x64--assumes sal.pc fits in long. */
1295 error ("No source file for address %s.",
c5aa993b 1296 local_hex_string ((unsigned long) sal.pc));
c906108c
SS
1297 sym = find_pc_function (sal.pc);
1298 if (sym)
1299 {
1300 print_address_numeric (sal.pc, 1, gdb_stdout);
1301 printf_filtered (" is in ");
1302 fputs_filtered (SYMBOL_SOURCE_NAME (sym), gdb_stdout);
1303 printf_filtered (" (%s:%d).\n", sal.symtab->filename, sal.line);
1304 }
1305 else
1306 {
1307 print_address_numeric (sal.pc, 1, gdb_stdout);
1308 printf_filtered (" is at %s:%d.\n",
1309 sal.symtab->filename, sal.line);
1310 }
1311 }
1312
1313 /* If line was not specified by just a line number,
1314 and it does not imply a symtab, it must be an undebuggable symbol
1315 which means no source code. */
1316
c5aa993b 1317 if (!linenum_beg && sal.symtab == 0)
c906108c
SS
1318 error ("No line number known for %s.", arg);
1319
1320 /* If this command is repeated with RET,
1321 turn it into the no-arg variant. */
1322
1323 if (from_tty)
1324 *arg = 0;
1325
1326 if (dummy_beg && sal_end.symtab == 0)
1327 error ("No default source file yet. Do \"help list\".");
1328 if (dummy_beg)
1329 print_source_lines (sal_end.symtab,
1330 max (sal_end.line - (lines_to_list - 1), 1),
1331 sal_end.line + 1, 0);
1332 else if (sal.symtab == 0)
1333 error ("No default source file yet. Do \"help list\".");
1334 else if (no_end)
7a292a7a 1335 {
d4f3574e
SS
1336 int first_line = sal.line - lines_to_list / 2;
1337
1338 if (first_line < 1) first_line = 1;
1339
1340 print_source_lines (sal.symtab, first_line, first_line + lines_to_list,
1341 0);
7a292a7a 1342 }
c906108c
SS
1343 else
1344 print_source_lines (sal.symtab, sal.line,
1345 (dummy_end
1346 ? sal.line + lines_to_list
1347 : sal_end.line + 1),
1348 0);
1349}
1350\f
1351/* Print info on range of pc's in a specified line. */
1352
1353static void
fba45db2 1354line_info (char *arg, int from_tty)
c906108c
SS
1355{
1356 struct symtabs_and_lines sals;
1357 struct symtab_and_line sal;
1358 CORE_ADDR start_pc, end_pc;
1359 int i;
1360
c5aa993b 1361 INIT_SAL (&sal); /* initialize to zeroes */
c906108c
SS
1362
1363 if (arg == 0)
1364 {
1365 sal.symtab = current_source_symtab;
1366 sal.line = last_line_listed;
1367 sals.nelts = 1;
1368 sals.sals = (struct symtab_and_line *)
1369 xmalloc (sizeof (struct symtab_and_line));
1370 sals.sals[0] = sal;
1371 }
1372 else
1373 {
1374 sals = decode_line_spec_1 (arg, 0);
c5aa993b 1375
c906108c
SS
1376 dont_repeat ();
1377 }
1378
1379 /* C++ More than one line may have been specified, as when the user
1380 specifies an overloaded function name. Print info on them all. */
1381 for (i = 0; i < sals.nelts; i++)
1382 {
1383 sal = sals.sals[i];
c5aa993b 1384
c906108c
SS
1385 if (sal.symtab == 0)
1386 {
1387 printf_filtered ("No line number information available");
1388 if (sal.pc != 0)
1389 {
1390 /* This is useful for "info line *0x7f34". If we can't tell the
c5aa993b
JM
1391 user about a source line, at least let them have the symbolic
1392 address. */
c906108c
SS
1393 printf_filtered (" for address ");
1394 wrap_here (" ");
1395 print_address (sal.pc, gdb_stdout);
1396 }
1397 else
1398 printf_filtered (".");
1399 printf_filtered ("\n");
1400 }
1401 else if (sal.line > 0
1402 && find_line_pc_range (sal, &start_pc, &end_pc))
1403 {
1404 if (start_pc == end_pc)
1405 {
1406 printf_filtered ("Line %d of \"%s\"",
1407 sal.line, sal.symtab->filename);
1408 wrap_here (" ");
1409 printf_filtered (" is at address ");
1410 print_address (start_pc, gdb_stdout);
1411 wrap_here (" ");
1412 printf_filtered (" but contains no code.\n");
1413 }
1414 else
1415 {
1416 printf_filtered ("Line %d of \"%s\"",
1417 sal.line, sal.symtab->filename);
1418 wrap_here (" ");
1419 printf_filtered (" starts at address ");
1420 print_address (start_pc, gdb_stdout);
1421 wrap_here (" ");
1422 printf_filtered (" and ends at ");
1423 print_address (end_pc, gdb_stdout);
1424 printf_filtered (".\n");
1425 }
1426
1427 /* x/i should display this line's code. */
1428 set_next_address (start_pc);
1429
1430 /* Repeating "info line" should do the following line. */
1431 last_line_listed = sal.line + 1;
1432
1433 /* If this is the only line, show the source code. If it could
1434 not find the file, don't do anything special. */
1435 if (annotation_level && sals.nelts == 1)
1436 identify_source_line (sal.symtab, sal.line, 0, start_pc);
1437 }
1438 else
1439 /* Is there any case in which we get here, and have an address
1440 which the user would want to see? If we have debugging symbols
1441 and no line numbers? */
1442 printf_filtered ("Line number %d is out of range for \"%s\".\n",
1443 sal.line, sal.symtab->filename);
1444 }
1445 free (sals.sals);
1446}
1447\f
1448/* Commands to search the source file for a regexp. */
1449
1450/* ARGSUSED */
1451static void
fba45db2 1452forward_search_command (char *regex, int from_tty)
c906108c
SS
1453{
1454 register int c;
1455 register int desc;
1456 register FILE *stream;
1457 int line;
1458 char *msg;
1459
1460#if defined(TUI)
1461 /*
c5aa993b
JM
1462 ** If this is the TUI, search from the first line displayed in
1463 ** the source window, otherwise, search from last_line_listed+1
1464 ** in current_source_symtab
1465 */
c906108c
SS
1466 if (!tui_version)
1467 line = last_line_listed;
1468 else
1469 {
1470 if (srcWin->generic.isVisible && srcWin->generic.contentSize > 0)
c5aa993b
JM
1471 line = ((TuiWinContent)
1472 srcWin->generic.content)[0]->whichElement.source.lineOrAddr.lineNo;
c906108c 1473 else
c5aa993b
JM
1474 {
1475 printf_filtered ("No source displayed.\nExpression not found.\n");
1476 return;
1477 }
c906108c
SS
1478 }
1479 line++;
1480#else
1481 line = last_line_listed + 1;
1482#endif
1483
1484 msg = (char *) re_comp (regex);
1485 if (msg)
1486 error (msg);
1487
1488 if (current_source_symtab == 0)
1489 select_source_symtab (0);
1490
1491 desc = open_source_file (current_source_symtab);
1492 if (desc < 0)
1493 perror_with_name (current_source_symtab->filename);
1494
1495 if (current_source_symtab->line_charpos == 0)
1496 find_source_lines (current_source_symtab, desc);
1497
1498 if (line < 1 || line > current_source_symtab->nlines)
1499 {
1500 close (desc);
1501 error ("Expression not found");
1502 }
1503
1504 if (lseek (desc, current_source_symtab->line_charpos[line - 1], 0) < 0)
1505 {
1506 close (desc);
1507 perror_with_name (current_source_symtab->filename);
1508 }
1509
1510 stream = fdopen (desc, FDOPEN_MODE);
1511 clearerr (stream);
c5aa993b
JM
1512 while (1)
1513 {
1514 static char *buf = NULL;
1515 register char *p;
1516 int cursize, newsize;
1517
1518 cursize = 256;
1519 buf = xmalloc (cursize);
1520 p = buf;
1521
1522 c = getc (stream);
1523 if (c == EOF)
1524 break;
1525 do
c906108c 1526 {
c5aa993b
JM
1527 *p++ = c;
1528 if (p - buf == cursize)
1529 {
1530 newsize = cursize + cursize / 2;
1531 buf = xrealloc (buf, newsize);
1532 p = buf + cursize;
1533 cursize = newsize;
1534 }
c906108c 1535 }
c5aa993b 1536 while (c != '\n' && (c = getc (stream)) >= 0);
c906108c 1537
7be570e7
JM
1538#ifdef CRLF_SOURCE_FILES
1539 /* Remove the \r, if any, at the end of the line, otherwise
1540 regular expressions that end with $ or \n won't work. */
1541 if (p - buf > 1 && p[-2] == '\r')
1542 {
1543 p--;
1544 p[-1] = '\n';
1545 }
1546#endif
1547
c5aa993b
JM
1548 /* we now have a source line in buf, null terminate and match */
1549 *p = 0;
1550 if (re_exec (buf) > 0)
1551 {
1552 /* Match! */
1553 fclose (stream);
1554 if (tui_version)
1555 print_source_lines_base (current_source_symtab, line, line + 1, 0);
1556 print_source_lines (current_source_symtab, line, line + 1, 0);
1557 set_internalvar (lookup_internalvar ("_"),
1558 value_from_longest (builtin_type_int,
1559 (LONGEST) line));
1560 current_source_line = max (line - lines_to_list / 2, 1);
1561 return;
1562 }
1563 line++;
1564 }
c906108c
SS
1565
1566 printf_filtered ("Expression not found\n");
1567 fclose (stream);
1568}
1569
1570/* ARGSUSED */
1571static void
fba45db2 1572reverse_search_command (char *regex, int from_tty)
c906108c
SS
1573{
1574 register int c;
1575 register int desc;
1576 register FILE *stream;
1577 int line;
1578 char *msg;
1579#if defined(TUI)
1580 /*
c5aa993b
JM
1581 ** If this is the TUI, search from the first line displayed in
1582 ** the source window, otherwise, search from last_line_listed-1
1583 ** in current_source_symtab
1584 */
c906108c
SS
1585 if (!tui_version)
1586 line = last_line_listed;
1587 else
1588 {
1589 if (srcWin->generic.isVisible && srcWin->generic.contentSize > 0)
c5aa993b
JM
1590 line = ((TuiWinContent)
1591 srcWin->generic.content)[0]->whichElement.source.lineOrAddr.lineNo;
c906108c 1592 else
c5aa993b
JM
1593 {
1594 printf_filtered ("No source displayed.\nExpression not found.\n");
1595 return;
1596 }
c906108c
SS
1597 }
1598 line--;
1599#else
1600 line = last_line_listed - 1;
1601#endif
1602
1603 msg = (char *) re_comp (regex);
1604 if (msg)
1605 error (msg);
1606
1607 if (current_source_symtab == 0)
1608 select_source_symtab (0);
1609
1610 desc = open_source_file (current_source_symtab);
1611 if (desc < 0)
1612 perror_with_name (current_source_symtab->filename);
1613
1614 if (current_source_symtab->line_charpos == 0)
1615 find_source_lines (current_source_symtab, desc);
1616
1617 if (line < 1 || line > current_source_symtab->nlines)
1618 {
1619 close (desc);
1620 error ("Expression not found");
1621 }
1622
1623 if (lseek (desc, current_source_symtab->line_charpos[line - 1], 0) < 0)
1624 {
1625 close (desc);
1626 perror_with_name (current_source_symtab->filename);
1627 }
1628
1629 stream = fdopen (desc, FDOPEN_MODE);
1630 clearerr (stream);
1631 while (line > 1)
1632 {
1633/* FIXME!!! We walk right off the end of buf if we get a long line!!! */
1634 char buf[4096]; /* Should be reasonable??? */
1635 register char *p = buf;
1636
1637 c = getc (stream);
1638 if (c == EOF)
1639 break;
c5aa993b
JM
1640 do
1641 {
1642 *p++ = c;
1643 }
1644 while (c != '\n' && (c = getc (stream)) >= 0);
c906108c 1645
7be570e7
JM
1646#ifdef CRLF_SOURCE_FILES
1647 /* Remove the \r, if any, at the end of the line, otherwise
1648 regular expressions that end with $ or \n won't work. */
1649 if (p - buf > 1 && p[-2] == '\r')
1650 {
1651 p--;
1652 p[-1] = '\n';
1653 }
1654#endif
1655
c906108c
SS
1656 /* We now have a source line in buf; null terminate and match. */
1657 *p = 0;
1658 if (re_exec (buf) > 0)
1659 {
1660 /* Match! */
1661 fclose (stream);
c5aa993b
JM
1662 if (tui_version)
1663 print_source_lines_base (current_source_symtab, line, line + 1, 0);
1664 print_source_lines (current_source_symtab, line, line + 1, 0);
c906108c
SS
1665 set_internalvar (lookup_internalvar ("_"),
1666 value_from_longest (builtin_type_int,
1667 (LONGEST) line));
1668 current_source_line = max (line - lines_to_list / 2, 1);
1669 return;
1670 }
1671 line--;
1672 if (fseek (stream, current_source_symtab->line_charpos[line - 1], 0) < 0)
1673 {
1674 fclose (stream);
1675 perror_with_name (current_source_symtab->filename);
1676 }
1677 }
1678
1679 printf_filtered ("Expression not found\n");
1680 fclose (stream);
1681 return;
1682}
1683\f
1684void
fba45db2 1685_initialize_source (void)
c906108c
SS
1686{
1687 struct cmd_list_element *c;
1688 current_source_symtab = 0;
1689 init_source_path ();
1690
1691 /* The intention is to use POSIX Basic Regular Expressions.
1692 Always use the GNU regex routine for consistency across all hosts.
1693 Our current GNU regex.c does not have all the POSIX features, so this is
1694 just an approximation. */
1695 re_set_syntax (RE_SYNTAX_GREP);
1696
1697 c = add_cmd ("directory", class_files, directory_command,
c5aa993b 1698 "Add directory DIR to beginning of search path for source files.\n\
c906108c
SS
1699Forget cached info on source file locations and line positions.\n\
1700DIR can also be $cwd for the current working directory, or $cdir for the\n\
1701directory in which the source file was compiled into object code.\n\
1702With no argument, reset the search path to $cdir:$cwd, the default.",
1703 &cmdlist);
1704
1705 if (dbx_commands)
c5aa993b 1706 add_com_alias ("use", "directory", class_files, 0);
c906108c
SS
1707
1708 c->completer = filename_completer;
1709
1710 add_cmd ("directories", no_class, show_directories,
1711 "Current search path for finding source files.\n\
1712$cwd in the path means the current working directory.\n\
1713$cdir in the path means the compilation directory of the source file.",
1714 &showlist);
1715
1716 if (xdb_commands)
1717 {
c5aa993b 1718 add_com_alias ("D", "directory", class_files, 0);
c906108c 1719 add_cmd ("ld", no_class, show_directories,
c5aa993b 1720 "Current search path for finding source files.\n\
c906108c
SS
1721$cwd in the path means the current working directory.\n\
1722$cdir in the path means the compilation directory of the source file.",
c5aa993b 1723 &cmdlist);
c906108c
SS
1724 }
1725
1726 add_info ("source", source_info,
1727 "Information about the current source file.");
1728
1729 add_info ("line", line_info,
1730 concat ("Core addresses of the code for a source line.\n\
1731Line can be specified as\n\
1732 LINENUM, to list around that line in current file,\n\
1733 FILE:LINENUM, to list around that line in that file,\n\
1734 FUNCTION, to list around beginning of that function,\n\
1735 FILE:FUNCTION, to distinguish among like-named static functions.\n\
1736", "\
1737Default is to describe the last source line that was listed.\n\n\
1738This sets the default address for \"x\" to the line's first instruction\n\
1739so that \"x/i\" suffices to start examining the machine code.\n\
1740The address is also stored as the value of \"$_\".", NULL));
1741
1742 add_com ("forward-search", class_files, forward_search_command,
1743 "Search for regular expression (see regex(3)) from last line listed.\n\
1744The matching line number is also stored as the value of \"$_\".");
1745 add_com_alias ("search", "forward-search", class_files, 0);
1746
1747 add_com ("reverse-search", class_files, reverse_search_command,
1748 "Search backward for regular expression (see regex(3)) from last line listed.\n\
1749The matching line number is also stored as the value of \"$_\".");
1750
1751 if (xdb_commands)
1752 {
c5aa993b
JM
1753 add_com_alias ("/", "forward-search", class_files, 0);
1754 add_com_alias ("?", "reverse-search", class_files, 0);
c906108c
SS
1755 }
1756
1757 add_com ("list", class_files, list_command,
1758 concat ("List specified function or line.\n\
1759With no argument, lists ten more lines after or around previous listing.\n\
1760\"list -\" lists the ten lines before a previous ten-line listing.\n\
1761One argument specifies a line, and ten lines are listed around that line.\n\
1762Two arguments with comma between specify starting and ending lines to list.\n\
1763", "\
1764Lines can be specified in these ways:\n\
1765 LINENUM, to list around that line in current file,\n\
1766 FILE:LINENUM, to list around that line in that file,\n\
1767 FUNCTION, to list around beginning of that function,\n\
1768 FILE:FUNCTION, to distinguish among like-named static functions.\n\
1769 *ADDRESS, to list around the line containing that address.\n\
1770With two args if one is empty it stands for ten lines away from the other arg.", NULL));
1771
1772 if (!xdb_commands)
1773 add_com_alias ("l", "list", class_files, 1);
1774 else
1775 add_com_alias ("v", "list", class_files, 1);
1776
1777 if (dbx_commands)
1778 add_com_alias ("file", "list", class_files, 1);
1779
1780 add_show_from_set
1781 (add_set_cmd ("listsize", class_support, var_uinteger,
c5aa993b
JM
1782 (char *) &lines_to_list,
1783 "Set number of source lines gdb will list by default.",
c906108c
SS
1784 &setlist),
1785 &showlist);
1786}
This page took 0.157261 seconds and 4 git commands to generate.