|
DataMuseum.dkPresents historical artifacts from the history of: DKUUG/EUUG Conference tapes |
This is an automatic "excavation" of a thematic subset of
See our Wiki for more about DKUUG/EUUG Conference tapes Excavated with: AutoArchaeologist - Free & Open Source Software. |
top - metrics - downloadIndex: T d
Length: 2718 (0xa9e) Types: TextFile Names: »dvipsf.c«
└─⟦060c9c824⟧ Bits:30007080 DKUUG TeX 2/12/89 └─⟦this⟧ »./DVIware/obsolete/mitdrivers/dvi2ps/dvipsf.c«
/* * dvipsf.c - output filter for postscript to printer * uses these other programs: * /usr/lib/postf (the lpr filter for postscript to laserwriter) * /usr/local/bin/dvi2ps (dvi to postscript translator) * /usr/lib/tex.ps (the postscript prologue to support TeX) * * Copyright 1985 Massachusetts Institute of Technology * Author: CJL@OZ * */ /* #define DEBUGGING */ #include <stdio.h> #include <signal.h> #include <sys/ioctl.h> #include <fcntl.h> #define PROLOGUE "/usr/lib/tex.ps" #define DVI2PS "/usr/local/bin/dvi2ps -q" #define CAT "/bin/cat" #define POSTF "/usr/lib/applef" #define TEXTF "/usr/lib/applef" FILE *popen(); char *user,*host; main(argc, argv) int argc; char *argv[]; { char tfn[BUFSIZ],cmdbuf[BUFSIZ],efn[BUFSIZ]; register int ch; register FILE *tf; int olderrfd,i; char *rindex(); FILE *ef,*of; if (rindex(argv[0],'/')) argv[0] = rindex(argv[0],'/')+1; for (i = 1; i < argc; i++) { if (argv[i][0] == '-') switch (argv[i][1]) { case 'h': host = argv[++i]; break; case 'n': user = argv[++i]; break; default: break; } } /* Copy the dvi data to a temp file, since we have to give it by name * to dvi2ps. */ if ((tf = fopen(mktemp(strcpy(tfn,"/usr/tmp/dvipsf.XXXXXX")),"w")) == NULL) { perror(tfn); exit(2); } while (!ferror(stdin) && (ch = getchar()) != EOF) putc(ch,tf); fclose(tf); if (ferror(stdin)) { perror("dvipsf stdin"); unlink(tfn); exit(2); } /* Now divert standard error to a temp file so we can print it later. */ if ((ef = fopen(mktemp(strcpy(efn,"/usr/tmp/dvipsf.err.XXXXXX")),"w+")) == NULL) { perror(efn); unlink(tfn); exit(2); } unlink(efn); fflush(stderr); olderrfd = dup(2); close(2); dup(fileno(ef)); /* Run the filters */ if (user != NULL && host != NULL) sprintf(cmdbuf,"%s %s | %s -n %s -h %s",DVI2PS,tfn,POSTF,user,host); else sprintf(cmdbuf,"%s %s | %s", DVI2PS, tfn, POSTF); system(cmdbuf); unlink(tfn); /* Now put back the old stderr */ fflush(stderr); close(2); dup(olderrfd); close(olderrfd); /* And send all the messages to the printer */ if (user != NULL && host != NULL) sprintf(cmdbuf,"%s -w80 -l66 -n %s -h %s",TEXTF,user,host); else sprintf(cmdbuf,"%s -w80 -l66", TEXTF); if ((of = popen(cmdbuf,"w")) == NULL) { perror(TEXTF); exit(2); } rewind(ef); while (!ferror(ef) && (ch = getc(ef)) != EOF) if (ch != '\031') { putc(ch,of); #ifdef DEBUGGING putc(ch,stderr); #endif } fclose(ef); pclose(of); if (ferror(ef)) { perror(efn); exit(2); } exit(0); }