]> git.cameronkatri.com Git - mandoc.git/blobdiff - hash.c
mdocterm now using new API.
[mandoc.git] / hash.c
diff --git a/hash.c b/hash.c
index d10f1b228b8a3172c4defbcf2235b1932d1fd8ad..cee663320c47c11abf5c88a150ccd2fbdc761c20 100644 (file)
--- a/hash.c
+++ b/hash.c
@@ -1,4 +1,4 @@
-/* $Id: hash.c,v 1.2 2008/12/15 02:23:12 kristaps Exp $ */
+/* $Id: hash.c,v 1.7 2009/03/08 11:41:22 kristaps Exp $ */
 /*
  * Copyright (c) 2008 Kristaps Dzonsons <kristaps@kth.se>
  *
 
 #include "private.h"
 
+/*
+ * Routines for the perfect-hash hashtable used by the parser to look up
+ * tokens by their string-ified names (`.Fl' -> MDOC_Fl).  The
+ * allocation penalty for this is 27 * 26 * sizeof(ptr). 
+ */
 
 void
-mdoc_hash_free(void *htab)
+mdoc_tokhash_free(void *htab)
 {
 
        free(htab);
@@ -35,7 +40,7 @@ mdoc_hash_free(void *htab)
 
 
 void *
-mdoc_hash_alloc(void)
+mdoc_tokhash_alloc(void)
 {
        int               i, major, minor, ind;
        const void      **htab;
@@ -80,7 +85,7 @@ mdoc_hash_alloc(void)
 
 
 int
-mdoc_hash_find(const void *arg, const char *tmp)
+mdoc_tokhash_find(const void *arg, const char *tmp)
 {
        int               major, minor, ind, slot;
        const void      **htab;
@@ -112,6 +117,8 @@ mdoc_hash_find(const void *arg, const char *tmp)
                minor = tmp[1] - 97;
 
        ind = (major * 27) + minor;
+       if (ind < 0 || ind >= (27 * 26))
+               return(MDOC_MAX);
 
        if (NULL == htab[ind])
                return(MDOC_MAX);
@@ -121,6 +128,11 @@ mdoc_hash_find(const void *arg, const char *tmp)
        assert(0 == (size_t)slot % sizeof(struct mdoc_macro));
        slot /= sizeof(struct mdoc_macro);
 
+       /* 
+        * FIXME: is this necessary, or do we only need to check the
+        * remaining characters (2+)? 
+        */
+
        if (0 != strcmp(mdoc_macronames[slot], tmp))
                return(MDOC_MAX);
        return(slot);