add parentheses to the output where required for disambiguation
authorschwarze <schwarze@openbsd.org>
Fri, 7 Jul 2017 19:06:15 +0000 (19:06 +0000)
committerschwarze <schwarze@openbsd.org>
Fri, 7 Jul 2017 19:06:15 +0000 (19:06 +0000)
regress/usr.bin/mandoc/eqn/fromto/basic.out_ascii
regress/usr.bin/mandoc/eqn/fromto/noarg.out_ascii
regress/usr.bin/mandoc/eqn/fromto/precedence.out_ascii
regress/usr.bin/mandoc/eqn/over/noarg.out_ascii
regress/usr.bin/mandoc/eqn/over/precedence.out_ascii
regress/usr.bin/mandoc/eqn/subsup/combine.out_ascii
regress/usr.bin/mandoc/eqn/subsup/noarg.out_ascii
regress/usr.bin/mandoc/eqn/subsup/precedence.out_ascii
regress/usr.bin/mandoc/eqn/subsup/sub_group.out_ascii
usr.bin/mandoc/eqn_term.c

index e4530a1..b67ec47 100644 (file)
@@ -4,6 +4,6 @@ N\bNA\bAM\bME\bE
      f\bfr\bro\bom\bmt\bto\bo-\b-b\bba\bas\bsi\bic\bc - vertical stacking
 
 D\bDE\bES\bSC\bCR\bRI\bIP\bPT\bTI\bIO\bON\bN
-     initial text E_(_\bi = 1)^oo 1/_\bi^2 final text
+     initial text E_(_\bi = 1)^oo 1/(_\bi^2) final text
 
 OpenBSD                          July 4, 2017                          OpenBSD
index c09dcde..f5f1e8f 100644 (file)
@@ -4,6 +4,6 @@ N\bNA\bAM\bME\bE
      f\bfr\bro\bom\bmt\bto\bo-\b-n\bno\boa\bar\brg\bg - vertical stacking lacks final argument
 
 D\bDE\bES\bSC\bCR\bRI\bIP\bPT\bTI\bIO\bON\bN
-     initial text _\bx__\ba^^ final text
+     initial text _\bx_(_\ba^)^ final text
 
 OpenBSD                          July 4, 2017                          OpenBSD
index 1eba1be..b7da718 100644 (file)
@@ -4,6 +4,6 @@ N\bNA\bAM\bME\bE
      s\bsu\bub\bbs\bsu\bup\bp-\b-p\bpr\bre\bec\bce\bed\bde\ben\bnc\bce\be - precedence of subscripts and superscripts
 
 D\bDE\bES\bSC\bCR\bRI\bIP\bPT\bTI\bIO\bON\bN
-     initial text _\bX__\ba_^_\bc^ ; X_a\ba^_\bc ; _\bX_1^2__\ba__\bc^_\be^_\bo__\br^_\bs final text
+     initial text _\bX_(_\ba_)^_\bc^ ; X_a\ba^_\bc ; (_\bX_1^2)_(_\ba__\bc^_\be)^(_\bo__\br^_\bs) final text
 
 OpenBSD                          July 6, 2017                          OpenBSD
index 22ceb49..c30afa5 100644 (file)
@@ -4,6 +4,6 @@ N\bNA\bAM\bME\bE
      o\bov\bve\ber\br-\b-n\bno\boa\bar\brg\bg - fraction operator without arguments
 
 D\bDE\bES\bSC\bCR\bRI\bIP\bPT\bTI\bIO\bON\bN
-     initial text // final text
+     initial text (/)/ final text
 
 OpenBSD                          July 4, 2017                          OpenBSD
index a77aa47..1059b74 100644 (file)
@@ -4,7 +4,7 @@ N\bNA\bAM\bME\bE
      o\bov\bve\ber\br-\b-p\bpr\bre\bec\bce\bed\bde\ben\bnc\bce\be - precedence of the fraction operator
 
 D\bDE\bES\bSC\bCR\bRI\bIP\bPT\bTI\bIO\bON\bN
