shithub: riscv

ref: 511421003a44633d8907828aef280acc762cc56b
dir: /sys/src/cmd/htmlroff/t10.c/

View raw version
#include "a.h"

/*
 * 10. Input and Output Conventions and Character Translation.
 */

/* set escape character */
void
r_ec(int argc, Rune **argv)
{
	if(argc == 1)
		backslash = '\\';
	else
		backslash = argv[1][0];
}

/* turn off escape character */
void
r_eo(int argc, Rune **argv)
{
	USED(argc);
	USED(argv);
	backslash = -2;
}

/* continuous underline (same as ul in troff) for the next N lines */
/* set underline font */
void
g_uf(int argc, Rune **argv)
{
	USED(argc);
	USED(argv);
}

/* set control character */
void
r_cc(int argc, Rune **argv)
{
	if(argc == 1)
		dot = '.';
	else
		dot = argv[1][0];
}

/* set no-break control character */
void
r_c2(int argc, Rune **argv)
{
	if(argc == 1)
		tick = '\'';
	else
		tick = argv[1][0];
}

/* output translation */

int
e_bang(void)
{
	Rune *line;
	
	line = readline(CopyMode);
	out(line);
	outrune('\n');
	free(line);
	return 0;
}

int
e_X(void)
{
	int c;
	
	while((c = getrune()) >= 0 && c != '\'' && c != '\n')
		outrune(c);
	if(c == '\n'){
		warn("newline in %CX'...'", backslash);
		outrune(c);
	}
	if(c < 0)
		warn("eof in %CX'...'", backslash);
	return 0;
}

int
e_quote(void)
{
	int c;

	if(inputmode&ArgMode){
		/* Leave \" around for argument parsing */
		ungetrune('"');
		return '\\';
	}
	while((c = getrune()) >= 0 && c != '\n')
		;
	return '\n';
}

int
e_newline(void)
{
	return 0;
}

int
e_e(void)
{
	return backslash;
}

void
r_comment(Rune *name)
{
	int c;
	
	USED(name);
	while((c = getrune()) >= 0 && c != '\n')
		;
}

void
t10init(void)
{
	addreq(L("ec"), r_ec, -1);
	addreq(L("eo"), r_eo, 0);
	addreq(L("lg"), r_nop, -1);
	addreq(L("cc"), r_cc, -1);
	addreq(L("c2"), r_c2, -1);
	addreq(L("tr"), r_warn, -1);
	addreq(L("ul"), r_nop, -1);
	addraw(L("\\\""), r_comment);
	
	addesc('!', e_bang, 0);
	addesc('X', e_X, 0);
	addesc('\"', e_quote, CopyMode|ArgMode);
	addesc('\n', e_newline, CopyMode|ArgMode|HtmlMode);
	addesc('e', e_e, 0);
}