aboutsummaryrefslogtreecommitdiffstatshomepage
path: root/hash.c
diff options
context:
space:
mode:
authorKristaps Dzonsons <kristaps@bsd.lv>2009-03-11 00:39:58 +0000
committerKristaps Dzonsons <kristaps@bsd.lv>2009-03-11 00:39:58 +0000
commit5625aa32a7011e20289ada22bc5924810dc97ce0 (patch)
treeb4ebe9ad8a6222d508f317142ec6706cc0c1f992 /hash.c
parent0bb92cdf676a4f8a32b2066037b9f54b3f587f9e (diff)
downloadmandoc-5625aa32a7011e20289ada22bc5924810dc97ce0.tar.gz
mandoc-5625aa32a7011e20289ada22bc5924810dc97ce0.tar.zst
mandoc-5625aa32a7011e20289ada22bc5924810dc97ce0.zip
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.
Diffstat (limited to 'hash.c')
-rw-r--r--hash.c65
1 files changed, 49 insertions, 16 deletions
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 <kristaps@kth.se>
*
@@ -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);
}