plan9fox/sys/src/cmd/htmlroff/t10.c
2011-03-30 19:35:09 +03:00

141 lines
1.9 KiB
C

#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);
}