]> ncurses.scripts.mit.edu Git - ncurses.git/blobdiff - ncurses/tinfo/comp_hash.c
ncurses 5.7 - patch 20090718
[ncurses.git] / ncurses / tinfo / comp_hash.c
index b7fbd06163454d8436e8599ee04d002aeb546e09..e120e3a7413fc0c30d13b087d8b7e676809a02ab 100644 (file)
@@ -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