diff options
-rw-r--r-- | include/ChangeLog | 5 | ||||
-rw-r--r-- | include/filenames.h | 7 | ||||
-rw-r--r-- | libiberty/ChangeLog | 8 | ||||
-rw-r--r-- | libiberty/Makefile.in | 16 | ||||
-rw-r--r-- | libiberty/filename_cmp.c | 73 | ||||
-rw-r--r-- | libiberty/functions.texi | 16 |
6 files changed, 117 insertions, 8 deletions
diff --git a/include/ChangeLog b/include/ChangeLog index 75c4753..269409c 100644 --- a/include/ChangeLog +++ b/include/ChangeLog @@ -1,3 +1,8 @@ +2007-03-29 Joel Brobecker <brobecker@adacore.com> + + * filenames.h (FILENAME_CMP): Adjust define to call filename_cmp + regardless of the type of file system. + 2007-03-06 Jan Hubicka <jh@suse.cz> * ansidecl.h (ATTRIBUTE_COLD, ATTRIBUTE_HOT): New. diff --git a/include/filenames.h b/include/filenames.h index 6b72fd2..5338208 100644 --- a/include/filenames.h +++ b/include/filenames.h @@ -5,7 +5,7 @@ use forward- and back-slash in path names interchangeably, and some of them have case-insensitive file names. - Copyright 2000, 2001 Free Software Foundation, Inc. + Copyright 2000, 2001, 2007 Free Software Foundation, Inc. This file is part of BFD, the Binary File Descriptor library. @@ -38,14 +38,15 @@ Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, MA 02110-1301, USA. want to know whether to prepend the current working directory to a file name, which should not be done with a name like d:foo. */ #define IS_ABSOLUTE_PATH(f) (IS_DIR_SEPARATOR((f)[0]) || (((f)[0]) && ((f)[1] == ':'))) -#define FILENAME_CMP(s1, s2) strcasecmp(s1, s2) #else /* not DOSish */ #define IS_DIR_SEPARATOR(c) ((c) == '/') #define IS_ABSOLUTE_PATH(f) (IS_DIR_SEPARATOR((f)[0])) -#define FILENAME_CMP(s1, s2) strcmp(s1, s2) #endif /* not DOSish */ +extern int filename_cmp (const char *s1, const char *s2); +#define FILENAME_CMP(s1, s2) filename_cmp(s1, s2) + #endif /* FILENAMES_H */ diff --git a/libiberty/ChangeLog b/libiberty/ChangeLog index 5c2f527..006c354 100644 --- a/libiberty/ChangeLog +++ b/libiberty/ChangeLog @@ -1,3 +1,11 @@ +2007-03-29 Joel Brobecker <brobecker@adacore.com> + + * filename_cmp.c: New file. + * Makefile.in (CFILES): Add filename_cmp.c. + (REQUIRED_OFILES): Add filename_cmp.o + (filename_cmp.o): New rule. + * functions.texi: Regenerate. + 2007-03-15 Geoffrey Keating <geoffk@apple.com> * cp-demangle.c (d_encoding): Exit early on error. diff --git a/libiberty/Makefile.in b/libiberty/Makefile.in index 90686f0..4f5e215 100644 --- a/libiberty/Makefile.in +++ b/libiberty/Makefile.in @@ -1,6 +1,6 @@ # # Makefile -# Copyright (C) 1990, 91-99, 2000, 2001, 2002, 2003, 2004, 2005, 2006 +# Copyright (C) 1990, 91-99, 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007 # Free Software Foundation # # This file is part of the libiberty library. @@ -131,8 +131,8 @@ CFILES = alloca.c argv.c asprintf.c atexit.c \ calloc.c choose-temp.c clock.c concat.c cp-demangle.c \ cp-demint.c cplus-dem.c \ dyn-string.c \ - fdmatch.c ffs.c fibheap.c floatformat.c fnmatch.c \ - fopen_unlocked.c \ + fdmatch.c ffs.c fibheap.c filename_cmp.c floatformat.c \ + fnmatch.c fopen_unlocked.c \ getcwd.c getopt.c getopt1.c getpagesize.c getpwd.c getruntime.c \ gettimeofday.c \ hashtab.c hex.c \ @@ -165,8 +165,8 @@ REQUIRED_OFILES = ./regex.o ./cplus-dem.o ./cp-demangle.o ./md5.o \ ./alloca.o ./argv.o \ ./choose-temp.o ./concat.o ./cp-demint.o \ ./dyn-string.o \ - ./fdmatch.o ./fibheap.o ./floatformat.o ./fnmatch.o \ - ./fopen_unlocked.o \ + ./fdmatch.o ./fibheap.o ./filename_cmp.o ./floatformat.o \ + ./fnmatch.o ./fopen_unlocked.o \ ./getopt.o ./getopt1.o ./getpwd.o ./getruntime.o \ ./hashtab.o ./hex.o \ ./lbasename.o ./lrealpath.o \ @@ -651,6 +651,12 @@ $(CONFIGURED_OFILES): stamp-picdir else true; fi $(COMPILE.c) $(srcdir)/fibheap.c $(OUTPUT_OPTION) +./filename_cmp.o: $(srcdir)/filename_cmp.c $(INCDIR)/filenames.h + if [ x"$(PICFLAG)" != x ]; then \ + $(COMPILE.c) $(PICFLAG) $(srcdir)/filename_cmp.c -o pic/$@; \ + else true; fi + $(COMPILE.c) $(srcdir)/filename_cmp.c $(OUTPUT_OPTION) + ./floatformat.o: $(srcdir)/floatformat.c config.h $(INCDIR)/ansidecl.h \ $(INCDIR)/floatformat.h $(INCDIR)/libiberty.h if [ x"$(PICFLAG)" != x ]; then \ diff --git a/libiberty/filename_cmp.c b/libiberty/filename_cmp.c new file mode 100644 index 0000000..5e12c82 --- /dev/null +++ b/libiberty/filename_cmp.c @@ -0,0 +1,73 @@ +/* File name comparison routine. + + Copyright (C) 2007 Free Software Foundation, Inc. + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2, or (at your option) + any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software Foundation, + Inc., 51 Franklin Street - Fifth Floor, Boston, MA 02110-1301, USA. */ + +#ifdef HAVE_STRING_H +#include <string.h> +#endif + +#include <ctype.h> +#include "filenames.h" + +/* + +@deftypefn Extension int filename_cmp (const char *@var{s1}, const char *@var{s2}) + +Return zero if the two paths @var{s1} and @var{s2} are equivalent. +If not equivalent, the returned value is similar to what strcmp 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 path 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_cmp (const char *s1, const char *s2) +{ +#ifndef HAVE_DOS_BASED_FILE_SYSTEM + return strcmp(s1, s2); +#else + for (;;) + { + 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 != c2) + return (c1 - c2); + + if (c1 == '\0') + return 0; + + s1++; + s2++; + } +#endif +} + diff --git a/libiberty/functions.texi b/libiberty/functions.texi index 9f49ff4..fd3e8e7 100644 --- a/libiberty/functions.texi +++ b/libiberty/functions.texi @@ -268,6 +268,22 @@ value 1). If @var{valu} is zero, zero is returned. @end deftypefn +@c filename_cmp.c:28 +@deftypefn Extension int filename_cmp (const char *@var{s1}, const char *@var{s2}) + +Return zero if the two paths @var{s1} and @var{s2} are equivalent. +If not equivalent, the returned value is similar to what strcmp 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 path 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}) |