=================================================================== RCS file: /cvs/mandoc/man.c,v retrieving revision 1.165 retrieving revision 1.169 diff -u -p -r1.165 -r1.169 --- mandoc/man.c 2015/10/06 18:32:19 1.165 +++ mandoc/man.c 2017/04/24 23:06:18 1.169 @@ -1,4 +1,4 @@ -/* $Id: man.c,v 1.165 2015/10/06 18:32:19 schwarze Exp $ */ +/* $Id: man.c,v 1.169 2017/04/24 23:06:18 schwarze Exp $ */ /* * Copyright (c) 2008, 2009, 2010, 2011 Kristaps Dzonsons * Copyright (c) 2013, 2014, 2015 Ingo Schwarze @@ -35,21 +35,6 @@ #include "roff_int.h" #include "libman.h" -const char *const __man_macronames[MAN_MAX] = { - "br", "TH", "SH", "SS", - "TP", "LP", "PP", "P", - "IP", "HP", "SM", "SB", - "BI", "IB", "BR", "RB", - "R", "B", "I", "IR", - "RI", "sp", "nf", - "fi", "RE", "RS", "DT", - "UC", "PD", "AT", "in", - "ft", "OP", "EX", "EE", - "UR", "UE", "ll" - }; - -const char * const *man_macronames = __man_macronames; - static void man_descope(struct roff_man *, int, int); static int man_ptext(struct roff_man *, int, char *, int); static int man_pmacro(struct roff_man *, int, char *, int); @@ -149,7 +134,7 @@ man_ptext(struct roff_man *man, int line, char *buf, i assert(i); if (mandoc_eos(buf, (size_t)i)) - man->last->flags |= MAN_EOS; + man->last->flags |= NODE_EOS; man_descope(man, line, offs); return 1; @@ -203,7 +188,7 @@ man_pmacro(struct roff_man *man, int ln, char *buf, in /* Jump to the next non-whitespace word. */ - while (buf[offs] && buf[offs] == ' ') + while (buf[offs] == ' ') offs++; /* @@ -275,8 +260,8 @@ man_breakscope(struct roff_man *man, int tok) mandoc_vmsg(MANDOCERR_BLK_LINE, man->parse, n->line, n->pos, "%s breaks %s", - tok == TOKEN_NONE ? "TS" : man_macronames[tok], - man_macronames[n->tok]); + tok == TOKEN_NONE ? "TS" : roff_name[tok], + roff_name[n->tok]); roff_node_delete(man, n); man->flags &= ~MAN_ELINE; @@ -317,8 +302,8 @@ man_breakscope(struct roff_man *man, int tok) mandoc_vmsg(MANDOCERR_BLK_LINE, man->parse, n->line, n->pos, "%s breaks %s", - tok == TOKEN_NONE ? "TS" : man_macronames[tok], - man_macronames[n->tok]); + tok == TOKEN_NONE ? "TS" : roff_name[tok], + roff_name[n->tok]); roff_node_delete(man, n); man->flags &= ~MAN_BLINE; @@ -331,4 +316,39 @@ man_mparse(const struct roff_man *man) assert(man && man->parse); return man->parse; +} + +void +man_state(struct roff_man *man, struct roff_node *n) +{ + + switch(n->tok) { + case MAN_nf: + case MAN_EX: + if (man->flags & MAN_LITERAL && ! (n->flags & NODE_VALID)) + mandoc_msg(MANDOCERR_NF_SKIP, man->parse, + n->line, n->pos, "nf"); + man->flags |= MAN_LITERAL; + break; + case MAN_fi: + case MAN_EE: + if ( ! (man->flags & MAN_LITERAL) && + ! (n->flags & NODE_VALID)) + mandoc_msg(MANDOCERR_FI_SKIP, man->parse, + n->line, n->pos, "fi"); + man->flags &= ~MAN_LITERAL; + break; + default: + break; + } + man->last->flags |= NODE_VALID; +} + +void +man_validate(struct roff_man *man) +{ + + man->last = man->first; + man_node_validate(man); + man->flags &= ~MAN_LITERAL; }