summaryrefslogtreecommitdiffstats
path: root/roff.c
diff options
context:
space:
mode:
authorIngo Schwarze <schwarze@openbsd.org>2014-12-16 23:44:41 +0000
committerIngo Schwarze <schwarze@openbsd.org>2014-12-16 23:44:41 +0000
commit049de3868dfab614357f07d4d25fa4b7c2e4b7f5 (patch)
tree3e9d18c4db18753163000049b6cfa2223383e920 /roff.c
parent1c5b69096dc052617e48d25e13d9e3875b100302 (diff)
downloadmandoc-049de3868dfab614357f07d4d25fa4b7c2e4b7f5.tar.gz
Ignore mdoc(7) and man(7) macros inside tbl(7) code because they
would abort the table in an unclean way, causing assertion failures found by jsg@.
Diffstat (limited to 'roff.c')
-rw-r--r--roff.c23
1 files changed, 19 insertions, 4 deletions
diff --git a/roff.c b/roff.c
index f44fd6e2..5d0d57f8 100644
--- a/roff.c
+++ b/roff.c
@@ -730,6 +730,7 @@ roff_parseln(struct roff *r, int ln, struct buf *buf, int *offs)
enum rofft t;
enum rofferr e;
int pos; /* parse point */
+ int spos; /* saved parse point for messages */
int ppos; /* original offset in buf->buf */
int ctl; /* macro line (boolean) */
@@ -800,15 +801,29 @@ roff_parseln(struct roff *r, int ln, struct buf *buf, int *offs)
return((*roffs[t].sub)(r, t, buf, ln, ppos, pos, offs));
}
+ /* No scope is open. This is a new request or macro. */
+
+ spos = pos;
+ t = roff_parse(r, buf->buf, &pos, ln, ppos);
+
+ /* Tables ignore most macros. */
+
+ if (r->tbl != NULL && (t == ROFF_MAX || t == ROFF_TS)) {
+ mandoc_msg(MANDOCERR_TBLMACRO, r->parse,
+ ln, pos, buf->buf + spos);
+ return(ROFF_IGN);
+ }
+
/*
- * Lastly, as we've no scope open, try to look up and execute
- * the new macro. If no macro is found, simply return and let
- * the compilers handle it.
+ * This is neither a roff request nor a user-defined macro.
+ * Let the standard macro set parsers handle it.
*/
- if ((t = roff_parse(r, buf->buf, &pos, ln, ppos)) == ROFF_MAX)
+ if (t == ROFF_MAX)
return(ROFF_CONT);
+ /* Execute a roff request or a user defined macro. */
+
assert(roffs[t].proc);
return((*roffs[t].proc)(r, t, buf, ln, ppos, pos, offs));
}