diff options
-rw-r--r-- | include/ChangeLog | 5 | ||||
-rw-r--r-- | include/filenames.h | 6 | ||||
-rw-r--r-- | libiberty/ChangeLog | 4 | ||||
-rw-r--r-- | libiberty/filename_cmp.c | 49 |
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; +} |