diff options
-rw-r--r-- | man.c | 3 | ||||
-rw-r--r-- | man_term.c | 1 | ||||
-rw-r--r-- | mdoc.c | 5 | ||||
-rw-r--r-- | mdoc.h | 1 | ||||
-rw-r--r-- | mdoc_action.c | 10 | ||||
-rw-r--r-- | mdoc_validate.c | 19 |
6 files changed, 17 insertions, 22 deletions
@@ -252,6 +252,8 @@ man_node_free(struct man_node *p) if (p->string) free(p->string); + if (p->parent) + p->parent->nchild--; free(p); } @@ -265,6 +267,7 @@ man_node_freelist(struct man_node *p) if (p->next) man_node_freelist(p->next); + assert(0 == p->nchild); man_node_free(p); } @@ -325,6 +325,7 @@ pre_TP(DECL_ARGS) size_t offs; term_vspace(p); + p->offset = INDENT; if (NULL == (nn = n->child)) @@ -442,6 +442,8 @@ node_append(struct mdoc *mdoc, struct mdoc_node *p) /* NOTREACHED */ } + p->parent->nchild++; + if ( ! mdoc_valid_pre(mdoc, p)) return(0); if ( ! mdoc_action_pre(mdoc, p)) @@ -597,6 +599,8 @@ void mdoc_node_free(struct mdoc_node *p) { + if (p->parent) + p->parent->nchild--; if (p->string) free(p->string); if (p->args) @@ -614,6 +618,7 @@ mdoc_node_freelist(struct mdoc_node *p) if (p->next) mdoc_node_freelist(p->next); + assert(0 == p->nchild); mdoc_node_free(p); } @@ -252,6 +252,7 @@ struct mdoc_node { struct mdoc_node *child; struct mdoc_node *next; struct mdoc_node *prev; + int nchild; int line; int pos; int tok; diff --git a/mdoc_action.c b/mdoc_action.c index 81e26e6a..e1517a11 100644 --- a/mdoc_action.c +++ b/mdoc_action.c @@ -663,11 +663,9 @@ post_bl_head(POST_ARGS) * column field. Then, delete the head children. */ - for (i = 0, nn = m->last->child; nn; nn = nn->next, i++) - /* Count children. */; - - n->args->argv[c].sz = (size_t)i; - n->args->argv[c].value = malloc((size_t)i * sizeof(char *)); + n->args->argv[c].sz = (size_t)m->last->nchild; + n->args->argv[c].value = malloc + ((size_t)m->last->nchild * sizeof(char *)); for (i = 0, nn = m->last->child; nn; i++) { n->args->argv[c].value[i] = nn->string; @@ -677,7 +675,9 @@ post_bl_head(POST_ARGS) mdoc_node_free(nnp); } + m->last->nchild = 0; m->last->child = NULL; + return(1); } diff --git a/mdoc_validate.c b/mdoc_validate.c index ab350fa0..3aa69cb2 100644 --- a/mdoc_validate.c +++ b/mdoc_validate.c @@ -99,7 +99,6 @@ static int err_child_gt(struct mdoc *, const char *, int); static int warn_child_gt(struct mdoc *, const char *, int); static int err_child_eq(struct mdoc *, const char *, int); static int warn_child_eq(struct mdoc *, const char *, int); -static int count_child(struct mdoc *); static int warn_print(struct mdoc *, int, int); static int warn_count(struct mdoc *, const char *, int, const char *, int); @@ -553,19 +552,6 @@ err_count(struct mdoc *m, const char *k, } -static inline int -count_child(struct mdoc *mdoc) -{ - int i; - struct mdoc_node *n; - - for (i = 0, n = mdoc->last->child; n; n = n->next, i++) - /* Do nothing */ ; - - return(i); -} - - /* * Build these up with macros because they're basically the same check * for different inequalities. Yes, this could be done with functions, @@ -576,10 +562,9 @@ count_child(struct mdoc *mdoc) static int \ lvl##_child_##name(struct mdoc *mdoc, const char *p, int sz) \ { \ - int i; \ - if ((i = count_child(mdoc)) ineq sz) \ + if (mdoc->last->nchild ineq sz) \ return(1); \ - return(lvl##_count(mdoc, #ineq, sz, p, i)); \ + return(lvl##_count(mdoc, #ineq, sz, p, mdoc->last->nchild)); \ } #define CHECK_BODY_DEFN(name, lvl, func, num) \ |