summaryrefslogtreecommitdiffstats
path: root/usr.bin/mandoc/mdoc.c
diff options
context:
space:
mode:
authorschwarze <schwarze@openbsd.org>2010-12-29 00:47:30 +0000
committerschwarze <schwarze@openbsd.org>2010-12-29 00:47:30 +0000
commit8c62fbf5c6c2302807c6dee76d107da474e91886 (patch)
tree21459ffe052ee13db18f2a29077fd0efe9758bb6 /usr.bin/mandoc/mdoc.c
parentsync (diff)
downloadwireguard-openbsd-8c62fbf5c6c2302807c6dee76d107da474e91886.tar.xz
wireguard-openbsd-8c62fbf5c6c2302807c6dee76d107da474e91886.zip
Reorg by Kristaps: In libmdoc, replace the union of pointers to structs
of macro-specific data by a pointer to a union of structs, which makes the code simpler and more robust at the expense of a small memory overhead. Merging was somewhat difficult because we mustn't break tbl(1) support which the bsd.lv version does not yet have.
Diffstat (limited to 'usr.bin/mandoc/mdoc.c')
-rw-r--r--usr.bin/mandoc/mdoc.c82
1 files changed, 53 insertions, 29 deletions
diff --git a/usr.bin/mandoc/mdoc.c b/usr.bin/mandoc/mdoc.c
index 1fc7a423202..dba7d5e27f9 100644
--- a/usr.bin/mandoc/mdoc.c
+++ b/usr.bin/mandoc/mdoc.c
@@ -1,4 +1,4 @@
-/* $Id: mdoc.c,v 1.74 2010/12/26 21:04:19 schwarze Exp $ */
+/* $Id: mdoc.c,v 1.75 2010/12/29 00:47:30 schwarze Exp $ */
/*
* Copyright (c) 2008, 2009, 2010 Kristaps Dzonsons <kristaps@bsd.lv>
* Copyright (c) 2010 Ingo Schwarze <schwarze@openbsd.org>
@@ -241,7 +241,7 @@ mdoc_parseln(struct mdoc *m, int ln, char *buf, int offs)
if (n && MDOC_TS == n->tok && MDOC_BODY == n->type &&
strncmp(buf+offs, ".TE", 3)) {
n = n->parent;
- if ( ! tbl_read(n->data.TS, "mdoc tbl parser",
+ if ( ! tbl_read(n->norm->TS, "mdoc tbl parser",
ln, buf+offs, strlen(buf+offs)))
mdoc_nmsg(m, n, MANDOCERR_TBL);
return(1);
@@ -340,6 +340,23 @@ node_append(struct mdoc *mdoc, struct mdoc_node *p)
p->parent->nchild++;
+ /*
+ * Copy over the normalised-data pointer of our parent. Not
+ * everybody has one, but copying a null pointer is fine.
+ */
+
+ switch (p->type) {
+ case (MDOC_BODY):
+ /* FALLTHROUGH */
+ case (MDOC_TAIL):
+ /* FALLTHROUGH */
+ case (MDOC_HEAD):
+ p->norm = p->parent->norm;
+ break;
+ default:
+ break;
+ }
+
if ( ! mdoc_valid_pre(mdoc, p))
return(0);
@@ -472,6 +489,23 @@ mdoc_block_alloc(struct mdoc *m, int line, int pos,
p->args = args;
if (p->args)
(args->refcnt)++;
+
+ switch (tok) {
+ case (MDOC_Bd):
+ /* FALLTHROUGH */
+ case (MDOC_Bf):
+ /* FALLTHROUGH */
+ case (MDOC_Bl):
+ /* FALLTHROUGH */
+ case (MDOC_Rs):
+ /* FALLTHROUGH */
+ case (MDOC_TS):
+ p->norm = mandoc_calloc(1, sizeof(union mdoc_data));
+ break;
+ default:
+ break;
+ }
+
if ( ! node_append(m, p))
return(0);
m->next = MDOC_NEXT_CHILD;
@@ -489,6 +523,15 @@ mdoc_elem_alloc(struct mdoc *m, int line, int pos,
p->args = args;
if (p->args)
(args->refcnt)++;
+
+ switch (tok) {
+ case (MDOC_An):
+ p->norm = mandoc_calloc(1, sizeof(union mdoc_data));
+ break;
+ default:
+ break;
+ }
+
if ( ! node_append(m, p))
return(0);
m->next = MDOC_NEXT_CHILD;
@@ -523,31 +566,12 @@ static void
mdoc_node_free(struct mdoc_node *p)
{
- /*
- * XXX: if these end up being problematic in terms of memory
- * management and dereferencing freed blocks, then make them
- * into reference-counted double-pointers.
- */
-
- if (MDOC_Bd == p->tok && MDOC_BLOCK == p->type)
- if (p->data.Bd)
- free(p->data.Bd);
- if (MDOC_Bl == p->tok && MDOC_BLOCK == p->type)
- if (p->data.Bl)
- free(p->data.Bl);
- if (MDOC_Bf == p->tok && MDOC_HEAD == p->type)
- if (p->data.Bf)
- free(p->data.Bf);
- if (MDOC_An == p->tok)
- if (p->data.An)
- free(p->data.An);
- if (MDOC_Rs == p->tok && MDOC_BLOCK == p->type)
- if (p->data.Rs)
- free(p->data.Rs);
if (MDOC_TS == p->tok && MDOC_BLOCK == p->type)
- if (p->data.TS)
- tbl_free(p->data.TS);
+ if (p->norm->TS)
+ tbl_free(p->norm->TS);
+ if (MDOC_BLOCK == p->type || MDOC_ELEM == p->type)
+ free(p->norm);
if (p->string)
free(p->string);
if (p->args)
@@ -642,7 +666,7 @@ mdoc_ptext(struct mdoc *m, int line, char *buf, int offs)
*/
if (MDOC_Bl == n->tok && MDOC_BODY == n->type &&
- LIST_column == n->data.Bl->type) {
+ LIST_column == n->norm->Bl.type) {
/* `Bl' is open without any children. */
m->flags |= MDOC_FREECOL;
return(mdoc_macro(m, MDOC_It, line, offs, &offs, buf));
@@ -651,7 +675,7 @@ mdoc_ptext(struct mdoc *m, int line, char *buf, int offs)
if (MDOC_It == n->tok && MDOC_BLOCK == n->type &&
NULL != n->parent &&
MDOC_Bl == n->parent->tok &&
- LIST_column == n->parent->data.Bl->type) {
+ LIST_column == n->parent->norm->Bl.type) {
/* `Bl' has block-level `It' children. */
m->flags |= MDOC_FREECOL;
return(mdoc_macro(m, MDOC_It, line, offs, &offs, buf));
@@ -832,7 +856,7 @@ mdoc_pmacro(struct mdoc *m, int ln, char *buf, int offs)
*/
if (MDOC_Bl == n->tok && MDOC_BODY == n->type &&
- LIST_column == n->data.Bl->type) {
+ LIST_column == n->norm->Bl.type) {
m->flags |= MDOC_FREECOL;
if ( ! mdoc_macro(m, MDOC_It, ln, sv, &sv, buf))
goto err;
@@ -848,7 +872,7 @@ mdoc_pmacro(struct mdoc *m, int ln, char *buf, int offs)
if (MDOC_It == n->tok && MDOC_BLOCK == n->type &&
NULL != n->parent &&
MDOC_Bl == n->parent->tok &&
- LIST_column == n->parent->data.Bl->type) {
+ LIST_column == n->parent->norm->Bl.type) {
m->flags |= MDOC_FREECOL;
if ( ! mdoc_macro(m, MDOC_It, ln, sv, &sv, buf))
goto err;