=================================================================== RCS file: /cvsrepo/anoncvs/cvs/src/usr.bin/mandoc/eqn_term.c,v retrieving revision 1.2 retrieving revision 1.3 diff -c -r1.2 -r1.3 *** src/usr.bin/mandoc/eqn_term.c 2014/04/20 16:44:44 1.2 --- src/usr.bin/mandoc/eqn_term.c 2014/10/12 14:48:25 1.3 *************** *** 1,6 **** ! /* $Id: eqn_term.c,v 1.2 2014/04/20 16:44:44 schwarze Exp $ */ /* * Copyright (c) 2011 Kristaps Dzonsons * * Permission to use, copy, modify, and distribute this software for any * purpose with or without fee is hereby granted, provided that the above --- 1,7 ---- ! /* $OpenBSD: eqn_term.c,v 1.3 2014/10/12 14:48:25 schwarze Exp $ */ /* * Copyright (c) 2011 Kristaps Dzonsons + * Copyright (c) 2014 Ingo Schwarze * * Permission to use, copy, modify, and distribute this software for any * purpose with or without fee is hereby granted, provided that the above *************** *** 14,19 **** --- 15,22 ---- * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */ + #include + #include #include #include *************** *** 38,73 **** term_eqn(struct termp *p, const struct eqn *ep) { - p->flags |= TERMP_NONOSPACE; eqn_box(p, ep->root); ! term_word(p, " "); ! p->flags &= ~TERMP_NONOSPACE; } static void eqn_box(struct termp *p, const struct eqn_box *bp) { ! if (EQNFONT_NONE != bp->font) term_fontpush(p, fontmap[(int)bp->font]); - if (bp->left) - term_word(p, bp->left); - if (EQN_SUBEXPR == bp->type) - term_word(p, "("); ! if (bp->text) term_word(p, bp->text); ! if (bp->first) eqn_box(p, bp->first); ! if (EQN_SUBEXPR == bp->type) ! term_word(p, ")"); ! if (bp->right) ! term_word(p, bp->right); ! if (EQNFONT_NONE != bp->font) term_fontpop(p); ! if (bp->next) ! eqn_box(p, bp->next); } --- 41,122 ---- term_eqn(struct termp *p, const struct eqn *ep) { eqn_box(p, ep->root); ! p->flags &= ~TERMP_NOSPACE; } static void eqn_box(struct termp *p, const struct eqn_box *bp) { + const struct eqn_box *child; ! if (bp->type == EQN_LIST || ! (bp->type == EQN_PILE && (bp->prev || bp->next)) || ! (bp->parent != NULL && bp->parent->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; ! } ! if (bp->font != EQNFONT_NONE) term_fontpush(p, fontmap[(int)bp->font]); ! if (bp->text != NULL) term_word(p, bp->text); ! if (bp->pos == EQNPOS_SQRT) { ! term_word(p, "sqrt"); ! p->flags |= TERMP_NOSPACE; eqn_box(p, bp->first); + } else if (bp->type == EQN_SUBEXPR) { + child = bp->first; + eqn_box(p, child); + p->flags |= TERMP_NOSPACE; + term_word(p, bp->pos == EQNPOS_OVER ? "/" : + (bp->pos == EQNPOS_SUP || + bp->pos == EQNPOS_TO) ? "^" : "_"); + p->flags |= TERMP_NOSPACE; + child = child->next; + eqn_box(p, child); + if (bp->pos == EQNPOS_FROMTO || + bp->pos == EQNPOS_SUBSUP) { + p->flags |= TERMP_NOSPACE; + term_word(p, "^"); + p->flags |= TERMP_NOSPACE; + child = child->next; + eqn_box(p, child); + } + } else { + child = bp->first; + if (bp->type == EQN_MATRIX && child->type == EQN_LIST) + child = child->first; + while (child != NULL) { + eqn_box(p, + bp->type == EQN_PILE && + child->type == EQN_LIST && + child->args == 1 ? + child->first : child); + child = child->next; + } + } ! if (bp->font != EQNFONT_NONE) term_fontpop(p); + if (bp->type == EQN_LIST || + (bp->type == EQN_PILE && (bp->prev || bp->next)) || + (bp->parent != NULL && bp->parent->pos == EQNPOS_SQRT)) { + p->flags |= TERMP_NOSPACE; + term_word(p, bp->right != NULL ? bp->right : ")"); + if (bp->parent->type == EQN_SUBEXPR && bp->next != NULL) + p->flags |= TERMP_NOSPACE; + } ! if (bp->top != NULL) { ! p->flags |= TERMP_NOSPACE; ! term_word(p, bp->top); ! } ! if (bp->bottom != NULL) { ! p->flags |= TERMP_NOSPACE; ! term_word(p, "_"); ! } }