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

Subversion Repositories openrisc

[/] [openrisc/] [trunk/] [gnu-old/] [binutils-2.18.50/] [gprof/] [source.c] - Diff between revs 156 and 816

Go to most recent revision | Only display areas with differences | Details | Blame | View Log

Rev 156 Rev 816
/* source.c - Keep track of source files.
/* source.c - Keep track of source files.
 
 
   Copyright 2000, 2001, 2002, 2004, 2007 Free Software Foundation, Inc.
   Copyright 2000, 2001, 2002, 2004, 2007 Free Software Foundation, Inc.
 
 
   This file is part of GNU Binutils.
   This file is part of GNU Binutils.
 
 
   This program is free software; you can redistribute it and/or modify
   This program is free software; you can redistribute it and/or modify
   it under the terms of the GNU General Public License as published by
   it under the terms of the GNU General Public License as published by
   the Free Software Foundation; either version 3 of the License, or
   the Free Software Foundation; either version 3 of the License, or
   (at your option) any later version.
   (at your option) any later version.
 
 
   This program is distributed in the hope that it will be useful,
   This program is distributed in the hope that it will be useful,
   but WITHOUT ANY WARRANTY; without even the implied warranty of
   but WITHOUT ANY WARRANTY; without even the implied warranty of
   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
   GNU General Public License for more details.
   GNU General Public License for more details.
 
 
   You should have received a copy of the GNU General Public License
   You should have received a copy of the GNU General Public License
   along with this program; if not, write to the Free Software
   along with this program; if not, write to the Free Software
   Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, MA
   Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, MA
   02110-1301, USA.  */
   02110-1301, USA.  */


