xref: /plan9/sys/src/cmd/postscript/tr2post/devcntl.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 <stdio.h>
5*219b2ee8SDavid du Colombier #include "../common/common.h"
6*219b2ee8SDavid du Colombier #include "tr2post.h"
7*219b2ee8SDavid du Colombier 
8*219b2ee8SDavid du Colombier char devname[20] = { 'u', 't', 'f', '\0' };
9*219b2ee8SDavid du Colombier int resolution;
10*219b2ee8SDavid du Colombier int minx, miny;
11*219b2ee8SDavid du Colombier 
12*219b2ee8SDavid du Colombier struct sjt {
13*219b2ee8SDavid du Colombier 	char *str;
14*219b2ee8SDavid du Colombier 	void (*func)(void *);
15*219b2ee8SDavid du Colombier };
16*219b2ee8SDavid du Colombier 
17*219b2ee8SDavid du Colombier /* I won't need this if getfields can replace sscanf
18*219b2ee8SDavid du Colombier 
19*219b2ee8SDavid du Colombier extern void picture(Biobufhdr *);
20*219b2ee8SDavid du Colombier extern void notavail(char *);
21*219b2ee8SDavid du Colombier 
22*219b2ee8SDavid du Colombier void
23*219b2ee8SDavid du Colombier PSInclude(Biobufhdr *inp) {
24*219b2ee8SDavid du Colombier 	char buf[256];
25*219b2ee8SDavid du Colombier 
26*219b2ee8SDavid du Colombier 	Bgetfield(inp, 's', buf, 256);
27*219b2ee8SDavid du Colombier 	if(pageon()) {
28*219b2ee8SDavid du Colombier 		endstring();
29*219b2ee8SDavid du Colombier 		Bprint(Bstdout, "%s\n", buf);
30*219b2ee8SDavid du Colombier 	}
31*219b2ee8SDavid du Colombier }
32*219b2ee8SDavid du Colombier 
33*219b2ee8SDavid du Colombier struct sjt specialjumptable[] = {
34*219b2ee8SDavid du Colombier 	{"PI", picture},
35*219b2ee8SDavid du Colombier 	{"PictureInclusion", picture},
36*219b2ee8SDavid du Colombier 	{"InlinePicture", NULL},
37*219b2ee8SDavid du Colombier 	{"BeginPath", NULL},
38*219b2ee8SDavid du Colombier 	{"DrawPath", NULL},
39*219b2ee8SDavid du Colombier 	{"BeginObject", NULL},
40*219b2ee8SDavid du Colombier 	{"EndObject", NULL},
41*219b2ee8SDavid du Colombier 	{"NewBaseline", NULL},
42*219b2ee8SDavid du Colombier 	{"DrawText", NULL},
43*219b2ee8SDavid du Colombier 	{"SetText", NULL},
44*219b2ee8SDavid du Colombier 	{"SetColor", NULL},
45*219b2ee8SDavid du Colombier 	{"INFO", NULL},
46*219b2ee8SDavid du Colombier 	{"PS", PSInclude},
47*219b2ee8SDavid du Colombier 	{"Postscript", PSInclude},
48*219b2ee8SDavid du Colombier 	{"ExportPS", notavail("ExportPS")},
49*219b2ee8SDavid du Colombier 	{NULL, NULL}
50*219b2ee8SDavid du Colombier };
51*219b2ee8SDavid du Colombier */
52*219b2ee8SDavid du Colombier 
53*219b2ee8SDavid du Colombier void
54*219b2ee8SDavid du Colombier devcntl(Biobufhdr *inp) {
55*219b2ee8SDavid du Colombier 
56*219b2ee8SDavid du Colombier 	char cmd[50], buf[256], str[MAXTOKENSIZE], *line;
57*219b2ee8SDavid du Colombier 	int c, n, linelen;
58*219b2ee8SDavid du Colombier 
59*219b2ee8SDavid du Colombier /*
60*219b2ee8SDavid du Colombier  *
61*219b2ee8SDavid du Colombier  * Interpret device control commands, ignoring any we don't recognize. The
62*219b2ee8SDavid du Colombier  * "x X ..." commands are a device dependent collection generated by troff's
63*219b2ee8SDavid du Colombier  * \X'...' request.
64*219b2ee8SDavid du Colombier  *
65*219b2ee8SDavid du Colombier  */
66*219b2ee8SDavid du Colombier 
67*219b2ee8SDavid du Colombier 	Bgetfield(inp, 's', cmd, 50);
68*219b2ee8SDavid du Colombier 	if (debug) Bprint(Bstderr, "devcntl(cmd=%s)\n", cmd);
69*219b2ee8SDavid du Colombier 	switch (cmd[0]) {
70*219b2ee8SDavid du Colombier 	case 'f':		/* mount font in a position */
71*219b2ee8SDavid du Colombier 		Bgetfield(inp, 'd', &n, 0);
72*219b2ee8SDavid du Colombier 		Bgetfield(inp, 's', str, 100);
73*219b2ee8SDavid du Colombier 		mountfont(n, str);
74*219b2ee8SDavid du Colombier 		break;
75*219b2ee8SDavid du Colombier 
76*219b2ee8SDavid du Colombier 	case 'i':			/* initialize */
77*219b2ee8SDavid du Colombier 		initialize();
78*219b2ee8SDavid du Colombier 		break;
79*219b2ee8SDavid du Colombier 
80*219b2ee8SDavid du Colombier 	case 'p':			/* pause */
81*219b2ee8SDavid du Colombier 		break;
82*219b2ee8SDavid du Colombier 
83*219b2ee8SDavid du Colombier 	case 'r':			/* resolution assumed when prepared */
84*219b2ee8SDavid du Colombier 		Bgetfield(inp, 'd', &resolution, 0);
85*219b2ee8SDavid du Colombier 		Bgetfield(inp, 'd', &minx, 0);
86*219b2ee8SDavid du Colombier 		Bgetfield(inp, 'd', &miny, 0);
87*219b2ee8SDavid du Colombier 		break;
88*219b2ee8SDavid du Colombier 
89*219b2ee8SDavid du Colombier 	case 's':			/* stop */
90*219b2ee8SDavid du Colombier 	case 't':			/* trailer */
91*219b2ee8SDavid du Colombier 		/* flushtext(); */
92*219b2ee8SDavid du Colombier 		break;
93*219b2ee8SDavid du Colombier 
94*219b2ee8SDavid du Colombier 	case 'H':			/* char height */
95*219b2ee8SDavid du Colombier 		Bgetfield(inp, 'd', &n, 0);
96*219b2ee8SDavid du Colombier 		/* charhgt(n); */
97*219b2ee8SDavid du Colombier 		break;
98*219b2ee8SDavid du Colombier 
99*219b2ee8SDavid du Colombier 	case 'S':			/* slant */
100*219b2ee8SDavid du Colombier 		Bgetfield(inp, 'd', &n, 0);
101*219b2ee8SDavid du Colombier 		/* t_slant(n); */
102*219b2ee8SDavid du Colombier 		break;
103*219b2ee8SDavid du Colombier 
104*219b2ee8SDavid du Colombier 	case 'T':			/* device name */
105*219b2ee8SDavid du Colombier 		Bgetfield(inp, 's', &devname, 16);
106*219b2ee8SDavid du Colombier 		if (debug) Bprint(Bstderr, "devname=%s\n", devname);
107*219b2ee8SDavid du Colombier 		break;
108*219b2ee8SDavid du Colombier 
109*219b2ee8SDavid du Colombier 	case 'E':			/* input encoding - not in troff yet */
110*219b2ee8SDavid du Colombier 		Bgetfield(inp, 's', &str, 100);
111*219b2ee8SDavid du Colombier /*		if ( strcmp(str, "UTF") == 0 )
112*219b2ee8SDavid du Colombier 		    reading = UTFENCODING;
113*219b2ee8SDavid du Colombier 		else reading = ONEBYTE;
114*219b2ee8SDavid du Colombier   */
115*219b2ee8SDavid du Colombier 		break;
116*219b2ee8SDavid du Colombier 
117*219b2ee8SDavid du Colombier 	case 'X':			/* copy through - from troff */
118*219b2ee8SDavid du Colombier 		if (Bgetfield(inp, 's', str, MAXTOKENSIZE-1) <= 0)
119*219b2ee8SDavid du Colombier 			error(FATAL, "incomplete devcntl line\n");
120*219b2ee8SDavid du Colombier 		if ((line = Brdline(inp, '\n')) == 0)
121*219b2ee8SDavid du Colombier 			error(FATAL, "incomplete devcntl line\n");
122*219b2ee8SDavid du Colombier 		strncpy(buf, line, Blinelen(inp)-1);
123*219b2ee8SDavid du Colombier 		buf[Blinelen(inp)-1] = '\0';
124*219b2ee8SDavid du Colombier 		Bungetc(inp);
125*219b2ee8SDavid du Colombier 
126*219b2ee8SDavid du Colombier 		if (strncmp(str, "PI", sizeof("PI")-1) == 0 || strncmp(str, "PictureInclusion", sizeof("PictureInclusion")-1) == 0) {
127*219b2ee8SDavid du Colombier 			picture(inp, str);
128*219b2ee8SDavid du Colombier 		} else if (strncmp(str, "InlinePicture", sizeof("InlinePicture")-1) == 0) {
129*219b2ee8SDavid du Colombier 			error(FATAL, "InlinePicture not implemented yet.\n");
130*219b2ee8SDavid du Colombier /*			inlinepic(inp, buf);			*/
131*219b2ee8SDavid du Colombier 		} else if (strncmp(str, "BeginPath", sizeof("BeginPath")-1) == 0) {
132*219b2ee8SDavid du Colombier 			error(FATAL, "BeginPath not implemented yet.\n");
133*219b2ee8SDavid du Colombier /*			beginpath(buf, FALSE);		*/
134*219b2ee8SDavid du Colombier 		} else if (strncmp(str, "DrawPath", sizeof("DrawPath")-1) == 0) {
135*219b2ee8SDavid du Colombier 			error(FATAL, "DrawPath not implemented yet.\n");
136*219b2ee8SDavid du Colombier /*			drawpath(buf, FALSE);		*/
137*219b2ee8SDavid du Colombier 		} else if (strncmp(str, "BeginObject", sizeof("BeginObject")-1) == 0) {
138*219b2ee8SDavid du Colombier 			error(FATAL, "BeginObject not implemented yet.\n");
139*219b2ee8SDavid du Colombier /*			beginpath(buf, TRUE);		*/
140*219b2ee8SDavid du Colombier 		} else if (strncmp(str, "EndObject", sizeof("EndObject")-1) == 0) {
141*219b2ee8SDavid du Colombier 			error(FATAL, "EndObject not implemented yet.\n");
142*219b2ee8SDavid du Colombier /*			drawpath(buf, TRUE);		*/
143*219b2ee8SDavid du Colombier 		} else if (strncmp(str, "NewBaseline", sizeof("NewBaseline")-1) == 0) {
144*219b2ee8SDavid du Colombier 			error(FATAL, "NewBaseline not implemented yet.\n");
145*219b2ee8SDavid du Colombier /*			newbaseline(buf);			*/
146*219b2ee8SDavid du Colombier 		} else if (strncmp(str, "DrawText", sizeof("DrawText")-1) == 0) {
147*219b2ee8SDavid du Colombier 			error(FATAL, "DrawText not implemented yet.\n");
148*219b2ee8SDavid du Colombier /*			drawtext(buf);				*/
149*219b2ee8SDavid du Colombier 		} else if (strncmp(str, "SetText", sizeof("SetText")-1) == 0) {
150*219b2ee8SDavid du Colombier 			error(FATAL, "SetText not implemented yet.\n");
151*219b2ee8SDavid du Colombier /*			settext(buf);				*/
152*219b2ee8SDavid du Colombier 		} else if (strncmp(str, "SetColor", sizeof("SetColor")-1) == 0) {
153*219b2ee8SDavid du Colombier 			error(FATAL, "SetColor not implemented yet.\n");
154*219b2ee8SDavid du Colombier /*			newcolor(buf);				*/
155*219b2ee8SDavid du Colombier /*			setcolor();					*/
156*219b2ee8SDavid du Colombier 		} else if (strncmp(str, "INFO", sizeof("INFO")-1) == 0) {
157*219b2ee8SDavid du Colombier 			error(FATAL, "INFO not implemented yet.\n");
158*219b2ee8SDavid du Colombier /*			flushtext();				*/
159*219b2ee8SDavid du Colombier /*			Bprint(outp, "%%INFO%s", buf);	*/
160*219b2ee8SDavid du Colombier 		} else if (strncmp(str, "PS", sizeof("PS")-1) == 0 || strncmp(str, "PostScript", sizeof("PostScript")-1) == 0) {
161*219b2ee8SDavid du Colombier 			if(pageon()) {
162*219b2ee8SDavid du Colombier 				endstring();
163*219b2ee8SDavid du Colombier 				Bprint(Bstdout, "%s\n", buf);
164*219b2ee8SDavid du Colombier 			}
165*219b2ee8SDavid du Colombier 		} else if (strncmp(str, "ExportPS", sizeof("ExportPS")-1) == 0) {	/* dangerous!! */
166*219b2ee8SDavid du Colombier 			error(FATAL, "ExportPS not implemented yet.\n");
167*219b2ee8SDavid du Colombier /*			if (Bfildes(outp) == 1) {		*/
168*219b2ee8SDavid du Colombier /*				restore();				*/
169*219b2ee8SDavid du Colombier /*				Bprint(outp, "%s", buf);	*/
170*219b2ee8SDavid du Colombier /*				save();				*/
171*219b2ee8SDavid du Colombier /*			}						*/
172*219b2ee8SDavid du Colombier 		}
173*219b2ee8SDavid du Colombier /*		 else
174*219b2ee8SDavid du Colombier 			error(WARNING, "Unknown string <%s %s> after x X\n", str, buf);
175*219b2ee8SDavid du Colombier */
176*219b2ee8SDavid du Colombier 
177*219b2ee8SDavid du Colombier 		break;
178*219b2ee8SDavid du Colombier 	}
179*219b2ee8SDavid du Colombier 	while ((c = Bgetc(inp)) != '\n' && c != Beof);
180*219b2ee8SDavid du Colombier 	inputlineno++;
181*219b2ee8SDavid du Colombier }
182*219b2ee8SDavid du Colombier 
183