aboutsummaryrefslogtreecommitdiff
path: root/libiberty/filename_cmp.c
diff options
context:
space:
mode:
authorKai Tietz <kai.tietz@onevision.com>2011-02-28 18:23:25 +0000
committerKai Tietz <ktietz@gcc.gnu.org>2011-02-28 19:23:25 +0100
commit94369251651270268df0a79ea5917265617b7fb4 (patch)
tree07ad443dd995197f3280e34b7b9dce263c7e22f2 /libiberty/filename_cmp.c
parent80a832cd25fa03a93768f3d2bc05d23a06a87e26 (diff)
downloadgcc-94369251651270268df0a79ea5917265617b7fb4.zip
gcc-94369251651270268df0a79ea5917265617b7fb4.tar.gz
gcc-94369251651270268df0a79ea5917265617b7fb4.tar.bz2
re PR debug/28047 (DWARF output_file_names should really understand DOS pathnames)
2011-02-28 Kai Tietz <kai.tietz@onevision.com> PR debug/28047 * dwarf2out.c (file_table_eq): Use filename_cmp instead of strcmp. (lookup_filename): Likewise. * final.c (remap_debug_filename): Use filename_ncmp instead of strncmp. 2011-02-28 Kai Tietz <kai.tietz@onevision.com> * filename_cmp.c (filename_ncmp): New function. * functions.texi: Regenerated. 2011-02-28 Kai Tietz <kai.tietz@onevision.com> * filenames.h (filename_ncmp): New prototype. From-SVN: r170570
Diffstat (limited to 'libiberty/filename_cmp.c')
-rw-r--r--libiberty/filename_cmp.c49
1 files changed, 49 insertions, 0 deletions
diff --git a/libiberty/filename_cmp.c b/libiberty/filename_cmp.c
index 0a4d0d8..0eed120 100644
--- a/libiberty/filename_cmp.c
+++ b/libiberty/filename_cmp.c
@@ -76,3 +76,52 @@ filename_cmp (const char *s1, const char *s2)
#endif
}
+/*
+
+@deftypefn Extension int filename_ncmp (const char *@var{s1}, const char *@var{s2}, size_t @var{n})
+
+Return zero if the two file names @var{s1} and @var{s2} are equivalent
+in range @var{n}.
+If not equivalent, the returned value is similar to what @code{strncmp}
+would return. In other words, it returns a negative value if @var{s1}
+is less than @var{s2}, or a positive value if @var{s2} is greater than
+@var{s2}.
+
+This function does not normalize file names. As a result, this function
+will treat filenames that are spelled differently as different even in
+the case when the two filenames point to the same underlying file.
+However, it does handle the fact that on DOS-like file systems, forward
+and backward slashes are equal.
+
+@end deftypefn
+
+*/
+
+int
+filename_ncmp (const char *s1, const char *s2, size_t n)
+{
+#ifndef HAVE_DOS_BASED_FILE_SYSTEM
+ return strncmp(s1, s2, n);
+#else
+ if (!n)
+ return 0;
+ for (; n > 0; --n)
+ {
+ int c1 = TOLOWER (*s1);
+ int c2 = TOLOWER (*s2);
+
+ /* On DOS-based file systems, the '/' and the '\' are equivalent. */
+ if (c1 == '/')
+ c1 = '\\';
+ if (c2 == '/')
+ c2 = '\\';
+
+ if (c1 == '\0' || c1 != c2)
+ return (c1 - c2);
+
+ s1++;
+ s2++;
+ }
+ return 0;
+#endif
+}