xref: /plan9/sys/src/cmd/postscript/tr2post/tr2post.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.h"
6*219b2ee8SDavid du Colombier #include "tr2post.h"
7*219b2ee8SDavid du Colombier #include "comments.h"
8*219b2ee8SDavid du Colombier #include "path.h"
9*219b2ee8SDavid du Colombier 
10*219b2ee8SDavid du Colombier int formsperpage = 1;
11*219b2ee8SDavid du Colombier int picflag = 1;
12*219b2ee8SDavid du Colombier double aspectratio = 1.0;
13*219b2ee8SDavid du Colombier int copies = 1;
14*219b2ee8SDavid du Colombier int landscape = 0;
15*219b2ee8SDavid du Colombier double magnification = 1.0;
16*219b2ee8SDavid du Colombier int linesperpage = 66;
17*219b2ee8SDavid du Colombier int pointsize = 10;
18*219b2ee8SDavid du Colombier double xoffset = .25;
19*219b2ee8SDavid du Colombier double yoffset = .25;
20*219b2ee8SDavid du Colombier char *passthrough = 0;
21*219b2ee8SDavid du Colombier 
22*219b2ee8SDavid du Colombier Biobuf binp, *bstdout, bstderr;
23*219b2ee8SDavid du Colombier Biobufhdr *Bstdin, *Bstdout, *Bstderr;
24*219b2ee8SDavid du Colombier int debug = 0;
25*219b2ee8SDavid du Colombier 
26*219b2ee8SDavid du Colombier char tmpfilename[MAXTOKENSIZE];
27*219b2ee8SDavid du Colombier char copybuf[BUFSIZ];
28*219b2ee8SDavid du Colombier 
29*219b2ee8SDavid du Colombier 
30*219b2ee8SDavid du Colombier struct charent **build_char_list = 0;
31*219b2ee8SDavid du Colombier int build_char_cnt = 0;
32*219b2ee8SDavid du Colombier 
33*219b2ee8SDavid du Colombier void
34*219b2ee8SDavid du Colombier prologues(void) {
35*219b2ee8SDavid du Colombier 	int i;
36*219b2ee8SDavid du Colombier 	char charlibname[MAXTOKENSIZE];
37*219b2ee8SDavid du Colombier 
38*219b2ee8SDavid du Colombier 	Bprint(Bstdout, "%s", CONFORMING);
39*219b2ee8SDavid du Colombier 	Bprint(Bstdout, "%s %s\n", VERSION, PROGRAMVERSION);
40*219b2ee8SDavid du Colombier 	Bprint(Bstdout, "%s %s\n", DOCUMENTFONTS, ATEND);
41*219b2ee8SDavid du Colombier 	Bprint(Bstdout, "%s %s\n", PAGES, ATEND);
42*219b2ee8SDavid du Colombier 	Bprint(Bstdout, "%s", ENDCOMMENTS);
43*219b2ee8SDavid du Colombier 
44*219b2ee8SDavid du Colombier 	if (cat(DPOST)) {
45*219b2ee8SDavid du Colombier 		Bprint(Bstderr, "can't read %s\n", DPOST);
46*219b2ee8SDavid du Colombier 		exits("dpost prologue");
47*219b2ee8SDavid du Colombier 	}
48*219b2ee8SDavid du Colombier 
49*219b2ee8SDavid du Colombier 	if (drawflag) {
50*219b2ee8SDavid du Colombier 		if (cat(DRAW)) {
51*219b2ee8SDavid du Colombier 			Bprint(Bstderr, "can't read %s\n", DRAW);
52*219b2ee8SDavid du Colombier 			exits("draw prologue");
53*219b2ee8SDavid du Colombier 		}
54*219b2ee8SDavid du Colombier 	}
55*219b2ee8SDavid du Colombier 
56*219b2ee8SDavid du Colombier 	if (DOROUND)
57*219b2ee8SDavid du Colombier 		cat(ROUNDPAGE);
58*219b2ee8SDavid du Colombier 
59*219b2ee8SDavid du Colombier 	Bprint(Bstdout, "%s", ENDPROLOG);
60*219b2ee8SDavid du Colombier 	Bprint(Bstdout, "%s", BEGINSETUP);
61*219b2ee8SDavid du Colombier 	Bprint(Bstdout, "mark\n");
62*219b2ee8SDavid du Colombier 	if (formsperpage > 1) {
63*219b2ee8SDavid du Colombier 		Bprint(Bstdout, "%s %d\n", FORMSPERPAGE, formsperpage);
64*219b2ee8SDavid du Colombier 		Bprint(Bstdout, "/formsperpage %d def\n", formsperpage);
65*219b2ee8SDavid du Colombier 	}
66*219b2ee8SDavid du Colombier 	if (aspectratio != 1) Bprint(Bstdout, "/aspectratio %g def\n", aspectratio);
67*219b2ee8SDavid du Colombier 	if (copies != 1) Bprint(Bstdout, "/#copies %d store\n", copies);
68*219b2ee8SDavid du Colombier 	if (landscape) Bprint(Bstdout, "/landscape true def\n");
69*219b2ee8SDavid du Colombier 	if (magnification != 1) Bprint(Bstdout, "/magnification %g def\n", magnification);
70*219b2ee8SDavid du Colombier 	if (pointsize != 10) Bprint(Bstdout, "/pointsize %d def\n", pointsize);
71*219b2ee8SDavid du Colombier 	if (xoffset != .25) Bprint(Bstdout, "/xoffset %g def\n", xoffset);
72*219b2ee8SDavid du Colombier 	if (yoffset != .25) Bprint(Bstdout, "/yoffset %g def\n", yoffset);
73*219b2ee8SDavid du Colombier 	cat(ENCODINGDIR"/Latin1.enc");
74*219b2ee8SDavid du Colombier 	if (passthrough != 0) Bprint(Bstdout, "%s\n", passthrough);
75*219b2ee8SDavid du Colombier 
76*219b2ee8SDavid du Colombier 	Bprint(Bstdout, "setup\n");
77*219b2ee8SDavid du Colombier 	if (formsperpage > 1) {
78*219b2ee8SDavid du Colombier 		cat(FORMFILE);
79*219b2ee8SDavid du Colombier 		Bprint(Bstdout, "%d setupforms \n", formsperpage);
80*219b2ee8SDavid du Colombier 	}
81*219b2ee8SDavid du Colombier /* output Build character info from charlib if necessary. */
82*219b2ee8SDavid du Colombier 
83*219b2ee8SDavid du Colombier 	for (i=0; i<build_char_cnt; i++) {
84*219b2ee8SDavid du Colombier 		sprint(charlibname, "%s/%s", CHARLIB, build_char_list[i]->name);
85*219b2ee8SDavid du Colombier 		if (cat(charlibname))
86*219b2ee8SDavid du Colombier 		Bprint(Bstderr, "cannot open %s\n", charlibname);
87*219b2ee8SDavid du Colombier 	}
88*219b2ee8SDavid du Colombier 
89*219b2ee8SDavid du Colombier 	Bprint(Bstdout, "%s", ENDSETUP);
90*219b2ee8SDavid du Colombier }
91*219b2ee8SDavid du Colombier 
92*219b2ee8SDavid du Colombier void
93*219b2ee8SDavid du Colombier cleanup(void) {
94*219b2ee8SDavid du Colombier 	remove(tmpfilename);
95*219b2ee8SDavid du Colombier }
96*219b2ee8SDavid du Colombier 
97*219b2ee8SDavid du Colombier main(int argc, char *argv[]) {
98*219b2ee8SDavid du Colombier 	Biobuf *binp;
99*219b2ee8SDavid du Colombier 	Biobufhdr *Binp;
100*219b2ee8SDavid du Colombier 	int i, tot, ifd;
101*219b2ee8SDavid du Colombier 	char *t;
102*219b2ee8SDavid du Colombier 
103*219b2ee8SDavid du Colombier 	programname = argv[0];
104*219b2ee8SDavid du Colombier 	if (Binit(&bstderr, 2, OWRITE) == Beof) {
105*219b2ee8SDavid du Colombier 		exits("Binit");
106*219b2ee8SDavid du Colombier 	}
107*219b2ee8SDavid du Colombier 	Bstderr = &bstderr.Biobufhdr;
108*219b2ee8SDavid du Colombier 
109*219b2ee8SDavid du Colombier 	tmpnam(tmpfilename);
110*219b2ee8SDavid du Colombier 	if ((bstdout=Bopen(tmpfilename, OWRITE)) == 0) {
111*219b2ee8SDavid du Colombier 		Bprint(Bstderr, "cannot open temporary file %s\n", tmpfilename);
112*219b2ee8SDavid du Colombier 		exits("Bopen");
113*219b2ee8SDavid du Colombier 	}
114*219b2ee8SDavid du Colombier 	atexit(cleanup);
115*219b2ee8SDavid du Colombier 	Bstdout = &bstdout->Biobufhdr;
116*219b2ee8SDavid du Colombier 
117*219b2ee8SDavid du Colombier 	ARGBEGIN{
118*219b2ee8SDavid du Colombier 		case 'a':			/* aspect ratio */
119*219b2ee8SDavid du Colombier 			aspectratio = atof(ARGF());
120*219b2ee8SDavid du Colombier 			break;
121*219b2ee8SDavid du Colombier 		case 'c':			/* copies */
122*219b2ee8SDavid du Colombier 			copies = atoi(ARGF());
123*219b2ee8SDavid du Colombier 			break;
124*219b2ee8SDavid du Colombier 		case 'd':
125*219b2ee8SDavid du Colombier 			debug = 1;
126*219b2ee8SDavid du Colombier 			break;
127*219b2ee8SDavid du Colombier 		case 'm':			/* magnification */
128*219b2ee8SDavid du Colombier 			magnification = atof(ARGF());
129*219b2ee8SDavid du Colombier 			break;
130*219b2ee8SDavid du Colombier 		case 'n':			/* forms per page */
131*219b2ee8SDavid du Colombier 			formsperpage = atoi(ARGF());
132*219b2ee8SDavid du Colombier 			break;
133*219b2ee8SDavid du Colombier 		case 'o':			/* output page list */
134*219b2ee8SDavid du Colombier 			pagelist(ARGF());
135*219b2ee8SDavid du Colombier 			break;
136*219b2ee8SDavid du Colombier 		case 'p':			/* landscape or portrait mode */
137*219b2ee8SDavid du Colombier 			if ( ARGF()[0] == 'l' )
138*219b2ee8SDavid du Colombier 				landscape = 1;
139*219b2ee8SDavid du Colombier 			else
140*219b2ee8SDavid du Colombier 				landscape = 0;
141*219b2ee8SDavid du Colombier 			break;
142*219b2ee8SDavid du Colombier 		case 'x':			/* shift things horizontally */
143*219b2ee8SDavid du Colombier 			xoffset = atof(ARGF());
144*219b2ee8SDavid du Colombier 			break;
145*219b2ee8SDavid du Colombier 		case 'y':			/* and vertically on the page */
146*219b2ee8SDavid du Colombier 			yoffset = atof(ARGF());
147*219b2ee8SDavid du Colombier 			break;
148*219b2ee8SDavid du Colombier 		case 'P':			/* PostScript pass through */
149*219b2ee8SDavid du Colombier 			t = ARGF();
150*219b2ee8SDavid du Colombier 			i = strlen(t) + 1;
151*219b2ee8SDavid du Colombier 			passthrough = malloc(i);
152*219b2ee8SDavid du Colombier 			if (passthrough == 0) {
153*219b2ee8SDavid du Colombier 				Bprint(Bstderr, "cannot allocate memory for argument string\n");
154*219b2ee8SDavid du Colombier 				exits("malloc");
155*219b2ee8SDavid du Colombier 			}
156*219b2ee8SDavid du Colombier 			strncpy(passthrough, t, i);
157*219b2ee8SDavid du Colombier 			break;
158*219b2ee8SDavid du Colombier 		default:			/* don't know what to do for ch */
159*219b2ee8SDavid du Colombier 			Bprint(Bstderr, "unknown option %C\n", ARGC());
160*219b2ee8SDavid du Colombier 			break;
161*219b2ee8SDavid du Colombier 	}ARGEND;
162*219b2ee8SDavid du Colombier 	readDESC();
163*219b2ee8SDavid du Colombier 	if (argc == 0) {
164*219b2ee8SDavid du Colombier 		if ((binp = (Biobuf *)malloc(sizeof(Biobuf))) < (Biobuf *)0) {
165*219b2ee8SDavid du Colombier 			Bprint(Bstderr, "malloc failed.\n");
166*219b2ee8SDavid du Colombier 			exits("malloc");
167*219b2ee8SDavid du Colombier 		}
168*219b2ee8SDavid du Colombier 		if (Binit(binp, 0, OREAD) == Beof) {
169*219b2ee8SDavid du Colombier 			Bprint(Bstderr, "Binit of <stdin> failed.\n");
170*219b2ee8SDavid du Colombier 			exits("Binit");
171*219b2ee8SDavid du Colombier 		}
172*219b2ee8SDavid du Colombier 		Binp = &(binp->Biobufhdr);
173*219b2ee8SDavid du Colombier 		if (debug) Bprint(Bstderr, "using standard input\n");
174*219b2ee8SDavid du Colombier 		conv(Binp);
175*219b2ee8SDavid du Colombier 		Bterm(Binp);
176*219b2ee8SDavid du Colombier 	}
177*219b2ee8SDavid du Colombier 	for (i=0; i<argc; i++) {
178*219b2ee8SDavid du Colombier 		if ((binp=Bopen(argv[i], OREAD)) == 0) {
179*219b2ee8SDavid du Colombier 			Bprint(Bstderr, "cannot open file %s\n", argv[i]);
180*219b2ee8SDavid du Colombier 			continue;
181*219b2ee8SDavid du Colombier 		}
182*219b2ee8SDavid du Colombier 		Binp = &(binp->Biobufhdr);
183*219b2ee8SDavid du Colombier 		inputfilename = argv[i];
184*219b2ee8SDavid du Colombier 		conv(Binp);
185*219b2ee8SDavid du Colombier 		Bterm(Binp);
186*219b2ee8SDavid du Colombier 	}
187*219b2ee8SDavid du Colombier 	Bterm(Bstdout);
188*219b2ee8SDavid du Colombier 
189*219b2ee8SDavid du Colombier 	if ((ifd=open(tmpfilename, OREAD)) < 0) {
190*219b2ee8SDavid du Colombier 		Bprint(Bstderr, "open of %s failed.\n", tmpfilename);
191*219b2ee8SDavid du Colombier 		exits("open");
192*219b2ee8SDavid du Colombier 	}
193*219b2ee8SDavid du Colombier 
194*219b2ee8SDavid du Colombier 	bstdout = galloc(0, sizeof(Biobuf), "bstdout");
195*219b2ee8SDavid du Colombier 	if (Binit(bstdout, 1, OWRITE) == Beof) {
196*219b2ee8SDavid du Colombier 		Bprint(Bstderr, "Binit of <stdout> failed.\n");
197*219b2ee8SDavid du Colombier 		exits("Binit");
198*219b2ee8SDavid du Colombier 	}
199*219b2ee8SDavid du Colombier 	Bstdout = &(bstdout->Biobufhdr);
200*219b2ee8SDavid du Colombier 	prologues();
201*219b2ee8SDavid du Colombier 	Bflush(Bstdout);
202*219b2ee8SDavid du Colombier 	tot = 0; i = 0;
203*219b2ee8SDavid du Colombier 	while ((i=read(ifd, copybuf, BUFSIZ)) > 0) {
204*219b2ee8SDavid du Colombier 		if (write(1, copybuf, i) != i) {
205*219b2ee8SDavid du Colombier 			Bprint(Bstderr, "write error on copying from temp file.\n");
206*219b2ee8SDavid du Colombier 			exits("write");
207*219b2ee8SDavid du Colombier 		}
208*219b2ee8SDavid du Colombier 		tot += i;
209*219b2ee8SDavid du Colombier 	}
210*219b2ee8SDavid du Colombier 	if (debug) Bprint(Bstderr, "copied %d bytes to final output i=%d\n", tot, i);
211*219b2ee8SDavid du Colombier 	if (i < 0) {
212*219b2ee8SDavid du Colombier 		Bprint(Bstderr, "read error on copying from temp file.\n");
213*219b2ee8SDavid du Colombier 		exits("read");
214*219b2ee8SDavid du Colombier 	}
215*219b2ee8SDavid du Colombier 	finish();
216*219b2ee8SDavid du Colombier 
217*219b2ee8SDavid du Colombier 	exits("");
218*219b2ee8SDavid du Colombier }
219