summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--bfd/ChangeLog15
-rw-r--r--bfd/archive.c10
-rw-r--r--bfd/corefile.c2
-rw-r--r--bfd/elf32-bfin.c6
-rw-r--r--bfd/elf32-frv.c6
-rw-r--r--bfd/elf32-spu.c4
-rw-r--r--bfd/syms.c4
-rw-r--r--bfd/xcofflink.c6
-rw-r--r--bfd/xtensa-isa.c4
-rw-r--r--include/ChangeLog4
-rw-r--r--include/filenames.h3
-rw-r--r--libiberty/ChangeLog5
-rw-r--r--libiberty/filename_cmp.c49
-rw-r--r--libiberty/functions.texi18
14 files changed, 115 insertions, 21 deletions
diff --git a/bfd/ChangeLog b/bfd/ChangeLog
index 53bf1cf13e2..e99450e2077 100644
--- a/bfd/ChangeLog
+++ b/bfd/ChangeLog
@@ -1,3 +1,18 @@
+2011-02-28 Kai Tietz <kai.tietz@onevision.com>
+
+ * archive.c (_bfd_find_nested_archive): Use filename_(n)cmp.
+ (adjust_relative_path): Likewise.
+ (_bfd_construct_extended_name_table): Likewise.
+ * corefile.c (generic_core_file_matches_executable_p): Likewise.
+ * elf32-bfin.c (bfinfdpic_relocate_section): Likewise.
+ * elf32-frv.c (elf32_frv_relocate_section): Likewise.
+ * elf32-spu.c (sort_bfds): Likewise.
+ (spu_elf_auto_overlay): Likewise.
+ * syms.c (_bfd_stab_section_find_nearest_line): Likewise.
+ * xcofflink.c (xcoff_set_import_path): Likewise.
+ * xtensa-isa.c (xtensa_regfile_lookup): Likewise.
+ (xtensa_regfile_lookup_shortname): Likewise.
+
2011-02-28 Alan Modra <amodra@gmail.com>
PR 12513
diff --git a/bfd/archive.c b/bfd/archive.c
index c3aaffc59f5..5abb25af5b0 100644
--- a/bfd/archive.c
+++ b/bfd/archive.c
@@ -348,7 +348,7 @@ _bfd_find_nested_archive (bfd *arch_bfd, const char *filename)
abfd != NULL;
abfd = abfd->archive_next)
{
- if (strcmp (filename, abfd->filename) == 0)
+ if (filename_cmp (filename, abfd->filename) == 0)
return abfd;
}
abfd = bfd_openr (filename, NULL);
@@ -1359,7 +1359,7 @@ adjust_relative_path (const char * path, const char * ref_path)
while (*e2 && ! IS_DIR_SEPARATOR (*e2))
++e2;
if (*e1 == '\0' || *e2 == '\0' || e1 - pathp != e2 - refp
- || strncmp (pathp, refp, e1 - pathp) != 0)
+ || filename_ncmp (pathp, refp, e1 - pathp) != 0)
break;
pathp = e1 + 1;
refp = e2 + 1;
@@ -1464,7 +1464,7 @@ _bfd_construct_extended_name_table (bfd *abfd,
/* If the path is the same as the previous path seen,
reuse it. This can happen when flattening a thin
archive that contains other archives. */
- if (last_filename && strcmp (last_filename, filename) == 0)
+ if (last_filename && filename_cmp (last_filename, filename) == 0)
continue;
last_filename = filename;
@@ -1510,7 +1510,7 @@ _bfd_construct_extended_name_table (bfd *abfd,
else
{
struct ar_hdr *hdr = arch_hdr (current);
- if (strncmp (normal, hdr->ar_name, thislen) != 0
+ if (filename_ncmp (normal, hdr->ar_name, thislen) != 0
|| (thislen < sizeof hdr->ar_name
&& hdr->ar_name[thislen] != ar_padchar (current)))
{
@@ -1558,7 +1558,7 @@ _bfd_construct_extended_name_table (bfd *abfd,
archive that contains other archives.
If the path is relative, adjust it relative to
the containing archive. */
- if (last_filename && strcmp (last_filename, filename) == 0)
+ if (last_filename && filename_cmp (last_filename, filename) == 0)
normal = last_filename;
else if (! IS_ABSOLUTE_PATH (filename)
&& ! IS_ABSOLUTE_PATH (abfd->filename))
diff --git a/bfd/corefile.c b/bfd/corefile.c
index 605be8d33da..bba0d1ca4f4 100644
--- a/bfd/corefile.c
+++ b/bfd/corefile.c
@@ -186,6 +186,6 @@ generic_core_file_matches_executable_p (bfd *core_bfd, bfd *exec_bfd)
if (last_slash != NULL)
exec = last_slash + 1;
- return strcmp (exec, core) == 0;
+ return filename_cmp (exec, core) == 0;
}
diff --git a/bfd/elf32-bfin.c b/bfd/elf32-bfin.c
index 8aba7edfe40..40c2c0446b0 100644
--- a/bfd/elf32-bfin.c
+++ b/bfd/elf32-bfin.c
@@ -3103,10 +3103,10 @@ bfinfdpic_relocate_section (bfd * output_bfd,
if (silence_segment_error == 1)
silence_segment_error =
(strlen (input_bfd->filename) == 6
- && strcmp (input_bfd->filename, "crt0.o") == 0)
+ && filename_cmp (input_bfd->filename, "crt0.o") == 0)
|| (strlen (input_bfd->filename) > 6
- && strcmp (input_bfd->filename
- + strlen (input_bfd->filename) - 7,
+ && filename_cmp (input_bfd->filename
+ + strlen (input_bfd->filename) - 7,
"/crt0.o") == 0)
? -1 : 0;
#endif
diff --git a/bfd/elf32-frv.c b/bfd/elf32-frv.c
index bce05403af9..8cd26f14b5b 100644
--- a/bfd/elf32-frv.c
+++ b/bfd/elf32-frv.c
@@ -3957,10 +3957,10 @@ elf32_frv_relocate_section (output_bfd, info, input_bfd, input_section,
if (silence_segment_error == 1)
silence_segment_error =
(strlen (input_bfd->filename) == 6
- && strcmp (input_bfd->filename, "crt0.o") == 0)
+ && filename_cmp (input_bfd->filename, "crt0.o") == 0)
|| (strlen (input_bfd->filename) > 6
- && strcmp (input_bfd->filename
- + strlen (input_bfd->filename) - 7,
+ && filename_cmp (input_bfd->filename
+ + strlen (input_bfd->filename) - 7,
"/crt0.o") == 0)
? -1 : 0;
if (!silence_segment_error
diff --git a/bfd/elf32-spu.c b/bfd/elf32-spu.c
index bcee155fdda..ae3ed10c4ed 100644
--- a/bfd/elf32-spu.c
+++ b/bfd/elf32-spu.c
@@ -4067,7 +4067,7 @@ sort_bfds (const void *a, const void *b)
bfd *const *abfd1 = a;
bfd *const *abfd2 = b;
- return strcmp ((*abfd1)->filename, (*abfd2)->filename);
+ return filename_cmp ((*abfd1)->filename, (*abfd2)->filename);
}
static unsigned int
@@ -4299,7 +4299,7 @@ spu_elf_auto_overlay (struct bfd_link_info *info)
qsort (bfd_arr, bfd_count, sizeof (*bfd_arr), sort_bfds);
for (i = 1; i < bfd_count; ++i)
- if (strcmp (bfd_arr[i - 1]->filename, bfd_arr[i]->filename) == 0)
+ if (filename_cmp (bfd_arr[i - 1]->filename, bfd_arr[i]->filename) == 0)
{
if (bfd_arr[i - 1]->my_archive == bfd_arr[i]->my_archive)
{
diff --git a/bfd/syms.c b/bfd/syms.c
index 1f25d33815c..e819eae16d6 100644
--- a/bfd/syms.c
+++ b/bfd/syms.c
@@ -1386,8 +1386,8 @@ _bfd_stab_section_find_nearest_line (bfd *abfd,
dirlen = strlen (directory_name);
if (info->filename == NULL
- || strncmp (info->filename, directory_name, dirlen) != 0
- || strcmp (info->filename + dirlen, file_name) != 0)
+ || filename_ncmp (info->filename, directory_name, dirlen) != 0
+ || filename_cmp (info->filename + dirlen, file_name) != 0)
{
size_t len;
diff --git a/bfd/xcofflink.c b/bfd/xcofflink.c
index d3e9043dc3f..7ff920aeaaf 100644
--- a/bfd/xcofflink.c
+++ b/bfd/xcofflink.c
@@ -758,9 +758,9 @@ xcoff_set_import_path (struct bfd_link_info *info,
*pp != NULL;
pp = &(*pp)->next, ++c)
{
- if (strcmp ((*pp)->path, imppath) == 0
- && strcmp ((*pp)->file, impfile) == 0
- && strcmp ((*pp)->member, impmember) == 0)
+ if (filename_cmp ((*pp)->path, imppath) == 0
+ && filename_cmp ((*pp)->file, impfile) == 0
+ && filename_cmp ((*pp)->member, impmember) == 0)
break;
}
diff --git a/bfd/xtensa-isa.c b/bfd/xtensa-isa.c
index 26deaaa7eac..ba7408f6a15 100644
--- a/bfd/xtensa-isa.c
+++ b/bfd/xtensa-isa.c
@@ -1364,7 +1364,7 @@ xtensa_regfile_lookup (xtensa_isa isa, const char *name)
/* The expected number of regfiles is small; use a linear search. */
for (n = 0; n < intisa->num_regfiles; n++)
{
- if (!strcmp (intisa->regfiles[n].name, name))
+ if (!filename_cmp (intisa->regfiles[n].name, name))
return n;
}
@@ -1394,7 +1394,7 @@ xtensa_regfile_lookup_shortname (xtensa_isa isa, const char *shortname)
as their parents. */
if (intisa->regfiles[n].parent != n)
continue;
- if (!strcmp (intisa->regfiles[n].shortname, shortname))
+ if (!filename_cmp (intisa->regfiles[n].shortname, shortname))
return n;
}
diff --git a/include/ChangeLog b/include/ChangeLog
index bbba3876818..fa904c7ed91 100644
--- a/include/ChangeLog
+++ b/include/ChangeLog
@@ -1,3 +1,7 @@
+2011-02-28 Kai Tietz <kai.tietz@onevision.com>
+
+ * filenames.h (filename_ncmp): New prototype.
+
2011-02-23 Kai Tietz <kai.tietz@onevision.com>
* dwarf2.h (_ELF_DWARF2_H): Renamed to
diff --git a/include/filenames.h b/include/filenames.h
index ca23d325314..d4955df661c 100644
--- a/include/filenames.h
+++ b/include/filenames.h
@@ -73,6 +73,9 @@ extern "C" {
extern int filename_cmp (const char *s1, const char *s2);
#define FILENAME_CMP(s1, s2) filename_cmp(s1, s2)
+extern int filename_ncmp (const char *s1, const char *s2,
+ size_t n);
+
#ifdef __cplusplus
}
#endif
diff --git a/libiberty/ChangeLog b/libiberty/ChangeLog
index da4b2be6b9d..dc926382a8e 100644
--- a/libiberty/ChangeLog
+++ b/libiberty/ChangeLog
@@ -1,3 +1,8 @@
+2011-02-28 Kai Tietz <kai.tietz@onevision.com>
+
+ * filename_cmp.c (filename_ncmp): New function.
+ * functions.texi: Regenerated.
+
2011-02-03 Ralf Wildenhues <Ralf.Wildenhues@gmx.de>
* splay-tree.c: Escape wrapping newlines in texinfo markup
diff --git a/libiberty/filename_cmp.c b/libiberty/filename_cmp.c
index 0a4d0d85091..0eed12086bf 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
+}
diff --git a/libiberty/functions.texi b/libiberty/functions.texi
index f6d0a23f1e6..c9df186be0f 100644
--- a/libiberty/functions.texi
+++ b/libiberty/functions.texi
@@ -296,6 +296,24 @@ and backward slashes are equal.
@end deftypefn
+@c filename_cmp.c:81
+@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
+
@c fnmatch.txh:1
@deftypefn Replacement int fnmatch (const char *@var{pattern}, @
const char *@var{string}, int @var{flags})