Move mdoc_hash_init() and man_hash_init() to libmandoc.h
authorschwarze <schwarze@openbsd.org>
Sat, 18 Apr 2015 17:01:28 +0000 (17:01 +0000)
committerschwarze <schwarze@openbsd.org>
Sat, 18 Apr 2015 17:01:28 +0000 (17:01 +0000)
and call them from mparse_alloc() and choose_parser(),
preparing unified allocation of struct roff_man.

usr.bin/mandoc/libman.h
usr.bin/mandoc/libmandoc.h
usr.bin/mandoc/libmdoc.h
usr.bin/mandoc/man.c
usr.bin/mandoc/man_hash.c
usr.bin/mandoc/mdoc.c
usr.bin/mandoc/mdoc_hash.c
usr.bin/mandoc/read.c

index a736ce7..573af9d 100644 (file)
@@ -1,4 +1,4 @@
-/*     $OpenBSD: libman.h,v 1.46 2015/04/18 16:04:40 schwarze Exp $ */
+/*     $OpenBSD: libman.h,v 1.47 2015/04/18 17:01:28 schwarze Exp $ */
 /*
  * Copyright (c) 2009, 2010, 2011 Kristaps Dzonsons <kristaps@bsd.lv>
  * Copyright (c) 2014, 2015 Ingo Schwarze <schwarze@openbsd.org>
@@ -43,7 +43,6 @@ void            man_head_alloc(struct roff_man *, int, int, int);
 void             man_body_alloc(struct roff_man *, int, int, int);
 void             man_elem_alloc(struct roff_man *, int, int, int);
 void             man_node_delete(struct roff_man *, struct roff_node *);
-void             man_hash_init(void);
 int              man_hash_find(const char *);
 void             man_macroend(struct roff_man *);
 void             man_valid_post(struct roff_man *);
index 169a98a..6034e15 100644 (file)
@@ -1,4 +1,4 @@
-/*     $OpenBSD: libmandoc.h,v 1.42 2015/04/18 16:04:40 schwarze Exp $ */
+/*     $OpenBSD: libmandoc.h,v 1.43 2015/04/18 17:01:28 schwarze Exp $ */
 /*
  * Copyright (c) 2009, 2010, 2011, 2012 Kristaps Dzonsons <kristaps@bsd.lv>
  * Copyright (c) 2013, 2014, 2015 Ingo Schwarze <schwarze@openbsd.org>
@@ -55,6 +55,7 @@ void           mdoc_free(struct roff_man *);
 struct roff_man        *mdoc_alloc(struct roff *, struct mparse *,
                        const char *, int);
 void            mdoc_reset(struct roff_man *);
+void            mdoc_hash_init(void);
 int             mdoc_parseln(struct roff_man *, int, char *, int);
 void            mdoc_endparse(struct roff_man *);
 void            mdoc_addspan(struct roff_man *, const struct tbl_span *);
@@ -64,6 +65,7 @@ void           man_free(struct roff_man *);
 struct roff_man        *man_alloc(struct roff *, struct mparse *,
                        const char *, int);
 void            man_reset(struct roff_man *);
+void            man_hash_init(void);
 int             man_parseln(struct roff_man *, int, char *, int);
 void            man_endparse(struct roff_man *);
 void            man_addspan(struct roff_man *, const struct tbl_span *);
index be4c7e5..054b38f 100644 (file)
@@ -1,4 +1,4 @@
-/*     $OpenBSD: libmdoc.h,v 1.71 2015/04/18 16:04:40 schwarze Exp $ */
+/*     $OpenBSD: libmdoc.h,v 1.72 2015/04/18 17:01:28 schwarze Exp $ */
 /*
  * Copyright (c) 2008, 2009, 2010, 2011 Kristaps Dzonsons <kristaps@bsd.lv>
  * Copyright (c) 2013, 2014, 2015 Ingo Schwarze <schwarze@openbsd.org>
@@ -80,7 +80,6 @@ struct roff_node *mdoc_endbody_alloc(struct roff_man *, int, int, int,
                        struct roff_node *, enum mdoc_endbody);
 void             mdoc_node_delete(struct roff_man *, struct roff_node *);
 void             mdoc_node_relink(struct roff_man *, struct roff_node *);
-void             mdoc_hash_init(void);
 int              mdoc_hash_find(const char *);
 const char      *mdoc_a2att(const char *);
 const char      *mdoc_a2st(const char *);
index 010590b..62c0fae 100644 (file)
@@ -1,4 +1,4 @@
-/*     $OpenBSD: man.c,v 1.102 2015/04/18 16:34:03 schwarze Exp $ */
+/*     $OpenBSD: man.c,v 1.103 2015/04/18 17:01:28 schwarze Exp $ */
 /*
  * Copyright (c) 2008, 2009, 2010, 2011 Kristaps Dzonsons <kristaps@bsd.lv>
  * Copyright (c) 2013, 2014, 2015 Ingo Schwarze <schwarze@openbsd.org>
@@ -99,8 +99,6 @@ man_alloc(struct roff *roff, struct mparse *parse,
        struct roff_man *p;
 
        p = mandoc_calloc(1, sizeof(*p));
-
-       man_hash_init();
        p->parse = parse;
        p->defos = defos;
        p->quick = quick;
index d80a925..6d6f780 100644 (file)
@@ -1,4 +1,4 @@
-/*     $OpenBSD: man_hash.c,v 1.21 2015/04/02 22:06:17 schwarze Exp $ */
+/*     $OpenBSD: man_hash.c,v 1.22 2015/04/18 17:01:28 schwarze Exp $ */
 /*
  * Copyright (c) 2008, 2009, 2010 Kristaps Dzonsons <kristaps@bsd.lv>
  *
 static unsigned char    table[26 * HASH_DEPTH];
 
 
-/*
- * 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_init(void)
 {
        int              i, j, x;
 
+       if (*table != '\0')
+               return;
+
        memset(table, UCHAR_MAX, sizeof(table));
 
        assert(MAN_MAX < UCHAR_MAX);
index f17ade3..b0ce838 100644 (file)
@@ -1,4 +1,4 @@
-/*     $OpenBSD: mdoc.c,v 1.132 2015/04/18 16:34:03 schwarze Exp $ */
+/*     $OpenBSD: mdoc.c,v 1.133 2015/04/18 17:01:28 schwarze Exp $ */
 /*
  * Copyright (c) 2008, 2009, 2010, 2011 Kristaps Dzonsons <kristaps@bsd.lv>
  * Copyright (c) 2010, 2012-2015 Ingo Schwarze <schwarze@openbsd.org>
@@ -185,7 +185,6 @@ mdoc_alloc(struct roff *roff, struct mparse *parse,
        p->quick = quick;
        p->roff = roff;
 
-       mdoc_hash_init();
        mdoc_alloc1(p);
        return(p);
 }
index 5df9b4c..3d0ada9 100644 (file)
@@ -1,4 +1,4 @@
-/*     $OpenBSD: mdoc_hash.c,v 1.18 2015/04/02 22:06:17 schwarze Exp $ */
+/*     $OpenBSD: mdoc_hash.c,v 1.19 2015/04/18 17:01:28 schwarze Exp $ */
 /*
  * Copyright (c) 2008, 2009 Kristaps Dzonsons <kristaps@bsd.lv>
  *
 static unsigned 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_init(void)
 {
        int              i, j, major;
        const char      *p;
 
+       if (*table != '\0')
+               return;
+
        memset(table, UCHAR_MAX, sizeof(table));
 
        for (i = 0; i < (int)MDOC_MAX; i++) {
index 3df1956..5d849d2 100644 (file)
@@ -1,4 +1,4 @@
-/*     $OpenBSD: read.c,v 1.110 2015/04/18 16:34:03 schwarze Exp $ */
+/*     $OpenBSD: read.c,v 1.111 2015/04/18 17:01:28 schwarze Exp $ */
 /*
  * Copyright (c) 2008, 2009, 2010, 2011 Kristaps Dzonsons <kristaps@bsd.lv>
  * Copyright (c) 2010-2015 Ingo Schwarze <schwarze@openbsd.org>
@@ -291,6 +291,7 @@ choose_parser(struct mparse *curp)
                            MPARSE_QUICK & curp->options ? 1 : 0);
                else
                        curp->man->macroset = MACROSET_MDOC;
+               mdoc_hash_init();
                return;
        }
 
@@ -302,6 +303,7 @@ choose_parser(struct mparse *curp)
                    MPARSE_QUICK & curp->options ? 1 : 0);
        else
                curp->man->macroset = MACROSET_MAN;
+       man_hash_init();
 }
 
 /*
@@ -868,14 +870,18 @@ mparse_alloc(int options, enum mandoclevel wlevel, mandocmsg mmsg,
 
        curp->mchars = mchars;
        curp->roff = roff_alloc(curp, curp->mchars, options);
-       if (curp->options & MPARSE_MDOC)
+       if (curp->options & MPARSE_MDOC) {
                curp->man = mdoc_alloc(
                    curp->roff, curp, curp->defos,
                    curp->options & MPARSE_QUICK ? 1 : 0);
-       if (curp->options & MPARSE_MAN)
+               mdoc_hash_init();
+       }
+       if (curp->options & MPARSE_MAN) {
                curp->man = man_alloc(
                    curp->roff, curp, curp->defos,
                    curp->options & MPARSE_QUICK ? 1 : 0);
+               man_hash_init();
+       }
 
        return(curp);
 }