/* roff.c, font control */

#include "nroff.h"

struct	font	*curfont;	/* current font */
struct	font	*fonts;		/* fonts */

#define	STDFONT	4

int	nfonts = STDFONT;		/* number of fonts */
static	struct	font	Nfonts[STDFONT];
static	struct	font	*prevfont;

/*
 * setup the default fonts
 */
static	char	inames[] = "RIBS";

setfonts()
{
	struct	font	*fp;
	int	i;

	fp = Nfonts;
	for(i = 0 ; i < STDFONT ; i++, fp++){
		fp->f_name[0] = inames[i];
		fp->f_pos = i+1;
		fp->f_next = fonts;
		fonts = fp;
		termsetf(fp);	/* set fonts for current terminal */
	}
	curfont = Nfonts;
}

chfont(ptr)	/* doesn't do numbered fonts yet */
char	**ptr;
{
	char	*p = *ptr;
	char	name[2];
	struct	font	*fp;

	if(*p == '('){
		name[0] = *++p;
		name[1] = *++p;
		*ptr = p;
	}
	else {
		name[0] = *p;
		name[1] = '\0';
		if(name[0] == 'P'){	/* the previous font */
			fp = prevfont;
			goto found;
		}
	}
	for(fp = fonts ; fp ; fp = fp->f_next)
		if(fp->f_name[0] == name[0] && fp->f_name[1] == name[1])
			break;
found:;
	if(fp == 0)		/* no font known */
		return;

	/* change font, */

	if(curfont->f_end)
		(*curfont->f_end)(fp);
	prevfont = curfont;
	curfont = fp;
	if(fp->f_start)
		(*fp->f_start)(prevfont);
}

/* default routines to deal with going into and out of different fonts */

fstrt_str(pfp)
struct	font	*pfp;
{
	struct	font	*fp = curfont;
	char	*p;

	p = fp->fstrt_str;
	if(p == 0)
		return;
	for(;*p; p++)
		PUT(*p);
}
	
/* end of font */

fend_str(pfp)
struct	font	*pfp;
{
	struct	font	*fp = curfont;
	char	*p;

	p = fp->fend_str;
	if(p == 0)
		return;
	for(;*p; p++)
		PUT(*p);
}

term_und(c)
{
	if(isprint(c)){
		PUT('_');
		PUT('\b');
	}
	PUT(c);
}
	
termsetf(fp)	/* set fonts for current terminal */
struct	font	*fp;
{
	switch(fp->f_name[0]){
	case 'R':	/* default, don't need anything special */
		break;
	case 'I':	/* go into italic mode, is underline */
		fp->fstrt_str = "\0334";
		fp->fend_str = "\0335";
		fp->f_start = fstrt_str;
		fp->f_end = fend_str;
		/* fp->f_putc = term_und; */
		break;
	case 'B':	/* go into bold mode */
		fp->fstrt_str = "\033G";
		fp->fend_str = "\033H";
		fp->f_start = fstrt_str;
		fp->f_end = fend_str;
		break;
	case 'S':	/* special font mode */
		break;
	}
}
