summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--include/ChangeLog5
-rw-r--r--include/filenames.h6
-rw-r--r--libiberty/ChangeLog4
-rw-r--r--libiberty/filename_cmp.c49
4 files changed, 64 insertions, 0 deletions
diff --git a/include/ChangeLog b/include/ChangeLog
index 08e1a793d01..38e30cf89f8 100644
--- a/include/ChangeLog
+++ b/include/ChangeLog
@@ -1,3 +1,8 @@
+2012-07-13 Doug Evans <dje@google.com>
+
+ * filenames.h: #include "hashtab.h".
+ (filename_hash, filename_eq): Declare.
+
2012-07-13 Andreas Krebbel <Andreas.Krebbel@de.ibm.com>
* elf/s390.h (START_RELOC_NUMBERS): Define R_390_IRELATIVE reloc.
diff --git a/include/filenames.h b/include/filenames.h
index 75ec3302d1d..e799a51b6ad 100644
--- a/include/filenames.h
+++ b/include/filenames.h
@@ -26,6 +26,8 @@ Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, MA 02110-1301, USA.
#ifndef FILENAMES_H
#define FILENAMES_H
+#include "hashtab.h" /* for hashval_t */
+
#ifdef __cplusplus
extern "C" {
#endif
@@ -84,6 +86,10 @@ extern int filename_cmp (const char *s1, const char *s2);
extern int filename_ncmp (const char *s1, const char *s2,
size_t n);
+extern hashval_t filename_hash (const void *s);
+
+extern int filename_eq (const void *s1, const void *s2);
+
#ifdef __cplusplus
}
#endif
diff --git a/libiberty/ChangeLog b/libiberty/ChangeLog
index 9628e2c4ae3..4ece5ab7474 100644
--- a/libiberty/ChangeLog
+++ b/libiberty/ChangeLog
@@ -1,3 +1,7 @@
+2012-07-13 Doug Evans <dje@google.com>
+
+ * filename_cmp.c (filename_hash, filename_eq): New functions.
+
2012-06-29 Andreas Schwab <schwab@linux-m68k.org>
* copying-lib.texi (Library Copying): Don't use @heading inside
diff --git a/libiberty/filename_cmp.c b/libiberty/filename_cmp.c
index 5179f8dd14f..9e16d242086 100644
--- a/libiberty/filename_cmp.c
+++ b/libiberty/filename_cmp.c
@@ -141,3 +141,52 @@ filename_ncmp (const char *s1, const char *s2, size_t n)
return 0;
#endif
}
+
+/*
+
+@deftypefn Extension hashval_t filename_hash (const void *@var{s})
+
+Return the hash value for file name @var{s} that will be compared
+using filename_cmp.
+This function is for use with hashtab.c hash tables.
+
+@end deftypefn
+
+*/
+
+hashval_t
+filename_hash (const void *s)
+{
+ /* The cast is for -Wc++-compat. */
+ const unsigned char *str = (const unsigned char *) s;
+ hashval_t r = 0;
+ unsigned char c;
+
+ while ((c = *str++) != 0)
+ {
+ if (c == '\\')
+ c = '/';
+ c = TOLOWER (c);
+ r = r * 67 + c - 113;
+ }
+
+ return r;
+}
+
+/*
+
+@deftypefn Extension int filename_eq (const void *@var{s1}, const void *@var{s2})
+
+Return non-zero if file names @var{s1} and @var{s2} are equivalent.
+This function is for use with hashtab.c hash tables.
+
+@end deftypefn
+
+*/
+
+int
+filename_eq (const void *s1, const void *s2)
+{
+ /* The casts are for -Wc++-compat. */
+ return filename_cmp ((const char *) s1, (const char *) s2) == 0;
+}