From 5625aa32a7011e20289ada22bc5924810dc97ce0 Mon Sep 17 00:00:00 2001 From: Kristaps Dzonsons Date: Wed, 11 Mar 2009 00:39:58 +0000 Subject: Expanded perfect htab to use 27 * 26 * 3 space. Added Brq, Bro and Brc macros. Added lbrace and rbrace to special characters. Fixed spacing in braces. --- hash.c | 65 +++++++++++++++++++++++++++++++++++++++++++++++++---------------- 1 file changed, 49 insertions(+), 16 deletions(-) (limited to 'hash.c') diff --git a/hash.c b/hash.c index 2814755b..fe6ce6c7 100644 --- a/hash.c +++ b/hash.c @@ -1,4 +1,4 @@ -/* $Id: hash.c,v 1.9 2009/03/10 10:20:03 kristaps Exp $ */ +/* $Id: hash.c,v 1.10 2009/03/11 00:39:58 kristaps Exp $ */ /* * Copyright (c) 2008 Kristaps Dzonsons * @@ -45,7 +45,7 @@ mdoc_tokhash_alloc(void) int i, major, minor, ind; const void **htab; - htab = calloc(27 * 26, sizeof(struct mdoc_macro *)); + htab = calloc(27 * 26 * 3, sizeof(struct mdoc_macro *)); if (NULL == htab) err(1, "calloc"); @@ -74,9 +74,19 @@ mdoc_tokhash_alloc(void) assert(major >= 0 && major < 27); assert(minor >= 0 && minor < 26); - ind = (major * 27) + minor; + ind = (major * 27 * 3) + (minor * 3); - assert(NULL == htab[ind]); + 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]; } @@ -118,25 +128,48 @@ mdoc_tokhash_find(const void *arg, const char *tmp) else minor = tmp[1] - 97; - ind = (major * 27) + minor; - if (ind < 0 || ind >= (27 * 26)) + ind = (major * 27 * 3) + (minor * 3); + if (ind < 0 || ind >= (27 * 26 * 3)) return(MDOC_MAX); - if (NULL == htab[ind]) - 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++; + } + + 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); - if (mdoc_macronames[slot][0] != tmp[0]) - return(MDOC_MAX); - if (mdoc_macronames[slot][1] != tmp[1]) - return(MDOC_MAX); - if (tmp[2] && mdoc_macronames[slot][2] != tmp[2]) - return(MDOC_MAX); - - return(slot); + return(MDOC_MAX); } -- cgit v1.2.3-56-ge451