-     initial text 1 + _\bx + _\bx^2/2 + _\bx^3/(2 * 3) ; _\ba^/_\bc~ ; a\ba/c\bc ; sqrt(_\ba)/sqrt(_\bc)
-     final text
+     initial text 1 + _\bx + (_\bx^2)/2 + (_\bx^3)/(2 * 3) ; _\ba^/_\bc~ ; a\ba/c\bc ;
+     sqrt(_\ba)/sqrt(_\bc) final text
 
 OpenBSD                          July 6, 2017                          OpenBSD
index 8812f6f..468a814 100644 (file)
@@ -4,6 +4,6 @@ N\bNA\bAM\bME\bE
      s\bsu\bub\bbs\bsu\bup\bp-\b-c\bco\bom\bmb\bbi\bin\bne\be - combination of subscripts and superscripts
 
 D\bDE\bES\bSC\bCR\bRI\bIP\bPT\bTI\bIO\bON\bN
-     initial text _\bx_1^2 + _\be^_\bx_2 final text
+     initial text _\bx_1^2 + _\be^(_\bx_2) final text
 
 OpenBSD                          July 4, 2017                          OpenBSD
index d5b87b2..eec09f1 100644 (file)
@@ -4,6 +4,6 @@ N\bNA\bAM\bME\bE
      s\bsu\bub\bbs\bsu\bup\bp-\b-n\bno\boa\bar\brg\bg - empty subscripts and superscripts
 
 D\bDE\bES\bSC\bCR\bRI\bIP\bPT\bTI\bIO\bON\bN
-     initial text _\bx_1^^ final text
+     initial text _\bx_(1^)^ final text
 
 OpenBSD                          July 4, 2017                          OpenBSD
index 60619b5..21207dd 100644 (file)
@@ -4,6 +4,6 @@ N\bNA\bAM\bME\bE
      s\bsu\bub\bbs\bsu\bup\bp-\b-p\bpr\bre\bec\bce\bed\bde\ben\bnc\bce\be - precedence of subscripts and superscripts
 
 D\bDE\bES\bSC\bCR\bRI\bIP\bPT\bTI\bIO\bON\bN
-     initial text _\bx^_1_^2 + _\be~^_\bx^__\bs<-> ; I_I\bI^_\bI + I^I\bI__\bI final text
+     initial text (_\bx^)_(1_)^2 + (_\be~)^((_\bx^)__\bs<->) ; I_I\bI^_\bI + I^(I\bI__\bI) final text
 
 OpenBSD                          July 6, 2017                          OpenBSD
index 85e3568..5628e6d 100644 (file)
@@ -4,6 +4,6 @@ N\bNA\bAM\bME\bE
      s\bsu\bub\bbs\bsu\bup\bp-\b-s\bsu\bub\bb_\b_g\bgr\bro\bou\bup\bp - grouping of subscripts
 
 D\bDE\bES\bSC\bCR\bRI\bIP\bPT\bTI\bIO\bON\bN
-     initial text _\bx__\bi + _\bx__\bj_1 + (_\bM__\bi)__\bj final text
+     initial text _\bx__\bi + _\bx_(_\bj_1) + (_\bM__\bi)__\bj final text
 
 OpenBSD                          July 4, 2017                          OpenBSD
index 503919f..4a48e79 100644 (file)
@@ -1,4 +1,4 @@
-/*     $OpenBSD: eqn_term.c,v 1.7 2017/07/06 00:08:52 schwarze Exp $ */
+/*     $OpenBSD: eqn_term.c,v 1.8 2017/07/07 19:06:15 schwarze Exp $ */
 /*
  * Copyright (c) 2011 Kristaps Dzonsons <kristaps@bsd.lv>
  * Copyright (c) 2014, 2015, 2017 Ingo Schwarze <schwarze@openbsd.org>
@@ -49,21 +49,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) {
@@ -109,6 +128,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) {
@@ -119,9 +140,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)