aboutsummaryrefslogtreecommitdiffstatshomepage
path: root/eqn_html.c
diff options
context:
space:
mode:
authorIngo Schwarze <schwarze@openbsd.org>2014-10-12 19:31:41 +0000
committerIngo Schwarze <schwarze@openbsd.org>2014-10-12 19:31:41 +0000
commit9bdc68b0e9c4ef307f52f16b3727a115cf20e060 (patch)
tree553f1dc246856c95ce4fc3c65ac2c4abdcb2f4bd /eqn_html.c
parent714b0f49e6eaefc48e0a4bc4859300de82444b58 (diff)
downloadmandoc-9bdc68b0e9c4ef307f52f16b3727a115cf20e060.tar.gz
mandoc-9bdc68b0e9c4ef307f52f16b3727a115cf20e060.tar.zst
mandoc-9bdc68b0e9c4ef307f52f16b3727a115cf20e060.zip
Improve error handling in the eqn(7) parser.
Get rid of the first fatal error, MANDOCERR_EQNSYNT. In eqn(7), there is no need to be bug-compatible with groff, so there is no need to abondon the whole equation in case of a syntax error. In particular: * Skip "back", "delim", "down", "fwd", "gfont", "gsize", "left", "right", "size", and "up" without arguments. * Skip "gsize" and "size" with a non-numeric argument. * Skip closing delimiters that are not open. * Skip "above" outside piles. * For diacritic marks and binary operators without a left operand, default to an empty box. * Let piles and matrices take one argument rather than insisting on a braced list. Let HTML output handle that, too. * When rewinding, if the root box is guaranteed to match the termination condition, no error handling is needed.
Diffstat (limited to 'eqn_html.c')
-rw-r--r--eqn_html.c14
1 files changed, 9 insertions, 5 deletions
diff --git a/eqn_html.c b/eqn_html.c
index 3f3fe8f6..f2973361 100644
--- a/eqn_html.c
+++ b/eqn_html.c
@@ -1,4 +1,4 @@
-/* $Id: eqn_html.c,v 1.9 2014/10/10 14:27:46 schwarze Exp $ */
+/* $Id: eqn_html.c,v 1.10 2014/10/12 19:31:41 schwarze Exp $ */
/*
* Copyright (c) 2011, 2014 Kristaps Dzonsons <kristaps@bsd.lv>
*
@@ -47,10 +47,12 @@ eqn_box(struct html *p, const struct eqn_box *bp)
if (EQN_MATRIX == bp->type) {
if (NULL == bp->first)
goto out;
- assert(EQN_LIST == bp->first->type);
+ if (EQN_LIST != bp->first->type) {
+ eqn_box(p, bp->first);
+ goto out;
+ }
if (NULL == (parent = bp->first->first))
goto out;
- assert(EQN_PILE == parent->type);
/* Estimate the number of rows, first. */
if (NULL == (child = parent->first))
goto out;
@@ -126,8 +128,10 @@ eqn_box(struct html *p, const struct eqn_box *bp)
if (EQN_PILE == bp->type) {
assert(NULL == post);
- post = print_otag(p, TAG_MTABLE, 0, NULL);
- } else if (bp->parent && EQN_PILE == bp->parent->type) {
+ if (bp->first != NULL && bp->first->type == EQN_LIST)
+ post = print_otag(p, TAG_MTABLE, 0, NULL);
+ } else if (bp->type == EQN_LIST &&
+ bp->parent && bp->parent->type == EQN_PILE) {
assert(NULL == post);
post = print_otag(p, TAG_MTR, 0, NULL);
print_otag(p, TAG_MTD, 0, NULL);