* dwarfread.c (struct dieinfo): Use CORE_ADDR for at_{low,high}_pc.
[deliverable/binutils-gdb.git] / gdb / source.c
CommitLineData
bd5635a1 1/* List lines of source files for GDB, the GNU debugger.
85ae1317
SS
2 Copyright 1986, 1987, 1988, 1989, 1991, 1992, 1993, 1994
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>
bd5635a1
RP
30#include <string.h>
31#include <sys/param.h>
32#include <sys/stat.h>
33#include <fcntl.h>
34#include "gdbcore.h"
e522fb52 35#include "regex.h"
318bf84f 36#include "symfile.h"
28df0c3e 37#include "objfiles.h"
1c95d7ab 38#include "annotate.h"
318bf84f 39
fad466eb
SS
40#ifndef DIRNAME_SEPARATOR
41#define DIRNAME_SEPARATOR ':'
42#endif
43
318bf84f
FF
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 {
250 if (query ("Reinitialize source path to empty? ", ""))
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
309 if (p[-1] == '/')
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 }
322 else if (p[-2] == '/')
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);
344 else if (name[0] != '/' && name[0] != '$')
318bf84f 345 name = concat (current_directory, "/", 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 }
367 else if ((st.st_mode & S_IFMT) != S_IFDIR)
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
bd5635a1
RP
492 if (try_cwd_first || string[0] == '/')
493 {
494 filename = string;
495 fd = open (filename, mode, prot);
b9298844 496 if (fd >= 0 || string[0] == '/' || strchr (string, '/'))
bd5635a1
RP
497 goto done;
498 }
499
b9298844
JK
500 /* ./foo => foo */
501 while (string[0] == '.' && string[1] == '/')
502 string += 2;
503
bd5635a1
RP
504 alloclen = strlen (path) + strlen (string) + 2;
505 filename = (char *) alloca (alloclen);
506 fd = -1;
507 for (p = path; p; p = p1 ? p1 + 1 : 0)
508 {
fad466eb 509 p1 = (char *) strchr (p, DIRNAME_SEPARATOR);
bd5635a1
RP
510 if (p1)
511 len = p1 - p;
512 else
513 len = strlen (p);
514
515 if (len == 4 && p[0] == '$' && p[1] == 'c'
516 && p[2] == 'w' && p[3] == 'd') {
517 /* Name is $cwd -- insert current directory name instead. */
518 int newlen;
519
520 /* First, realloc the filename buffer if too short. */
521 len = strlen (current_directory);
522 newlen = len + strlen (string) + 2;
523 if (newlen > alloclen) {
524 alloclen = newlen;
525 filename = (char *) alloca (alloclen);
526 }
527 strcpy (filename, current_directory);
528 } else {
529 /* Normal file name in path -- just use it. */
530 strncpy (filename, p, len);
531 filename[len] = 0;
532 }
533
28df0c3e
JG
534 /* Remove trailing slashes */
535 while (len > 0 && filename[len-1] == '/')
536 filename[--len] = 0;
537
bd5635a1
RP
538 strcat (filename+len, "/");
539 strcat (filename, string);
540
fad466eb 541 fd = open (filename, mode);
bd5635a1
RP
542 if (fd >= 0) break;
543 }
544
545 done:
546 if (filename_opened)
85ae1317
SS
547 {
548 if (fd < 0)
549 *filename_opened = (char *) 0;
550 else if (filename[0] == '/')
551 *filename_opened = savestring (filename, strlen (filename));
552 else
553 {
554 /* Beware the // my son, the Emacs barfs, the botch that catch... */
555
556 *filename_opened = concat (current_directory,
557 '/' == current_directory[strlen(current_directory)-1]? "": "/",
558 filename, NULL);
559 }
560 }
561/* start-sanitize-mpw */
562#ifdef MPW
563 if (1) {
564 printf("openp on %s, path %s mode %d prot %d\n returned %d",
565 string, path, mode, prot, fd);
566 if (*filename_opened)
567 printf(" (filename is %s)", *filename_opened);
568 printf("\n");
569 }
570#endif
571/* end-sanitize-mpw */
bd5635a1
RP
572
573 return fd;
574}
575
85ae1317
SS
576/* Open a source file given a symtab S. Returns a file descriptor or
577 negative number for error. */
318bf84f
FF
578
579static int
bd5635a1
RP
580open_source_file (s)
581 struct symtab *s;
582{
583 char *path = source_path;
584 char *p;
585 int result;
318bf84f 586 char *fullname;
bd5635a1
RP
587
588 /* Quick way out if we already know its full name */
589 if (s->fullname)
590 {
591 result = open (s->fullname, O_RDONLY);
592 if (result >= 0)
593 return result;
594 /* Didn't work -- free old one, try again. */
318bf84f 595 mfree (s->objfile->md, s->fullname);
bd5635a1
RP
596 s->fullname = NULL;
597 }
598
599 if (s->dirname != NULL)
600 {
601 /* Replace a path entry of $cdir with the compilation directory name */
602#define cdir_len 5
e3af0493
JG
603 /* We cast strstr's result in case an ANSIhole has made it const,
604 which produces a "required warning" when assigned to a nonconst. */
605 p = (char *)strstr (source_path, "$cdir");
fad466eb 606 if (p && (p == path || p[-1] == DIRNAME_SEPARATOR)
85ae1317
SS
607 && (p[cdir_len] == DIRNAME_SEPARATOR || p[cdir_len] == '\0'))
608 {
609 int len;
610
611 path = (char *)
612 alloca (strlen (source_path) + 1 + strlen (s->dirname) + 1);
613 len = p - source_path;
614 strncpy (path, source_path, len); /* Before $cdir */
615 strcpy (path + len, s->dirname); /* new stuff */
616 strcat (path + len, source_path + len + cdir_len); /* After $cdir */
617 }
bd5635a1
RP
618 }
619
318bf84f
FF
620 result = openp (path, 0, s->filename, O_RDONLY, 0, &s->fullname);
621 if (result < 0)
622 {
623 /* Didn't work. Try using just the basename. */
624 p = basename (s->filename);
625 if (p != s->filename)
fad466eb 626 result = openp (path, 0, p, O_RDONLY, 0, &s->fullname);
318bf84f 627 }
85ae1317
SS
628/* start-sanitize-mpw */
629#ifdef MPW
630 if (result < 0)
631 {
632 /* Didn't work. Try using just the MPW basename. */
633 p = (char *) mpw_basename (s->filename);
634 if (p != s->filename)
635 result = openp (path, 0, p, O_RDONLY, 0, &s->fullname);
636 }
637 if (result < 0)
638 {
639 /* Didn't work. Try using the mixed Unix/MPW basename. */
640 p = (char *) mpw_mixed_basename (s->filename);
641 if (p != s->filename)
642 result = openp (path, 0, p, O_RDONLY, 0, &s->fullname);
643 }
644#endif
645/* end-sanitize-mpw */
318bf84f
FF
646 if (result >= 0)
647 {
fad466eb
SS
648 fullname = s->fullname;
649 s->fullname = mstrsave (s->objfile->md, s->fullname);
318bf84f
FF
650 free (fullname);
651 }
652 return result;
bd5635a1
RP
653}
654
85ae1317
SS
655/* Return the path to the source file associated with symtab. Returns NULL
656 if no symtab. */
657
658char *
659symtab_to_filename (s)
660 struct symtab *s;
661{
662 int fd;
663
664 if (!s)
665 return NULL;
666
667 /* If we've seen the file before, just return fullname. */
668
669 if (s->fullname)
670 return s->fullname;
671
672 /* Try opening the file to setup fullname */
673
674 fd = open_source_file (s);
675 if (fd < 0)
676 return s->filename; /* File not found. Just use short name */
677
678 /* Found the file. Cleanup and return the full name */
679
680 close (fd);
681 return s->fullname;
682}
683
bd5635a1
RP
684\f
685/* Create and initialize the table S->line_charpos that records
686 the positions of the lines in the source file, which is assumed
687 to be open on descriptor DESC.
688 All set S->nlines to the number of such lines. */
689
690static void
691find_source_lines (s, desc)
692 struct symtab *s;
693 int desc;
694{
695 struct stat st;
696 register char *data, *p, *end;
697 int nlines = 0;
698 int lines_allocated = 1000;
318bf84f
FF
699 int *line_charpos;
700 long exec_mtime;
28df0c3e 701 int size;
bd5635a1 702
318bf84f
FF
703 line_charpos = (int *) xmmalloc (s -> objfile -> md,
704 lines_allocated * sizeof (int));
bd5635a1 705 if (fstat (desc, &st) < 0)
85ae1317 706 perror_with_name (s->filename);
318bf84f 707
85ae1317
SS
708 if (exec_bfd)
709 {
710 exec_mtime = bfd_get_mtime(exec_bfd);
711 if (exec_mtime && exec_mtime < st.st_mtime)
712 printf_filtered ("Source file is more recent than executable.\n");
713 }
bd5635a1 714
8a96d79b 715#ifdef LSEEK_NOT_LINEAR
85ae1317
SS
716 {
717 char c;
8a96d79b 718
85ae1317 719 /* Have to read it byte by byte to find out where the chars live */
28df0c3e 720
85ae1317
SS
721 line_charpos[0] = tell(desc);
722 nlines = 1;
723 while (myread(desc, &c, 1)>0)
724 {
725 if (c == '\n')
726 {
727 if (nlines == lines_allocated)
728 {
729 lines_allocated *= 2;
730 line_charpos =
731 (int *) xmrealloc (s -> objfile -> md, (char *) line_charpos,
732 sizeof (int) * lines_allocated);
733 }
734 line_charpos[nlines++] = tell(desc);
735 }
736 }
737 }
738#else /* lseek linear. */
8a96d79b 739 {
85ae1317
SS
740 struct cleanup *old_cleanups;
741
742 /* st_size might be a large type, but we only support source files whose
743 size fits in an int. */
744 size = (int) st.st_size;
745
746 /* Use malloc, not alloca, because this may be pretty large, and we may
747 run into various kinds of limits on stack size. */
748 data = (char *) xmalloc (size);
749 old_cleanups = make_cleanup (free, data);
750
751 if (myread (desc, data, size) < 0)
752 perror_with_name (s->filename);
753 end = data + size;
754 p = data;
755 line_charpos[0] = 0;
756 nlines = 1;
757 while (p != end)
8a96d79b 758 {
85ae1317
SS
759 if (*p++ == '\n'
760 /* A newline at the end does not start a new line. */
761 && p != end)
762 {
763 if (nlines == lines_allocated)
764 {
765 lines_allocated *= 2;
766 line_charpos =
767 (int *) xmrealloc (s -> objfile -> md, (char *) line_charpos,
768 sizeof (int) * lines_allocated);
769 }
770 line_charpos[nlines++] = p - data;
771 }
8a96d79b 772 }
85ae1317 773 do_cleanups (old_cleanups);
8a96d79b 774 }
85ae1317 775#endif /* lseek linear. */
bd5635a1 776 s->nlines = nlines;
318bf84f 777 s->line_charpos =
8a96d79b
JG
778 (int *) xmrealloc (s -> objfile -> md, (char *) line_charpos,
779 nlines * sizeof (int));
780
bd5635a1
RP
781}
782
783/* Return the character position of a line LINE in symtab S.
784 Return 0 if anything is invalid. */
785
318bf84f
FF
786#if 0 /* Currently unused */
787
bd5635a1
RP
788int
789source_line_charpos (s, line)
790 struct symtab *s;
791 int line;
792{
793 if (!s) return 0;
794 if (!s->line_charpos || line <= 0) return 0;
795 if (line > s->nlines)
796 line = s->nlines;
797 return s->line_charpos[line - 1];
798}
799
800/* Return the line number of character position POS in symtab S. */
801
802int
803source_charpos_line (s, chr)
804 register struct symtab *s;
805 register int chr;
806{
807 register int line = 0;
808 register int *lnp;
809
810 if (s == 0 || s->line_charpos == 0) return 0;
811 lnp = s->line_charpos;
812 /* Files are usually short, so sequential search is Ok */
813 while (line < s->nlines && *lnp <= chr)
814 {
815 line++;
816 lnp++;
817 }
818 if (line >= s->nlines)
819 line = s->nlines;
820 return line;
821}
318bf84f
FF
822
823#endif /* 0 */
824
bd5635a1
RP
825\f
826/* Get full pathname and line number positions for a symtab.
827 Return nonzero if line numbers may have changed.
828 Set *FULLNAME to actual name of the file as found by `openp',
829 or to 0 if the file is not found. */
830
318bf84f 831static int
bd5635a1
RP
832get_filename_and_charpos (s, fullname)
833 struct symtab *s;
834 char **fullname;
835{
836 register int desc, linenums_changed = 0;
837
838 desc = open_source_file (s);
839 if (desc < 0)
840 {
841 if (fullname)
842 *fullname = NULL;
843 return 0;
844 }
845 if (fullname)
846 *fullname = s->fullname;
847 if (s->line_charpos == 0) linenums_changed = 1;
848 if (linenums_changed) find_source_lines (s, desc);
849 close (desc);
850 return linenums_changed;
851}
852
853/* Print text describing the full name of the source file S
854 and the line number LINE and its corresponding character position.
855 The text starts with two Ctrl-z so that the Emacs-GDB interface
856 can easily find it.
857
858 MID_STATEMENT is nonzero if the PC is not at the beginning of that line.
859
860 Return 1 if successful, 0 if could not find the file. */
861
862int
b9298844 863identify_source_line (s, line, mid_statement, pc)
bd5635a1
RP
864 struct symtab *s;
865 int line;
866 int mid_statement;
b9298844 867 CORE_ADDR pc;
bd5635a1
RP
868{
869 if (s->line_charpos == 0)
870 get_filename_and_charpos (s, (char **)NULL);
871 if (s->fullname == 0)
872 return 0;
f1ed4330
JK
873 if (line > s->nlines)
874 /* Don't index off the end of the line_charpos array. */
875 return 0;
1c95d7ab
JK
876 annotate_source (s->fullname, line, s->line_charpos[line - 1],
877 mid_statement, pc);
878
bd5635a1
RP
879 current_source_line = line;
880 first_line_listed = line;
881 last_line_listed = line;
882 current_source_symtab = s;
883 return 1;
884}
885\f
886/* Print source lines from the file of symtab S,
887 starting with line number LINE and stopping before line number STOPLINE. */
888
889void
890print_source_lines (s, line, stopline, noerror)
891 struct symtab *s;
892 int line, stopline;
893 int noerror;
894{
895 register int c;
896 register int desc;
897 register FILE *stream;
898 int nlines = stopline - line;
899
900 /* Regardless of whether we can open the file, set current_source_symtab. */
901 current_source_symtab = s;
902 current_source_line = line;
903 first_line_listed = line;
904
905 desc = open_source_file (s);
906 if (desc < 0)
907 {
908 if (! noerror) {
909 char *name = alloca (strlen (s->filename) + 100);
910 sprintf (name, "%s:%d", s->filename, line);
911 print_sys_errmsg (name, errno);
912 }
913 return;
914 }
915
916 if (s->line_charpos == 0)
917 find_source_lines (s, desc);
918
919 if (line < 1 || line > s->nlines)
920 {
921 close (desc);
922 error ("Line number %d out of range; %s has %d lines.",
923 line, s->filename, s->nlines);
924 }
925
926 if (lseek (desc, s->line_charpos[line - 1], 0) < 0)
927 {
928 close (desc);
929 perror_with_name (s->filename);
930 }
931
b9298844 932 stream = fdopen (desc, FOPEN_RT);
bd5635a1
RP
933 clearerr (stream);
934
935 while (nlines-- > 0)
936 {
937 c = fgetc (stream);
938 if (c == EOF) break;
939 last_line_listed = current_source_line;
940 printf_filtered ("%d\t", current_source_line++);
941 do
942 {
8a96d79b 943 if (c < 040 && c != '\t' && c != '\n' && c != '\r')
bd5635a1
RP
944 printf_filtered ("^%c", c + 0100);
945 else if (c == 0177)
946 printf_filtered ("^?");
947 else
948 printf_filtered ("%c", c);
949 } while (c != '\n' && (c = fgetc (stream)) >= 0);
950 }
951
952 fclose (stream);
953}
954\f
955
956
85ae1317
SS
957/* Print a list of files and line numbers which a user may choose from
958 in order to list a function which was specified ambiguously (as with
959 `list classname::overloadedfuncname', for example). The vector in
960 SALS provides the filenames and line numbers. */
961
bd5635a1
RP
962static void
963ambiguous_line_spec (sals)
964 struct symtabs_and_lines *sals;
965{
966 int i;
967
968 for (i = 0; i < sals->nelts; ++i)
28df0c3e
JG
969 printf_filtered("file: \"%s\", line number: %d\n",
970 sals->sals[i].symtab->filename, sals->sals[i].line);
bd5635a1
RP
971}
972
bd5635a1
RP
973static void
974list_command (arg, from_tty)
975 char *arg;
976 int from_tty;
977{
978 struct symtabs_and_lines sals, sals_end;
979 struct symtab_and_line sal, sal_end;
980 struct symbol *sym;
981 char *arg1;
982 int no_end = 1;
983 int dummy_end = 0;
984 int dummy_beg = 0;
985 int linenum_beg = 0;
986 char *p;
987
318bf84f 988 if (!have_full_symbols () && !have_partial_symbols())
e522fb52 989 error ("No symbol table is loaded. Use the \"file\" command.");
bd5635a1
RP
990
991 /* Pull in a current source symtab if necessary */
992 if (current_source_symtab == 0 &&
993 (arg == 0 || arg[0] == '+' || arg[0] == '-'))
994 select_source_symtab (0);
995
996 /* "l" or "l +" lists next ten lines. */
997
2e4964ad 998 if (arg == 0 || STREQ (arg, "+"))
bd5635a1
RP
999 {
1000 if (current_source_symtab == 0)
1001 error ("No default source file yet. Do \"help list\".");
1002 print_source_lines (current_source_symtab, current_source_line,
e3af0493 1003 current_source_line + lines_to_list, 0);
bd5635a1
RP
1004 return;
1005 }
1006
1007 /* "l -" lists previous ten lines, the ones before the ten just listed. */
2e4964ad 1008 if (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,
e3af0493 1013 max (first_line_listed - lines_to_list, 1),
bd5635a1
RP
1014 first_line_listed, 0);
1015 return;
1016 }
1017
1018 /* Now if there is only one argument, decode it in SAL
1019 and set NO_END.
1020 If there are two arguments, decode them in SAL and SAL_END
1021 and clear NO_END; however, if one of the arguments is blank,
1022 set DUMMY_BEG or DUMMY_END to record that fact. */
1023
1024 arg1 = arg;
1025 if (*arg1 == ',')
1026 dummy_beg = 1;
1027 else
1028 {
199b2450 1029 sals = decode_line_1 (&arg1, 0, 0, 0, 0);
bd5635a1
RP
1030
1031 if (! sals.nelts) return; /* C++ */
1032 if (sals.nelts > 1)
1033 {
1034 ambiguous_line_spec (&sals);
1035 free (sals.sals);
1036 return;
1037 }
1038
1039 sal = sals.sals[0];
1040 free (sals.sals);
1041 }
1042
1043 /* Record whether the BEG arg is all digits. */
1044
1045 for (p = arg; p != arg1 && *p >= '0' && *p <= '9'; p++);
1046 linenum_beg = (p == arg1);
1047
1048 while (*arg1 == ' ' || *arg1 == '\t')
1049 arg1++;
1050 if (*arg1 == ',')
1051 {
1052 no_end = 0;
1053 arg1++;
1054 while (*arg1 == ' ' || *arg1 == '\t')
1055 arg1++;
1056 if (*arg1 == 0)
1057 dummy_end = 1;
1058 else
1059 {
1060 if (dummy_beg)
199b2450 1061 sals_end = decode_line_1 (&arg1, 0, 0, 0, 0);
bd5635a1 1062 else
199b2450 1063 sals_end = decode_line_1 (&arg1, 0, sal.symtab, sal.line, 0);
bd5635a1
RP
1064 if (sals_end.nelts == 0)
1065 return;
1066 if (sals_end.nelts > 1)
1067 {
1068 ambiguous_line_spec (&sals_end);
1069 free (sals_end.sals);
1070 return;
1071 }
1072 sal_end = sals_end.sals[0];
1073 free (sals_end.sals);
1074 }
1075 }
1076
1077 if (*arg1)
1078 error ("Junk at end of line specification.");
1079
1080 if (!no_end && !dummy_beg && !dummy_end
1081 && sal.symtab != sal_end.symtab)
1082 error ("Specified start and end are in different files.");
1083 if (dummy_beg && dummy_end)
1084 error ("Two empty args do not say what lines to list.");
1085
1086 /* if line was specified by address,
1087 first print exactly which line, and which file.
1088 In this case, sal.symtab == 0 means address is outside
1089 of all known source files, not that user failed to give a filename. */
1090 if (*arg == '*')
1091 {
1092 if (sal.symtab == 0)
fad466eb 1093 /* FIXME-32x64--assumes sal.pc fits in long. */
199b2450
TL
1094 error ("No source file for address %s.",
1095 local_hex_string((unsigned long) sal.pc));
bd5635a1
RP
1096 sym = find_pc_function (sal.pc);
1097 if (sym)
28df0c3e 1098 {
1c95d7ab 1099 print_address_numeric (sal.pc, 1, gdb_stdout);
fad466eb 1100 printf_filtered (" is in ");
199b2450 1101 fputs_filtered (SYMBOL_SOURCE_NAME (sym), gdb_stdout);
28df0c3e
JG
1102 printf_filtered (" (%s:%d).\n", sal.symtab->filename, sal.line);
1103 }
bd5635a1 1104 else
fad466eb 1105 {
1c95d7ab 1106 print_address_numeric (sal.pc, 1, gdb_stdout);
fad466eb
SS
1107 printf_filtered (" is at %s:%d.\n",
1108 sal.symtab->filename, sal.line);
1109 }
bd5635a1
RP
1110 }
1111
1112 /* If line was not specified by just a line number,
1113 and it does not imply a symtab, it must be an undebuggable symbol
1114 which means no source code. */
1115
1116 if (! linenum_beg && sal.symtab == 0)
1117 error ("No line number known for %s.", arg);
1118
1119 /* If this command is repeated with RET,
1120 turn it into the no-arg variant. */
1121
1122 if (from_tty)
1123 *arg = 0;
1124
1125 if (dummy_beg && sal_end.symtab == 0)
1126 error ("No default source file yet. Do \"help list\".");
1127 if (dummy_beg)
1128 print_source_lines (sal_end.symtab,
e3af0493 1129 max (sal_end.line - (lines_to_list - 1), 1),
bd5635a1
RP
1130 sal_end.line + 1, 0);
1131 else if (sal.symtab == 0)
1132 error ("No default source file yet. Do \"help list\".");
1133 else if (no_end)
1134 print_source_lines (sal.symtab,
e3af0493
JG
1135 max (sal.line - (lines_to_list / 2), 1),
1136 sal.line + (lines_to_list / 2), 0);
bd5635a1
RP
1137 else
1138 print_source_lines (sal.symtab, sal.line,
1139 (dummy_end
e3af0493 1140 ? sal.line + lines_to_list
bd5635a1
RP
1141 : sal_end.line + 1),
1142 0);
1143}
1144\f
1145/* Print info on range of pc's in a specified line. */
1146
1147static void
1148line_info (arg, from_tty)
1149 char *arg;
1150 int from_tty;
1151{
1152 struct symtabs_and_lines sals;
1153 struct symtab_and_line sal;
1154 CORE_ADDR start_pc, end_pc;
1155 int i;
1156
1157 if (arg == 0)
1158 {
1159 sal.symtab = current_source_symtab;
1160 sal.line = last_line_listed;
1161 sals.nelts = 1;
1162 sals.sals = (struct symtab_and_line *)
1163 xmalloc (sizeof (struct symtab_and_line));
1164 sals.sals[0] = sal;
1165 }
1166 else
1167 {
1168 sals = decode_line_spec_1 (arg, 0);
1169
2f2a70e5 1170 dont_repeat ();
bd5635a1
RP
1171 }
1172
1173 /* C++ More than one line may have been specified, as when the user
1174 specifies an overloaded function name. Print info on them all. */
1175 for (i = 0; i < sals.nelts; i++)
1176 {
1177 sal = sals.sals[i];
1178
1179 if (sal.symtab == 0)
2f2a70e5
JK
1180 {
1181 printf_filtered ("No line number information available");
1182 if (sal.pc != 0)
1183 {
1184 /* This is useful for "info line *0x7f34". If we can't tell the
1185 user about a source line, at least let them have the symbolic
1186 address. */
1187 printf_filtered (" for address ");
1188 wrap_here (" ");
199b2450 1189 print_address (sal.pc, gdb_stdout);
2f2a70e5
JK
1190 }
1191 else
1192 printf_filtered (".");
1193 printf_filtered ("\n");
1194 }
1195 else if (sal.line > 0
fad466eb 1196 && find_line_pc_range (sal, &start_pc, &end_pc))
bd5635a1
RP
1197 {
1198 if (start_pc == end_pc)
f1ed4330
JK
1199 {
1200 printf_filtered ("Line %d of \"%s\"",
1201 sal.line, sal.symtab->filename);
1202 wrap_here (" ");
1203 printf_filtered (" is at address ");
199b2450 1204 print_address (start_pc, gdb_stdout);
f1ed4330
JK
1205 wrap_here (" ");
1206 printf_filtered (" but contains no code.\n");
1207 }
bd5635a1 1208 else
318bf84f 1209 {
f1ed4330
JK
1210 printf_filtered ("Line %d of \"%s\"",
1211 sal.line, sal.symtab->filename);
1212 wrap_here (" ");
1213 printf_filtered (" starts at address ");
199b2450 1214 print_address (start_pc, gdb_stdout);
f1ed4330
JK
1215 wrap_here (" ");
1216 printf_filtered (" and ends at ");
199b2450 1217 print_address (end_pc, gdb_stdout);
f1ed4330 1218 printf_filtered (".\n");
318bf84f 1219 }
f1ed4330 1220
bd5635a1
RP
1221 /* x/i should display this line's code. */
1222 set_next_address (start_pc);
f1ed4330 1223
bd5635a1
RP
1224 /* Repeating "info line" should do the following line. */
1225 last_line_listed = sal.line + 1;
b9298844
JK
1226
1227 /* If this is the only line, show the source code. If it could
1228 not find the file, don't do anything special. */
1c95d7ab 1229 if (annotation_level && sals.nelts == 1)
b9298844 1230 identify_source_line (sal.symtab, sal.line, 0, start_pc);
bd5635a1
RP
1231 }
1232 else
2f2a70e5
JK
1233 /* Is there any case in which we get here, and have an address
1234 which the user would want to see? If we have debugging symbols
1235 and no line numbers? */
28df0c3e
JG
1236 printf_filtered ("Line number %d is out of range for \"%s\".\n",
1237 sal.line, sal.symtab->filename);
bd5635a1 1238 }
199b2450 1239 free (sals.sals);
bd5635a1
RP
1240}
1241\f
1242/* Commands to search the source file for a regexp. */
1243
e522fb52 1244/* ARGSUSED */
bd5635a1
RP
1245static void
1246forward_search_command (regex, from_tty)
1247 char *regex;
1248 int from_tty;
1249{
1250 register int c;
1251 register int desc;
1252 register FILE *stream;
1253 int line = last_line_listed + 1;
1254 char *msg;
1255
1256 msg = (char *) re_comp (regex);
1257 if (msg)
1258 error (msg);
1259
1260 if (current_source_symtab == 0)
1261 select_source_symtab (0);
1262
1263 /* Search from last_line_listed+1 in current_source_symtab */
1264
1265 desc = open_source_file (current_source_symtab);
1266 if (desc < 0)
1267 perror_with_name (current_source_symtab->filename);
1268
1269 if (current_source_symtab->line_charpos == 0)
1270 find_source_lines (current_source_symtab, desc);
1271
1272 if (line < 1 || line > current_source_symtab->nlines)
1273 {
1274 close (desc);
1275 error ("Expression not found");
1276 }
1277
1278 if (lseek (desc, current_source_symtab->line_charpos[line - 1], 0) < 0)
1279 {
1280 close (desc);
1281 perror_with_name (current_source_symtab->filename);
1282 }
1283
b9298844 1284 stream = fdopen (desc, FOPEN_RT);
bd5635a1
RP
1285 clearerr (stream);
1286 while (1) {
85ae1317
SS
1287 static char *buf = NULL;
1288 register char *p;
1289 int cursize, newsize;
1290
1291 cursize = 256;
1292 buf = xmalloc (cursize);
1293 p = buf;
bd5635a1 1294
e522fb52 1295 c = getc (stream);
bd5635a1
RP
1296 if (c == EOF)
1297 break;
1298 do {
1299 *p++ = c;
85ae1317
SS
1300 if (p - buf == cursize)
1301 {
1302 newsize = cursize + cursize / 2;
1303 buf = xrealloc (buf, newsize);
1304 p = buf + cursize;
1305 cursize = newsize;
1306 }
e522fb52 1307 } while (c != '\n' && (c = getc (stream)) >= 0);
bd5635a1
RP
1308
1309 /* we now have a source line in buf, null terminate and match */
1310 *p = 0;
1311 if (re_exec (buf) > 0)
1312 {
1313 /* Match! */
1314 fclose (stream);
85ae1317 1315 print_source_lines (current_source_symtab, line, line+1, 0);
e3af0493 1316 current_source_line = max (line - lines_to_list / 2, 1);
bd5635a1
RP
1317 return;
1318 }
1319 line++;
1320 }
1321
28df0c3e 1322 printf_filtered ("Expression not found\n");
bd5635a1
RP
1323 fclose (stream);
1324}
1325
e522fb52 1326/* ARGSUSED */
bd5635a1
RP
1327static void
1328reverse_search_command (regex, from_tty)
1329 char *regex;
1330 int from_tty;
1331{
1332 register int c;
1333 register int desc;
1334 register FILE *stream;
1335 int line = last_line_listed - 1;
1336 char *msg;
1337
1338 msg = (char *) re_comp (regex);
1339 if (msg)
1340 error (msg);
1341
1342 if (current_source_symtab == 0)
1343 select_source_symtab (0);
1344
1345 /* Search from last_line_listed-1 in current_source_symtab */
1346
1347 desc = open_source_file (current_source_symtab);
1348 if (desc < 0)
1349 perror_with_name (current_source_symtab->filename);
1350
1351 if (current_source_symtab->line_charpos == 0)
1352 find_source_lines (current_source_symtab, desc);
1353
1354 if (line < 1 || line > current_source_symtab->nlines)
1355 {
1356 close (desc);
1357 error ("Expression not found");
1358 }
1359
1360 if (lseek (desc, current_source_symtab->line_charpos[line - 1], 0) < 0)
1361 {
1362 close (desc);
1363 perror_with_name (current_source_symtab->filename);
1364 }
1365
b9298844 1366 stream = fdopen (desc, FOPEN_RT);
bd5635a1
RP
1367 clearerr (stream);
1368 while (line > 1)
1369 {
e522fb52 1370/* FIXME!!! We walk right off the end of buf if we get a long line!!! */
bd5635a1
RP
1371 char buf[4096]; /* Should be reasonable??? */
1372 register char *p = buf;
1373
e522fb52 1374 c = getc (stream);
bd5635a1
RP
1375 if (c == EOF)
1376 break;
1377 do {
1378 *p++ = c;
e522fb52 1379 } while (c != '\n' && (c = getc (stream)) >= 0);
bd5635a1
RP
1380
1381 /* We now have a source line in buf; null terminate and match. */
1382 *p = 0;
1383 if (re_exec (buf) > 0)
1384 {
1385 /* Match! */
1386 fclose (stream);
1387 print_source_lines (current_source_symtab,
1388 line, line+1, 0);
e3af0493 1389 current_source_line = max (line - lines_to_list / 2, 1);
bd5635a1
RP
1390 return;
1391 }
1392 line--;
1393 if (fseek (stream, current_source_symtab->line_charpos[line - 1], 0) < 0)
1394 {
1395 fclose (stream);
1396 perror_with_name (current_source_symtab->filename);
1397 }
1398 }
1399
28df0c3e 1400 printf_filtered ("Expression not found\n");
bd5635a1
RP
1401 fclose (stream);
1402 return;
1403}
1404\f
1405void
1406_initialize_source ()
1407{
f1ed4330 1408 struct cmd_list_element *c;
bd5635a1
RP
1409 current_source_symtab = 0;
1410 init_source_path ();
1411
199b2450
TL
1412 /* The intention is to use POSIX Basic Regular Expressions.
1413 Always use the GNU regex routine for consistency across all hosts.
1414 Our current GNU regex.c does not have all the POSIX features, so this is
1415 just an approximation. */
1416 re_set_syntax (RE_SYNTAX_GREP);
1417
f1ed4330 1418 c = add_cmd ("directory", class_files, directory_command,
bd5635a1
RP
1419 "Add directory DIR to beginning of search path for source files.\n\
1420Forget cached info on source file locations and line positions.\n\
1421DIR can also be $cwd for the current working directory, or $cdir for the\n\
1422directory in which the source file was compiled into object code.\n\
f1ed4330
JK
1423With no argument, reset the search path to $cdir:$cwd, the default.",
1424 &cmdlist);
1425 c->completer = filename_completer;
bd5635a1 1426
d1343a2a
JK
1427 add_cmd ("directories", no_class, show_directories,
1428 "Current search path for finding source files.\n\
bd5635a1 1429$cwd in the path means the current working directory.\n\
d1343a2a
JK
1430$cdir in the path means the compilation directory of the source file.",
1431 &showlist);
bd5635a1
RP
1432
1433 add_info ("source", source_info,
1434 "Information about the current source file.");
1435
85ae1317
SS
1436/* start-sanitize-mpw */
1437#ifndef MPW_C
1438/* end-sanitize-mpw */
bd5635a1
RP
1439 add_info ("line", line_info,
1440 "Core addresses of the code for a source line.\n\
1441Line can be specified as\n\
1442 LINENUM, to list around that line in current file,\n\
1443 FILE:LINENUM, to list around that line in that file,\n\
1444 FUNCTION, to list around beginning of that function,\n\
1445 FILE:FUNCTION, to distinguish among like-named static functions.\n\
1446Default is to describe the last source line that was listed.\n\n\
1447This sets the default address for \"x\" to the line's first instruction\n\
1448so that \"x/i\" suffices to start examining the machine code.\n\
1449The address is also stored as the value of \"$_\".");
85ae1317
SS
1450/* start-sanitize-mpw */
1451#else
1452 add_info ("line", line_info,
1453 "Core addresses of the code for a source line. \n\
1454Line can be specified as \n\
1455 LINENUM, to list around that line in current file, \n\
1456 FILE:LINENUM, to list around that line in that file, \n\
1457Default is to describe the last source line that was listed. \n\n\
1458The address is also stored as the value of \"$_\". ");
1459#endif
1460/* end-sanitize-mpw */
bd5635a1
RP
1461
1462 add_com ("forward-search", class_files, forward_search_command,
1463 "Search for regular expression (see regex(3)) from last line listed.");
1464 add_com_alias ("search", "forward-search", class_files, 0);
1465
1466 add_com ("reverse-search", class_files, reverse_search_command,
1467 "Search backward for regular expression (see regex(3)) from last line listed.");
1468
85ae1317
SS
1469/* start-sanitize-mpw */
1470#ifndef MPW_C
1471/* end-sanitize-mpw */
bd5635a1
RP
1472 add_com ("list", class_files, list_command,
1473 "List specified function or line.\n\
1474With no argument, lists ten more lines after or around previous listing.\n\
1475\"list -\" lists the ten lines before a previous ten-line listing.\n\
1476One argument specifies a line, and ten lines are listed around that line.\n\
1477Two arguments with comma between specify starting and ending lines to list.\n\
1478Lines can be specified in these ways:\n\
1479 LINENUM, to list around that line in current file,\n\
1480 FILE:LINENUM, to list around that line in that file,\n\
1481 FUNCTION, to list around beginning of that function,\n\
1482 FILE:FUNCTION, to distinguish among like-named static functions.\n\
1483 *ADDRESS, to list around the line containing that address.\n\
1484With two args if one is empty it stands for ten lines away from the other arg.");
85ae1317
SS
1485/* start-sanitize-mpw */
1486#else /* MPW_C */
1487 add_com ("list", class_files, list_command,
1488 "List specified function or line.\n\
1489With no argument, lists ten more lines after or around previous listing. \n\
1490One argument specifies a line, and ten lines are listed around that line. \n\
1491Two arguments with comma between specify starting and ending lines to list. \n\
1492Lines can be specified in these ways:\n\
1493With two args if one is empty it stands for ten lines away from the other arg. ");
1494#endif /* MPW_C */
1495/* end-sanitize-mpw */
8a96d79b 1496 add_com_alias ("l", "list", class_files, 1);
bd5635a1 1497
e3af0493
JG
1498 add_show_from_set
1499 (add_set_cmd ("listsize", class_support, var_uinteger,
1500 (char *)&lines_to_list,
1501 "Set number of source lines gdb will list by default.",
1502 &setlist),
1503 &showlist);
1504}
This page took 0.272635 seconds and 4 git commands to generate.