Darwin has case-insensitive filesystems

HFS+, the FS on Darwin, is case insensitive. So this patch adjusts
filename_cmp.c to ignore the casing when comparing filenames on Darwin.

include/ChangeLog:

        * filenames.h (HAVE_CASE_INSENSITIVE_FILE_SYSTEM): Define
        on Darwin, as well as on the systems that use a DOS-like
        filesystem.

libiberty/ChangeLog:

        * filename_cmp.c (filename_cmp, filename_ncmp): Add handling of
        HAVE_CASE_INSENSITIVE_FILE_SYSTEM.

From-SVN: r175762
This commit is contained in:
Joel Brobecker 2011-07-01 17:51:05 +00:00 committed by Joel Brobecker
parent cb0ad10428
commit 985b34c77a
4 changed files with 41 additions and 6 deletions

View File

@ -1,3 +1,9 @@
2011-07-01 Joel Brobecker <brobecker@adacore.com>
* filenames.h (HAVE_CASE_INSENSITIVE_FILE_SYSTEM): Define
on Darwin, as well as on the systems that use a DOS-like
filesystem.
2011-06-22 Jakub Jelinek <jakub@redhat.com>
PR debug/47858

View File

@ -34,10 +34,18 @@ extern "C" {
# ifndef HAVE_DOS_BASED_FILE_SYSTEM
# define HAVE_DOS_BASED_FILE_SYSTEM 1
# endif
# ifndef HAVE_CASE_INSENSITIVE_FILE_SYSTEM
# define HAVE_CASE_INSENSITIVE_FILE_SYSTEM 1
# endif
# define HAS_DRIVE_SPEC(f) HAS_DOS_DRIVE_SPEC (f)
# define IS_DIR_SEPARATOR(c) IS_DOS_DIR_SEPARATOR (c)
# define IS_ABSOLUTE_PATH(f) IS_DOS_ABSOLUTE_PATH (f)
#else /* not DOSish */
# if defined(__APPLE__)
# ifndef HAVE_CASE_INSENSITIVE_FILE_SYSTEM
# define HAVE_CASE_INSENSITIVE_FILE_SYSTEM 1
# endif
# endif /* __APPLE__ */
# define HAS_DRIVE_SPEC(f) (0)
# define IS_DIR_SEPARATOR(c) IS_UNIX_DIR_SEPARATOR (c)
# define IS_ABSOLUTE_PATH(f) IS_UNIX_ABSOLUTE_PATH (f)

View File

@ -1,3 +1,8 @@
2011-07-01 Joel Brobecker <brobecker@adacore.com>
* filename_cmp.c (filename_cmp, filename_ncmp): Add handling of
HAVE_CASE_INSENSITIVE_FILE_SYSTEM.
2011-07-01 Jan Kratochvil <jan.kratochvil@redhat.com>
PR debug/49408

View File

@ -50,19 +50,27 @@ and backward slashes are equal.
int
filename_cmp (const char *s1, const char *s2)
{
#ifndef HAVE_DOS_BASED_FILE_SYSTEM
#if !defined(HAVE_DOS_BASED_FILE_SYSTEM) \
&& !defined(HAVE_CASE_INSENSITIVE_FILE_SYSTEM)
return strcmp(s1, s2);
#else
for (;;)
{
int c1 = TOLOWER (*s1);
int c2 = TOLOWER (*s2);
int c1 = *s1;
int c2 = *s2;
#if defined (HAVE_CASE_INSENSITIVE_FILE_SYSTEM)
c1 = TOLOWER (c1);
c2 = TOLOWER (c2);
#endif
#if defined (HAVE_DOS_BASED_FILE_SYSTEM)
/* On DOS-based file systems, the '/' and the '\' are equivalent. */
if (c1 == '/')
c1 = '\\';
if (c2 == '/')
c2 = '\\';
#endif
if (c1 != c2)
return (c1 - c2);
@ -100,21 +108,29 @@ and backward slashes are equal.
int
filename_ncmp (const char *s1, const char *s2, size_t n)
{
#ifndef HAVE_DOS_BASED_FILE_SYSTEM
#if !defined(HAVE_DOS_BASED_FILE_SYSTEM) \
&& !defined(HAVE_CASE_INSENSITIVE_FILE_SYSTEM)
return strncmp(s1, s2, n);
#else
if (!n)
return 0;
for (; n > 0; --n)
{
int c1 = TOLOWER (*s1);
int c2 = TOLOWER (*s2);
int c1 = *s1;
int c2 = *s2;
#if defined (HAVE_CASE_INSENSITIVE_FILE_SYSTEM)
c1 = TOLOWER (c1);
c2 = TOLOWER (c2);
#endif
#if defined (HAVE_DOS_BASED_FILE_SYSTEM)
/* On DOS-based file systems, the '/' and the '\' are equivalent. */
if (c1 == '/')
c1 = '\\';
if (c2 == '/')
c2 = '\\';
#endif
if (c1 == '\0' || c1 != c2)
return (c1 - c2);