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