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