245 lines · 5.9 KB · C
RawDownload
#include <u.h>#include <libc.h>#include <bio.h>#include <stdio.h>#include "common.h"#include "tr2post.h"#include "comments.h"#include "path.h" int formsperpage = 1;int picflag = 1;double aspectratio = 1.0;int copies = 1;int landscape = 0;double magnification = 1.0;int linesperpage = 66;int pointsize = 10;double xoffset = .25;double yoffset = .25;char *passthrough = 0; Biobuf binp, *bstdout, bstderr;Biobuf *Bstdin, *Bstdout, *Bstderr;int debug = 0; #ifndef MAXPATHLEN#define MAXPATHLEN 255#endif char tmpfilename[MAXPATHLEN+1];char copybuf[BUFSIZ];  struct charent **build_char_list = 0;int build_char_cnt = 0; voidprologues(void) {	int i;	char charlibname[MAXTOKENSIZE]; 	Bprint(Bstdout, "%s", CONFORMING);	Bprint(Bstdout, "%s %s\n", VERSION, PROGRAMVERSION);	Bprint(Bstdout, "%s %s\n", DOCUMENTFONTS, ATEND);	Bprint(Bstdout, "%s %s\n", PAGES, ATEND);	Bprint(Bstdout, "%s", ENDCOMMENTS); 	if (cat(unsharp(DPOST))) {		Bprint(Bstderr, "can't read %s\n", DPOST);		exits("dpost prologue");	} 	if (drawflag) {		if (cat(unsharp(DRAW))) {			Bprint(Bstderr, "can't read %s\n", DRAW);			exits("draw prologue");		}	} 	if (DOROUND)		cat(unsharp(ROUNDPAGE)); 	Bprint(Bstdout, "%s", ENDPROLOG);	Bprint(Bstdout, "%s", BEGINSETUP);	Bprint(Bstdout, "mark\n");	if (formsperpage > 1) {		Bprint(Bstdout, "%s %d\n", FORMSPERPAGE, formsperpage);		Bprint(Bstdout, "/formsperpage %d def\n", formsperpage);	}	if (aspectratio != 1) Bprint(Bstdout, "/aspectratio %g def\n", aspectratio);	if (copies != 1) Bprint(Bstdout, "/#copies %d store\n", copies);	if (landscape) Bprint(Bstdout, "/landscape true def\n");	if (magnification != 1) Bprint(Bstdout, "/magnification %g def\n", magnification);	if (pointsize != 10) Bprint(Bstdout, "/pointsize %d def\n", pointsize);	if (xoffset != .25) Bprint(Bstdout, "/xoffset %g def\n", xoffset);	if (yoffset != .25) Bprint(Bstdout, "/yoffset %g def\n", yoffset);	cat(unsharp(ENCODINGDIR"/Latin1.enc"));	if (passthrough != 0) Bprint(Bstdout, "%s\n", passthrough); 	Bprint(Bstdout, "setup\n");	if (formsperpage > 1) {		cat(unsharp(FORMFILE));		Bprint(Bstdout, "%d setupforms \n", formsperpage);	}/* output Build character info from charlib if necessary. */ 	for (i=0; i<build_char_cnt; i++) {		// Rewrite file name for case-insensitive or non-UTF-8 file systems.		// _x means a lowercase x; #1234 means Unicode 0x1234.		char buf[100];		char *r, *w;		for(w=buf, r=build_char_list[i]->name; *r && w<buf+sizeof buf-8; ){			if((uchar)*r >= 0x80){				Rune rr;				r += chartorune(&rr, r);				sprint(w, "#%04x", rr);				w += strlen(w);				continue;			}			if(('a' <= *r && *r <= 'z') || *r == '_')				*w++ = '_';			if(*r == '#')				*w++ = '#';			*w++ = *r++;		}		*w = 0;		sprint(charlibname, "%s/%s", CHARLIB, buf);		if (cat(unsharp(charlibname)))			Bprint(Bstderr, "cannot open %s\n", charlibname);	} 	Bprint(Bstdout, "%s", ENDSETUP);} voidcleanup(void) {	remove(tmpfilename);} intmain(int argc, char *argv[]) {	Biobuf btmp;	Biobuf *binp;	Biobuf *Binp;	int i, tot, ifd, fd;	char *t; 	programname = argv[0];	if (Binit(&bstderr, 2, OWRITE) == Beof) {		exits("Binit");	}	Bstderr = &bstderr;  /* &bstderr.Biobufhdr; */ 	bstdout = &btmp;	fd = safe_tmpnam(tmpfilename);	if ((Binit(bstdout, fd, OWRITE)) == Beof) {		Bprint(Bstderr, "cannot open temporary file %s\n", tmpfilename);		exits("Bopen");	}	atexit(cleanup);	Bstdout = bstdout; /* &bstdout->Biobufhdr; */		ARGBEGIN{		case 'a':			/* aspect ratio */			aspectratio = atof(ARGF());			break;		case 'c':			/* copies */			copies = atoi(ARGF());			break;		case 'd':			debug = 1;			break;		case 'm':			/* magnification */			magnification = atof(ARGF());			break;		case 'n':			/* forms per page */			formsperpage = atoi(ARGF());			break;		case 'o':			/* output page list */			pagelist(ARGF());			break;		case 'p':			/* landscape or portrait mode */			if ( ARGF()[0] == 'l' )				landscape = 1;			else				landscape = 0;			break;		case 'x':			/* shift things horizontally */			xoffset = atof(ARGF());			break;		case 'y':			/* and vertically on the page */			yoffset = atof(ARGF());			break;		case 'P':			/* PostScript pass through */			t = ARGF();			i = strlen(t) + 1;			passthrough = malloc(i);			if (passthrough == 0) {				Bprint(Bstderr, "cannot allocate memory for argument string\n");				exits("malloc");			}			strncpy(passthrough, t, i);			break;		default:			/* don't know what to do for ch */			Bprint(Bstderr, "unknown option %C\n", ARGC());			break;	}ARGEND;	readDESC();	if (argc == 0) {		if ((binp = (Biobuf *)malloc(sizeof(Biobuf))) < (Biobuf *)0) {			Bprint(Bstderr, "malloc failed.\n");			exits("malloc");		}		if (Binit(binp, 0, OREAD) == Beof) {			Bprint(Bstderr, "Binit of <stdin> failed.\n");			exits("Binit");		}		Binp = binp; /* &(binp->Biobufhdr); */		if (debug) Bprint(Bstderr, "using standard input\n");		conv(Binp);		Bterm(Binp);	}	for (i=0; i<argc; i++) {		if ((binp=Bopen(argv[i], OREAD)) == 0) {			Bprint(Bstderr, "cannot open file %s\n", argv[i]);			continue;		}		Binp = binp; /* &(binp->Biobufhdr); */		inputfilename = argv[i];		conv(Binp);		Bterm(Binp);	}	Bterm(Bstdout); 	if ((ifd=open(tmpfilename, OREAD)) < 0) {		Bprint(Bstderr, "open of %s failed.\n", tmpfilename);		exits("open");	} 	bstdout = galloc(0, sizeof(Biobuf), "bstdout");	if (Binit(bstdout, 1, OWRITE) == Beof) {		Bprint(Bstderr, "Binit of <stdout> failed.\n");		exits("Binit");	}	Bstdout = bstdout; /* &(bstdout->Biobufhdr); */	prologues();	Bflush(Bstdout);	tot = 0; i = 0;	while ((i=read(ifd, copybuf, BUFSIZ)) > 0) {		if (write(1, copybuf, i) != i) {			Bprint(Bstderr, "write error on copying from temp file.\n");			exits("write");		}		tot += i;	}	if (debug) Bprint(Bstderr, "copied %d bytes to final output i=%d\n", tot, i);	if (i < 0) {		Bprint(Bstderr, "read error on copying from temp file.\n");		exits("read");	}	finish();			exits("");	return 0;}