diff options
Diffstat (limited to 'gprof/source.c')
-rw-r--r-- | gprof/source.c | 50 |
1 files changed, 47 insertions, 3 deletions
diff --git a/gprof/source.c b/gprof/source.c index 4901a04..49ba57e 100644 --- a/gprof/source.c +++ b/gprof/source.c @@ -1,8 +1,11 @@ /* * Keeps track of source files. */ +#include <sys/stat.h> + #include "gprof.h" #include "libiberty.h" +#include "filenames.h" #include "search_list.h" #include "source.h" @@ -25,7 +28,7 @@ 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; } @@ -66,7 +69,7 @@ DEFUN (source_file_lookup_name, (filename), const char *filename) { fname = sf->name; } - if (strcmp (filename, fname) == 0) + if (FILENAME_CMP (filename, fname) == 0) { break; } @@ -95,7 +98,7 @@ 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 */ } @@ -112,6 +115,15 @@ DEFUN (annotate_source, (sf, max_width, annote, arg), if (!sle && !name_only) { name_only = strrchr (sf->name, '/'); +#ifdef HAVE_DOS_BASED_FILE_SYSTEM + { + char *bslash = strrchr (sf->name, '\\'); + if (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: */ @@ -122,6 +134,11 @@ DEFUN (annotate_source, (sf, max_width, annote, arg), 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) { @@ -156,6 +173,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 (bslash > filename) + filename = bslash; + if (filename == NULL && sf->name[0] != '\0' && sf->name[1] == ':') + filename = sf->name + 1; + } +#endif if (filename) { ++filename; @@ -167,6 +193,24 @@ DEFUN (annotate_source, (sf, max_width, annote, arg), 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) { |