More mult-arch conversions: IEEE_FLOAT, SKIP_PROLOGUE,
[deliverable/binutils-gdb.git] / gprof / source.c
index 1fb0e533c6725d20380083db71a8ed647f808272..dd671d5e1595ca97c0da4b3a698ea3cfe4ee5f13 100644 (file)
@@ -3,6 +3,7 @@
  */
 #include "gprof.h"
 #include "libiberty.h"
+#include "filenames.h"
 #include "search_list.h"
 #include "source.h"
 
@@ -25,23 +26,23 @@ DEFUN (source_file_lookup_path, (path), const char *path)
 
   for (sf = first_src_file; sf; sf = sf->next)
     {
-      if (strcmp (path, sf->name) == 0)
+      if (FILENAME_CMP (path, sf->name) == 0)
        {
          break;
-       }                       /* if */
-    }                          /* for */
+       }
+    }
   if (!sf)
     {
       /* create a new source file descriptor: */
 
       sf = (Source_File *) xmalloc (sizeof (*sf));
       memset (sf, 0, sizeof (*sf));
-      sf->name = strdup (path);
+      sf->name = xstrdup (path);
       sf->next = first_src_file;
       first_src_file = sf;
-    }                          /* if */
+    }
   return sf;
-}                              /* source_file_lookup_path */
+}
 
 
 Source_File *
@@ -65,14 +66,14 @@ DEFUN (source_file_lookup_name, (filename), const char *filename)
       else
        {
          fname = sf->name;
-       }                       /* if */
-      if (strcmp (filename, fname) == 0)
+       }
+      if (FILENAME_CMP (filename, fname) == 0)
        {
          break;
-       }                       /* if */
-    }                          /* for */
+       }
+    }
   return sf;
-}                              /* source_file_lookup_name */
+}
 
 
 FILE *
@@ -95,10 +96,10 @@ DEFUN (annotate_source, (sf, max_width, annote, arg),
    * open succeeds or reaching end of list:
    */
   strcpy (fname, sf->name);
-  if (sf->name[0] == '/')
+  if (IS_ABSOLUTE_PATH (sf->name))
     {
       sle = 0;                 /* don't use search list for absolute paths */
-    }                          /* if */
+    }
   name_only = 0;
   while (TRUE)
     {
@@ -108,20 +109,34 @@ DEFUN (annotate_source, (sf, max_width, annote, arg),
       if (ifp)
        {
          break;
-       }                       /* if */
+       }
       if (!sle && !name_only)
        {
          name_only = strrchr (sf->name, '/');
+#ifdef HAVE_DOS_BASED_FILE_SYSTEM
+         {
+           char *bslash = strrchr (sf->name, '\\');
+           if (name_only == NULL || (bslash != NULL && bslash > name_only))
+             name_only = bslash;
+           if (name_only == NULL && sf->name[0] != '\0' && sf->name[1] == ':')
+             name_only = (char *)sf->name + 1;
+         }
+#endif
          if (name_only)
            {
              /* try search-list again, but this time with name only: */
              ++name_only;
              sle = src_search_list.head;
-           }                   /* if */
-       }                       /* if */
+           }
+       }
       if (sle)
        {
          strcpy (fname, sle->path);
+#ifdef HAVE_DOS_BASED_FILE_SYSTEM
+         /* d:foo is not the same thing as d:/foo!  */
+         if (fname[strlen (fname) - 1] == ':')
+           strcat (fname, ".");
+#endif
          strcat (fname, "/");
          if (name_only)
            {
@@ -130,23 +145,23 @@ DEFUN (annotate_source, (sf, max_width, annote, arg),
          else
            {
              strcat (fname, sf->name);
-           }                   /* if */
+           }
          sle = sle->next;
        }
       else
        {
          if (errno == ENOENT)
            {
-             fprintf (stderr, "%s: could not locate `%s'\n",
+             fprintf (stderr, _("%s: could not locate `%s'\n"),
                       whoami, sf->name);
            }
          else
            {
              perror (sf->name);
-           }                   /* if */
+           }
          return 0;
-       }                       /* if */
-    }                          /* while */
+       }
+    }
 
   ofp = stdout;
   if (create_annotation_files)
@@ -156,6 +171,15 @@ DEFUN (annotate_source, (sf, max_width, annote, arg),
 
       /* create annotation files in the current working directory: */
       filename = strrchr (sf->name, '/');
+#ifdef HAVE_DOS_BASED_FILE_SYSTEM
+       {
+         char *bslash = strrchr (sf->name, '\\');
+         if (filename == NULL || (bslash != NULL && bslash > filename))
+           filename = bslash;
+         if (filename == NULL && sf->name[0] != '\0' && sf->name[1] == ':')
+           filename = sf->name + 1;
+       }
+#endif
       if (filename)
        {
          ++filename;
@@ -163,17 +187,35 @@ DEFUN (annotate_source, (sf, max_width, annote, arg),
       else
        {
          filename = sf->name;
-       }                       /* if */
+       }
 
       strcpy (fname, filename);
       strcat (fname, EXT_ANNO);
+#ifdef __MSDOS__
+      {
+       /* foo.cpp-ann can overwrite foo.cpp due to silent truncation of
+          file names on 8+3 filesystems.  Their `stat' better be good...  */
+       struct stat buf1, buf2;
+
+       if (stat (filename, &buf1) == 0
+           && stat (fname, &buf2) == 0
+           && buf1.st_ino == buf2.st_ino)
+         {
+           char *dot = strrchr (fname, '.');
+
+           if (dot)
+             *dot = '\0';
+           strcat (fname, ".ann");
+         }
+      }
+#endif
       ofp = fopen (fname, "w");
       if (!ofp)
        {
          perror (fname);
          return 0;
-       }                       /* if */
-    }                          /* if */
+       }
+    }
 
   /*
    * Print file names if output goes to stdout and there are
@@ -188,7 +230,7 @@ DEFUN (annotate_source, (sf, max_width, annote, arg),
       else
        {
          fputc ('\n', ofp);
-       }                       /* if */
+       }
       if (first_output)
        {
          first_output = FALSE;
@@ -196,9 +238,9 @@ DEFUN (annotate_source, (sf, max_width, annote, arg),
       else
        {
          fprintf (ofp, "\f\n");
-       }                       /* if */
-      fprintf (ofp, "*** File %s:\n", sf->name);
-    }                          /* if */
+       }
+      fprintf (ofp, _("*** File %s:\n"), sf->name);
+    }
 
   annotation = xmalloc (max_width + 1);
   line_num = 1;
@@ -213,13 +255,11 @@ DEFUN (annotate_source, (sf, max_width, annote, arg),
              fputs (annotation, ofp);
              ++line_num;
              new_line = FALSE;
-           }                   /* if */
+           }
          new_line = (buf[i] == '\n');
          fputc (buf[i], ofp);
-       }                       /* for */
-    }                          /* while */
+       }
+    }
   free (annotation);
   return ofp;
-}                              /* annotate_source */
-
-/*** end of source.c ***/
+}
This page took 0.03754 seconds and 4 git commands to generate.