]> Git Repo - binutils.git/blob - gdb/source.c
Abort if input format is ARM and output format is not
[binutils.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   /* Only prints "No such file or directory" once */
998   if ((s != last_source_visited) || (! last_source_error))
999     {
1000       last_source_visited = s;
1001       desc = open_source_file (s);
1002     }
1003   else
1004     {
1005       desc = last_source_error;
1006       noerror = 1;
1007     }
1008
1009   if (desc < 0)
1010     {
1011       last_source_error = desc;
1012
1013       if (! noerror)
1014         {
1015           char *name = alloca (strlen (s->filename) + 100);
1016           sprintf (name, "%d\t%s", line, s->filename);
1017           print_sys_errmsg (name, errno);
1018         }
1019       else
1020         printf_filtered ("%d\tin %s\n", line, s->filename);
1021
1022       return;
1023     }
1024
1025   last_source_error = 0;
1026
1027   if (s->line_charpos == 0)
1028     find_source_lines (s, desc);
1029
1030   if (line < 1 || line > s->nlines)
1031     {
1032       close (desc);
1033       error ("Line number %d out of range; %s has %d lines.",
1034              line, s->filename, s->nlines);
1035     }
1036
1037   if (lseek (desc, s->line_charpos[line - 1], 0) < 0)
1038     {
1039       close (desc);
1040       perror_with_name (s->filename);
1041     }
1042
1043   stream = fdopen (desc, FDOPEN_MODE);
1044   clearerr (stream);
1045
1046   while (nlines-- > 0)
1047     {
1048       c = fgetc (stream);
1049       if (c == EOF) break;
1050       last_line_listed = current_source_line;
1051       printf_filtered ("%d\t", current_source_line++);
1052       do
1053         {
1054           if (c < 040 && c != '\t' && c != '\n' && c != '\r')
1055             printf_filtered ("^%c", c + 0100);
1056           else if (c == 0177)
1057             printf_filtered ("^?");
1058 #ifdef CRLF_SOURCE_FILES
1059           else if (c == '\r')
1060             {
1061               /* Just skip \r characters.  */
1062             }
1063 #endif
1064           else
1065             printf_filtered ("%c", c);
1066         } while (c != '\n' && (c = fgetc (stream)) >= 0);
1067     }
1068
1069   fclose (stream);
1070 }
1071 \f
1072 /* Show source lines from the file of symtab S, starting with line
1073    number LINE and stopping before line number STOPLINE.  If this is the
1074    not the command line version, then the source is shown in the source
1075    window otherwise it is simply printed */
1076
1077 void 
1078 print_source_lines (s, line, stopline, noerror)
1079     struct symtab *s;
1080     int line, stopline, noerror;
1081 {
1082 #if defined(TUI)
1083   if (!tui_version || 
1084       m_winPtrIsNull(srcWin) || !srcWin->generic.isVisible )
1085     print_source_lines_base(s, line, stopline, noerror);
1086   else
1087     {
1088       TuiGenWinInfoPtr locator = locatorWinInfoPtr();
1089       extern void tui_vAddWinToLayout PARAMS ((va_list));
1090       extern void tui_vUpdateSourceWindowsWithLine PARAMS ((va_list));
1091
1092     /* Regardless of whether we can open the file,
1093        set current_source_symtab. */
1094     current_source_symtab = s;
1095     current_source_line = line;
1096     first_line_listed = line;
1097
1098     /* make sure that the source window is displayed */
1099     tuiDo((TuiOpaqueFuncPtr)tui_vAddWinToLayout, SRC_WIN);
1100
1101     tuiDo((TuiOpaqueFuncPtr)tui_vUpdateSourceWindowsWithLine, s, line);
1102     tuiDo((TuiOpaqueFuncPtr)tui_vUpdateLocatorFilename, s->filename);
1103   }
1104 #else
1105   print_source_lines_base(s, line, stopline, noerror);
1106 #endif
1107 }
1108 \f
1109
1110
1111 /* Print a list of files and line numbers which a user may choose from
1112   in order to list a function which was specified ambiguously (as with
1113   `list classname::overloadedfuncname', for example).  The vector in
1114   SALS provides the filenames and line numbers.  */
1115
1116 static void
1117 ambiguous_line_spec (sals)
1118      struct symtabs_and_lines *sals;
1119 {
1120   int i;
1121
1122   for (i = 0; i < sals->nelts; ++i)
1123     printf_filtered("file: \"%s\", line number: %d\n",
1124                     sals->sals[i].symtab->filename, sals->sals[i].line);
1125 }
1126
1127 static void
1128 list_command (arg, from_tty)
1129      char *arg;
1130      int from_tty;
1131 {
1132   struct symtabs_and_lines sals, sals_end;
1133   struct symtab_and_line sal, sal_end;
1134   struct symbol *sym;
1135   char *arg1;
1136   int no_end = 1;
1137   int dummy_end = 0;
1138   int dummy_beg = 0;
1139   int linenum_beg = 0;
1140   char *p;
1141
1142   if (!have_full_symbols () && !have_partial_symbols())
1143     error ("No symbol table is loaded.  Use the \"file\" command.");
1144
1145   /* Pull in a current source symtab if necessary */
1146   if (current_source_symtab == 0 &&
1147       (arg == 0 || arg[0] == '+' || arg[0] == '-'))
1148     select_source_symtab (0);
1149
1150   /* "l" or "l +" lists next ten lines.  */
1151
1152   if (arg == 0 || STREQ (arg, "+"))
1153     {
1154       if (current_source_symtab == 0)
1155         error ("No default source file yet.  Do \"help list\".");
1156       print_source_lines (current_source_symtab, current_source_line,
1157                           current_source_line + lines_to_list, 0);
1158       return;
1159     }
1160
1161   /* "l -" lists previous ten lines, the ones before the ten just listed.  */
1162   if (STREQ (arg, "-"))
1163     {
1164       if (current_source_symtab == 0)
1165         error ("No default source file yet.  Do \"help list\".");
1166       print_source_lines (current_source_symtab,
1167                           max (first_line_listed - lines_to_list, 1),
1168                           first_line_listed, 0);
1169       return;
1170     }
1171
1172   /* Now if there is only one argument, decode it in SAL
1173      and set NO_END.
1174      If there are two arguments, decode them in SAL and SAL_END
1175      and clear NO_END; however, if one of the arguments is blank,
1176      set DUMMY_BEG or DUMMY_END to record that fact.  */
1177
1178   arg1 = arg;
1179   if (*arg1 == ',')
1180     dummy_beg = 1;
1181   else
1182     {
1183       sals = decode_line_1 (&arg1, 0, 0, 0, 0);
1184
1185       if (! sals.nelts) return;  /*  C++  */
1186       if (sals.nelts > 1)
1187         {
1188           ambiguous_line_spec (&sals);
1189           free (sals.sals);
1190           return;
1191         }
1192
1193       sal = sals.sals[0];
1194       free (sals.sals);
1195     }
1196
1197   /* Record whether the BEG arg is all digits.  */
1198
1199   for (p = arg; p != arg1 && *p >= '0' && *p <= '9'; p++);
1200   linenum_beg = (p == arg1);
1201
1202   while (*arg1 == ' ' || *arg1 == '\t')
1203     arg1++;
1204   if (*arg1 == ',')
1205     {
1206       no_end = 0;
1207       arg1++;
1208       while (*arg1 == ' ' || *arg1 == '\t')
1209         arg1++;
1210       if (*arg1 == 0)
1211         dummy_end = 1;
1212       else
1213         {
1214           if (dummy_beg)
1215             sals_end = decode_line_1 (&arg1, 0, 0, 0, 0);
1216           else
1217             sals_end = decode_line_1 (&arg1, 0, sal.symtab, sal.line, 0);
1218           if (sals_end.nelts == 0) 
1219             return;
1220           if (sals_end.nelts > 1)
1221             {
1222               ambiguous_line_spec (&sals_end);
1223               free (sals_end.sals);
1224               return;
1225             }
1226           sal_end = sals_end.sals[0];
1227           free (sals_end.sals);
1228         }
1229     }
1230
1231   if (*arg1)
1232     error ("Junk at end of line specification.");
1233
1234   if (!no_end && !dummy_beg && !dummy_end
1235       && sal.symtab != sal_end.symtab)
1236     error ("Specified start and end are in different files.");
1237   if (dummy_beg && dummy_end)
1238     error ("Two empty args do not say what lines to list.");
1239  
1240   /* if line was specified by address,
1241      first print exactly which line, and which file.
1242      In this case, sal.symtab == 0 means address is outside
1243      of all known source files, not that user failed to give a filename.  */
1244   if (*arg == '*')
1245     {
1246       if (sal.symtab == 0)
1247         /* FIXME-32x64--assumes sal.pc fits in long.  */
1248         error ("No source file for address %s.",
1249                 local_hex_string((unsigned long) sal.pc));
1250       sym = find_pc_function (sal.pc);
1251       if (sym)
1252         {
1253           print_address_numeric (sal.pc, 1, gdb_stdout);
1254           printf_filtered (" is in ");
1255           fputs_filtered (SYMBOL_SOURCE_NAME (sym), gdb_stdout);
1256           printf_filtered (" (%s:%d).\n", sal.symtab->filename, sal.line);
1257         }
1258       else
1259         {
1260           print_address_numeric (sal.pc, 1, gdb_stdout);
1261           printf_filtered (" is at %s:%d.\n",
1262                            sal.symtab->filename, sal.line);
1263         }
1264     }
1265
1266   /* If line was not specified by just a line number,
1267      and it does not imply a symtab, it must be an undebuggable symbol
1268      which means no source code.  */
1269
1270   if (! linenum_beg && sal.symtab == 0)
1271     error ("No line number known for %s.", arg);
1272
1273   /* If this command is repeated with RET,
1274      turn it into the no-arg variant.  */
1275
1276   if (from_tty)
1277     *arg = 0;
1278
1279   if (dummy_beg && sal_end.symtab == 0)
1280     error ("No default source file yet.  Do \"help list\".");
1281   if (dummy_beg)
1282     print_source_lines (sal_end.symtab,
1283                         max (sal_end.line - (lines_to_list - 1), 1),
1284                         sal_end.line + 1, 0);
1285   else if (sal.symtab == 0)
1286     error ("No default source file yet.  Do \"help list\".");
1287   else if (no_end)
1288     {
1289       if (lines_to_list % 2 == 0) 
1290         print_source_lines (sal.symtab,
1291                             max (sal.line - (lines_to_list / 2), 1),
1292                             sal.line + (lines_to_list / 2), 0);
1293       else
1294         /* If lines_to_list is odd, then we round down in
1295          * one of the lines_to_list/2 computations, round up in
1296          * the other, so the total window size around the specified
1297          * line comes out right.
1298          */
1299         print_source_lines (sal.symtab,
1300                             max (sal.line - (lines_to_list / 2), 1),
1301                             sal.line + ((1+lines_to_list) / 2), 0);
1302     }
1303   else
1304     print_source_lines (sal.symtab, sal.line,
1305                         (dummy_end
1306                          ? sal.line + lines_to_list
1307                          : sal_end.line + 1),
1308                         0);
1309 }
1310 \f
1311 /* Print info on range of pc's in a specified line.  */
1312
1313 static void
1314 line_info (arg, from_tty)
1315      char *arg;
1316      int from_tty;
1317 {
1318   struct symtabs_and_lines sals;
1319   struct symtab_and_line sal;
1320   CORE_ADDR start_pc, end_pc;
1321   int i;
1322
1323   INIT_SAL (&sal);      /* initialize to zeroes */
1324
1325   if (arg == 0)
1326     {
1327       sal.symtab = current_source_symtab;
1328       sal.line = last_line_listed;
1329       sals.nelts = 1;
1330       sals.sals = (struct symtab_and_line *)
1331         xmalloc (sizeof (struct symtab_and_line));
1332       sals.sals[0] = sal;
1333     }
1334   else
1335     {
1336       sals = decode_line_spec_1 (arg, 0);
1337       
1338       dont_repeat ();
1339     }
1340
1341   /* C++  More than one line may have been specified, as when the user
1342      specifies an overloaded function name. Print info on them all. */
1343   for (i = 0; i < sals.nelts; i++)
1344     {
1345       sal = sals.sals[i];
1346       
1347       if (sal.symtab == 0)
1348         {
1349           printf_filtered ("No line number information available");
1350           if (sal.pc != 0)
1351             {
1352               /* This is useful for "info line *0x7f34".  If we can't tell the
1353                  user about a source line, at least let them have the symbolic
1354                  address.  */
1355               printf_filtered (" for address ");
1356               wrap_here ("  ");
1357               print_address (sal.pc, gdb_stdout);
1358             }
1359           else
1360             printf_filtered (".");
1361           printf_filtered ("\n");
1362         }
1363       else if (sal.line > 0
1364                && find_line_pc_range (sal, &start_pc, &end_pc))
1365         {
1366           if (start_pc == end_pc)
1367             {
1368               printf_filtered ("Line %d of \"%s\"",
1369                                sal.line, sal.symtab->filename);
1370               wrap_here ("  ");
1371               printf_filtered (" is at address ");
1372               print_address (start_pc, gdb_stdout);
1373               wrap_here ("  ");
1374               printf_filtered (" but contains no code.\n");
1375             }
1376           else
1377             {
1378               printf_filtered ("Line %d of \"%s\"",
1379                                sal.line, sal.symtab->filename);
1380               wrap_here ("  ");
1381               printf_filtered (" starts at address ");
1382               print_address (start_pc, gdb_stdout);
1383               wrap_here ("  ");
1384               printf_filtered (" and ends at ");
1385               print_address (end_pc, gdb_stdout);
1386               printf_filtered (".\n");
1387             }
1388
1389           /* x/i should display this line's code.  */
1390           set_next_address (start_pc);
1391
1392           /* Repeating "info line" should do the following line.  */
1393           last_line_listed = sal.line + 1;
1394
1395           /* If this is the only line, show the source code.  If it could
1396              not find the file, don't do anything special.  */
1397           if (annotation_level && sals.nelts == 1)
1398             identify_source_line (sal.symtab, sal.line, 0, start_pc);
1399         }
1400       else
1401         /* Is there any case in which we get here, and have an address
1402            which the user would want to see?  If we have debugging symbols
1403            and no line numbers?  */
1404         printf_filtered ("Line number %d is out of range for \"%s\".\n",
1405                          sal.line, sal.symtab->filename);
1406     }
1407   free (sals.sals);
1408 }
1409 \f
1410 /* Commands to search the source file for a regexp.  */
1411
1412 /* ARGSUSED */
1413 static void
1414 forward_search_command (regex, from_tty)
1415      char *regex;
1416      int from_tty;
1417 {
1418   register int c;
1419   register int desc;
1420   register FILE *stream;
1421   int line;
1422   char *msg;
1423
1424 #if defined(TUI)
1425   /* 
1426   ** If this is the TUI, search from the first line displayed in 
1427   ** the source window, otherwise, search from last_line_listed+1 
1428   ** in current_source_symtab 
1429   */
1430   if (!tui_version)
1431     line = last_line_listed;
1432   else
1433     {
1434       if (srcWin->generic.isVisible && srcWin->generic.contentSize > 0)
1435         line = ((TuiWinContent)
1436             srcWin->generic.content)[0]->whichElement.source.lineOrAddr.lineNo;
1437       else
1438         {
1439           printf_filtered("No source displayed.\nExpression not found.\n");
1440           return;
1441         }
1442     }
1443   line++;
1444 #else
1445   line = last_line_listed + 1;
1446 #endif
1447
1448   msg = (char *) re_comp (regex);
1449   if (msg)
1450     error (msg);
1451
1452   if (current_source_symtab == 0)
1453     select_source_symtab (0);
1454
1455   desc = open_source_file (current_source_symtab);
1456   if (desc < 0)
1457     perror_with_name (current_source_symtab->filename);
1458
1459   if (current_source_symtab->line_charpos == 0)
1460     find_source_lines (current_source_symtab, desc);
1461
1462   if (line < 1 || line > current_source_symtab->nlines)
1463     {
1464       close (desc);
1465       error ("Expression not found");
1466     }
1467
1468   if (lseek (desc, current_source_symtab->line_charpos[line - 1], 0) < 0)
1469     {
1470       close (desc);
1471       perror_with_name (current_source_symtab->filename);
1472     }
1473
1474   stream = fdopen (desc, FDOPEN_MODE);
1475   clearerr (stream);
1476   while (1) {
1477     static char *buf = NULL;
1478     register char *p;
1479     int cursize, newsize;
1480
1481     cursize = 256;
1482     buf = xmalloc (cursize);
1483     p = buf;
1484
1485     c = getc (stream);
1486     if (c == EOF)
1487       break;
1488     do {
1489       *p++ = c;
1490       if (p - buf == cursize)
1491         {
1492           newsize = cursize + cursize / 2;
1493           buf = xrealloc (buf, newsize);
1494           p = buf + cursize;
1495           cursize = newsize;
1496         }
1497     } while (c != '\n' && (c = getc (stream)) >= 0);
1498
1499     /* we now have a source line in buf, null terminate and match */
1500     *p = 0;
1501     if (re_exec (buf) > 0)
1502       {
1503         /* Match! */
1504         fclose (stream);
1505         if (tui_version)
1506           print_source_lines_base (current_source_symtab, line, line+1, 0);
1507         print_source_lines (current_source_symtab, line, line+1, 0);
1508         set_internalvar (lookup_internalvar ("_"),
1509                          value_from_longest (builtin_type_int,
1510                                              (LONGEST) line));
1511         current_source_line = max (line - lines_to_list / 2, 1);
1512         return;
1513       }
1514     line++;
1515   }
1516
1517   printf_filtered ("Expression not found\n");
1518   fclose (stream);
1519 }
1520
1521 /* ARGSUSED */
1522 static void
1523 reverse_search_command (regex, from_tty)
1524      char *regex;
1525      int from_tty;
1526 {
1527   register int c;
1528   register int desc;
1529   register FILE *stream;
1530   int line;
1531   char *msg;
1532 #if defined(TUI)
1533   /*
1534   ** If this is the TUI, search from the first line displayed in
1535   ** the source window, otherwise, search from last_line_listed-1
1536   ** in current_source_symtab
1537   */
1538   if (!tui_version)
1539     line = last_line_listed;
1540   else
1541     {
1542       if (srcWin->generic.isVisible && srcWin->generic.contentSize > 0)
1543         line = ((TuiWinContent)
1544             srcWin->generic.content)[0]->whichElement.source.lineOrAddr.lineNo;
1545       else
1546         {
1547           printf_filtered("No source displayed.\nExpression not found.\n");
1548           return;
1549         }
1550     }
1551   line--;
1552 #else
1553   line = last_line_listed - 1;
1554 #endif
1555
1556   msg = (char *) re_comp (regex);
1557   if (msg)
1558     error (msg);
1559
1560   if (current_source_symtab == 0)
1561     select_source_symtab (0);
1562
1563   desc = open_source_file (current_source_symtab);
1564   if (desc < 0)
1565     perror_with_name (current_source_symtab->filename);
1566
1567   if (current_source_symtab->line_charpos == 0)
1568     find_source_lines (current_source_symtab, desc);
1569
1570   if (line < 1 || line > current_source_symtab->nlines)
1571     {
1572       close (desc);
1573       error ("Expression not found");
1574     }
1575
1576   if (lseek (desc, current_source_symtab->line_charpos[line - 1], 0) < 0)
1577     {
1578       close (desc);
1579       perror_with_name (current_source_symtab->filename);
1580     }
1581
1582   stream = fdopen (desc, FDOPEN_MODE);
1583   clearerr (stream);
1584   while (line > 1)
1585     {
1586 /* FIXME!!!  We walk right off the end of buf if we get a long line!!! */
1587       char buf[4096];           /* Should be reasonable??? */
1588       register char *p = buf;
1589
1590       c = getc (stream);
1591       if (c == EOF)
1592         break;
1593       do {
1594         *p++ = c;
1595       } while (c != '\n' && (c = getc (stream)) >= 0);
1596
1597       /* We now have a source line in buf; null terminate and match.  */
1598       *p = 0;
1599       if (re_exec (buf) > 0)
1600         {
1601           /* Match! */
1602           fclose (stream);
1603           if (tui_version)
1604             print_source_lines_base (current_source_symtab, line, line+1, 0);
1605           print_source_lines (current_source_symtab, line, line+1, 0);
1606           set_internalvar (lookup_internalvar ("_"),
1607                            value_from_longest (builtin_type_int,
1608                                                (LONGEST) line));
1609           current_source_line = max (line - lines_to_list / 2, 1);
1610           return;
1611         }
1612       line--;
1613       if (fseek (stream, current_source_symtab->line_charpos[line - 1], 0) < 0)
1614         {
1615           fclose (stream);
1616           perror_with_name (current_source_symtab->filename);
1617         }
1618     }
1619
1620   printf_filtered ("Expression not found\n");
1621   fclose (stream);
1622   return;
1623 }
1624 \f
1625 void
1626 _initialize_source ()
1627 {
1628   struct cmd_list_element *c;
1629   current_source_symtab = 0;
1630   init_source_path ();
1631
1632   /* The intention is to use POSIX Basic Regular Expressions.
1633      Always use the GNU regex routine for consistency across all hosts.
1634      Our current GNU regex.c does not have all the POSIX features, so this is
1635      just an approximation.  */
1636   re_set_syntax (RE_SYNTAX_GREP);
1637
1638   c = add_cmd ("directory", class_files, directory_command,
1639            "Add directory DIR to beginning of search path for source files.\n\
1640 Forget cached info on source file locations and line positions.\n\
1641 DIR can also be $cwd for the current working directory, or $cdir for the\n\
1642 directory in which the source file was compiled into object code.\n\
1643 With no argument, reset the search path to $cdir:$cwd, the default.",
1644                &cmdlist);
1645
1646   if (dbx_commands)
1647     add_com_alias("use", "directory", class_files, 0);
1648
1649   c->completer = filename_completer;
1650
1651   add_cmd ("directories", no_class, show_directories,
1652            "Current search path for finding source files.\n\
1653 $cwd in the path means the current working directory.\n\
1654 $cdir in the path means the compilation directory of the source file.",
1655            &showlist);
1656
1657   if (xdb_commands)
1658     {
1659       add_com_alias("D", "directory", class_files, 0);
1660       add_cmd ("ld", no_class, show_directories,
1661            "Current search path for finding source files.\n\
1662 $cwd in the path means the current working directory.\n\
1663 $cdir in the path means the compilation directory of the source file.",
1664            &cmdlist);
1665     }
1666
1667   add_info ("source", source_info,
1668             "Information about the current source file.");
1669
1670   add_info ("line", line_info,
1671             concat ("Core addresses of the code for a source line.\n\
1672 Line can be specified as\n\
1673   LINENUM, to list around that line in current file,\n\
1674   FILE:LINENUM, to list around that line in that file,\n\
1675   FUNCTION, to list around beginning of that function,\n\
1676   FILE:FUNCTION, to distinguish among like-named static functions.\n\
1677 ", "\
1678 Default is to describe the last source line that was listed.\n\n\
1679 This sets the default address for \"x\" to the line's first instruction\n\
1680 so that \"x/i\" suffices to start examining the machine code.\n\
1681 The address is also stored as the value of \"$_\".", NULL));
1682
1683   add_com ("forward-search", class_files, forward_search_command,
1684            "Search for regular expression (see regex(3)) from last line listed.\n\
1685 The matching line number is also stored as the value of \"$_\".");
1686   add_com_alias ("search", "forward-search", class_files, 0);
1687
1688   add_com ("reverse-search", class_files, reverse_search_command,
1689            "Search backward for regular expression (see regex(3)) from last line listed.\n\
1690 The matching line number is also stored as the value of \"$_\".");
1691
1692   if (xdb_commands)
1693     {
1694       add_com_alias("/", "forward-search", class_files, 0);
1695       add_com_alias("?", "reverse-search", class_files, 0);
1696     }
1697
1698   add_com ("list", class_files, list_command,
1699            concat ("List specified function or line.\n\
1700 With no argument, lists ten more lines after or around previous listing.\n\
1701 \"list -\" lists the ten lines before a previous ten-line listing.\n\
1702 One argument specifies a line, and ten lines are listed around that line.\n\
1703 Two arguments with comma between specify starting and ending lines to list.\n\
1704 ", "\
1705 Lines can be specified in these ways:\n\
1706   LINENUM, to list around that line in current file,\n\
1707   FILE:LINENUM, to list around that line in that file,\n\
1708   FUNCTION, to list around beginning of that function,\n\
1709   FILE:FUNCTION, to distinguish among like-named static functions.\n\
1710   *ADDRESS, to list around the line containing that address.\n\
1711 With two args if one is empty it stands for ten lines away from the other arg.", NULL));
1712
1713   if (!xdb_commands)
1714     add_com_alias ("l", "list", class_files, 1);
1715   else
1716     add_com_alias ("v", "list", class_files, 1);
1717
1718   if (dbx_commands)
1719     add_com_alias ("file", "list", class_files, 1);
1720
1721   add_show_from_set
1722     (add_set_cmd ("listsize", class_support, var_uinteger,
1723                   (char *)&lines_to_list,
1724         "Set number of source lines gdb will list by default.",
1725                   &setlist),
1726      &showlist);
1727 }
This page took 0.115909 seconds and 4 git commands to generate.