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