version 1.6, 2014/08/10 23:54:41 |
version 1.7, 2014/10/12 14:49:39 |
|
|
/* $Id$ */ |
/* $Id$ */ |
/* |
/* |
* Copyright (c) 2011 Kristaps Dzonsons <kristaps@bsd.lv> |
* Copyright (c) 2011 Kristaps Dzonsons <kristaps@bsd.lv> |
|
* Copyright (c) 2014 Ingo Schwarze <schwarze@openbsd.org> |
* |
* |
* Permission to use, copy, modify, and distribute this software for any |
* Permission to use, copy, modify, and distribute this software for any |
* purpose with or without fee is hereby granted, provided that the above |
* purpose with or without fee is hereby granted, provided that the above |
|
|
term_eqn(struct termp *p, const struct eqn *ep) |
term_eqn(struct termp *p, const struct eqn *ep) |
{ |
{ |
|
|
p->flags |= TERMP_NONOSPACE; |
|
eqn_box(p, ep->root); |
eqn_box(p, ep->root); |
term_word(p, " "); |
p->flags &= ~TERMP_NOSPACE; |
p->flags &= ~TERMP_NONOSPACE; |
|
} |
} |
|
|
static void |
static void |
eqn_box(struct termp *p, const struct eqn_box *bp) |
eqn_box(struct termp *p, const struct eqn_box *bp) |
{ |
{ |
|
const struct eqn_box *child; |
|
|
if (EQNFONT_NONE != bp->font) |
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]); |
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) |
if (bp->text != NULL) |
term_word(p, bp->text); |
term_word(p, bp->text); |
|
|
if (bp->first) |
if (bp->pos == EQNPOS_SQRT) { |
|
term_word(p, "sqrt"); |
|
p->flags |= TERMP_NOSPACE; |
eqn_box(p, bp->first); |
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 (EQN_SUBEXPR == bp->type) |
if (bp->font != EQNFONT_NONE) |
term_word(p, ")"); |
|
if (bp->right) |
|
term_word(p, bp->right); |
|
if (EQNFONT_NONE != bp->font) |
|
term_fontpop(p); |
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->next) |
if (bp->top != NULL) { |
eqn_box(p, bp->next); |
p->flags |= TERMP_NOSPACE; |
|
term_word(p, bp->top); |
|
} |
|
if (bp->bottom != NULL) { |
|
p->flags |= TERMP_NOSPACE; |
|
term_word(p, "_"); |
|
} |
} |
} |