From 14b264ac5a6226fdf3065c90d26a2595186fa976 Mon Sep 17 00:00:00 2001 From: Kristaps Dzonsons Date: Mon, 19 Jan 2009 17:51:32 +0000 Subject: More correct validation. Elision of prologue macros from main tree. --- macro.c | 35 ++++++++++++++++++++++++++++++----- 1 file changed, 30 insertions(+), 5 deletions(-) (limited to 'macro.c') diff --git a/macro.c b/macro.c index 6ea7b58f..70cd340b 100644 --- a/macro.c +++ b/macro.c @@ -1,4 +1,4 @@ -/* $Id: macro.c,v 1.42 2009/01/19 17:02:58 kristaps Exp $ */ +/* $Id: macro.c,v 1.43 2009/01/19 17:51:32 kristaps Exp $ */ /* * Copyright (c) 2008 Kristaps Dzonsons * @@ -961,9 +961,10 @@ macro_constant_delimited(MACRO_PROT_ARGS) int macro_constant(MACRO_PROT_ARGS) { - int c, lastarg, argc, fl; - struct mdoc_arg argv[MDOC_LINEARG_MAX]; - char *p; + int c, lastarg, argc, fl; + struct mdoc_arg argv[MDOC_LINEARG_MAX]; + char *p; + struct mdoc_node *n; fl = 0; if (MDOC_QUOTABLE & mdoc_macros[tok].flags) @@ -1019,7 +1020,31 @@ macro_constant(MACRO_PROT_ARGS) mdoc->next = MDOC_NEXT_SIBLING; } - return(rewind_elem(mdoc, tok)); + if ( ! rewind_elem(mdoc, tok)) + return(0); + if ( ! (MDOC_NOKEEP & mdoc_macros[tok].flags)) + return(1); + + assert(mdoc->last->tok == tok); + if (mdoc->last->parent->child == mdoc->last) + mdoc->last->parent->child = mdoc->last->prev; + if (mdoc->last->prev) + mdoc->last->prev->next = NULL; + + n = mdoc->last; + assert(NULL == mdoc->last->next); + + if (mdoc->last->prev) { + mdoc->last = mdoc->last->prev; + mdoc->next = MDOC_NEXT_SIBLING; + } else { + mdoc->last = mdoc->last->parent; + mdoc->next = MDOC_NEXT_CHILD; + } + + mdoc_node_freelist(n); + + return(1); } -- cgit v1.2.3