]> git.cameronkatri.com Git - mandoc.git/blobdiff - eqn_term.c
Run the regression tests iteratively rather than recursively.
[mandoc.git] / eqn_term.c
index e11b0485a18ad25991a4ab93a4ecc6e062c46575..08f4a993eca4f7aaff63b2986fd136d593d688b1 100644 (file)
@@ -1,4 +1,4 @@
-/*     $Id: eqn_term.c,v 1.11 2017/07/06 00:19:54 schwarze Exp $ */
+/*     $Id: eqn_term.c,v 1.13 2017/07/08 14:51:04 schwarze Exp $ */
 /*
  * Copyright (c) 2011 Kristaps Dzonsons <kristaps@bsd.lv>
  * Copyright (c) 2014, 2015, 2017 Ingo Schwarze <schwarze@openbsd.org>
@@ -40,10 +40,10 @@ static void eqn_box(struct termp *, const struct eqn_box *);
 
 
 void
-term_eqn(struct termp *p, const struct eqn *ep)
+term_eqn(struct termp *p, const struct eqn_box *bp)
 {
 
-       eqn_box(p, ep->root);
+       eqn_box(p, bp);
        p->flags &= ~TERMP_NOSPACE;
 }
 
@@ -51,21 +51,40 @@ static void
 eqn_box(struct termp *p, const struct eqn_box *bp)
 {
        const struct eqn_box *child;
+       int delim;
+
+       /* Delimiters around this box? */
 
        if ((bp->type == EQN_LIST && bp->expectargs > 1) ||
            (bp->type == EQN_PILE && (bp->prev || bp->next)) ||
-           (bp->parent != NULL && bp->parent->pos == EQNPOS_SQRT)) {
+           (bp->parent != NULL && (bp->parent->pos == EQNPOS_SQRT ||
+           /* Diacritic followed by ^ or _. */
+           ((bp->top != NULL || bp->bottom != NULL) &&
+            bp->parent->type == EQN_SUBEXPR &&
+            bp->parent->pos != EQNPOS_OVER && bp->next != NULL) ||
+           /* Nested over, sub, sup, from, to. */
+           (bp->type == EQN_SUBEXPR && bp->pos != EQNPOS_SQRT &&
+            ((bp->parent->type == EQN_LIST && bp->expectargs == 1) ||
+             (bp->parent->type == EQN_SUBEXPR &&
+              bp->pos != EQNPOS_SQRT)))))) {
                if (bp->parent->type == EQN_SUBEXPR && bp->prev != NULL)
                        p->flags |= TERMP_NOSPACE;
                term_word(p, bp->left != NULL ? bp->left : "(");
                p->flags |= TERMP_NOSPACE;
-       }
+               delim = 1;
+       } else
+               delim = 0;
+
+       /* Handle Fonts and text. */
+
        if (bp->font != EQNFONT_NONE)
                term_fontpush(p, fontmap[(int)bp->font]);
 
        if (bp->text != NULL)
                term_word(p, bp->text);
 
+       /* Special box types. */
+
        if (bp->pos == EQNPOS_SQRT) {
                term_word(p, "sqrt");
                if (bp->first != NULL) {
@@ -111,6 +130,8 @@ eqn_box(struct termp *p, const struct eqn_box *bp)
                }
        }
 
+       /* Handle Fonts and diacritics. */
+
        if (bp->font != EQNFONT_NONE)
                term_fontpop(p);
        if (bp->top != NULL) {
@@ -121,9 +142,10 @@ eqn_box(struct termp *p, const struct eqn_box *bp)
                p->flags |= TERMP_NOSPACE;
                term_word(p, "_");
        }
-       if ((bp->type == EQN_LIST && bp->expectargs > 1) ||
-           (bp->type == EQN_PILE && (bp->prev || bp->next)) ||
-           (bp->parent != NULL && bp->parent->pos == EQNPOS_SQRT)) {
+
+       /* Right delimiter after this box? */
+
+       if (delim) {
                p->flags |= TERMP_NOSPACE;
                term_word(p, bp->right != NULL ? bp->right : ")");
                if (bp->parent->type == EQN_SUBEXPR && bp->next != NULL)