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