=================================================================== RCS file: /cvs/mandoc/roff.c,v retrieving revision 1.307 retrieving revision 1.310 diff -u -p -r1.307 -r1.310 --- mandoc/roff.c 2017/06/08 19:35:51 1.307 +++ mandoc/roff.c 2017/06/14 14:02:39 1.310 @@ -1,4 +1,4 @@ -/* $Id: roff.c,v 1.307 2017/06/08 19:35:51 schwarze Exp $ */ +/* $Id: roff.c,v 1.310 2017/06/14 14:02:39 schwarze Exp $ */ /* * Copyright (c) 2008-2012, 2014 Kristaps Dzonsons * Copyright (c) 2010-2015, 2017 Ingo Schwarze @@ -222,8 +222,8 @@ static enum rofferr roff_userdef(ROFF_ARGS); const char *__roff_name[MAN_MAX + 1] = { "br", "ce", "ft", "ll", - "mc", "sp", "ta", "ti", - NULL, + "mc", "rj", "sp", "ta", + "ti", NULL, "ab", "ad", "af", "aln", "als", "am", "am1", "ami", "ami1", "as", "as1", "asciify", @@ -267,7 +267,7 @@ const char *__roff_name[MAN_MAX + 1] = { "pn", "pnr", "po", "ps", "psbb", "pshape", "pso", "ptr", "pvs", "rchar", "rd", "recursionlimit", - "return", "rfschar", "rhang", "rj", + "return", "rfschar", "rhang", "rm", "rn", "rnn", "rr", "rs", "rt", "schar", "sentchar", "shc", "shift", "sizes", "so", @@ -334,6 +334,7 @@ static struct roffmac roffs[TOKEN_NONE] = { { roff_onearg, NULL, NULL, 0 }, /* ft */ { roff_onearg, NULL, NULL, 0 }, /* ll */ { roff_onearg, NULL, NULL, 0 }, /* mc */ + { roff_onearg, NULL, NULL, 0 }, /* rj */ { roff_onearg, NULL, NULL, 0 }, /* sp */ { roff_manyarg, NULL, NULL, 0 }, /* ta */ { roff_onearg, NULL, NULL, 0 }, /* ti */ @@ -511,7 +512,6 @@ static struct roffmac roffs[TOKEN_NONE] = { { roff_unsupp, NULL, NULL, 0 }, /* return */ { roff_unsupp, NULL, NULL, 0 }, /* rfschar */ { roff_line_ignore, NULL, NULL, 0 }, /* rhang */ - { roff_line_ignore, NULL, NULL, 0 }, /* rj */ { roff_rm, NULL, NULL, 0 }, /* rm */ { roff_rn, NULL, NULL, 0 }, /* rn */ { roff_unsupp, NULL, NULL, 0 }, /* rnn */ @@ -1548,10 +1548,11 @@ roff_parseln(struct roff *r, int ln, struct buf *buf, /* Tables ignore most macros. */ - if (r->tbl != NULL && (t == TOKEN_NONE || t == ROFF_TS)) { + if (r->tbl != NULL && (t == TOKEN_NONE || t == ROFF_TS || + t == ROFF_br || t == ROFF_ce || t == ROFF_rj || t == ROFF_sp)) { mandoc_msg(MANDOCERR_TBLMACRO, r->parse, ln, pos, buf->buf + spos); - if (t == ROFF_TS) + if (t != TOKEN_NONE) return ROFF_IGN; while (buf->buf[pos] != '\0' && buf->buf[pos] != ' ') pos++; @@ -2064,7 +2065,7 @@ roff_evalcond(struct roff *r, int ln, char *v, int *po { char *cp, *name; size_t sz; - int number, savepos, wanttrue; + int number, savepos, istrue, wanttrue; if ('!' == v[*pos]) { wanttrue = 0; @@ -2080,17 +2081,23 @@ roff_evalcond(struct roff *r, int ln, char *v, int *po (*pos)++; return wanttrue; case 'c': - case 'd': case 'e': case 't': case 'v': (*pos)++; return !wanttrue; + case 'd': case 'r': - cp = name = v + ++*pos; - sz = roff_getname(r, &cp, ln, *pos); + cp = v + *pos + 1; + while (*cp == ' ') + cp++; + name = cp; + sz = roff_getname(r, &cp, ln, cp - v); + istrue = sz && (v[*pos] == 'r' ? roff_hasregn(r, name, sz) : + (roff_getstrn(r, name, sz) != NULL || + roff_getrenn(r, name, sz) != NULL)); *pos = cp - v; - return (sz && roff_hasregn(r, name, sz)) == wanttrue; + return istrue == wanttrue; default: break; } @@ -2879,7 +2886,7 @@ roff_onearg(ROFF_ARGS) (tok == ROFF_sp || tok == ROFF_ti)) man_breakscope(r->man, tok); - if (tok == ROFF_ce && roffce_node != NULL) { + if (roffce_node != NULL && (tok == ROFF_ce || tok == ROFF_rj)) { r->man->last = roffce_node; r->man->next = ROFF_NEXT_SIBLING; } @@ -2900,8 +2907,8 @@ roff_onearg(ROFF_ARGS) roff_word_alloc(r->man, ln, pos, buf->buf + pos); } - if (tok == ROFF_ce) { - if (r->man->last->tok == ROFF_ce) { + if (tok == ROFF_ce || tok == ROFF_rj) { + if (r->man->last->type == ROFFT_ELEM) { roff_word_alloc(r->man, ln, pos, "1"); r->man->last->flags |= NODE_NOSRC; }