summaryrefslogtreecommitdiffstatshomepage
diff options
context:
space:
mode:
-rw-r--r--libmdoc.h5
-rw-r--r--mdoc.c58
-rw-r--r--mdoc_action.c25
3 files changed, 53 insertions, 35 deletions
diff --git a/libmdoc.h b/libmdoc.h
index c1cf4175..c6fbbbe5 100644
--- a/libmdoc.h
+++ b/libmdoc.h
@@ -1,4 +1,4 @@
-/* $Id: libmdoc.h,v 1.32 2010/04/03 14:02:10 kristaps Exp $ */
+/* $Id: libmdoc.h,v 1.33 2010/04/06 11:33:00 kristaps Exp $ */
/*
* Copyright (c) 2008, 2009 Kristaps Dzonsons <kristaps@kth.se>
*
@@ -137,8 +137,7 @@ int mdoc_block_alloc(struct mdoc *, int, int,
int mdoc_head_alloc(struct mdoc *, int, int, enum mdoct);
int mdoc_tail_alloc(struct mdoc *, int, int, enum mdoct);
int mdoc_body_alloc(struct mdoc *, int, int, enum mdoct);
-void mdoc_node_free(struct mdoc_node *);
-void mdoc_node_freelist(struct mdoc_node *);
+void mdoc_node_delete(struct mdoc *, struct mdoc_node *);
void mdoc_hash_init(void);
enum mdoct mdoc_hash_find(const char *);
int mdoc_iscdelim(char);
diff --git a/mdoc.c b/mdoc.c
index d5e4d1b0..e0d63fed 100644
--- a/mdoc.c
+++ b/mdoc.c
@@ -1,4 +1,4 @@
-/* $Id: mdoc.c,v 1.120 2010/04/05 08:59:46 kristaps Exp $ */
+/* $Id: mdoc.c,v 1.121 2010/04/06 11:33:00 kristaps Exp $ */
/*
* Copyright (c) 2008, 2009 Kristaps Dzonsons <kristaps@kth.se>
*
@@ -141,6 +141,9 @@ const char *const __mdoc_argnames[MDOC_ARG_MAX] = {
const char * const *mdoc_macronames = __mdoc_macronames;
const char * const *mdoc_argnames = __mdoc_argnames;
+static void mdoc_node_free(struct mdoc_node *);
+static void mdoc_node_unlink(struct mdoc *,
+ struct mdoc_node *);
static void mdoc_free1(struct mdoc *);
static void mdoc_alloc1(struct mdoc *);
static struct mdoc_node *node_alloc(struct mdoc *, int, int,
@@ -177,7 +180,7 @@ mdoc_free1(struct mdoc *mdoc)
{
if (mdoc->first)
- mdoc_node_freelist(mdoc->first);
+ mdoc_node_delete(mdoc, mdoc->first);
if (mdoc->meta.title)
free(mdoc->meta.title);
if (mdoc->meta.os)
@@ -565,8 +568,6 @@ void
mdoc_node_free(struct mdoc_node *p)
{
- if (p->parent)
- p->parent->nchild--;
if (p->string)
free(p->string);
if (p->args)
@@ -575,16 +576,53 @@ mdoc_node_free(struct mdoc_node *p)
}
-void
-mdoc_node_freelist(struct mdoc_node *p)
+static void
+mdoc_node_unlink(struct mdoc *m, struct mdoc_node *n)
{
- if (p->child)
- mdoc_node_freelist(p->child);
- if (p->next)
- mdoc_node_freelist(p->next);
+ /* Adjust siblings. */
+
+ if (n->prev)
+ n->prev->next = n->next;
+ if (n->next)
+ n->next->prev = n->prev;
+
+ /* Adjust parent. */
+
+ if (n->parent) {
+ n->parent->nchild--;
+ if (n->parent->child == n)
+ n->parent->child = n->prev ? n->prev : n->next;
+ }
+
+ /* Adjust parse point, if applicable. */
+
+ if (m && m->last == n) {
+ if (n->prev) {
+ m->last = n->prev;
+ m->next = MDOC_NEXT_SIBLING;
+ } else {
+ m->last = n->parent;
+ m->next = MDOC_NEXT_CHILD;
+ }
+ }
+
+ if (m && m->first == n)
+ m->first = NULL;
+}
+
+void
+mdoc_node_delete(struct mdoc *m, struct mdoc_node *p)
+{
+
+ while (p->child) {
+ assert(p->nchild);
+ mdoc_node_delete(m, p->child);
+ }
assert(0 == p->nchild);
+
+ mdoc_node_unlink(m, p);
mdoc_node_free(p);
}
diff --git a/mdoc_action.c b/mdoc_action.c
index dcf3d32d..1d0245c7 100644
--- a/mdoc_action.c
+++ b/mdoc_action.c
@@ -1,4 +1,4 @@
-/* $Id: mdoc_action.c,v 1.52 2010/04/05 09:03:12 kristaps Exp $ */
+/* $Id: mdoc_action.c,v 1.53 2010/04/06 11:33:00 kristaps Exp $ */
/*
* Copyright (c) 2008, 2009 Kristaps Dzonsons <kristaps@kth.se>
*
@@ -729,7 +729,7 @@ post_bl_head(POST_ARGS)
nn->string = NULL;
nnp = nn;
nn = nn->next;
- mdoc_node_free(nnp);
+ mdoc_node_delete(NULL, nnp);
}
n->nchild = 0;
@@ -854,29 +854,10 @@ post_dd(POST_ARGS)
static int
post_prol(POST_ARGS)
{
- struct mdoc_node *np;
-
- if (n->parent->child == n)
- n->parent->child = n->prev;
- if (n->prev)
- n->prev->next = NULL;
-
- np = n;
- assert(NULL == n->next);
-
- if (n->prev) {
- m->last = n->prev;
- m->next = MDOC_NEXT_SIBLING;
- } else {
- m->last = n->parent;
- m->next = MDOC_NEXT_CHILD;
- }
-
- mdoc_node_freelist(np);
+ mdoc_node_delete(m, n);
if (m->meta.title && m->meta.date && m->meta.os)
m->flags |= MDOC_PBODY;
-
return(1);
}