OpenCores
URL https://opencores.org/ocsvn/open8_urisc/open8_urisc/trunk

Subversion Repositories open8_urisc

[/] [open8_urisc/] [trunk/] [gnu/] [binutils/] [gprof/] [source.c] - Blame information for rev 98

Go to most recent revision | Details | Compare with Previous | View Log

Line No. Rev Author Line
1 25 khays
/* source.c - Keep track of source files.
2
 
3
   Copyright 2000, 2001, 2002, 2004, 2007 Free Software Foundation, Inc.
4
 
5
   This file is part of GNU Binutils.
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 3 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., 51 Franklin Street - Fifth Floor, Boston, MA
20
   02110-1301, USA.  */
21
 
22
#include "gprof.h"
23
#include "libiberty.h"
24
#include "filenames.h"
25
#include "search_list.h"
26
#include "source.h"
27
 
28
#define EXT_ANNO "-ann"         /* Postfix of annotated files.  */
29
 
30
/* Default option values.  */
31
bfd_boolean create_annotation_files = FALSE;
32
 
33
Search_List src_search_list = {0, 0};
34
Source_File *first_src_file = 0;
35
 
36
 
37
Source_File *
38
source_file_lookup_path (const char *path)
39
{
40
  Source_File *sf;
41
 
42
  for (sf = first_src_file; sf; sf = sf->next)
43
    {
44
      if (FILENAME_CMP (path, sf->name) == 0)
45
        break;
46
    }
47
 
48
  if (!sf)
49
    {
50
      /* Create a new source file descriptor.  */
51
      sf = (Source_File *) xmalloc (sizeof (*sf));
52
 
53
      memset (sf, 0, sizeof (*sf));
54
 
55
      sf->name = xstrdup (path);
56
      sf->next = first_src_file;
57
      first_src_file = sf;
58
    }
59
 
60
  return sf;
61
}
62
 
63
 
64
Source_File *
65
source_file_lookup_name (const char *filename)
66
{
67
  const char *fname;
68
  Source_File *sf;
69
 
70
  /* The user cannot know exactly how a filename will be stored in
71
     the debugging info (e.g., ../include/foo.h
72
     vs. /usr/include/foo.h).  So we simply compare the filename
73
     component of a path only.  */
74
  for (sf = first_src_file; sf; sf = sf->next)
75
    {
76
      fname = strrchr (sf->name, '/');
77
 
78
      if (fname)
79
        ++fname;
80
      else
81
        fname = sf->name;
82
 
83
      if (FILENAME_CMP (filename, fname) == 0)
84
        break;
85
    }
86
 
87
  return sf;
88
}
89
 
90
 
91
FILE *
92
annotate_source (Source_File *sf, unsigned int max_width,
93
     void (*annote) (char *, unsigned int, int, void *),
94
     void *arg)
