=================================================================== RCS file: /cvs/mandoc/man_macro.c,v retrieving revision 1.6 retrieving revision 1.8 diff -u -p -r1.6 -r1.8 --- mandoc/man_macro.c 2009/03/25 15:36:05 1.6 +++ mandoc/man_macro.c 2009/03/26 11:16:21 1.8 @@ -1,4 +1,4 @@ -/* $Id: man_macro.c,v 1.6 2009/03/25 15:36:05 kristaps Exp $ */ +/* $Id: man_macro.c,v 1.8 2009/03/26 11:16:21 kristaps Exp $ */ /* * Copyright (c) 2008, 2009 Kristaps Dzonsons * @@ -18,7 +18,6 @@ */ #include #include -#include /* XXX */ #include #include #include @@ -56,8 +55,16 @@ man_macro(struct man *man, int tok, int line, man->next = MAN_NEXT_SIBLING; } - for ( ; man->last && man->last != n; - man->last = man->last->parent) { + /* + * Note that when TH is pruned, we'll be back at the root, so + * make sure that we don't clobber as its sibling. + */ + + for ( ; man->last; man->last = man->last->parent) { + if (man->last == n) + break; + if (man->last->type == MAN_ROOT) + break; if ( ! man_valid_post(man)) return(0); if ( ! man_action_post(man)) @@ -66,13 +73,17 @@ man_macro(struct man *man, int tok, int line, assert(man->last); - if ( ! man_valid_post(man)) + /* + * Same here regarding whether we're back at the root. + */ + + if (man->last->type != MAN_ROOT && ! man_valid_post(man)) return(0); - if ( ! man_action_post(man)) + if (man->last->type != MAN_ROOT && ! man_action_post(man)) return(0); + if (man->last->type != MAN_ROOT) + man->next = MAN_NEXT_SIBLING; - man->next = MAN_NEXT_SIBLING; - return(1); } @@ -88,6 +99,7 @@ man_macroend(struct man *m) if ( ! man_action_post(m)) return(0); } + assert(m->last == m->first); if ( ! man_valid_post(m)) return(0); @@ -100,7 +112,7 @@ man_macroend(struct man *m) /* ARGSUSED */ static int -man_args(struct man *man, int line, +man_args(struct man *m, int line, int *pos, char *buf, char **v) { @@ -133,8 +145,10 @@ man_args(struct man *man, int line, if (buf[*pos]) return(1); - warnx("tail whitespace"); - return(-1); + if ( ! man_vwarn(m, line, *pos, "trailing spaces")) + return(-1); + + return(1); } /* @@ -149,8 +163,9 @@ man_args(struct man *man, int line, (*pos)++; if (0 == buf[*pos]) { - warnx("unterminated quotation"); - return(-1); + if ( ! man_vwarn(m, line, *pos, "unterminated quote")) + return(-1); + return(1); } buf[(*pos)++] = 0; @@ -163,6 +178,7 @@ man_args(struct man *man, int line, if (buf[*pos]) return(1); - warnx("tail whitespace"); - return(-1); + if ( ! man_vwarn(m, line, *pos, "trailing spaces")) + return(-1); + return(1); }