1219b2ee8SDavid du Colombier #include <u.h>
2219b2ee8SDavid du Colombier #include <libc.h>
3219b2ee8SDavid du Colombier #include <bio.h>
4219b2ee8SDavid du Colombier #include "../common/common.h"
5219b2ee8SDavid du Colombier #include "tr2post.h"
6219b2ee8SDavid du Colombier
7219b2ee8SDavid du Colombier void
conv(Biobufhdr * Bp)8219b2ee8SDavid du Colombier conv(Biobufhdr *Bp) {
9*456a8764SDavid du Colombier long n;
10219b2ee8SDavid du Colombier int r;
11219b2ee8SDavid du Colombier char special[10];
127dd7cddfSDavid du Colombier int save;
13219b2ee8SDavid du Colombier
14219b2ee8SDavid du Colombier inputlineno = 1;
15*456a8764SDavid du Colombier if (debug)
16*456a8764SDavid du Colombier fprint(2, "conv(Biobufhdr *Bp=%#p)\n", Bp);
17219b2ee8SDavid du Colombier while ((r = Bgetrune(Bp)) >= 0) {
18219b2ee8SDavid du Colombier switch (r) {
19219b2ee8SDavid du Colombier case 's': /* set point size */
20219b2ee8SDavid du Colombier Bgetfield(Bp, 'd', &fontsize, 0);
21219b2ee8SDavid du Colombier break;
22219b2ee8SDavid du Colombier case 'f': /* set font to postion */
23219b2ee8SDavid du Colombier Bgetfield(Bp, 'd', &fontpos, 0);
247dd7cddfSDavid du Colombier save = inputlineno;
25219b2ee8SDavid du Colombier settrfont();
267dd7cddfSDavid du Colombier inputlineno = save; /* ugh */
27219b2ee8SDavid du Colombier break;
28219b2ee8SDavid du Colombier case 'c': /* print rune */
29219b2ee8SDavid du Colombier r = Bgetrune(Bp);
30219b2ee8SDavid du Colombier runeout(r);
31219b2ee8SDavid du Colombier break;
32219b2ee8SDavid du Colombier case 'C': /* print special character */
33219b2ee8SDavid du Colombier Bgetfield(Bp, 's', special, 10);
34219b2ee8SDavid du Colombier specialout(special);
35219b2ee8SDavid du Colombier break;
36219b2ee8SDavid du Colombier case 'N': /* print character with numeric value from current font */
37219b2ee8SDavid du Colombier Bgetfield(Bp, 'd', &n, 0);
38219b2ee8SDavid du Colombier break;
39219b2ee8SDavid du Colombier case 'H': /* go to absolute horizontal position */
40219b2ee8SDavid du Colombier Bgetfield(Bp, 'd', &n, 0);
41219b2ee8SDavid du Colombier hgoto(n);
42219b2ee8SDavid du Colombier break;
43219b2ee8SDavid du Colombier case 'V': /* go to absolute vertical position */
44219b2ee8SDavid du Colombier Bgetfield(Bp, 'd', &n, 0);
45219b2ee8SDavid du Colombier vgoto(n);
46219b2ee8SDavid du Colombier break;
47219b2ee8SDavid du Colombier case 'h': /* go to relative horizontal position */
48219b2ee8SDavid du Colombier Bgetfield(Bp, 'd', &n, 0);
49219b2ee8SDavid du Colombier hmot(n);
50219b2ee8SDavid du Colombier break;
51219b2ee8SDavid du Colombier case 'v': /* go to relative vertical position */
52219b2ee8SDavid du Colombier Bgetfield(Bp, 'd', &n, 0);
53219b2ee8SDavid du Colombier vmot(n);
54219b2ee8SDavid du Colombier break;
55219b2ee8SDavid du Colombier case '0': case '1': case '2': case '3': case '4':
56219b2ee8SDavid du Colombier case '5': case '6': case '7': case '8': case '9':
57219b2ee8SDavid du Colombier /* move right nn units, then print character c */
58219b2ee8SDavid du Colombier n = (r - '0') * 10;
59219b2ee8SDavid du Colombier r = Bgetrune(Bp);
60219b2ee8SDavid du Colombier if (r < 0)
61219b2ee8SDavid du Colombier error(FATAL, "EOF or error reading input\n");
62219b2ee8SDavid du Colombier else if (r < '0' || r > '9')
63219b2ee8SDavid du Colombier error(FATAL, "integer expected\n");
64219b2ee8SDavid du Colombier n += r - '0';
65219b2ee8SDavid du Colombier r = Bgetrune(Bp);
66219b2ee8SDavid du Colombier hmot(n);
67219b2ee8SDavid du Colombier runeout(r);
68219b2ee8SDavid du Colombier break;
69219b2ee8SDavid du Colombier case 'p': /* begin page */
70219b2ee8SDavid du Colombier Bgetfield(Bp, 'd', &n, 0);
71219b2ee8SDavid du Colombier endpage();
72219b2ee8SDavid du Colombier startpage();
73219b2ee8SDavid du Colombier break;
74219b2ee8SDavid du Colombier case 'n': /* end of line (information only 'b a' follows) */
75219b2ee8SDavid du Colombier Brdline(Bp, '\n'); /* toss rest of line */
76219b2ee8SDavid du Colombier inputlineno++;
77219b2ee8SDavid du Colombier break;
78219b2ee8SDavid du Colombier case 'w': /* paddable word space (information only) */
79219b2ee8SDavid du Colombier break;
80219b2ee8SDavid du Colombier case 'D': /* graphics function */
81219b2ee8SDavid du Colombier draw(Bp);
82219b2ee8SDavid du Colombier break;
83219b2ee8SDavid du Colombier case 'x': /* device control functions */
84219b2ee8SDavid du Colombier devcntl(Bp);
85219b2ee8SDavid du Colombier break;
86219b2ee8SDavid du Colombier case '#': /* comment */
87219b2ee8SDavid du Colombier Brdline(Bp, '\n'); /* toss rest of line */
88219b2ee8SDavid du Colombier case '\n':
89219b2ee8SDavid du Colombier inputlineno++;
90219b2ee8SDavid du Colombier break;
91219b2ee8SDavid du Colombier default:
92219b2ee8SDavid du Colombier error(WARNING, "unknown troff function <%c>\n", r);
93219b2ee8SDavid du Colombier break;
94219b2ee8SDavid du Colombier }
95219b2ee8SDavid du Colombier }
96219b2ee8SDavid du Colombier endpage();
97*456a8764SDavid du Colombier if (debug) {
98*456a8764SDavid du Colombier fprint(2, "r=%#ux\n", r);
99*456a8764SDavid du Colombier fprint(2, "leaving conv\n");
100*456a8764SDavid du Colombier }
101219b2ee8SDavid du Colombier }
102