+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
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);
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;
/* 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;
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)))
{
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))
if (last_slash != NULL)
exec = last_slash + 1;
- return strcmp (exec, core) == 0;
+ return filename_cmp (exec, core) == 0;
}
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
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
bfd *const *abfd1 = a;
bfd *const *abfd2 = b;
- return strcmp ((*abfd1)->filename, (*abfd2)->filename);
+ return filename_cmp ((*abfd1)->filename, (*abfd2)->filename);
}
static unsigned int
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)
{
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;
*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;
}
/* 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;
}
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;
}
+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
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
+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
#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
+}
@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})