=================================================================== RCS file: /cvs/mandoc/Attic/mdoc_hash.c,v retrieving revision 1.5 retrieving revision 1.11 diff -u -p -r1.5 -r1.11 --- mandoc/Attic/mdoc_hash.c 2009/06/16 19:55:28 1.5 +++ mandoc/Attic/mdoc_hash.c 2009/09/17 07:41:28 1.11 @@ -1,4 +1,4 @@ -/* $Id: mdoc_hash.c,v 1.5 2009/06/16 19:55:28 kristaps Exp $ */ +/* $Id: mdoc_hash.c,v 1.11 2009/09/17 07:41:28 kristaps Exp $ */ /* * Copyright (c) 2008, 2009 Kristaps Dzonsons * @@ -14,159 +14,75 @@ * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */ +#include + #include #include +#include #include #include #include #include "libmdoc.h" +static u_char table[27 * 12]; + /* - * 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). + * XXX - this hash has global scope, so if intended for use as a library + * with multiple callers, it will need re-invocation protection. */ - void -mdoc_hash_free(void *htab) +mdoc_hash_init(void) { + int i, j, major; + const char *p; - free(htab); -} + memset(table, UCHAR_MAX, sizeof(table)); - -void * -mdoc_hash_alloc(void) -{ - int i, major, minor, ind; - const void **htab; - - htab = calloc(27 * 26 * 3, sizeof(struct mdoc_macro *)); - if (NULL == htab) - return(NULL); - for (i = 0; i < MDOC_MAX; i++) { - major = mdoc_macronames[i][0]; - assert((major >= 65 && major <= 90) || - major == 37); + p = mdoc_macronames[i]; - if (major == 37) - major = 0; + if (isalpha((u_char)p[1])) + major = 12 * (tolower((u_char)p[1]) - 97); else - major -= 64; + major = 12 * 26; - minor = mdoc_macronames[i][1]; - assert((minor >= 65 && minor <= 90) || - (minor == 49) || - (minor >= 97 && minor <= 122)); + for (j = 0; j < 12; j++) + if (UCHAR_MAX == table[major + j]) { + table[major + j] = (u_char)i; + break; + } - if (minor == 49) - minor = 0; - else if (minor <= 90) - minor -= 65; - else - minor -= 97; - - assert(major >= 0 && major < 27); - assert(minor >= 0 && minor < 26); - - ind = (major * 27 * 3) + (minor * 3); - - if (NULL == htab[ind]) { - htab[ind] = &mdoc_macros[i]; - continue; - } - - if (NULL == htab[++ind]) { - htab[ind] = &mdoc_macros[i]; - continue; - } - - assert(NULL == htab[++ind]); - htab[ind] = &mdoc_macros[i]; + assert(j < 12); } - - return((void *)htab); } - int -mdoc_hash_find(const void *arg, const char *tmp) +mdoc_hash_find(const char *p) { - int major, minor, ind, slot; - const void **htab; + int major, i, j; - htab = /* LINTED */ - (const void **)arg; - - if (0 == tmp[0] || 0 == tmp[1]) + if (0 == p[0]) return(MDOC_MAX); - if (tmp[2] && tmp[3]) + if ( ! isalpha((u_char)p[0]) && '%' != p[0]) return(MDOC_MAX); - if ( ! (tmp[0] == 37 || (tmp[0] >= 65 && tmp[0] <= 90))) + if (isalpha((u_char)p[1])) + major = 12 * (tolower((u_char)p[1]) - 97); + else if ('1' == p[1]) + major = 12 * 26; + else return(MDOC_MAX); - if ( ! ((tmp[1] >= 65 && tmp[1] <= 90) || - (tmp[1] == 49) || - (tmp[1] >= 97 && tmp[1] <= 122))) + if (p[2] && p[3]) return(MDOC_MAX); - if (tmp[0] == 37) - major = 0; - else - major = tmp[0] - 64; - - if (tmp[1] == 49) - minor = 0; - else if (tmp[1] <= 90) - minor = tmp[1] - 65; - else - minor = tmp[1] - 97; - - ind = (major * 27 * 3) + (minor * 3); - if (ind < 0 || ind >= (27 * 26 * 3)) - return(MDOC_MAX); - - if (htab[ind]) { - slot = htab[ind] - /* LINTED */ - (void *)mdoc_macros; - assert(0 == (size_t)slot % sizeof(struct mdoc_macro)); - slot /= sizeof(struct mdoc_macro); - if (mdoc_macronames[slot][0] == tmp[0] && - mdoc_macronames[slot][1] == tmp[1] && - (0 == tmp[2] || - mdoc_macronames[slot][2] == tmp[2])) - return(slot); - ind++; + for (j = 0; j < 12; j++) { + if (UCHAR_MAX == (i = table[major + j])) + break; + if (0 == strcmp(p, mdoc_macronames[i])) + return(i); } - if (htab[ind]) { - slot = htab[ind] - /* LINTED */ - (void *)mdoc_macros; - assert(0 == (size_t)slot % sizeof(struct mdoc_macro)); - slot /= sizeof(struct mdoc_macro); - if (mdoc_macronames[slot][0] == tmp[0] && - mdoc_macronames[slot][1] == tmp[1] && - (0 == tmp[2] || - mdoc_macronames[slot][2] == tmp[2])) - return(slot); - ind++; - } - - if (NULL == htab[ind]) - return(MDOC_MAX); - slot = htab[ind] - /* LINTED */ - (void *)mdoc_macros; - assert(0 == (size_t)slot % sizeof(struct mdoc_macro)); - slot /= sizeof(struct mdoc_macro); - if (mdoc_macronames[slot][0] == tmp[0] && - mdoc_macronames[slot][1] == tmp[1] && - (0 == tmp[2] || - mdoc_macronames[slot][2] == tmp[2])) - return(slot); - return(MDOC_MAX); } -