#include "gprof.h"
#include "gprof.h"
#include "libiberty.h"
#include "libiberty.h"
#include "filenames.h"
#include "filenames.h"
#include "search_list.h"
#include "search_list.h"
#include "source.h"
#include "source.h"
 
 
#define EXT_ANNO "-ann"         /* Postfix of annotated files.  */
#define EXT_ANNO "-ann"         /* Postfix of annotated files.  */
 
 
/* Default option values.  */
/* Default option values.  */
bfd_boolean create_annotation_files = FALSE;
bfd_boolean create_annotation_files = FALSE;
 
 
Search_List src_search_list = {0, 0};
Search_List src_search_list = {0, 0};
Source_File *first_src_file = 0;
Source_File *first_src_file = 0;
 
 
 
 
Source_File *
Source_File *
source_file_lookup_path (const char *path)
source_file_lookup_path (const char *path)
{
{
  Source_File *sf;
  Source_File *sf;
 
 
  for (sf = first_src_file; sf; sf = sf->next)
  for (sf = first_src_file; sf; sf = sf->next)
    {
    {
      if (FILENAME_CMP (path, sf->name) == 0)
      if (FILENAME_CMP (path, sf->name) == 0)
        break;
        break;
    }
    }
 
 
  if (!sf)
  if (!sf)
    {
    {
      /* Create a new source file descriptor.  */
      /* Create a new source file descriptor.  */
      sf = (Source_File *) xmalloc (sizeof (*sf));
      sf = (Source_File *) xmalloc (sizeof (*sf));
 
 
      memset (sf, 0, sizeof (*sf));
      memset (sf, 0, sizeof (*sf));
 
 
      sf->name = xstrdup (path);
      sf->name = xstrdup (path);
      sf->next = first_src_file;
      sf->next = first_src_file;
      first_src_file = sf;
      first_src_file = sf;
    }
    }
 
 
  return sf;
  return sf;
}
}
 
 
 
 
Source_File *
Source_File *
source_file_lookup_name (const char *filename)
source_file_lookup_name (const char *filename)
{
{
  const char *fname;
  const char *fname;
  Source_File *sf;
  Source_File *sf;
 
 
  /* The user cannot know exactly how a filename will be stored in
  /* The user cannot know exactly how a filename will be stored in
     the debugging info (e.g., ../include/foo.h
     the debugging info (e.g., ../include/foo.h
     vs. /usr/include/foo.h).  So we simply compare the filename
     vs. /usr/include/foo.h).  So we simply compare the filename
     component of a path only.  */
     component of a path only.  */
  for (sf = first_src_file; sf; sf = sf->next)
  for (sf = first_src_file; sf; sf = sf->next)
    {
    {
      fname = strrchr (sf->name, '/');
      fname = strrchr (sf->name, '/');
 
 
      if (fname)
      if (fname)
        ++fname;
        ++fname;
      else
      else
        fname = sf->name;
        fname = sf->name;
 
 
      if (FILENAME_CMP (filename, fname) == 0)
      if (FILENAME_CMP (filename, fname) == 0)
        break;
        break;
    }
    }
 
 
  return sf;
  return sf;
}
}
 
 
 
 
FILE *
FILE *
annotate_source (Source_File *sf, unsigned int max_width,
annotate_source (Source_File *sf, unsigned int max_width,
     void (*annote) (char *, unsigned int, int, void *),
     void (*annote) (char *, unsigned int, int, void *),
     void *arg)
     void *arg)
{
{
  static bfd_boolean first_file = TRUE;
  static bfd_boolean first_file = TRUE;
  int i, line_num, nread;
  int i, line_num, nread;
  bfd_boolean new_line;
  bfd_boolean new_line;
  char buf[8192];
  char buf[8192];
  char fname[PATH_MAX];
  char fname[PATH_MAX];
  char *annotation, *name_only;
  char *annotation, *name_only;
  FILE *ifp, *ofp;
  FILE *ifp, *ofp;
  Search_List_Elem *sle = src_search_list.head;
  Search_List_Elem *sle = src_search_list.head;
 
 
  /* Open input file.  If open fails, walk along search-list until
  /* Open input file.  If open fails, walk along search-list until
     open succeeds or reaching end of list.  */
     open succeeds or reaching end of list.  */
  strcpy (fname, sf->name);
  strcpy (fname, sf->name);
 
 
  if (IS_ABSOLUTE_PATH (sf->name))
  if (IS_ABSOLUTE_PATH (sf->name))
    sle = 0;                     /* Don't use search list for absolute paths.  */
    sle = 0;                     /* Don't use search list for absolute paths.  */
 
 
  name_only = 0;
  name_only = 0;
  while (TRUE)
  while (TRUE)
    {
    {
      DBG (SRCDEBUG, printf ("[annotate_source]: looking for %s, trying %s\n",
      DBG (SRCDEBUG, printf ("[annotate_source]: looking for %s, trying %s\n",
                             sf->name, fname));
                             sf->name, fname));
 
 
      ifp = fopen (fname, FOPEN_RB);
      ifp = fopen (fname, FOPEN_RB);
      if (ifp)
      if (ifp)
        break;
        break;
 
 
      if (!sle && !name_only)
      if (!sle && !name_only)
        {
        {
          name_only = strrchr (sf->name, '/');
          name_only = strrchr (sf->name, '/');
#ifdef HAVE_DOS_BASED_FILE_SYSTEM
#ifdef HAVE_DOS_BASED_FILE_SYSTEM
          {
          {
            char *bslash = strrchr (sf->name, '\\');
            char *bslash = strrchr (sf->name, '\\');
            if (name_only == NULL || (bslash != NULL && bslash > name_only))
            if (name_only == NULL || (bslash != NULL && bslash > name_only))
              name_only = bslash;
              name_only = bslash;
            if (name_only == NULL && sf->name[0] != '\0' && sf->name[1] == ':')
            if (name_only == NULL && sf->name[0] != '\0' && sf->name[1] == ':')
              name_only = (char *)sf->name + 1;
              name_only = (char *)sf->name + 1;
          }
          }
#endif
#endif
          if (name_only)
          if (name_only)
            {
            {
              /* Try search-list again, but this time with name only.  */
              /* Try search-list again, but this time with name only.  */
              ++name_only;
              ++name_only;
              sle = src_search_list.head;
              sle = src_search_list.head;
            }
            }
        }
        }
 
 
      if (sle)
      if (sle)
        {
        {
          strcpy (fname, sle->path);
          strcpy (fname, sle->path);
#ifdef HAVE_DOS_BASED_FILE_SYSTEM
#ifdef HAVE_DOS_BASED_FILE_SYSTEM
          /* d:foo is not the same thing as d:/foo!  */
          /* d:foo is not the same thing as d:/foo!  */
          if (fname[strlen (fname) - 1] == ':')
          if (fname[strlen (fname) - 1] == ':')
            strcat (fname, ".");
            strcat (fname, ".");
#endif
#endif
          strcat (fname, "/");
          strcat (fname, "/");
 
 
          if (name_only)
          if (name_only)
            strcat (fname, name_only);
            strcat (fname, name_only);
          else
          else
            strcat (fname, sf->name);
            strcat (fname, sf->name);
 
 
          sle = sle->next;
          sle = sle->next;
        }
        }
      else
      else
        {
        {
          if (errno == ENOENT)
          if (errno == ENOENT)
            fprintf (stderr, _("%s: could not locate `%s'\n"),
            fprintf (stderr, _("%s: could not locate `%s'\n"),
                     whoami, sf->name);
                     whoami, sf->name);
          else
          else
            perror (sf->name);
            perror (sf->name);
 
 
          return 0;
          return 0;
        }
        }
    }
    }
 
 
  ofp = stdout;
  ofp = stdout;
 
 
  if (create_annotation_files)
  if (create_annotation_files)
    {
    {
      /* Try to create annotated source file.  */
      /* Try to create annotated source file.  */
      const char *filename;
      const char *filename;
 
 
      /* Create annotation files in the current working directory.  */
      /* Create annotation files in the current working directory.  */
      filename = strrchr (sf->name, '/');
      filename = strrchr (sf->name, '/');
#ifdef HAVE_DOS_BASED_FILE_SYSTEM
#ifdef HAVE_DOS_BASED_FILE_SYSTEM
        {
        {
          char *bslash = strrchr (sf->name, '\\');
          char *bslash = strrchr (sf->name, '\\');
          if (filename == NULL || (bslash != NULL && bslash > filename))
          if (filename == NULL || (bslash != NULL && bslash > filename))
            filename = bslash;
            filename = bslash;
          if (filename == NULL && sf->name[0] != '\0' && sf->name[1] == ':')
          if (filename == NULL && sf->name[0] != '\0' && sf->name[1] == ':')
            filename = sf->name + 1;
            filename = sf->name + 1;
        }
        }
#endif
#endif
      if (filename)
      if (filename)
        ++filename;
        ++filename;
      else
      else
        filename = sf->name;
        filename = sf->name;
 
 
      strcpy (fname, filename);
      strcpy (fname, filename);
      strcat (fname, EXT_ANNO);
      strcat (fname, EXT_ANNO);
#ifdef __MSDOS__
#ifdef __MSDOS__
      {
      {
        /* foo.cpp-ann can overwrite foo.cpp due to silent truncation of
        /* foo.cpp-ann can overwrite foo.cpp due to silent truncation of
           file names on 8+3 filesystems.  Their `stat' better be good...  */
           file names on 8+3 filesystems.  Their `stat' better be good...  */
        struct stat buf1, buf2;
        struct stat buf1, buf2;
 
 
        if (stat (filename, &buf1) == 0
        if (stat (filename, &buf1) == 0
            && stat (fname, &buf2) == 0
            && stat (fname, &buf2) == 0
            && buf1.st_ino == buf2.st_ino)
            && buf1.st_ino == buf2.st_ino)
          {
          {
            char *dot = strrchr (fname, '.');
            char *dot = strrchr (fname, '.');
 
 
            if (dot)
            if (dot)
              *dot = '\0';
              *dot = '\0';
            strcat (fname, ".ann");
            strcat (fname, ".ann");
          }
          }
      }
      }
#endif
#endif
      ofp = fopen (fname, "w");
      ofp = fopen (fname, "w");
 
 
      if (!ofp)
      if (!ofp)
        {
        {
          perror (fname);
          perror (fname);
          return 0;
          return 0;
        }
        }
    }
    }
 
 
  /* Print file names if output goes to stdout
  /* Print file names if output goes to stdout
     and there are more than one source file.  */
     and there are more than one source file.  */
  if (ofp == stdout)
  if (ofp == stdout)
    {
    {
      if (first_file)
      if (first_file)
        first_file = FALSE;
        first_file = FALSE;
      else
      else
        fputc ('\n', ofp);
        fputc ('\n', ofp);
 
 
      if (first_output)
      if (first_output)
        first_output = FALSE;
        first_output = FALSE;
      else
      else
        fprintf (ofp, "\f\n");
        fprintf (ofp, "\f\n");
 
 
      fprintf (ofp, _("*** File %s:\n"), sf->name);
      fprintf (ofp, _("*** File %s:\n"), sf->name);
    }
    }
 
 
  annotation = xmalloc (max_width + 1);
  annotation = xmalloc (max_width + 1);
  line_num = 1;
  line_num = 1;
  new_line = TRUE;
  new_line = TRUE;
 
 
  while ((nread = fread (buf, 1, sizeof (buf), ifp)) > 0)
  while ((nread = fread (buf, 1, sizeof (buf), ifp)) > 0)
    {
    {
      for (i = 0; i < nread; ++i)
      for (i = 0; i < nread; ++i)
        {
        {
          if (new_line)
          if (new_line)
            {
            {
              (*annote) (annotation, max_width, line_num, arg);
              (*annote) (annotation, max_width, line_num, arg);
              fputs (annotation, ofp);
              fputs (annotation, ofp);
              ++line_num;
              ++line_num;
              new_line = FALSE;
              new_line = FALSE;
            }
            }
 
 
          new_line = (buf[i] == '\n');
          new_line = (buf[i] == '\n');
          fputc (buf[i], ofp);
          fputc (buf[i], ofp);
        }
        }
    }
    }
 
 
  free (annotation);
  free (annotation);
  return ofp;
  return ofp;
}
}
 
 

powered by: WebSVN 2.1.0

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