X-Git-Url: https://ncurses.scripts.mit.edu/?a=blobdiff_plain;f=ncurses%2Ftinfo%2Fcomp_hash.c;h=e120e3a7413fc0c30d13b087d8b7e676809a02ab;hb=d803343ca3e2a419085e76fc9f04a6fbd14498b8;hp=b7fbd06163454d8436e8599ee04d002aeb546e09;hpb=11ca5f62994c7a14c4e500510bd242e1e721f8be;p=ncurses.git diff --git a/ncurses/tinfo/comp_hash.c b/ncurses/tinfo/comp_hash.c index b7fbd061..e120e3a7 100644 --- a/ncurses/tinfo/comp_hash.c +++ b/ncurses/tinfo/comp_hash.c @@ -1,5 +1,5 @@ /**************************************************************************** - * Copyright (c) 1998-2007,2008 Free Software Foundation, Inc. * + * Copyright (c) 1998-2008,2009 Free Software Foundation, Inc. * * * * Permission is hereby granted, free of charge, to any person obtaining a * * copy of this software and associated documentation files (the * @@ -50,7 +50,7 @@ #define DEBUG(level, params) /*nothing */ #endif -MODULE_ID("$Id: comp_hash.c,v 1.36 2008/08/16 17:06:53 tom Exp $") +MODULE_ID("$Id: comp_hash.c,v 1.45 2009/07/18 20:30:21 tom Exp $") static int hash_function(const char *); @@ -91,8 +91,7 @@ _nc_make_hash_table(struct name_table_entry *table, hash_table[hashvalue] = i; } - DEBUG(4, ("Hash table complete: %d collisions out of %d entries", - collisions, CAPTABSIZE)); + printf("/* %d collisions out of %d entries */\n", collisions, CAPTABSIZE); } #endif @@ -121,16 +120,24 @@ hash_function(const char *string) return (int) (sum % HASHTABSIZE); } +#ifndef MAIN_PROGRAM + +#define SameName(a,b,termcap) (termcap ? !strncmp(a,b,2) : !strcmp(a,b)) +#if 0 +static bool +same_name(const char *a, const char *b, bool termcap) +{ + fprintf(stderr, "compare(%s,%s)\n", a, b); + return SameName(a, b, termcap); +} +#else +#define same_name(a,b,termcap) SameName(a,b,termcap) +#endif + /* - * struct name_table_entry * - * find_entry(string) - * - * Finds the entry for the given string in the hash table if present. - * Returns a pointer to the entry in the table or 0 if not found. - * + * Finds the entry for the given string in the hash table if present. + * Returns a pointer to the entry in the table or 0 if not found. */ - -#ifndef MAIN_PROGRAM NCURSES_EXPORT(struct name_table_entry const *) _nc_find_entry(const char *string, const short *hash_table) @@ -142,11 +149,15 @@ _nc_find_entry(const char *string, hashvalue = hash_function(string); if (hash_table[hashvalue] >= 0) { - real_table = _nc_get_table(hash_table != _nc_get_hash_table(FALSE)); + bool termcap = (hash_table != _nc_get_hash_table(FALSE)); + + real_table = _nc_get_table(termcap); ptr = real_table + hash_table[hashvalue]; - while (strcmp(ptr->nte_name, string) != 0) { - if (ptr->nte_link < 0) - return 0; + while (!same_name(ptr->nte_name, string, termcap)) { + if (ptr->nte_link < 0) { + ptr = 0; + break; + } ptr = real_table + (ptr->nte_link + hash_table[HASHTABSIZE]); } } @@ -155,29 +166,36 @@ _nc_find_entry(const char *string, } /* - * struct name_table_entry * - * find_type_entry(string, type, table) + * Finds the entry for the given name with the given type in the given table if + * present (as distinct from _nc_find_entry, which finds the last entry + * regardless of type). * - * Finds the first entry for the given name with the given type in the - * given table if present (as distinct from find_entry, which finds the - * the last entry regardless of type). You can use this if you detect - * a name clash. It's slower, though. Returns a pointer to the entry - * in the table or 0 if not found. + * Returns a pointer to the entry in the table or 0 if not found. */ - NCURSES_EXPORT(struct name_table_entry const *) _nc_find_type_entry(const char *string, int type, - const struct name_table_entry *table) + bool termcap) { - struct name_table_entry const *ptr; + struct name_table_entry const *ptr = NULL; + const short *hash_table = _nc_get_hash_table(termcap); + int hashvalue = hash_function(string); - for (ptr = table; ptr < table + CAPTABSIZE; ptr++) { - if (ptr->nte_type == type && strcmp(string, ptr->nte_name) == 0) - return (ptr); + if (hash_table[hashvalue] >= 0) { + const struct name_table_entry *const table = _nc_get_table(termcap); + + ptr = table + hash_table[hashvalue]; + while (ptr->nte_type != type + || !same_name(ptr->nte_name, string, termcap)) { + if (ptr->nte_link < 0) { + ptr = 0; + break; + } + ptr = table + (ptr->nte_link + hash_table[HASHTABSIZE]); + } } - return ((struct name_table_entry *) NULL); + return ptr; } #endif