summaryrefslogtreecommitdiff
path: root/usr.bin
diff options
context:
space:
mode:
authorIngo Schwarze <schwarze@cvs.openbsd.org>2009-09-21 21:11:38 +0000
committerIngo Schwarze <schwarze@cvs.openbsd.org>2009-09-21 21:11:38 +0000
commit2a1b4b314d3ac327c46f7aba65e67bf92b4b7e60 (patch)
tree3250ca9bc4a8c16ebbb57abdb90f9f1bd9ce84e4 /usr.bin
parentf80ca1f01053a477123e46378108aca2f4371a5e (diff)
sync to 1.9.5: lookup hashes are now static tables
shortening the code, and, according to kristaps@, speeding it up
Diffstat (limited to 'usr.bin')
-rw-r--r--usr.bin/mandoc/libman.h8
-rw-r--r--usr.bin/mandoc/libmdoc.h8
-rw-r--r--usr.bin/mandoc/man.c14
-rw-r--r--usr.bin/mandoc/man_hash.c46
-rw-r--r--usr.bin/mandoc/mdoc.c13
-rw-r--r--usr.bin/mandoc/mdoc_action.c6
-rw-r--r--usr.bin/mandoc/mdoc_hash.c152
-rw-r--r--usr.bin/mandoc/mdoc_macro.c31
8 files changed, 84 insertions, 194 deletions
diff --git a/usr.bin/mandoc/libman.h b/usr.bin/mandoc/libman.h
index 70c1e8e4edf..f0a5de14a4b 100644
--- a/usr.bin/mandoc/libman.h
+++ b/usr.bin/mandoc/libman.h
@@ -1,4 +1,4 @@
-/* $Id: libman.h,v 1.8 2009/08/22 23:17:39 schwarze Exp $ */
+/* $Id: libman.h,v 1.9 2009/09/21 21:11:36 schwarze Exp $ */
/*
* Copyright (c) 2009 Kristaps Dzonsons <kristaps@kth.se>
*
@@ -27,7 +27,6 @@ enum man_next {
struct man {
void *data;
struct man_cb cb;
- void *htab;
int pflags;
int flags;
#define MAN_HALT (1 << 0)
@@ -95,9 +94,8 @@ int man_body_alloc(struct man *, int, int, int);
int man_elem_alloc(struct man *, int, int, int);
void man_node_free(struct man_node *);
void man_node_freelist(struct man_node *);
-void *man_hash_alloc(void);
-int man_hash_find(const void *, const char *);
-void man_hash_free(void *);
+void man_hash_init(void);
+int man_hash_find(const char *);
int man_macroend(struct man *);
int man_args(struct man *, int, int *, char *, char **);
#define ARGS_ERROR (-1)
diff --git a/usr.bin/mandoc/libmdoc.h b/usr.bin/mandoc/libmdoc.h
index e8c4ac6abea..f51f9d709a1 100644
--- a/usr.bin/mandoc/libmdoc.h
+++ b/usr.bin/mandoc/libmdoc.h
@@ -1,4 +1,4 @@
-/* $Id: libmdoc.h,v 1.20 2009/08/22 22:39:55 schwarze Exp $ */
+/* $Id: libmdoc.h,v 1.21 2009/09/21 21:11:37 schwarze Exp $ */
/*
* Copyright (c) 2008, 2009 Kristaps Dzonsons <kristaps@kth.se>
*
@@ -27,7 +27,6 @@ enum mdoc_next {
struct mdoc {
void *data;
struct mdoc_cb cb;
- void *htab;
int flags;
#define MDOC_HALT (1 << 0) /* Error in parse. Halt. */
#define MDOC_LITERAL (1 << 1) /* In a literal scope. */
@@ -139,9 +138,8 @@ int mdoc_tail_alloc(struct mdoc *, int, int, int);
int mdoc_body_alloc(struct mdoc *, int, int, int);
void mdoc_node_free(struct mdoc_node *);
void mdoc_node_freelist(struct mdoc_node *);
-void *mdoc_hash_alloc(void);
-int mdoc_hash_find(const void *, const char *);
-void mdoc_hash_free(void *);
+void mdoc_hash_init(void);
+int mdoc_hash_find(const char *);
int mdoc_iscdelim(char);
int mdoc_isdelim(const char *);
size_t mdoc_isescape(const char *);
diff --git a/usr.bin/mandoc/man.c b/usr.bin/mandoc/man.c
index c3888bb684c..d749a73eff3 100644
--- a/usr.bin/mandoc/man.c
+++ b/usr.bin/mandoc/man.c
@@ -1,4 +1,4 @@
-/* $Id: man.c,v 1.12 2009/09/18 22:46:14 schwarze Exp $ */
+/* $Id: man.c,v 1.13 2009/09/21 21:11:37 schwarze Exp $ */
/*
* Copyright (c) 2008, 2009 Kristaps Dzonsons <kristaps@kth.se>
*
@@ -101,9 +101,6 @@ man_free(struct man *man)
{
man_free1(man);
-
- if (man->htab)
- man_hash_free(man->htab);
free(man);
}
@@ -121,14 +118,11 @@ man_alloc(void *data, int pflags, const struct man_cb *cb)
return(NULL);
}
+ man_hash_init();
+
p->data = data;
p->pflags = pflags;
(void)memcpy(&p->cb, cb, sizeof(struct man_cb));
-
- if (NULL == (p->htab = man_hash_alloc())) {
- free(p);
- return(NULL);
- }
return(p);
}
@@ -509,7 +503,7 @@ man_pmacro(struct man *m, int ln, char *buf)
return(1);
}
- if (MAN_MAX == (c = man_hash_find(m->htab, mac))) {
+ if (MAN_MAX == (c = man_hash_find(mac))) {
if ( ! (MAN_IGN_MACRO & m->pflags)) {
(void)man_perr(m, ln, ppos, WMACRO);
goto err;
diff --git a/usr.bin/mandoc/man_hash.c b/usr.bin/mandoc/man_hash.c
index 2b83f0f56b3..b7d376fa2bf 100644
--- a/usr.bin/mandoc/man_hash.c
+++ b/usr.bin/mandoc/man_hash.c
@@ -1,4 +1,4 @@
-/* $Id: man_hash.c,v 1.5 2009/08/22 23:17:40 schwarze Exp $ */
+/* $Id: man_hash.c,v 1.6 2009/09/21 21:11:37 schwarze Exp $ */
/*
* Copyright (c) 2008, 2009 Kristaps Dzonsons <kristaps@kth.se>
*
@@ -15,39 +15,27 @@
* OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
*/
#include <assert.h>
+#include <limits.h>
#include <stdlib.h>
#include <string.h>
#include "libman.h"
+static u_char table[26 * 6];
-/* ARGUSED */
+/*
+ * XXX - this hash has global scope, so if intended for use as a library
+ * with multiple callers, it will need re-invocation protection.
+ */
void
-man_hash_free(void *htab)
-{
-
- free(htab);
-}
-
-
-/* ARGUSED */
-void *
-man_hash_alloc(void)
+man_hash_init(void)
{
- int *htab;
int i, j, x;
- /* Initialised to -1. */
-
- htab = malloc(26 * 6 * sizeof(int));
- if (NULL == htab)
- return(NULL);
- for (i = 0; i < 26 * 6; i++)
- htab[i] = -1;
+ memset(table, UCHAR_MAX, sizeof(table));
for (i = 0; i < MAN_MAX; i++) {
x = man_macronames[i][0];
-
assert((x >= 65 && x <= 90) ||
(x >= 97 && x <= 122));
@@ -55,25 +43,18 @@ man_hash_alloc(void)
x *= 6;
for (j = 0; j < 6; j++)
- if (-1 == htab[x + j]) {
- htab[x + j] = i;
+ if (UCHAR_MAX == table[x + j]) {
+ table[x + j] = (u_char)i;
break;
}
-
assert(j < 6);
}
-
- return((void *)htab);
}
-
int
-man_hash_find(const void *arg, const char *tmp)
+man_hash_find(const char *tmp)
{
int x, i, tok;
- const int *htab;
-
- htab = (const int *)arg;
if (0 == (x = tmp[0]))
return(MAN_MAX);
@@ -84,7 +65,7 @@ man_hash_find(const void *arg, const char *tmp)
x *= 6;
for (i = 0; i < 6; i++) {
- if (-1 == (tok = htab[x + i]))
+ if (UCHAR_MAX == (tok = table[x + i]))
return(MAN_MAX);
if (0 == strcmp(tmp, man_macronames[tok]))
return(tok);
@@ -92,4 +73,3 @@ man_hash_find(const void *arg, const char *tmp)
return(MAN_MAX);
}
-
diff --git a/usr.bin/mandoc/mdoc.c b/usr.bin/mandoc/mdoc.c
index da3983aca93..f29b4b0e836 100644
--- a/usr.bin/mandoc/mdoc.c
+++ b/usr.bin/mandoc/mdoc.c
@@ -1,4 +1,4 @@
-/* $Id: mdoc.c,v 1.26 2009/09/18 22:37:05 schwarze Exp $ */
+/* $Id: mdoc.c,v 1.27 2009/09/21 21:11:37 schwarze Exp $ */
/*
* Copyright (c) 2008, 2009 Kristaps Dzonsons <kristaps@kth.se>
*
@@ -226,8 +226,6 @@ mdoc_free(struct mdoc *mdoc)
{
mdoc_free1(mdoc);
- if (mdoc->htab)
- mdoc_hash_free(mdoc->htab);
free(mdoc);
}
@@ -245,13 +243,12 @@ mdoc_alloc(void *data, int pflags, const struct mdoc_cb *cb)
if (cb)
(void)memcpy(&p->cb, cb, sizeof(struct mdoc_cb));
+ mdoc_hash_init();
+
p->data = data;
p->pflags = pflags;
- if (NULL == (p->htab = mdoc_hash_alloc())) {
- free(p);
- return(NULL);
- } else if (mdoc_alloc1(p))
+ if (mdoc_alloc1(p))
return(p);
free(p);
@@ -721,7 +718,7 @@ parsemacro(struct mdoc *m, int ln, char *buf)
return(1);
}
- if (MDOC_MAX == (c = mdoc_hash_find(m->htab, mac))) {
+ if (MDOC_MAX == (c = mdoc_hash_find(mac))) {
if ( ! macrowarn(m, ln, mac))
goto err;
return(1);
diff --git a/usr.bin/mandoc/mdoc_action.c b/usr.bin/mandoc/mdoc_action.c
index 258b8bb059c..b19180a3936 100644
--- a/usr.bin/mandoc/mdoc_action.c
+++ b/usr.bin/mandoc/mdoc_action.c
@@ -1,4 +1,4 @@
-/* $Id: mdoc_action.c,v 1.20 2009/08/22 22:50:17 schwarze Exp $ */
+/* $Id: mdoc_action.c,v 1.21 2009/09/21 21:11:37 schwarze Exp $ */
/*
* Copyright (c) 2008, 2009 Kristaps Dzonsons <kristaps@kth.se>
*
@@ -53,7 +53,7 @@ static int post_tilde(POST_ARGS);
static int pre_bd(PRE_ARGS);
static int pre_dl(PRE_ARGS);
-const struct actions mdoc_actions[MDOC_MAX] = {
+static const struct actions mdoc_actions[MDOC_MAX] = {
{ NULL, NULL }, /* Ap */
{ NULL, post_dd }, /* Dd */
{ NULL, post_dt }, /* Dt */
@@ -613,7 +613,7 @@ post_bl_width(POST_ARGS)
if (0 == strcmp(p, "Ds"))
width = 6;
- else if (MDOC_MAX == (tok = mdoc_hash_find(m->htab, p)))
+ else if (MDOC_MAX == (tok = mdoc_hash_find(p)))
return(1);
else if (0 == (width = mdoc_macro2len(tok)))
return(mdoc_nwarn(m, n, ENOWIDTH));
diff --git a/usr.bin/mandoc/mdoc_hash.c b/usr.bin/mandoc/mdoc_hash.c
index b188e340bf7..4af63bea72c 100644
--- a/usr.bin/mandoc/mdoc_hash.c
+++ b/usr.bin/mandoc/mdoc_hash.c
@@ -1,4 +1,4 @@
-/* $Id: mdoc_hash.c,v 1.5 2009/08/09 18:01:15 schwarze Exp $ */
+/* $Id: mdoc_hash.c,v 1.6 2009/09/21 21:11:37 schwarze Exp $ */
/*
* Copyright (c) 2008, 2009 Kristaps Dzonsons <kristaps@kth.se>
*
@@ -18,149 +18,71 @@
#include <assert.h>
#include <ctype.h>
+#include <limits.h>
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include "libmdoc.h"
-#define ADJUST_MAJOR(x) \
- do if (37 == (x)) \
- (x) = 0; /* % -> 00 */ \
- else if (91 > (x)) \
- (x) -= 64; /* A-Z -> 01 - 26 */ \
- else \
- (x) -= 70; /* a-z -> 27 - 52 */ \
- while (/*CONSTCOND*/0)
-
-#define ADJUST_MINOR(y) \
- do if (49 == (y)) \
- (y) = 0; /* 1 -> 00 */ \
- else if (91 > (y)) \
- (y) -= 65; /* A-Z -> 00 - 25 */ \
- else \
- (y) -= 97; /* a-z -> 00 - 25 */ \
- while (/*CONSTCOND*/0)
-
-#define INDEX(maj, min) \
- ((maj) * 26 * 3) + ((min) * 3)
-
-#define SLOTCMP(slot, val) \
- (mdoc_macronames[(slot)][0] == (val)[0] && \
- mdoc_macronames[(slot)][1] == (val)[1] && \
- (0 == (val)[2] || \
- mdoc_macronames[(slot)][2] == (val)[2]))
-
+static u_char table[27 * 12];
+/*
+ * 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);
-}
-
-
-
-void *
-mdoc_hash_alloc(void)
-{
- int i, major, minor, ind;
- const void **htab;
-
- htab = calloc(26 * 3 * 52, sizeof(struct mdoc_macro *));
- if (NULL == htab)
- return(NULL);
+ memset(table, UCHAR_MAX, sizeof(table));
for (i = 0; i < MDOC_MAX; i++) {
- major = mdoc_macronames[i][0];
- assert(isalpha((u_char)major) || 37 == major);
-
- ADJUST_MAJOR(major);
-
- minor = mdoc_macronames[i][1];
- assert(isalpha((u_char)minor) || 49 == minor);
-
- ADJUST_MINOR(minor);
+ p = mdoc_macronames[i];
- ind = INDEX(major, minor);
+ if (isalpha((u_char)p[1]))
+ major = 12 * (tolower((u_char)p[1]) - 97);
+ else
+ major = 12 * 26;
- if (NULL == htab[ind]) {
- htab[ind] = &mdoc_macros[i];
- continue;
- }
+ for (j = 0; j < 12; j++)
+ if (UCHAR_MAX == table[major + j]) {
+ table[major + j] = (u_char)i;
+ break;
+ }
- 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;
-
- htab = /* LINTED */
- (const void **)arg;
+ int major, i, j;
- if (0 == (major = tmp[0]))
+ if (0 == p[0])
return(MDOC_MAX);
- if (0 == (minor = tmp[1]))
+ if ( ! isalpha((u_char)p[0]) && '%' != p[0])
return(MDOC_MAX);
- if (tmp[2] && tmp[3])
- return(MDOC_MAX);
-
- if (37 != major && ! isalpha((u_char)major))
- return(MDOC_MAX);
- if (49 != minor && ! isalpha((u_char)minor))
+ 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);
- ADJUST_MAJOR(major);
- ADJUST_MINOR(minor);
-
- ind = INDEX(major, minor);
-
- if (ind < 0 || ind >= 26 * 3 * 52)
+ if (p[2] && p[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 (SLOTCMP(slot, tmp))
- 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 (SLOTCMP(slot, tmp))
- 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 (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 (SLOTCMP(slot, tmp))
- return(slot);
-
return(MDOC_MAX);
}
-
diff --git a/usr.bin/mandoc/mdoc_macro.c b/usr.bin/mandoc/mdoc_macro.c
index a3989b9dbde..c0781dca46e 100644
--- a/usr.bin/mandoc/mdoc_macro.c
+++ b/usr.bin/mandoc/mdoc_macro.c
@@ -1,4 +1,4 @@
-/* $Id: mdoc_macro.c,v 1.23 2009/08/22 22:39:55 schwarze Exp $ */
+/* $Id: mdoc_macro.c,v 1.24 2009/09/21 21:11:37 schwarze Exp $ */
/*
* Copyright (c) 2008, 2009 Kristaps Dzonsons <kristaps@kth.se>
*
@@ -46,8 +46,8 @@ static int rew_sub(enum mdoc_type, struct mdoc *,
static int rew_last(struct mdoc *,
const struct mdoc_node *);
static int append_delims(struct mdoc *, int, int *, char *);
-static int lookup(struct mdoc *, int, const char *);
-static int lookup_raw(struct mdoc *, const char *);
+static int lookup(int, const char *);
+static int lookup_raw(const char *);
static int swarn(struct mdoc *, enum mdoc_type, int, int,
const struct mdoc_node *);
@@ -258,12 +258,13 @@ mdoc_macroend(struct mdoc *m)
* Look up a macro from within a subsequent context.
*/
static int
-lookup(struct mdoc *mdoc, int from, const char *p)
+lookup(int from, const char *p)
{
+ /* FIXME: make -diag lists be un-PARSED. */
if ( ! (MDOC_PARSED & mdoc_macros[from].flags))
return(MDOC_MAX);
- return(lookup_raw(mdoc, p));
+ return(lookup_raw(p));
}
@@ -271,11 +272,11 @@ lookup(struct mdoc *mdoc, int from, const char *p)
* Lookup a macro following the initial line macro.
*/
static int
-lookup_raw(struct mdoc *mdoc, const char *p)
+lookup_raw(const char *p)
{
int res;
- if (MDOC_MAX == (res = mdoc_hash_find(mdoc->htab, p)))
+ if (MDOC_MAX == (res = mdoc_hash_find(p)))
return(MDOC_MAX);
if (MDOC_CALLABLE & mdoc_macros[res].flags)
return(res);
@@ -669,7 +670,7 @@ blk_exp_close(MACRO_PROT_ARGS)
if (ARGS_EOLN == c)
break;
- if (MDOC_MAX != (c = lookup(m, tok, p))) {
+ if (MDOC_MAX != (c = lookup(tok, p))) {
if ( ! flushed) {
if ( ! rew_sub(MDOC_BLOCK, m, tok, line, ppos))
return(0);
@@ -753,7 +754,7 @@ in_line(MACRO_PROT_ARGS)
/* Quoted words shouldn't be looked-up. */
- c = ARGS_QWORD == w ? MDOC_MAX : lookup(m, tok, p);
+ c = ARGS_QWORD == w ? MDOC_MAX : lookup(tok, p);
/*
* In this case, we've located a submacro and must
@@ -932,7 +933,7 @@ blk_full(MACRO_PROT_ARGS)
continue;
}
- if (MDOC_MAX == (c = lookup(m, tok, p))) {
+ if (MDOC_MAX == (c = lookup(tok, p))) {
if ( ! mdoc_word_alloc(m, line, lastarg, p))
return(0);
continue;
@@ -995,7 +996,7 @@ blk_part_imp(MACRO_PROT_ARGS)
if (ARGS_EOLN == c)
break;
- if (MDOC_MAX == (c = lookup(m, tok, p))) {
+ if (MDOC_MAX == (c = lookup(tok, p))) {
if ( ! mdoc_word_alloc(m, line, la, p))
return(0);
continue;
@@ -1098,7 +1099,7 @@ blk_part_exp(MACRO_PROT_ARGS)
if (ARGS_EOLN == c)
break;
- if (MDOC_MAX != (c = lookup(m, tok, p))) {
+ if (MDOC_MAX != (c = lookup(tok, p))) {
if ( ! flushed) {
if ( ! rew_sub(MDOC_HEAD, m, tok, line, ppos))
return(0);
@@ -1209,7 +1210,7 @@ in_line_argn(MACRO_PROT_ARGS)
if (ARGS_EOLN == c)
break;
- if (MDOC_MAX != (c = lookup(m, tok, p))) {
+ if (MDOC_MAX != (c = lookup(tok, p))) {
if ( ! flushed && ! rew_elem(m, tok))
return(0);
flushed = 1;
@@ -1284,7 +1285,7 @@ in_line_eoln(MACRO_PROT_ARGS)
if (ARGS_EOLN == w)
break;
- c = ARGS_QWORD == w ? MDOC_MAX : lookup(m, tok, p);
+ c = ARGS_QWORD == w ? MDOC_MAX : lookup(tok, p);
if (MDOC_MAX != c) {
if ( ! rew_elem(m, tok))
@@ -1333,7 +1334,7 @@ phrase(struct mdoc *m, int line, int ppos, char *buf)
if (ARGS_EOLN == w)
break;
- c = ARGS_QWORD == w ? MDOC_MAX : lookup_raw(m, p);
+ c = ARGS_QWORD == w ? MDOC_MAX : lookup_raw(p);
if (MDOC_MAX != c) {
if ( ! mdoc_macro(m, c, line, la, &pos, buf))