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