shithub: riscv

ref: dfb4b522830edab8f3856289d326d6cf5e930644
dir: /sys/src/cmd/htmlroff/t4.c/

View raw version
#include "a.h"

/*
 * 4 - Text filling, centering, and adjusting.  
 * 	"\ " - unbreakable space
 * 	.n register - length of last line
 *	nl register - text baseline position on this page
 *	.h register - baseline high water mark
 *	.k register - current horizontal output position
 *	\p - cause break at end of word, justify
 *	\& - non-printing zero-width filler
 *	tr - output translation
 *	\c - break (but don't) input line in .nf mode
 *	\c - break (but don't) word in .fi mode
 */

int
e_space(void)
{
	return 0xA0;	/* non-breaking space */
}

int
e_amp(void)
{
	return Uempty;
}

int
e_c(void)
{
	getrune();
	bol = 1;
	return 0;
}

void
r_br(int argc, Rune **argv)
{
	USED(argc);
	USED(argv);
	br();
}

/* fill mode on */
void
r_fi(int argc, Rune **argv)
{
	USED(argc);
	USED(argv);
	nr(L(".fi"), 1);
// warn(".fi");
}

/* no-fill mode */
void
r_nf(int argc, Rune **argv)
{
	USED(argc);
	USED(argv);
	nr(L(".fi"), 0);
}

/* adjust */
void
r_ad(int argc, Rune **argv)
{
	int c, n;
	
	nr(L(".j"), getnr(L(".j"))|1);
	if(argc < 2)
		return;
	c = argv[1][0];
	switch(c){
	default:
		fprint(2, "%L: bad adjust %C\n", c);
		return;
	case 'r':
		n = 2*2|1;
		break;
	case 'l':
		n = 0;
		break;
	case 'c':
		n = 1*2|1;
		break;
	case 'b':
	case 'n':
		n = 0*2|1;
		break;
	case '0':
	case '1':
	case '2':
	case '3':
	case '4':
	case '5':
		n = c-'0';
		break;
	}
	nr(L(".j"), n);
}

/* no adjust */
void
r_na(int argc, Rune **argv)
{
	USED(argc);
	USED(argv);

	nr(L(".j"), getnr(L(".j"))&~1);
}

/* center next N lines */
void
r_ce(int argc, Rune **argv)
{
	if(argc < 2)
		nr(L(".ce"), 1);
	else
		nr(L(".ce"), eval(argv[1]));
	/* XXX set trap */
}

void
t4init(void)
{
	nr(L(".fi"), 1);
	nr(L(".j"), 1);

	addreq(L("br"), r_br, 0);
	addreq(L("fi"), r_fi, 0);
	addreq(L("nf"), r_nf, 0);
	addreq(L("ad"), r_ad, -1);
	addreq(L("na"), r_na, 0);
	addreq(L("ce"), r_ce, -1);
	
	addesc(' ', e_space, 0);
	addesc('p', e_warn, 0);
	addesc('&', e_amp, 0);
	addesc('c', e_c, 0);
}