version 1.4, 2011/07/24 10:09:03 |
version 1.11, 2017/07/06 00:19:54 |
|
|
/* $Id$ */ |
/* $Id$ */ |
/* |
/* |
* Copyright (c) 2011 Kristaps Dzonsons <kristaps@bsd.lv> |
* Copyright (c) 2011 Kristaps Dzonsons <kristaps@bsd.lv> |
|
* Copyright (c) 2014, 2015, 2017 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 |
|
|
* ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF |
* ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF |
* OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. |
* OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. |
*/ |
*/ |
#ifdef HAVE_CONFIG_H |
|
#include "config.h" |
#include "config.h" |
#endif |
|
|
|
|
#include <sys/types.h> |
|
|
#include <assert.h> |
#include <assert.h> |
#include <stdio.h> |
#include <stdio.h> |
#include <stdlib.h> |
#include <stdlib.h> |
Line 37 static const enum termfont fontmap[EQNFONT__MAX] = { |
|
Line 38 static const enum termfont fontmap[EQNFONT__MAX] = { |
|
|
|
static void eqn_box(struct termp *, const struct eqn_box *); |
static void eqn_box(struct termp *, const struct eqn_box *); |
|
|
|
|
void |
void |
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->expectargs > 1) || |
|
(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) { |
eqn_box(p, bp->first); |
term_word(p, "sqrt"); |
|
if (bp->first != NULL) { |
|
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; |
|
if (child != NULL) { |
|
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; |
|
if (child != NULL) |
|
eqn_box(p, child); |
|
} |
|
} |
|
} else { |
|
child = bp->first; |
|
if (bp->type == EQN_MATRIX && |
|
child != NULL && |
|
child->type == EQN_LIST && |
|
child->expectargs > 1) |
|
child = child->first; |
|
while (child != NULL) { |
|
eqn_box(p, |
|
bp->type == EQN_PILE && |
|
child->type == EQN_LIST && |
|
child->expectargs > 1 && |
|
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->top != NULL) { |
if (bp->next) |
p->flags |= TERMP_NOSPACE; |
eqn_box(p, bp->next); |
term_word(p, bp->top); |
|
} |
|
if (bp->bottom != NULL) { |
|
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)) { |
|
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; |
|
} |
} |
} |