URI:
       ttr2post.c - plan9port - [fork] Plan 9 from user space
  HTML git clone git://src.adamsgaard.dk/plan9port
   DIR Log
   DIR Files
   DIR Refs
   DIR README
   DIR LICENSE
       ---
       ttr2post.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 }