77 lines
		
	
	
		
			2.0 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			77 lines
		
	
	
		
			2.0 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
/*	$Vendor-Id: eqn_term.c,v 1.4 2011/07/24 10:09:03 kristaps Exp $ */
 | 
						|
/*
 | 
						|
 * Copyright (c) 2011 Kristaps Dzonsons <kristaps@bsd.lv>
 | 
						|
 *
 | 
						|
 * Permission to use, copy, modify, and distribute this software for any
 | 
						|
 * purpose with or without fee is hereby granted, provided that the above
 | 
						|
 * copyright notice and this permission notice appear in all copies.
 | 
						|
 *
 | 
						|
 * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
 | 
						|
 * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
 | 
						|
 * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
 | 
						|
 * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
 | 
						|
 * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
 | 
						|
 * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
 | 
						|
 * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
 | 
						|
 */
 | 
						|
#ifdef HAVE_CONFIG_H
 | 
						|
#include "config.h"
 | 
						|
#endif
 | 
						|
 | 
						|
#include <assert.h>
 | 
						|
#include <stdio.h>
 | 
						|
#include <stdlib.h>
 | 
						|
#include <string.h>
 | 
						|
 | 
						|
#include "mandoc.h"
 | 
						|
#include "out.h"
 | 
						|
#include "term.h"
 | 
						|
 | 
						|
static	const enum termfont fontmap[EQNFONT__MAX] = {
 | 
						|
	TERMFONT_NONE, /* EQNFONT_NONE */
 | 
						|
	TERMFONT_NONE, /* EQNFONT_ROMAN */
 | 
						|
	TERMFONT_BOLD, /* EQNFONT_BOLD */
 | 
						|
	TERMFONT_BOLD, /* EQNFONT_FAT */
 | 
						|
	TERMFONT_UNDER /* EQNFONT_ITALIC */
 | 
						|
};
 | 
						|
 | 
						|
static void	eqn_box(struct termp *, const struct eqn_box *);
 | 
						|
 | 
						|
void
 | 
						|
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);
 | 
						|
}
 |