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