95
{
96
  static bfd_boolean first_file = TRUE;
97
  int i, line_num, nread;
98
  bfd_boolean new_line;
99
  char buf[8192];
100
  char fname[PATH_MAX];
101
  char *annotation, *name_only;
102
  FILE *ifp, *ofp;
103
  Search_List_Elem *sle = src_search_list.head;
104
 
105
  /* Open input file.  If open fails, walk along search-list until
106
     open succeeds or reaching end of list.  */
107
  strcpy (fname, sf->name);
108
 
109
  if (IS_ABSOLUTE_PATH (sf->name))
110
    sle = 0;                     /* Don't use search list for absolute paths.  */
111
 
112
  name_only = 0;
113
  while (TRUE)
114
    {
115
      DBG (SRCDEBUG, printf ("[annotate_source]: looking for %s, trying %s\n",
116
                             sf->name, fname));
117
 
118
      ifp = fopen (fname, FOPEN_RB);
119
      if (ifp)
120
        break;
121
 
122
      if (!sle && !name_only)
123
        {
124
          name_only = strrchr (sf->name, '/');
125
#ifdef HAVE_DOS_BASED_FILE_SYSTEM
126
          {
127
            char *bslash = strrchr (sf->name, '\\');
128
            if (name_only == NULL || (bslash != NULL && bslash > name_only))
129
              name_only = bslash;
130
            if (name_only == NULL && sf->name[0] != '\0' && sf->name[1] == ':')
131
              name_only = (char *)sf->name + 1;
132
          }
133
#endif
134
          if (name_only)
135
            {
136
              /* Try search-list again, but this time with name only.  */
137
              ++name_only;
138
              sle = src_search_list.head;
139
            }
140
        }
141
 
142
      if (sle)
143
        {
144
          strcpy (fname, sle->path);
145
#ifdef HAVE_DOS_BASED_FILE_SYSTEM
146
          /* d:foo is not the same thing as d:/foo!  */
147
          if (fname[strlen (fname) - 1] == ':')
148
            strcat (fname, ".");
149
#endif
150
          strcat (fname, "/");
151
 
152
          if (name_only)
153
            strcat (fname, name_only);
154
          else
155
            strcat (fname, sf->name);
156
 
157
          sle = sle->next;
158
        }
159
      else
160
        {
161
          if (errno == ENOENT)
162
            fprintf (stderr, _("%s: could not locate `%s'\n"),
163
                     whoami, sf->name);
164
          else
165
            perror (sf->name);
166
 
167
          return 0;
168
        }
169
    }
170
 
171
  ofp = stdout;
172
 
173
  if (create_annotation_files)
174
    {
175
      /* Try to create annotated source file.  */
176
      const char *filename;
177
 
178
      /* Create annotation files in the current working directory.  */
179
      filename = strrchr (sf->name, '/');
180
#ifdef HAVE_DOS_BASED_FILE_SYSTEM
181
        {
182
          char *bslash = strrchr (sf->name, '\\');
183
          if (filename == NULL || (bslash != NULL && bslash > filename))
184
            filename = bslash;
185
          if (filename == NULL && sf->name[0] != '\0' && sf->name[1] == ':')
186
            filename = sf->name + 1;
187
        }
188
#endif
189
      if (filename)
190
        ++filename;
191
      else
192
        filename = sf->name;
193
 
194
      strcpy (fname, filename);
195
      strcat (fname, EXT_ANNO);
196
#ifdef __MSDOS__
197
      {
198
        /* foo.cpp-ann can overwrite foo.cpp due to silent truncation of
199
           file names on 8+3 filesystems.  Their `stat' better be good...  */
200
        struct stat buf1, buf2;
201
 
202
        if (stat (filename, &buf1) == 0
203
            && stat (fname, &buf2) == 0
204
            && buf1.st_ino == buf2.st_ino)
205
          {
206
            char *dot = strrchr (fname, '.');
207
 
208
            if (dot)
209
              *dot = '\0';
210
            strcat (fname, ".ann");
211
          }
212
      }
213
#endif
214
      ofp = fopen (fname, "w");
215
 
216
      if (!ofp)
217
        {
218
          perror (fname);
219
          return 0;
220
        }
221
    }
222
 
223
  /* Print file names if output goes to stdout
224
     and there are more than one source file.  */
225
  if (ofp == stdout)
226
    {
227
      if (first_file)
228
        first_file = FALSE;
229
      else
230
        fputc ('\n', ofp);
231
 
232
      if (first_output)
233
        first_output = FALSE;
234
      else
235
        fprintf (ofp, "\f\n");
236
 
237
      fprintf (ofp, _("*** File %s:\n"), sf->name);
238
    }
239
 
240
  annotation = (char *) xmalloc (max_width + 1);
241
  line_num = 1;
242
  new_line = TRUE;
243
 
244
  while ((nread = fread (buf, 1, sizeof (buf), ifp)) > 0)
245
    {
246
      for (i = 0; i < nread; ++i)
247
        {
248
          if (new_line)
249
            {
250
              (*annote) (annotation, max_width, line_num, arg);
251
              fputs (annotation, ofp);
252
              ++line_num;
253
              new_line = FALSE;
254
            }
255
 
256
          new_line = (buf[i] == '\n');
257
          fputc (buf[i], ofp);
258
        }
259
    }
260
 
261
  free (annotation);
262
  return ofp;
263
}

powered by: WebSVN 2.1.0

© copyright 1999-2024 OpenCores.org, equivalent to Oliscience, all rights reserved. OpenCores®, registered trademark.