xref: /plan9/sys/src/cmd/postscript/tr2post/tr2post.c (revision cc26c1e8a0b1774933e5dd61a2917c4bee17c23c)
1219b2ee8SDavid du Colombier #include <u.h>
2219b2ee8SDavid du Colombier #include <libc.h>
3219b2ee8SDavid du Colombier #include <bio.h>
4219b2ee8SDavid du Colombier #include <stdio.h>
5219b2ee8SDavid du Colombier #include "common.h"
6219b2ee8SDavid du Colombier #include "tr2post.h"
7219b2ee8SDavid du Colombier #include "comments.h"
8219b2ee8SDavid du Colombier #include "path.h"
9219b2ee8SDavid du Colombier 
10219b2ee8SDavid du Colombier int formsperpage = 1;
11219b2ee8SDavid du Colombier int picflag = 1;
12219b2ee8SDavid du Colombier double aspectratio = 1.0;
13219b2ee8SDavid du Colombier int copies = 1;
14219b2ee8SDavid du Colombier int landscape = 0;
15219b2ee8SDavid du Colombier double magnification = 1.0;
16219b2ee8SDavid du Colombier int linesperpage = 66;
17219b2ee8SDavid du Colombier int pointsize = 10;
18219b2ee8SDavid du Colombier double xoffset = .25;
19219b2ee8SDavid du Colombier double yoffset = .25;
20219b2ee8SDavid du Colombier char *passthrough = 0;
21219b2ee8SDavid du Colombier 
22219b2ee8SDavid du Colombier Biobuf binp, *bstdout, bstderr;
23219b2ee8SDavid du Colombier Biobufhdr *Bstdin, *Bstdout, *Bstderr;
24219b2ee8SDavid du Colombier int debug = 0;
25219b2ee8SDavid du Colombier 
26219b2ee8SDavid du Colombier char tmpfilename[MAXTOKENSIZE];
27219b2ee8SDavid du Colombier char copybuf[BUFSIZ];
28219b2ee8SDavid du Colombier 
29219b2ee8SDavid du Colombier 
30219b2ee8SDavid du Colombier struct charent **build_char_list = 0;
31219b2ee8SDavid du Colombier int build_char_cnt = 0;
32219b2ee8SDavid du Colombier 
33219b2ee8SDavid du Colombier void
34219b2ee8SDavid du Colombier prologues(void) {
35219b2ee8SDavid du Colombier 	int i;
36219b2ee8SDavid du Colombier 	char charlibname[MAXTOKENSIZE];
37219b2ee8SDavid du Colombier 
38219b2ee8SDavid du Colombier 	Bprint(Bstdout, "%s", CONFORMING);
39219b2ee8SDavid du Colombier 	Bprint(Bstdout, "%s %s\n", VERSION, PROGRAMVERSION);
40*cc26c1e8SDavid du Colombier 	Bprint(Bstdout, "%s %s\n", CREATOR, PROGRAMNAME);
41219b2ee8SDavid du Colombier 	Bprint(Bstdout, "%s %s\n", DOCUMENTFONTS, ATEND);
42219b2ee8SDavid du Colombier 	Bprint(Bstdout, "%s %s\n", PAGES, ATEND);
43219b2ee8SDavid du Colombier 	Bprint(Bstdout, "%s", ENDCOMMENTS);
44219b2ee8SDavid du Colombier 
45219b2ee8SDavid du Colombier 	if (cat(DPOST)) {
46219b2ee8SDavid du Colombier 		Bprint(Bstderr, "can't read %s\n", DPOST);
47219b2ee8SDavid du Colombier 		exits("dpost prologue");
48219b2ee8SDavid du Colombier 	}
49219b2ee8SDavid du Colombier 
50219b2ee8SDavid du Colombier 	if (drawflag) {
51219b2ee8SDavid du Colombier 		if (cat(DRAW)) {
52219b2ee8SDavid du Colombier 			Bprint(Bstderr, "can't read %s\n", DRAW);
53219b2ee8SDavid du Colombier 			exits("draw prologue");
54219b2ee8SDavid du Colombier 		}
55219b2ee8SDavid du Colombier 	}
56219b2ee8SDavid du Colombier 
57219b2ee8SDavid du Colombier 	if (DOROUND)
58219b2ee8SDavid du Colombier 		cat(ROUNDPAGE);
59219b2ee8SDavid du Colombier 
60219b2ee8SDavid du Colombier 	Bprint(Bstdout, "%s", ENDPROLOG);
61219b2ee8SDavid du Colombier 	Bprint(Bstdout, "%s", BEGINSETUP);
62219b2ee8SDavid du Colombier 	Bprint(Bstdout, "mark\n");
63219b2ee8SDavid du Colombier 	if (formsperpage > 1) {
64219b2ee8SDavid du Colombier 		Bprint(Bstdout, "%s %d\n", FORMSPERPAGE, formsperpage);
65219b2ee8SDavid du Colombier 		Bprint(Bstdout, "/formsperpage %d def\n", formsperpage);
66219b2ee8SDavid du Colombier 	}
67219b2ee8SDavid du Colombier 	if (aspectratio != 1) Bprint(Bstdout, "/aspectratio %g def\n", aspectratio);
68219b2ee8SDavid du Colombier 	if (copies != 1) Bprint(Bstdout, "/#copies %d store\n", copies);
69219b2ee8SDavid du Colombier 	if (landscape) Bprint(Bstdout, "/landscape true def\n");
70219b2ee8SDavid du Colombier 	if (magnification != 1) Bprint(Bstdout, "/magnification %g def\n", magnification);
71219b2ee8SDavid du Colombier 	if (pointsize != 10) Bprint(Bstdout, "/pointsize %d def\n", pointsize);
72219b2ee8SDavid du Colombier 	if (xoffset != .25) Bprint(Bstdout, "/xoffset %g def\n", xoffset);
73219b2ee8SDavid du Colombier 	if (yoffset != .25) Bprint(Bstdout, "/yoffset %g def\n", yoffset);
74219b2ee8SDavid du Colombier 	cat(ENCODINGDIR"/Latin1.enc");
75219b2ee8SDavid du Colombier 	if (passthrough != 0) Bprint(Bstdout, "%s\n", passthrough);
76219b2ee8SDavid du Colombier 
77219b2ee8SDavid du Colombier 	Bprint(Bstdout, "setup\n");
78219b2ee8SDavid du Colombier 	if (formsperpage > 1) {
79219b2ee8SDavid du Colombier 		cat(FORMFILE);
80219b2ee8SDavid du Colombier 		Bprint(Bstdout, "%d setupforms \n", formsperpage);
81219b2ee8SDavid du Colombier 	}
82219b2ee8SDavid du Colombier /* output Build character info from charlib if necessary. */
83219b2ee8SDavid du Colombier 
84219b2ee8SDavid du Colombier 	for (i=0; i<build_char_cnt; i++) {
85219b2ee8SDavid du Colombier 		sprint(charlibname, "%s/%s", CHARLIB, build_char_list[i]->name);
86219b2ee8SDavid du Colombier 		if (cat(charlibname))
87219b2ee8SDavid du Colombier 		Bprint(Bstderr, "cannot open %s\n", charlibname);
88219b2ee8SDavid du Colombier 	}
89219b2ee8SDavid du Colombier 
90219b2ee8SDavid du Colombier 	Bprint(Bstdout, "%s", ENDSETUP);
91219b2ee8SDavid du Colombier }
92219b2ee8SDavid du Colombier 
93219b2ee8SDavid du Colombier void
94219b2ee8SDavid du Colombier cleanup(void) {
95219b2ee8SDavid du Colombier 	remove(tmpfilename);
96219b2ee8SDavid du Colombier }
97219b2ee8SDavid du Colombier 
98219b2ee8SDavid du Colombier main(int argc, char *argv[]) {
99219b2ee8SDavid du Colombier 	Biobuf *binp;
100219b2ee8SDavid du Colombier 	Biobufhdr *Binp;
101219b2ee8SDavid du Colombier 	int i, tot, ifd;
102219b2ee8SDavid du Colombier 	char *t;
103219b2ee8SDavid du Colombier 
104219b2ee8SDavid du Colombier 	programname = argv[0];
105219b2ee8SDavid du Colombier 	if (Binit(&bstderr, 2, OWRITE) == Beof) {
106219b2ee8SDavid du Colombier 		exits("Binit");
107219b2ee8SDavid du Colombier 	}
108219b2ee8SDavid du Colombier 	Bstderr = &bstderr.Biobufhdr;
109219b2ee8SDavid du Colombier 
110219b2ee8SDavid du Colombier 	tmpnam(tmpfilename);
111219b2ee8SDavid du Colombier 	if ((bstdout=Bopen(tmpfilename, OWRITE)) == 0) {
112219b2ee8SDavid du Colombier 		Bprint(Bstderr, "cannot open temporary file %s\n", tmpfilename);
113219b2ee8SDavid du Colombier 		exits("Bopen");
114219b2ee8SDavid du Colombier 	}
115219b2ee8SDavid du Colombier 	atexit(cleanup);
116219b2ee8SDavid du Colombier 	Bstdout = &bstdout->Biobufhdr;
117219b2ee8SDavid du Colombier 
118219b2ee8SDavid du Colombier 	ARGBEGIN{
119219b2ee8SDavid du Colombier 		case 'a':			/* aspect ratio */
120219b2ee8SDavid du Colombier 			aspectratio = atof(ARGF());
121219b2ee8SDavid du Colombier 			break;
122219b2ee8SDavid du Colombier 		case 'c':			/* copies */
123219b2ee8SDavid du Colombier 			copies = atoi(ARGF());
124219b2ee8SDavid du Colombier 			break;
125219b2ee8SDavid du Colombier 		case 'd':
126219b2ee8SDavid du Colombier 			debug = 1;
127219b2ee8SDavid du Colombier 			break;
128219b2ee8SDavid du Colombier 		case 'm':			/* magnification */
129219b2ee8SDavid du Colombier 			magnification = atof(ARGF());
130219b2ee8SDavid du Colombier 			break;
131219b2ee8SDavid du Colombier 		case 'n':			/* forms per page */
132219b2ee8SDavid du Colombier 			formsperpage = atoi(ARGF());
133219b2ee8SDavid du Colombier 			break;
134219b2ee8SDavid du Colombier 		case 'o':			/* output page list */
135219b2ee8SDavid du Colombier 			pagelist(ARGF());
136219b2ee8SDavid du Colombier 			break;
137219b2ee8SDavid du Colombier 		case 'p':			/* landscape or portrait mode */
138219b2ee8SDavid du Colombier 			if ( ARGF()[0] == 'l' )
139219b2ee8SDavid du Colombier 				landscape = 1;
140219b2ee8SDavid du Colombier 			else
141219b2ee8SDavid du Colombier 				landscape = 0;
142219b2ee8SDavid du Colombier 			break;
143219b2ee8SDavid du Colombier 		case 'x':			/* shift things horizontally */
144219b2ee8SDavid du Colombier 			xoffset = atof(ARGF());
145219b2ee8SDavid du Colombier 			break;
146219b2ee8SDavid du Colombier 		case 'y':			/* and vertically on the page */
147219b2ee8SDavid du Colombier 			yoffset = atof(ARGF());
148219b2ee8SDavid du Colombier 			break;
149219b2ee8SDavid du Colombier 		case 'P':			/* PostScript pass through */
150219b2ee8SDavid du Colombier 			t = ARGF();
151219b2ee8SDavid du Colombier 			i = strlen(t) + 1;
152219b2ee8SDavid du Colombier 			passthrough = malloc(i);
153219b2ee8SDavid du Colombier 			if (passthrough == 0) {
154219b2ee8SDavid du Colombier 				Bprint(Bstderr, "cannot allocate memory for argument string\n");
155219b2ee8SDavid du Colombier 				exits("malloc");
156219b2ee8SDavid du Colombier 			}
157219b2ee8SDavid du Colombier 			strncpy(passthrough, t, i);
158219b2ee8SDavid du Colombier 			break;
159219b2ee8SDavid du Colombier 		default:			/* don't know what to do for ch */
160219b2ee8SDavid du Colombier 			Bprint(Bstderr, "unknown option %C\n", ARGC());
161219b2ee8SDavid du Colombier 			break;
162219b2ee8SDavid du Colombier 	}ARGEND;
163219b2ee8SDavid du Colombier 	readDESC();
164219b2ee8SDavid du Colombier 	if (argc == 0) {
165219b2ee8SDavid du Colombier 		if ((binp = (Biobuf *)malloc(sizeof(Biobuf))) < (Biobuf *)0) {
166219b2ee8SDavid du Colombier 			Bprint(Bstderr, "malloc failed.\n");
167219b2ee8SDavid du Colombier 			exits("malloc");
168219b2ee8SDavid du Colombier 		}
169219b2ee8SDavid du Colombier 		if (Binit(binp, 0, OREAD) == Beof) {
170219b2ee8SDavid du Colombier 			Bprint(Bstderr, "Binit of <stdin> failed.\n");
171219b2ee8SDavid du Colombier 			exits("Binit");
172219b2ee8SDavid du Colombier 		}
173219b2ee8SDavid du Colombier 		Binp = &(binp->Biobufhdr);
174219b2ee8SDavid du Colombier 		if (debug) Bprint(Bstderr, "using standard input\n");
175219b2ee8SDavid du Colombier 		conv(Binp);
176219b2ee8SDavid du Colombier 		Bterm(Binp);
177219b2ee8SDavid du Colombier 	}
178219b2ee8SDavid du Colombier 	for (i=0; i<argc; i++) {
179219b2ee8SDavid du Colombier 		if ((binp=Bopen(argv[i], OREAD)) == 0) {
180219b2ee8SDavid du Colombier 			Bprint(Bstderr, "cannot open file %s\n", argv[i]);
181219b2ee8SDavid du Colombier 			continue;
182219b2ee8SDavid du Colombier 		}
183219b2ee8SDavid du Colombier 		Binp = &(binp->Biobufhdr);
184219b2ee8SDavid du Colombier 		inputfilename = argv[i];
185219b2ee8SDavid du Colombier 		conv(Binp);
186219b2ee8SDavid du Colombier 		Bterm(Binp);
187219b2ee8SDavid du Colombier 	}
188219b2ee8SDavid du Colombier 	Bterm(Bstdout);
189219b2ee8SDavid du Colombier 
190219b2ee8SDavid du Colombier 	if ((ifd=open(tmpfilename, OREAD)) < 0) {
191219b2ee8SDavid du Colombier 		Bprint(Bstderr, "open of %s failed.\n", tmpfilename);
192219b2ee8SDavid du Colombier 		exits("open");
193219b2ee8SDavid du Colombier 	}
194219b2ee8SDavid du Colombier 
195219b2ee8SDavid du Colombier 	bstdout = galloc(0, sizeof(Biobuf), "bstdout");
196219b2ee8SDavid du Colombier 	if (Binit(bstdout, 1, OWRITE) == Beof) {
197219b2ee8SDavid du Colombier 		Bprint(Bstderr, "Binit of <stdout> failed.\n");
198219b2ee8SDavid du Colombier 		exits("Binit");
199219b2ee8SDavid du Colombier 	}
200219b2ee8SDavid du Colombier 	Bstdout = &(bstdout->Biobufhdr);
201219b2ee8SDavid du Colombier 	prologues();
202219b2ee8SDavid du Colombier 	Bflush(Bstdout);
203219b2ee8SDavid du Colombier 	tot = 0; i = 0;
204219b2ee8SDavid du Colombier 	while ((i=read(ifd, copybuf, BUFSIZ)) > 0) {
205219b2ee8SDavid du Colombier 		if (write(1, copybuf, i) != i) {
206219b2ee8SDavid du Colombier 			Bprint(Bstderr, "write error on copying from temp file.\n");
207219b2ee8SDavid du Colombier 			exits("write");
208219b2ee8SDavid du Colombier 		}
209219b2ee8SDavid du Colombier 		tot += i;
210219b2ee8SDavid du Colombier 	}
211219b2ee8SDavid du Colombier 	if (debug) Bprint(Bstderr, "copied %d bytes to final output i=%d\n", tot, i);
212219b2ee8SDavid du Colombier 	if (i < 0) {
213219b2ee8SDavid du Colombier 		Bprint(Bstderr, "read error on copying from temp file.\n");
214219b2ee8SDavid du Colombier 		exits("read");
215219b2ee8SDavid du Colombier 	}
216219b2ee8SDavid du Colombier 	finish();
217219b2ee8SDavid du Colombier 
218219b2ee8SDavid du Colombier 	exits("");
219219b2ee8SDavid du Colombier }
220