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