diff options
-rw-r--r-- | bfd/ChangeLog | 15 | ||||
-rw-r--r-- | bfd/archive.c | 10 | ||||
-rw-r--r-- | bfd/corefile.c | 2 | ||||
-rw-r--r-- | bfd/elf32-bfin.c | 6 | ||||
-rw-r--r-- | bfd/elf32-frv.c | 6 | ||||
-rw-r--r-- | bfd/elf32-spu.c | 4 | ||||
-rw-r--r-- | bfd/syms.c | 4 | ||||
-rw-r--r-- | bfd/xcofflink.c | 6 | ||||
-rw-r--r-- | bfd/xtensa-isa.c | 4 | ||||
-rw-r--r-- | include/ChangeLog | 4 | ||||
-rw-r--r-- | include/filenames.h | 3 | ||||
-rw-r--r-- | libiberty/ChangeLog | 5 | ||||
-rw-r--r-- | libiberty/filename_cmp.c | 49 | ||||
-rw-r--r-- | libiberty/functions.texi | 18 |
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}) |