summaryrefslogtreecommitdiffstats
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
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@.
-rw-r--r--mandoc.11
-rw-r--r--mandoc.h1
-rw-r--r--read.c1
-rw-r--r--roff.c23
4 files changed, 22 insertions, 4 deletions
diff --git a/mandoc.1 b/mandoc.1
index 10b50351..5b55b728 100644
--- a/mandoc.1
+++ b/mandoc.1
@@ -1266,6 +1266,7 @@ keeps the code more readable.
.It "ignore data in cell"
.It "data block still open"
.It "ignoring extra data cells"
+.It "ignoring macro in table"
.El
.Ss "Errors related to roff, mdoc, and man code"
.Bl -ohang
diff --git a/mandoc.h b/mandoc.h
index 5588a3a4..c3f32994 100644
--- a/mandoc.h
+++ b/mandoc.h
@@ -144,6 +144,7 @@ enum mandocerr {
MANDOCERR_TBLIGNDATA, /* ignore data in cell */
MANDOCERR_TBLBLOCK, /* data block still open */
MANDOCERR_TBLEXTRADAT, /* ignoring extra data cells */
+ MANDOCERR_TBLMACRO, /* ignoring macro in table: macro */
/* related to document structure and macros */
MANDOCERR_ROFFLOOP, /* input stack limit exceeded, infinite loop? */
diff --git a/read.c b/read.c
index 558c5e94..9b266090 100644
--- a/read.c
+++ b/read.c
@@ -188,6 +188,7 @@ static const char * const mandocerrs[MANDOCERR_MAX] = {
"ignore data in cell",
"data block still open",
"ignoring extra data cells",
+ "ignoring macro in table",
/* related to document structure and macros */
"input stack limit exceeded, infinite loop?",
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));
}