blob: 25575ccc5d4424d60654cac7a3ec8becb9531d3f [file] [log] [blame]
#include <u.h>
#include <libc.h>
#include <bio.h>
#include "../common/common.h"
#include "tr2post.h"
void
conv(Biobuf *Bp) {
long n;
int r;
char special[10];
int save;
inputlineno = 1;
if (debug) Bprint(Bstderr, "conv(Biobufhdr *Bp=0x%x)\n", Bp);
while ((r = Bgetrune(Bp)) >= 0) {
/* Bprint(Bstderr, "r=<%c>,0x%x\n", r, r); */
/* Bflush(Bstderr); */
switch (r) {
case 's': /* set point size */
Bgetfield(Bp, 'd', &fontsize, 0);
break;
case 'f': /* set font to postion */
Bgetfield(Bp, 'd', &fontpos, 0);
save = inputlineno;
settrfont();
inputlineno = save; /* ugh */
break;
case 'c': /* print rune */
r = Bgetrune(Bp);
runeout(r);
break;
case 'C': /* print special character */
Bgetfield(Bp, 's', special, 10);
specialout(special);
break;
case 'N': /* print character with numeric value from current font */
Bgetfield(Bp, 'd', &n, 0);
break;
case 'H': /* go to absolute horizontal position */
Bgetfield(Bp, 'd', &n, 0);
hgoto(n);
break;
case 'V': /* go to absolute vertical position */
Bgetfield(Bp, 'd', &n, 0);
vgoto(n);
break;
case 'h': /* go to relative horizontal position */
Bgetfield(Bp, 'd', &n, 0);
hmot(n);
break;
case 'v': /* go to relative vertical position */
Bgetfield(Bp, 'd', &n, 0);
vmot(n);
break;
case '0': case '1': case '2': case '3': case '4':
case '5': case '6': case '7': case '8': case '9':
/* move right nn units, then print character c */
n = (r - '0') * 10;
r = Bgetrune(Bp);
if (r < 0)
error(FATAL, "EOF or error reading input\n");
else if (r < '0' || r > '9')
error(FATAL, "integer expected\n");
n += r - '0';
r = Bgetrune(Bp);
hmot(n);
runeout(r);
break;
case 'p': /* begin page */
Bgetfield(Bp, 'd', &n, 0);
endpage();
startpage();
break;
case 'n': /* end of line (information only 'b a' follows) */
Brdline(Bp, '\n'); /* toss rest of line */
inputlineno++;
break;
case 'w': /* paddable word space (information only) */
break;
case 'D': /* graphics function */
draw(Bp);
break;
case 'x': /* device control functions */
devcntl(Bp);
break;
case '#': /* comment */
Brdline(Bp, '\n'); /* toss rest of line */
case '\n':
inputlineno++;
break;
default:
error(WARNING, "unknown troff function <%c>\n", r);
break;
}
}
endpage();
if (debug) Bprint(Bstderr, "r=0x%x\n", r);
if (debug) Bprint(Bstderr, "leaving conv\n");
}