version 1.1, 2008/12/15 01:54:58 |
version 1.5, 2009/01/20 13:44:05 |
|
|
|
|
#include "private.h" |
#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 |
void |
mdoc_hash_free(void *htab) |
mdoc_tokhash_free(void *htab) |
{ |
{ |
|
|
free(htab); |
free(htab); |
Line 35 mdoc_hash_free(void *htab) |
|
Line 41 mdoc_hash_free(void *htab) |
|
|
|
|
|
void * |
void * |
mdoc_hash_alloc(void) |
mdoc_tokhash_alloc(void) |
{ |
{ |
int i, major, minor, index; |
int i, major, minor, ind; |
const void **htab; |
const void **htab; |
|
|
htab = calloc(27 * 26, sizeof(struct mdoc_macro *)); |
htab = calloc(27 * 26, sizeof(struct mdoc_macro *)); |
Line 69 mdoc_hash_alloc(void) |
|
Line 75 mdoc_hash_alloc(void) |
|
assert(major >= 0 && major < 27); |
assert(major >= 0 && major < 27); |
assert(minor >= 0 && minor < 26); |
assert(minor >= 0 && minor < 26); |
|
|
index = (major * 27) + minor; |
ind = (major * 27) + minor; |
|
|
assert(NULL == htab[index]); |
assert(NULL == htab[ind]); |
htab[index] = &mdoc_macros[i]; |
htab[ind] = &mdoc_macros[i]; |
} |
} |
|
|
return((void *)htab); |
return((void *)htab); |
Line 80 mdoc_hash_alloc(void) |
|
Line 86 mdoc_hash_alloc(void) |
|
|
|
|
|
int |
int |
mdoc_hash_find(const void *arg, const char *tmp) |
mdoc_tokhash_find(const void *arg, const char *tmp) |
{ |
{ |
int major, minor, index, slot; |
int major, minor, ind, slot; |
const void **htab; |
const void **htab; |
|
|
htab = (const void **)arg; |
htab = /* LINTED */ |
|
(const void **)arg; |
|
|
if (0 == tmp[0] || 0 == tmp[1]) |
if (0 == tmp[0] || 0 == tmp[1]) |
return(MDOC_MAX); |
return(MDOC_MAX); |
Line 110 mdoc_hash_find(const void *arg, const char *tmp) |
|
Line 117 mdoc_hash_find(const void *arg, const char *tmp) |
|
else |
else |
minor = tmp[1] - 97; |
minor = tmp[1] - 97; |
|
|
index = (major * 27) + minor; |
ind = (major * 27) + minor; |
|
if (ind < 0 || ind >= (27 * 26)) |
|
return(MDOC_MAX); |
|
|
if (NULL == htab[index]) |
if (NULL == htab[ind]) |
return(MDOC_MAX); |
return(MDOC_MAX); |
|
|
slot = htab[index] - (void *)mdoc_macros; |
slot = htab[ind] - /* LINTED */ |
assert(0 == slot % sizeof(struct mdoc_macro)); |
(void *)mdoc_macros; |
|
assert(0 == (size_t)slot % sizeof(struct mdoc_macro)); |
slot /= sizeof(struct mdoc_macro); |
slot /= sizeof(struct mdoc_macro); |
|
|
if (0 != strcmp(mdoc_macronames[slot], tmp)) |
if (0 != strcmp(mdoc_macronames[slot], tmp)) |