=================================================================== RCS file: /cvs/mandoc/roff.c,v retrieving revision 1.315 retrieving revision 1.318 diff -u -p -r1.315 -r1.318 --- mandoc/roff.c 2017/06/18 17:36:03 1.315 +++ mandoc/roff.c 2017/07/04 22:52:00 1.318 @@ -1,4 +1,4 @@ -/* $Id: roff.c,v 1.315 2017/06/18 17:36:03 schwarze Exp $ */ +/* $Id: roff.c,v 1.318 2017/07/04 22:52:00 schwarze Exp $ */ /* * Copyright (c) 2008-2012, 2014 Kristaps Dzonsons * Copyright (c) 2010-2015, 2017 Ingo Schwarze @@ -330,7 +330,7 @@ const char *__roff_name[MAN_MAX + 1] = { "RE", "RS", "DT", "UC", "PD", "AT", "in", "OP", "EX", "EE", "UR", - "UE", NULL + "UE", "MT", "ME", NULL }; const char *const *roff_name = __roff_name; @@ -819,14 +819,14 @@ roff_man_free(struct roff_man *man) struct roff_man * roff_man_alloc(struct roff *roff, struct mparse *parse, - const char *defos, int quick) + const char *os_s, int quick) { struct roff_man *man; man = mandoc_calloc(1, sizeof(*man)); man->parse = parse; man->roff = roff; - man->defos = defos; + man->os_s = os_s; man->quick = quick; roff_man_alloc1(man); roff->man = man; @@ -1138,7 +1138,7 @@ roff_res(struct roff *r, struct buf *buf, int ln, int size_t maxl; /* expected length of the escape name */ size_t naml; /* actual length of the escape name */ enum mandoc_esc esc; /* type of the escape sequence */ - enum mdoc_os os_e; /* kind of RCS id seen */ + enum mandoc_os os_e; /* kind of RCS id seen */ int inaml; /* length returned from mandoc_escape() */ int expand_count; /* to avoid infinite loops */ int npos; /* position in numeric expression */ @@ -1161,10 +1161,10 @@ roff_res(struct roff *r, struct buf *buf, int ln, int /* Comment found, look for RCS id. */ if ((cp = strstr(stesc, "$" "OpenBSD")) != NULL) { - os_e = MDOC_OS_OPENBSD; + os_e = MANDOC_OS_OPENBSD; cp += 8; } else if ((cp = strstr(stesc, "$" "NetBSD")) != NULL) { - os_e = MDOC_OS_NETBSD; + os_e = MANDOC_OS_NETBSD; cp += 7; } if (cp != NULL && @@ -1926,17 +1926,8 @@ roff_cond_sub(ROFF_ARGS) rr = r->last->rule; roffnode_cleanscope(r); - t = roff_parse(r, buf->buf, &pos, ln, ppos); /* - * Fully handle known macros when they are structurally - * required or when the conditional evaluated to true. - */ - - if (t != TOKEN_NONE && (rr || roffs[t].flags & ROFFMAC_STRUCT)) - return (*roffs[t].proc)(r, t, buf, ln, ppos, pos, offs); - - /* * If `\}' occurs on a macro line without a preceding macro, * drop the line completely. */ @@ -1948,14 +1939,29 @@ roff_cond_sub(ROFF_ARGS) /* Always check for the closing delimiter `\}'. */ while ((ep = strchr(ep, '\\')) != NULL) { - if (*(++ep) == '}') { - *ep = '&'; - roff_ccond(r, ln, ep - buf->buf - 1); - } - if (*ep != '\0') + switch (ep[1]) { + case '}': + memmove(ep, ep + 2, strlen(ep + 2) + 1); + roff_ccond(r, ln, ep - buf->buf); + break; + case '\0': ++ep; + break; + default: + ep += 2; + break; + } } - return rr ? ROFF_CONT : ROFF_IGN; + + /* + * Fully handle known macros when they are structurally + * required or when the conditional evaluated to true. + */ + + t = roff_parse(r, buf->buf, &pos, ln, ppos); + return t != TOKEN_NONE && (rr || roffs[t].flags & ROFFMAC_STRUCT) + ? (*roffs[t].proc)(r, t, buf, ln, ppos, pos, offs) : rr + ? ROFF_CONT : ROFF_IGN; } static enum rofferr