X-Git-Url: https://git.cameronkatri.com/mandoc.git/blobdiff_plain/06e820ac3b1a9f89fcc4399df3b24bc4d4df2e5f..e5226f1d3e48a679a30aa6dcec6beaccf505aecf:/hash.c diff --git a/hash.c b/hash.c index d10f1b22..cee66332 100644 --- 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 * @@ -25,9 +25,14 @@ #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);