version 1.3, 2008/12/23 05:30:49 |
version 1.8, 2009/03/08 20:29:45 |
|
|
|
|
#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_tokhash_free(void *htab) |
mdoc_tokhash_free(void *htab) |
Line 90 mdoc_tokhash_find(const void *arg, const char *tmp) |
|
Line 95 mdoc_tokhash_find(const void *arg, const char *tmp) |
|
|
|
if (0 == tmp[0] || 0 == tmp[1]) |
if (0 == tmp[0] || 0 == tmp[1]) |
return(MDOC_MAX); |
return(MDOC_MAX); |
|
if (tmp[2] && tmp[3]) |
|
return(MDOC_MAX); |
|
|
if ( ! (tmp[0] == 37 || (tmp[0] >= 65 && tmp[0] <= 90))) |
if ( ! (tmp[0] == 37 || (tmp[0] >= 65 && tmp[0] <= 90))) |
return(MDOC_MAX); |
return(MDOC_MAX); |
Line 112 mdoc_tokhash_find(const void *arg, const char *tmp) |
|
Line 119 mdoc_tokhash_find(const void *arg, const char *tmp) |
|
minor = tmp[1] - 97; |
minor = tmp[1] - 97; |
|
|
ind = (major * 27) + minor; |
ind = (major * 27) + minor; |
|
if (ind < 0 || ind >= (27 * 26)) |
|
return(MDOC_MAX); |
|
|
if (NULL == htab[ind]) |
if (NULL == htab[ind]) |
return(MDOC_MAX); |
return(MDOC_MAX); |
Line 121 mdoc_tokhash_find(const void *arg, const char *tmp) |
|
Line 130 mdoc_tokhash_find(const void *arg, const char *tmp) |
|
assert(0 == (size_t)slot % sizeof(struct mdoc_macro)); |
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 == tmp[2]) |
return(MDOC_MAX); |
return(slot); |
return(slot); |
|
|
assert(0 == tmp[3]); |
|
return(tmp[2] == mdoc_macronames[slot][2] ? slot : MDOC_MAX); |
} |
} |
|
|