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 struct charent **build_char_list = 0;
30219b2ee8SDavid du Colombier int build_char_cnt = 0;
31219b2ee8SDavid du Colombier
32219b2ee8SDavid du Colombier void
prologues(void)33219b2ee8SDavid du Colombier prologues(void) {
34219b2ee8SDavid du Colombier int i;
35219b2ee8SDavid du Colombier char charlibname[MAXTOKENSIZE];
36219b2ee8SDavid du Colombier
37219b2ee8SDavid du Colombier Bprint(Bstdout, "%s", CONFORMING);
38219b2ee8SDavid du Colombier Bprint(Bstdout, "%s %s\n", VERSION, PROGRAMVERSION);
39cc26c1e8SDavid du Colombier Bprint(Bstdout, "%s %s\n", CREATOR, PROGRAMNAME);
40219b2ee8SDavid du Colombier Bprint(Bstdout, "%s %s\n", DOCUMENTFONTS, ATEND);
41219b2ee8SDavid du Colombier Bprint(Bstdout, "%s %s\n", PAGES, ATEND);
42219b2ee8SDavid du Colombier Bprint(Bstdout, "%s", ENDCOMMENTS);
43219b2ee8SDavid du Colombier
44219b2ee8SDavid du Colombier if (cat(DPOST)) {
45*456a8764SDavid du Colombier fprint(2, "can't read %s\n", DPOST);
46219b2ee8SDavid du Colombier exits("dpost prologue");
47219b2ee8SDavid du Colombier }
48219b2ee8SDavid du Colombier
49219b2ee8SDavid du Colombier if (drawflag) {
50219b2ee8SDavid du Colombier if (cat(DRAW)) {
51*456a8764SDavid du Colombier fprint(2, "can't read %s\n", DRAW);
52219b2ee8SDavid du Colombier exits("draw prologue");
53219b2ee8SDavid du Colombier }
54219b2ee8SDavid du Colombier }
55219b2ee8SDavid du Colombier
56219b2ee8SDavid du Colombier if (DOROUND)
57219b2ee8SDavid du Colombier cat(ROUNDPAGE);
58219b2ee8SDavid du Colombier
59219b2ee8SDavid du Colombier Bprint(Bstdout, "%s", ENDPROLOG);
60219b2ee8SDavid du Colombier Bprint(Bstdout, "%s", BEGINSETUP);
61219b2ee8SDavid du Colombier Bprint(Bstdout, "mark\n");
62219b2ee8SDavid du Colombier if (formsperpage > 1) {
63219b2ee8SDavid du Colombier Bprint(Bstdout, "%s %d\n", FORMSPERPAGE, formsperpage);
64219b2ee8SDavid du Colombier Bprint(Bstdout, "/formsperpage %d def\n", formsperpage);
65219b2ee8SDavid du Colombier }
66219b2ee8SDavid du Colombier if (aspectratio != 1) Bprint(Bstdout, "/aspectratio %g def\n", aspectratio);
67219b2ee8SDavid du Colombier if (copies != 1) Bprint(Bstdout, "/#copies %d store\n", copies);
68219b2ee8SDavid du Colombier if (landscape) Bprint(Bstdout, "/landscape true def\n");
69219b2ee8SDavid du Colombier if (magnification != 1) Bprint(Bstdout, "/magnification %g def\n", magnification);
70219b2ee8SDavid du Colombier if (pointsize != 10) Bprint(Bstdout, "/pointsize %d def\n", pointsize);
71219b2ee8SDavid du Colombier if (xoffset != .25) Bprint(Bstdout, "/xoffset %g def\n", xoffset);
72219b2ee8SDavid du Colombier if (yoffset != .25) Bprint(Bstdout, "/yoffset %g def\n", yoffset);
73219b2ee8SDavid du Colombier cat(ENCODINGDIR"/Latin1.enc");
74219b2ee8SDavid du Colombier if (passthrough != 0) Bprint(Bstdout, "%s\n", passthrough);
75219b2ee8SDavid du Colombier
76219b2ee8SDavid du Colombier Bprint(Bstdout, "setup\n");
77219b2ee8SDavid du Colombier if (formsperpage > 1) {
78219b2ee8SDavid du Colombier cat(FORMFILE);
79219b2ee8SDavid du Colombier Bprint(Bstdout, "%d setupforms \n", formsperpage);
80219b2ee8SDavid du Colombier }
81219b2ee8SDavid du Colombier /* output Build character info from charlib if necessary. */
82219b2ee8SDavid du Colombier
83219b2ee8SDavid du Colombier for (i=0; i<build_char_cnt; i++) {
84219b2ee8SDavid du Colombier sprint(charlibname, "%s/%s", CHARLIB, build_char_list[i]->name);
85219b2ee8SDavid du Colombier if (cat(charlibname))
86*456a8764SDavid du Colombier fprint(2, "cannot open %s\n", charlibname);
87219b2ee8SDavid du Colombier }
88219b2ee8SDavid du Colombier
89219b2ee8SDavid du Colombier Bprint(Bstdout, "%s", ENDSETUP);
90219b2ee8SDavid du Colombier }
91219b2ee8SDavid du Colombier
92219b2ee8SDavid du Colombier void
cleanup(void)93219b2ee8SDavid du Colombier cleanup(void) {
94219b2ee8SDavid du Colombier remove(tmpfilename);
95219b2ee8SDavid du Colombier }
96219b2ee8SDavid du Colombier
97027288c8SDavid du Colombier void
main(int argc,char * argv[])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];
105*456a8764SDavid du Colombier if (Binit(&bstderr, 2, OWRITE) == Beof)
106*456a8764SDavid du Colombier sysfatal("Binit");
107219b2ee8SDavid du Colombier Bstderr = &bstderr.Biobufhdr;
108219b2ee8SDavid du Colombier
109219b2ee8SDavid du Colombier tmpnam(tmpfilename);
110*456a8764SDavid du Colombier if ((bstdout=Bopen(tmpfilename, OWRITE)) == 0)
111*456a8764SDavid du Colombier sysfatal("cannot open temporary file %s: %r", tmpfilename);
112219b2ee8SDavid du Colombier atexit(cleanup);
113219b2ee8SDavid du Colombier Bstdout = &bstdout->Biobufhdr;
114219b2ee8SDavid du Colombier
115219b2ee8SDavid du Colombier ARGBEGIN{
116219b2ee8SDavid du Colombier case 'a': /* aspect ratio */
117219b2ee8SDavid du Colombier aspectratio = atof(ARGF());
118219b2ee8SDavid du Colombier break;
119219b2ee8SDavid du Colombier case 'c': /* copies */
120219b2ee8SDavid du Colombier copies = atoi(ARGF());
121219b2ee8SDavid du Colombier break;
122219b2ee8SDavid du Colombier case 'd':
123219b2ee8SDavid du Colombier debug = 1;
124219b2ee8SDavid du Colombier break;
125219b2ee8SDavid du Colombier case 'm': /* magnification */
126219b2ee8SDavid du Colombier magnification = atof(ARGF());
127219b2ee8SDavid du Colombier break;
128219b2ee8SDavid du Colombier case 'n': /* forms per page */
129219b2ee8SDavid du Colombier formsperpage = atoi(ARGF());
130219b2ee8SDavid du Colombier break;
131219b2ee8SDavid du Colombier case 'o': /* output page list */
132219b2ee8SDavid du Colombier pagelist(ARGF());
133219b2ee8SDavid du Colombier break;
134219b2ee8SDavid du Colombier case 'p': /* landscape or portrait mode */
135219b2ee8SDavid du Colombier if ( ARGF()[0] == 'l' )
136219b2ee8SDavid du Colombier landscape = 1;
137219b2ee8SDavid du Colombier else
138219b2ee8SDavid du Colombier landscape = 0;
139219b2ee8SDavid du Colombier break;
140219b2ee8SDavid du Colombier case 'x': /* shift things horizontally */
141219b2ee8SDavid du Colombier xoffset = atof(ARGF());
142219b2ee8SDavid du Colombier break;
143219b2ee8SDavid du Colombier case 'y': /* and vertically on the page */
144219b2ee8SDavid du Colombier yoffset = atof(ARGF());
145219b2ee8SDavid du Colombier break;
146219b2ee8SDavid du Colombier case 'P': /* PostScript pass through */
147219b2ee8SDavid du Colombier t = ARGF();
148219b2ee8SDavid du Colombier i = strlen(t) + 1;
149219b2ee8SDavid du Colombier passthrough = malloc(i);
150*456a8764SDavid du Colombier if (passthrough == 0)
151*456a8764SDavid du Colombier sysfatal("malloc");
152219b2ee8SDavid du Colombier strncpy(passthrough, t, i);
153219b2ee8SDavid du Colombier break;
154219b2ee8SDavid du Colombier default: /* don't know what to do for ch */
155*456a8764SDavid du Colombier fprint(2, "unknown option %C\n", ARGC());
156219b2ee8SDavid du Colombier break;
157219b2ee8SDavid du Colombier }ARGEND;
158*456a8764SDavid du Colombier
159219b2ee8SDavid du Colombier readDESC();
160219b2ee8SDavid du Colombier if (argc == 0) {
161*456a8764SDavid du Colombier if ((binp = (Biobuf *)malloc(sizeof(Biobuf))) == nil)
162*456a8764SDavid du Colombier sysfatal("malloc");
163*456a8764SDavid du Colombier if (Binit(binp, 0, OREAD) == Beof)
164*456a8764SDavid du Colombier sysfatal("Binit of <stdin> failed.");
165*456a8764SDavid du Colombier Binp = &binp->Biobufhdr;
166*456a8764SDavid du Colombier if (debug) fprint(2, "using standard input\n");
167219b2ee8SDavid du Colombier conv(Binp);
168219b2ee8SDavid du Colombier Bterm(Binp);
169219b2ee8SDavid du Colombier }
170219b2ee8SDavid du Colombier for (i=0; i<argc; i++) {
171219b2ee8SDavid du Colombier if ((binp=Bopen(argv[i], OREAD)) == 0) {
172*456a8764SDavid du Colombier fprint(2, "cannot open file %s\n", argv[i]);
173219b2ee8SDavid du Colombier continue;
174219b2ee8SDavid du Colombier }
175*456a8764SDavid du Colombier Binp = &binp->Biobufhdr;
176219b2ee8SDavid du Colombier inputfilename = argv[i];
177219b2ee8SDavid du Colombier conv(Binp);
178219b2ee8SDavid du Colombier Bterm(Binp);
179219b2ee8SDavid du Colombier }
180219b2ee8SDavid du Colombier Bterm(Bstdout);
181219b2ee8SDavid du Colombier
182*456a8764SDavid du Colombier if ((ifd=open(tmpfilename, OREAD)) < 0)
183*456a8764SDavid du Colombier sysfatal("open of %s failed: %r", tmpfilename);
184219b2ee8SDavid du Colombier
185219b2ee8SDavid du Colombier bstdout = galloc(0, sizeof(Biobuf), "bstdout");
186*456a8764SDavid du Colombier if (Binit(bstdout, 1, OWRITE) == Beof)
187*456a8764SDavid du Colombier sysfatal("Binit of <stdout> failed.");
188219b2ee8SDavid du Colombier Bstdout = &(bstdout->Biobufhdr);
189219b2ee8SDavid du Colombier prologues();
190219b2ee8SDavid du Colombier Bflush(Bstdout);
191*456a8764SDavid du Colombier tot = 0;
192219b2ee8SDavid du Colombier while ((i=read(ifd, copybuf, BUFSIZ)) > 0) {
193219b2ee8SDavid du Colombier if (write(1, copybuf, i) != i) {
194*456a8764SDavid du Colombier fprint(2, "write error on copying from temp file.\n");
195219b2ee8SDavid du Colombier exits("write");
196219b2ee8SDavid du Colombier }
197219b2ee8SDavid du Colombier tot += i;
198219b2ee8SDavid du Colombier }
199*456a8764SDavid du Colombier if (debug) fprint(2, "copied %d bytes to final output i=%d\n", tot, i);
200*456a8764SDavid du Colombier if (i < 0)
201*456a8764SDavid du Colombier sysfatal("read error copying from temp file: %r");
202219b2ee8SDavid du Colombier finish();
203219b2ee8SDavid du Colombier exits("");
204219b2ee8SDavid du Colombier }
205