xref: /plan9-contrib/sys/src/cmd/postscript/tr2post/conv.c (revision 219b2ee8daee37f4aad58d63f21287faa8e4ffdc)
1*219b2ee8SDavid du Colombier #include <u.h>
2*219b2ee8SDavid du Colombier #include <libc.h>
3*219b2ee8SDavid du Colombier #include <bio.h>
4*219b2ee8SDavid du Colombier #include "../common/common.h"
5*219b2ee8SDavid du Colombier #include "tr2post.h"
6*219b2ee8SDavid du Colombier 
7*219b2ee8SDavid du Colombier void
8*219b2ee8SDavid du Colombier conv(Biobufhdr *Bp) {
9*219b2ee8SDavid du Colombier 	long c, n;
10*219b2ee8SDavid du Colombier 	int r;
11*219b2ee8SDavid du Colombier 	char special[10];
12*219b2ee8SDavid du Colombier 
13*219b2ee8SDavid du Colombier 	inputlineno = 1;
14*219b2ee8SDavid du Colombier 	if (debug) Bprint(Bstderr, "conv(Biobufhdr *Bp=0x%x)\n", Bp);
15*219b2ee8SDavid du Colombier 	while ((r = Bgetrune(Bp)) >= 0) {
16*219b2ee8SDavid du Colombier /* Bprint(Bstderr, "r=<%c>,0x%x\n", r, r); */
17*219b2ee8SDavid du Colombier /*		Bflush(Bstderr); */
18*219b2ee8SDavid du Colombier 		switch (r) {
19*219b2ee8SDavid du Colombier 		case 's':	/* set point size */
20*219b2ee8SDavid du Colombier 			Bgetfield(Bp, 'd', &fontsize, 0);
21*219b2ee8SDavid du Colombier 			break;
22*219b2ee8SDavid du Colombier 		case 'f':	/* set font to postion */
23*219b2ee8SDavid du Colombier 			Bgetfield(Bp, 'd', &fontpos, 0);
24*219b2ee8SDavid du Colombier 			settrfont();
25*219b2ee8SDavid du Colombier 			break;
26*219b2ee8SDavid du Colombier 		case 'c':	/* print rune */
27*219b2ee8SDavid du Colombier 			r = Bgetrune(Bp);
28*219b2ee8SDavid du Colombier 			runeout(r);
29*219b2ee8SDavid du Colombier 			break;
30*219b2ee8SDavid du Colombier 		case 'C':	/* print special character */
31*219b2ee8SDavid du Colombier 			Bgetfield(Bp, 's', special, 10);
32*219b2ee8SDavid du Colombier 			specialout(special);
33*219b2ee8SDavid du Colombier 			break;
34*219b2ee8SDavid du Colombier 		case 'N':	/* print character with numeric value from current font */
35*219b2ee8SDavid du Colombier 			Bgetfield(Bp, 'd', &n, 0);
36*219b2ee8SDavid du Colombier 			break;
37*219b2ee8SDavid du Colombier 		case 'H':	/* go to absolute horizontal position */
38*219b2ee8SDavid du Colombier 			Bgetfield(Bp, 'd', &n, 0);
39*219b2ee8SDavid du Colombier 			hgoto(n);
40*219b2ee8SDavid du Colombier 			break;
41*219b2ee8SDavid du Colombier 		case 'V':	/* go to absolute vertical position */
42*219b2ee8SDavid du Colombier 			Bgetfield(Bp, 'd', &n, 0);
43*219b2ee8SDavid du Colombier 			vgoto(n);
44*219b2ee8SDavid du Colombier 			break;
45*219b2ee8SDavid du Colombier 		case 'h':	/* go to relative horizontal position */
46*219b2ee8SDavid du Colombier 			Bgetfield(Bp, 'd', &n, 0);
47*219b2ee8SDavid du Colombier 			hmot(n);
48*219b2ee8SDavid du Colombier 			break;
49*219b2ee8SDavid du Colombier 		case 'v':	/* go to relative vertical position */
50*219b2ee8SDavid du Colombier 			Bgetfield(Bp, 'd', &n, 0);
51*219b2ee8SDavid du Colombier 			vmot(n);
52*219b2ee8SDavid du Colombier 			break;
53*219b2ee8SDavid du Colombier 		case '0': case '1': case '2': case '3': case '4':
54*219b2ee8SDavid du Colombier 		case '5': case '6': case '7': case '8': case '9':
55*219b2ee8SDavid du Colombier 				/* move right nn units, then print character c */
56*219b2ee8SDavid du Colombier 			n = (r - '0') * 10;
57*219b2ee8SDavid du Colombier 			r = Bgetrune(Bp);
58*219b2ee8SDavid du Colombier 			if (r < 0)
59*219b2ee8SDavid du Colombier 				error(FATAL, "EOF or error reading input\n");
60*219b2ee8SDavid du Colombier 			else if (r < '0' || r > '9')
61*219b2ee8SDavid du Colombier 				error(FATAL, "integer expected\n");
62*219b2ee8SDavid du Colombier 			n += r - '0';
63*219b2ee8SDavid du Colombier 			r = Bgetrune(Bp);
64*219b2ee8SDavid du Colombier 			hmot(n);
65*219b2ee8SDavid du Colombier 			runeout(r);
66*219b2ee8SDavid du Colombier 			break;
67*219b2ee8SDavid du Colombier 		case 'p':	/* begin page */
68*219b2ee8SDavid du Colombier 			Bgetfield(Bp, 'd', &n, 0);
69*219b2ee8SDavid du Colombier 			endpage();
70*219b2ee8SDavid du Colombier 			startpage();
71*219b2ee8SDavid du Colombier 			break;
72*219b2ee8SDavid du Colombier 		case 'n':	/* end of line (information only 'b a' follows) */
73*219b2ee8SDavid du Colombier 			Brdline(Bp, '\n');	/* toss rest of line */
74*219b2ee8SDavid du Colombier 			inputlineno++;
75*219b2ee8SDavid du Colombier 			break;
76*219b2ee8SDavid du Colombier 		case 'w':	/* paddable word space (information only) */
77*219b2ee8SDavid du Colombier 			break;
78*219b2ee8SDavid du Colombier 		case 'D':	/* graphics function */
79*219b2ee8SDavid du Colombier 			draw(Bp);
80*219b2ee8SDavid du Colombier 			break;
81*219b2ee8SDavid du Colombier 		case 'x':	/* device control functions */
82*219b2ee8SDavid du Colombier 			devcntl(Bp);
83*219b2ee8SDavid du Colombier 			break;
84*219b2ee8SDavid du Colombier 		case '#':	/* comment */
85*219b2ee8SDavid du Colombier 			Brdline(Bp, '\n');	/* toss rest of line */
86*219b2ee8SDavid du Colombier 		case '\n':
87*219b2ee8SDavid du Colombier 			inputlineno++;
88*219b2ee8SDavid du Colombier 			break;
89*219b2ee8SDavid du Colombier 		default:
90*219b2ee8SDavid du Colombier 			error(WARNING, "unknown troff function <%c>\n", r);
91*219b2ee8SDavid du Colombier 			break;
92*219b2ee8SDavid du Colombier 		}
93*219b2ee8SDavid du Colombier 	}
94*219b2ee8SDavid du Colombier 	endpage();
95*219b2ee8SDavid du Colombier 	if (debug) Bprint(Bstderr, "r=0x%x\n", r);
96*219b2ee8SDavid du Colombier 	if (debug) Bprint(Bstderr, "leaving conv\n");
97*219b2ee8SDavid du Colombier }
98