133295Skarels #ifndef lint 233295Skarels static char Notice[] = "Copyright (c) 1985 Adobe Systems Incorporated"; 3*40521Skarels static char sccsid[] = "@(#)enscript.c 1.4 (Berkeley) 03/18/90"; 440201Skarels static char *RCSID = "$Header: enscript.c,v 1.7 89/03/12 01:31:55 van Exp $"; 540201Skarels 633295Skarels #endif 740201Skarels /* 840201Skarels * enscript.c 933295Skarels * 1040201Skarels * Copyright (c) 1985 Adobe Systems Incorporated 1133295Skarels * 1240201Skarels * inspired by Gosling's cz there have been major overhauls, but the input 1340201Skarels * language is the same: new widths format generate PostScript (much easier 1440201Skarels * than Press) new and renamed switches (to match 4.2bsd lpr spooler) obeys 1540201Skarels * PostScript comment conventions doesn't worry so much about fonts 1640201Skarels * (everything is scalable and rotatable, use PS font names, no face 1740201Skarels * properties) 1833295Skarels * 1940201Skarels * enscript generates POSTSCRIPT print files of a special kind the coordinate 2040201Skarels * system is in 20ths of a point. (1440 per inch) 2133295Skarels * 2240201Skarels * Edit History: Andrew Shore: Mon Nov 18 14:05:05 1985 End Edit History. 2333295Skarels * 2440201Skarels * RCSLOG: $Log: enscript.c,v $ 2540201Skarels * Revision 1.7 89/03/12 01:31:55 van 2640201Skarels * we have to escape special chars in title strings. 2733295Skarels * 2840201Skarels * Revision 1.6 89/03/10 00:30:39 van 2940201Skarels * might as well let the user change everything. 3033295Skarels * 3140201Skarels * Revision 1.5 89/03/09 23:19:17 van 3240201Skarels * gcc lint. 3333295Skarels * 3440201Skarels * Revision 1.4 89/03/09 23:08:50 van 3540201Skarels * let user set the fonts used in 'gaudy' mode 3640201Skarels * 3740201Skarels * Revision 1.3 88/03/06 17:23:58 leres 3840201Skarels * Fix logic bug; only spool output if that's want we want. 3940201Skarels * 4040201Skarels * Revision 1.2 86/07/03 00:06:31 van 4140201Skarels * reformatted. removed SYSV ifdefs. 4240201Skarels * Revision 1.1 86/07/03 00:03:12 van Initial 4340201Skarels * revision 4433295Skarels * 4540201Skarels * Revision 2.1 85/11/24 11:48:55 shore Product Release 2.0 4640201Skarels * 4740201Skarels * Revision 1.3 85/11/20 00:10:01 shore Added System V support (input options 4840201Skarels * and spooling) margins/linecount reworked (Dataproducts) incompatible 4940201Skarels * options changes, getopt! Guy Riddle's Gaudy mode and other changes output 5040201Skarels * spooling messages, pages, copies 5140201Skarels * 5240201Skarels * Revision 1.2 85/05/14 11:22:14 shore *** empty log message *** 5340201Skarels * 5440201Skarels * 5533295Skarels */ 5633295Skarels 5733295Skarels #define POSTSCRIPTPRINTER "PostScript" 5833295Skarels 5933295Skarels #define BODYROMAN "Courier" 60*40521Skarels #define BODYSZ 10 61*40521Skarels #define HEADFONT "Courier-Bold" 62*40521Skarels #define HEADSZ 10 63*40521Skarels #define GHEADFONT "Helvetica-Bold" 64*40521Skarels #define GHEADSZ 14 6540201Skarels #define SHEADFONT "Times-Bold" 66*40521Skarels #define SHEADSZ 12 6740201Skarels #define PGNUMFONT "Helvetica-Bold" 68*40521Skarels #define PGNUMSZ 24 69*40521Skarels #define DATEFONT "Times-Bold" 70*40521Skarels #define DATESZ 12 7133295Skarels 7233295Skarels #ifdef DEBUG 7333295Skarels #define debugp(x) {fprintf x ; VOIDC fflush(stderr);} 7433295Skarels #else 7533295Skarels #define debugp(x) 7633295Skarels #endif 7733295Skarels 7833295Skarels #define UperInch (1440L) 7933295Skarels #define PtsPerInch 72 8033295Skarels #define UperPt 20 8133295Skarels 8233295Skarels /* virtual page is 8 x 10.5 inches (for Toshiba compat) */ 8333295Skarels #define PageWidth ((long) UperInch*8) 8433295Skarels #define PageLength ((long)((UperInch*21)/2)) 8533295Skarels 8640201Skarels /* #define PageLength ((long) ((long) (UperInch*(8*11-3)))/8) */ 8740201Skarels /* #define PageWidth ((long) ((long) (UperInch*(8*17-3)))/8) */ 8833295Skarels 8933295Skarels /* true page is 8.5 x 11 inches */ 9033295Skarels #define TruePageWidth (UperInch*17/2) 9133295Skarels #define TruePageLength ((long)(UperInch*11)) 9233295Skarels 9333295Skarels #include <stdio.h> 9433295Skarels #include <ctype.h> 9533295Skarels #include <pwd.h> 9633295Skarels #include <strings.h> 9733295Skarels #include <sys/time.h> 9833295Skarels #include <signal.h> 9933295Skarels #include <sys/types.h> 10033295Skarels #include <sys/stat.h> 10133295Skarels #include "transcript.h" 10233295Skarels 10333295Skarels #define LPR "lpr" 10433295Skarels 10540201Skarels #define MAXBAD 20 /* number of bad chars to pass before 10640201Skarels * complaint */ 10733295Skarels 10833295Skarels private struct stat S; 10933295Skarels 11040201Skarels extern double atof(); 11133295Skarels extern char *optarg; /* getopt current opt char */ 11233295Skarels extern int optind; /* getopt argv index */ 11333295Skarels 11440201Skarels private VOID int1 (); 11540201Skarels private FlushShow(); 11633295Skarels 11733295Skarels #define FSIZEMAX 256 /* number of chars per font */ 11833295Skarels 11933295Skarels /* the layout of a font information block */ 12033295Skarels private struct font { 12140201Skarels char name[100]; /* PostScript font name */ 12240201Skarels int dsize; /* size */ 12340201Skarels int Xwid[FSIZEMAX]; /* X widths for each character */ 12433295Skarels }; 12533295Skarels 12640201Skarels private struct font fonts[16]; /* 16 possible fonts at one time */ 12740201Skarels private int nf = 0; /* number of fonts known about */ 12833295Skarels 12933295Skarels private int TabWidth = TruePageWidth / 10; /* width of a tab */ 13040201Skarels private int BSWidth; /* width of a backspace */ 13133295Skarels 13233295Skarels private long UperLine = UperInch / 7; 13333295Skarels private long UperHLine = UperInch / 7; 13433295Skarels 13533295Skarels private char *prog; /* program name argv[0] */ 13633295Skarels private char *libdir; /* place for prolog and widths files */ 13733295Skarels private char *tempdir; /* place for temp file */ 13833295Skarels private char TempName[100]; /* name of temporary PostScript file */ 13933295Skarels private char OutName[256] = ""; /* filename for disk output */ 14033295Skarels private int PipeOut = FALSE; /* output to stdout (-p -) */ 14133295Skarels private int ListOmitted = FALSE;/* list omitted chars on the tty */ 142*40521Skarels private int BeQuiet = FALSE; /* suppress stderr error messages */ 143*40521Skarels private int Verbose = FALSE; /* silly informational messages */ 14433295Skarels private int Gaudy = FALSE; /* pretty bars along the top */ 14533295Skarels private int LPTsimulate = FALSE;/* an lpt should be simulated */ 14633295Skarels private int Lines = 0; /* max lines per page */ 14733295Skarels private int LinesLeft = 66; /* lines left on page when in LPT mode */ 14833295Skarels private int LineMax = 64; /* ? */ 14933295Skarels private int col; /* column number on current line */ 15033295Skarels private int SeenText = TRUE; /* true if seen some text on this page */ 15133295Skarels private int OutOnly = FALSE; /* PS file only wanted */ 15233295Skarels private int Rotated = FALSE; /* pages to be rotated landscape */ 15333295Skarels private int PreFeed = FALSE; /* prefeed should be enabled */ 15433295Skarels private int TwoColumn = FALSE; /* two-column mode */ 15533295Skarels private int FirstCol = TRUE; /* we're printing column 1 */ 15633295Skarels private int NoTitle = FALSE; /* title line is suppressed */ 15733295Skarels private int Cvted = FALSE; /* converted a file to PS format */ 15833295Skarels 15940201Skarels private int IgnoreGarbage = FALSE; /* garbage should be ignored */ 160*40521Skarels private int SeenFont = FALSE; /* we've seen a font request */ 16133295Skarels private int SeenFile = FALSE; /* a file has been processed */ 16240201Skarels private int ScannedFonts = FALSE; /* we've scanned the font file */ 16333295Skarels private char *FileName = 0; /* name of file currently being PSed */ 16433295Skarels private char *FileDate = 0; /* last mod date of file being PSed */ 16533295Skarels private char DateStr[27]; /* thanks, but no thanks ctime! */ 16640201Skarels private int spoolNoBurst = FALSE; /* no break page flag for spooler */ 16733295Skarels 16833295Skarels #ifdef BSD 16933295Skarels private char *spoolJobClass = NULL; 17033295Skarels private char *spoolJobName = NULL; 17140201Skarels 17233295Skarels #endif 17333295Skarels private char *PrinterName = NULL; 17433295Skarels private int spoolNotify = 0; 17533295Skarels private char *spoolCopies = "1"; 17633295Skarels 17733295Skarels private char tempstr[256]; /* various path names */ 17833295Skarels 17933295Skarels private int CurFont; /* current Font */ 18040201Skarels private int fontindex[26]; /* table of fonts, indexed by font designator 18140201Skarels * ('a' to 'z') */ 18240201Skarels 18333295Skarels /* indexes for default fonts */ 18433295Skarels 18533295Skarels #define Roman fontindex['r'-'a'] 18633295Skarels #define HeaderFont fontindex['h'-'a'] 18740201Skarels #define SHeaderFont fontindex['i'-'a'] 18840201Skarels #define DateFont fontindex['j'-'a'] 18940201Skarels #define PgNumFont fontindex['k'-'a'] 19033295Skarels 19133295Skarels private long cX, cY; /* current page positions */ 19233295Skarels private long dX, dY; /* desired page positions */ 19333295Skarels private long lX, lY; /* page positions of the start of the line */ 19433295Skarels private long crX, crY; /* X and Y increments to apply to CR's */ 19533295Skarels private long maxX; /* maximum x coord on line */ 19633295Skarels private long minY; /* minimum y coord on page */ 19740201Skarels private long Xoffset; /* amount to offset left margin */ 19833295Skarels 19933295Skarels #define None 0 20033295Skarels #define RelX 1 20133295Skarels #define RelY 2 20233295Skarels #define RelXY 3 20333295Skarels #define AbsX 4 20433295Skarels #define AbsY 8 20533295Skarels #define AbsXY 12 20633295Skarels 20733295Skarels private int movepending; /* moveto pending coords on stack */ 20833295Skarels private int showpending; /* number of characters waiting to be shown */ 20940201Skarels private int pagepending; /* start on next page when have something to 21040201Skarels * print */ 21140201Skarels private char *UsersHeader = NULL; /* user specified heading */ 21233295Skarels private char *Header = NULL; /* generated header (usually FileName) */ 213*40521Skarels private char *Header2 = NULL; /* second header line for Gaudy */ 21433295Skarels private int Page = 0; /* current page number */ 21533295Skarels private int TotalPages = 0; /* total number of pages printed */ 21633295Skarels private int TruncChars = 0; /* number of characters truncated */ 21740201Skarels private int UndefChars = 0; /* number of characters skipped because they 21840201Skarels * weren't defined in some font */ 21940201Skarels private int BadChars = 0; /* number of bad characters seen so far */ 22033295Skarels private FILE *OutFile = NULL; /* output ps file */ 22133295Skarels 22233295Skarels 22333295Skarels /* decode a fontname string - e.g. Courier10 Helvetica-Bold12 */ 22440201Skarels private 22540201Skarels decodefont (name, f) 22640201Skarels register char *name; 22740201Skarels register struct font *f; 22840201Skarels { 22940201Skarels register char *d, *p; 23033295Skarels 23140201Skarels p = name; 23240201Skarels d = f->name; 23340201Skarels f->dsize = 0; 23440201Skarels while (isascii (*p) && (isalpha (*p) || (*p == '-'))) { 23540201Skarels *d++ = *p++; 23640201Skarels } 23740201Skarels *d++ = '\0'; 23840201Skarels while (isascii (*p) && isdigit (*p)) { 23940201Skarels f->dsize = f->dsize * 10 + *p++ - '0'; 24040201Skarels } 24140201Skarels if (*p || !f->dsize || !f->name[0]) { 24240201Skarels fprintf (stderr, "%s: poorly formed font name & size: \"%s\"\n", 24340201Skarels prog, name); 24440201Skarels exit (1); 24540201Skarels } 24633295Skarels } 24740201Skarels 24840201Skarels 24933295Skarels #define NOTDEF 0x8000 25033295Skarels #define ForAllFonts(p) for(p = &fonts[nf-1]; p >= &fonts[0]; p--) 25133295Skarels 25233295Skarels 25340201Skarels /* 25440201Skarels * Scan the font metrics directory looking for entries that match the entries 25540201Skarels * in ``fonts''. For entries that are found the data in the font description 25640201Skarels * is filled in, if any are missing, it dies horribly. 25733295Skarels */ 25840201Skarels private VOID ScanFont () 25940201Skarels { 26040201Skarels register struct font *f; 26140201Skarels register FILE *FontData;/* afm file */ 26240201Skarels char *c; 26340201Skarels int ccode, cwidth, inChars; 26440201Skarels char FontFile[512]; /* afm file name */ 26540201Skarels char afmbuf[BUFSIZ]; 26633295Skarels 26733295Skarels 26840201Skarels if (!SeenFont) { 26940201Skarels if (Lines == 0) 27040201Skarels Lines = 64; 27140201Skarels if (Rotated && TwoColumn) 27240201Skarels fonts[Roman].dsize = 7; 27333295Skarels } 27440201Skarels /* loop through fonts, find and read metric entry in dir */ 27540201Skarels ForAllFonts (f) { 27640201Skarels VOIDC mstrcat (FontFile, libdir, "/", sizeof FontFile); 27733295Skarels 27840201Skarels VOIDC mstrcat (FontFile, FontFile, f->name, sizeof FontFile); 27940201Skarels 28040201Skarels VOIDC mstrcat (FontFile, FontFile, ".afm", sizeof FontFile); 28140201Skarels 28240201Skarels if ((FontData = fopen (FontFile, "r")) == NULL) { 28340201Skarels fprintf (stderr, "%s: can't open font metrics file %s\n", 28440201Skarels prog, FontFile); 28540201Skarels exit (1); 28633295Skarels } 28740201Skarels /* read the .afm file to get the widths */ 28840201Skarels for (ccode = 0; ccode < FSIZEMAX; ccode++) 28940201Skarels f->Xwid[ccode] = NOTDEF; 29040201Skarels 29140201Skarels inChars = 0; 29240201Skarels while (fgets (afmbuf, sizeof afmbuf, FontData) != NULL) { 29340201Skarels /* strip off newline */ 29440201Skarels if ((c = INDEX (afmbuf, '\n')) == 0) { 29540201Skarels fprintf (stderr, "%s: AFM file %s line too long %s\n", 29640201Skarels prog, FontFile, afmbuf); 29740201Skarels exit (1); 29840201Skarels } 29940201Skarels *c = '\0'; 30040201Skarels if (*afmbuf == '\0') 30140201Skarels continue; 30240201Skarels if (strcmp (afmbuf, "StartCharMetrics") == 0) { 30340201Skarels inChars++; 30440201Skarels continue; 30540201Skarels } 30640201Skarels if (strcmp (afmbuf, "EndCharMetrics") == 0) 30740201Skarels break; 30840201Skarels if (inChars == 1) { 30940201Skarels if (sscanf (afmbuf, "C %d ; WX %d ;", &ccode, &cwidth) != 2) { 31040201Skarels fprintf (stderr, "%s: trouble with AFM file %s\n", 31140201Skarels prog, FontFile); 31240201Skarels exit (1); 31340201Skarels } 31440201Skarels /* get out once we see an unencoded char */ 31540201Skarels if (ccode == -1) 31640201Skarels break; 31740201Skarels if (ccode > 255) 31840201Skarels continue; 31940201Skarels f->Xwid[ccode] = 32040201Skarels (short) (((long) cwidth * (long) f->dsize * (long) UperPt) 32140201Skarels / 1000L); 32240201Skarels continue; 32340201Skarels } 32440201Skarels } 32540201Skarels VOIDC fclose (FontData); 32633295Skarels } 32733295Skarels 32840201Skarels TabWidth = fonts[Roman].Xwid['0'] * 8; /* 8 * figure width */ 32940201Skarels BSWidth = fonts[Roman].Xwid[' ']; /* space width */ 33033295Skarels 33140201Skarels UperLine = (fonts[Roman].dsize + 1) * UperPt; 33233295Skarels 33340201Skarels if (LPTsimulate) { 33440201Skarels UperHLine = UperLine; 33540201Skarels Lines = LineMax = 66; 33640201Skarels } else { 33740201Skarels UperHLine = (fonts[HeaderFont].dsize + 1) * UperPt; 33840201Skarels } 33933295Skarels 34040201Skarels crX = 0; 34140201Skarels crY = -UperLine; 34233295Skarels 34333295Skarels } 34433295Skarels 34533295Skarels 34640201Skarels /* 34740201Skarels * Return a font number for the font with the indicated name and size. Adds 34840201Skarels * info to the font list for the eventual search. 34933295Skarels */ 35040201Skarels private int 35140201Skarels DefineFont (name, size) 35240201Skarels char *name; 35340201Skarels { 35440201Skarels register struct font *p; 35540201Skarels 35640201Skarels p = &fonts[nf]; 35740201Skarels VOIDC strcpy (p->name, name); 35840201Skarels 35940201Skarels p->dsize = size; 36040201Skarels return (nf++); 36133295Skarels } 36233295Skarels 36333295Skarels 36433295Skarels /* dump the fonts to the PS file for setup */ 36540201Skarels private VOID 36640201Skarels DumpFonts () 36740201Skarels { 36840201Skarels register struct font *f; 36933295Skarels 37040201Skarels ForAllFonts (f) { 37140201Skarels fprintf (OutFile, "%d %d /%s\n", f - &fonts[0], f->dsize * UperPt, f->name); 37240201Skarels } 37340201Skarels fprintf (OutFile, "%d SetUpFonts\n", nf); 37433295Skarels } 37533295Skarels 37633295Skarels /* add a shown character to the PS file */ 37740201Skarels private VOID 37840201Skarels OUTputc (c) 37940201Skarels register int c; 38040201Skarels { 38140201Skarels if (!showpending) { 38240201Skarels putc ('(', OutFile); 38340201Skarels showpending = TRUE; 38440201Skarels } 38540201Skarels if (c == '\\' || c == '(' || c == ')') 38640201Skarels putc ('\\', OutFile); 38740201Skarels if ((c > 0176) || (c < 040)) { 38840201Skarels putc ('\\', OutFile); 38940201Skarels putc ((c >> 6) + '0', OutFile); 39040201Skarels putc (((c >> 3) & 07) + '0', OutFile); 39140201Skarels putc ((c & 07) + '0', OutFile); 39240201Skarels } else 39340201Skarels putc (c, OutFile); 39433295Skarels } 39533295Skarels 39640201Skarels /* put a correctly escaped string to the PS file */ 39740201Skarels private VOID 39840201Skarels OUTstr(s) 39940201Skarels register char *s; 40040201Skarels { 40140201Skarels if (!showpending) { 40240201Skarels putc ('(', OutFile); 40340201Skarels showpending = TRUE; 40440201Skarels } 40540201Skarels while (*s) 40640201Skarels OUTputc(*s++); 40740201Skarels 40840201Skarels putc(')', OutFile); 40940201Skarels showpending = FALSE; 41040201Skarels } 41140201Skarels 41233295Skarels /* Set the current font */ 41340201Skarels private VOID 41440201Skarels SetFont (f) 41540201Skarels int f; 41640201Skarels { 41740201Skarels FlushShow (); 41840201Skarels CurFont = f; 41940201Skarels fprintf (OutFile, "%d F\n", f); 42033295Skarels } 42133295Skarels 42240201Skarels /* 42340201Skarels * put a character onto the page at the desired X and Y positions. If the 42440201Skarels * current position doesn't agree with the desired position, put out movement 42540201Skarels * directives. Leave the current position updated to account for the 42640201Skarels * character. 42733295Skarels */ 42840201Skarels private VOID 42940201Skarels ShowChar (c) 43040201Skarels register int c; 43140201Skarels { 43240201Skarels register struct font *f; 43340201Skarels register long nX, nY; 43440201Skarels static level = 0; 435*40521Skarels VOID PageEject(); 43633295Skarels 43740201Skarels level++; 43840201Skarels f = &fonts[CurFont]; 43933295Skarels 44040201Skarels if (f->Xwid[c] == NOTDEF) { 44140201Skarels UndefChars++; 44240201Skarels if (ListOmitted) 44340201Skarels fprintf (stderr, "%s: \\%03o not found in font %s\n", 44440201Skarels prog, c, f->name); 44540201Skarels if (level <= 1) { 44640201Skarels ShowChar ('\\'); 44740201Skarels ShowChar ((c >> 6) + '0'); 44840201Skarels ShowChar (((c >> 3) & 07) + '0'); 44940201Skarels ShowChar ((c & 07) + '0'); 45040201Skarels col += 3; 45140201Skarels } 45240201Skarels level--; 45340201Skarels return; 45433295Skarels } 45540201Skarels nX = dX + f->Xwid[c]; /* resulting position after showing this char */ 45640201Skarels nY = dY; 45733295Skarels 45840201Skarels if (c != ' ' || ((cX == dX) && (cY == dY))) { 459*40521Skarels /* 460*40521Skarels * If character doesn't fit on this line 461*40521Skarels * (and we're not at left margin), simulate newline 462*40521Skarels * and then call ourselves recursively. 463*40521Skarels */ 464*40521Skarels if (nX > maxX && dX > lX) { 465*40521Skarels SeenText = TRUE; 466*40521Skarels dY = lY = lY + crY; 467*40521Skarels dX = lX = lX + crX; 468*40521Skarels if ((dY < minY) || (--LinesLeft <= 0)) 469*40521Skarels PageEject (); 470*40521Skarels col = 1; 471*40521Skarels ShowChar(c); 472*40521Skarels level--; 473*40521Skarels return; 474*40521Skarels } 475*40521Skarels if (cX != dX) { 476*40521Skarels if (cY != dY) { 47740201Skarels FlushShow (); 478*40521Skarels /* absolute x, relative y */ 479*40521Skarels fprintf (OutFile, "%ld %ld", dX, dY); 480*40521Skarels movepending = AbsXY; 481*40521Skarels } else { 482*40521Skarels FlushShow (); 483*40521Skarels fprintf (OutFile, "%ld", dX - cX); /* relative x */ 484*40521Skarels movepending = RelX; 48540201Skarels } 486*40521Skarels } else if (cY != dY) { 487*40521Skarels FlushShow (); 488*40521Skarels fprintf (OutFile, "%ld", dY - cY); /* relative y */ 489*40521Skarels movepending = RelY; 490*40521Skarels } 491*40521Skarels OUTputc (c); 492*40521Skarels showpending = TRUE; 493*40521Skarels cX = nX; 494*40521Skarels cY = nY; 49533295Skarels } 49640201Skarels dX = nX; 49740201Skarels dY = nY; 49833295Skarels 49940201Skarels level--; 50033295Skarels } 50133295Skarels 50233295Skarels /* put out a shown string to the PS file */ 50340201Skarels private VOID 50440201Skarels ShowStr (s) 50540201Skarels register char *s; 50640201Skarels { 50740201Skarels while (*s) { 50840201Skarels if (*s >= 040) 50940201Skarels ShowChar (*s); 51040201Skarels s++; 51140201Skarels } 51233295Skarels } 51333295Skarels 51433295Skarels /* flush pending show */ 51540201Skarels private 51640201Skarels FlushShow () 51740201Skarels { 51840201Skarels if (showpending) { 51940201Skarels putc (')', OutFile); 52040201Skarels switch (movepending) { 52140201Skarels case RelX: 52240201Skarels putc ('X', OutFile); 52340201Skarels break; 52440201Skarels case RelY: 52540201Skarels putc ('Y', OutFile); 52640201Skarels break; 52740201Skarels case AbsXY: 52840201Skarels putc ('B', OutFile); 52940201Skarels break; 53040201Skarels case None: 53140201Skarels putc ('S', OutFile); 53240201Skarels break; 53340201Skarels } 53440201Skarels putc ('\n', OutFile); 53540201Skarels movepending = None; 53640201Skarels showpending = FALSE; 53733295Skarels } 53833295Skarels } 53933295Skarels 54033295Skarels /* put out a page heading to the PS file */ 54140201Skarels private VOID 54240201Skarels InitPage () 54340201Skarels { 54440201Skarels char header[200]; 54540201Skarels register int OldFont = CurFont; 54633295Skarels 54740201Skarels TotalPages++; 54840201Skarels fprintf (OutFile, "%%%%Page: ? %d\n", TotalPages); 54940201Skarels fprintf (OutFile, "StartPage\n"); 55040201Skarels SeenText = FALSE; 55140201Skarels cX = cY = -1; 55240201Skarels showpending = pagepending = FALSE; 55340201Skarels FirstCol = TRUE; 55440201Skarels if (Rotated) { 55540201Skarels fprintf (OutFile, "Landscape\n"); 55640201Skarels lX = dX = UperInch / 4 + Xoffset; 55740201Skarels lY = dY = PageLength - (UperHLine * 3) / 2; 55840201Skarels maxX = TruePageLength; 55940201Skarels /* minY = (PageLength - TruePageWidth) + 3*UperLine+480; */ 56040201Skarels minY = (TruePageLength - TruePageWidth) + (TruePageWidth - PageWidth) / 2; 56140201Skarels } else { 56240201Skarels lX = dX = Xoffset + 56340201Skarels (TwoColumn? (UperInch * 0.3) : ((UperInch * 5) / 8)); 56440201Skarels lY = dY = PageLength - UperHLine; 56540201Skarels maxX = TruePageWidth; 56640201Skarels minY = (UperInch / 4); /* 0.25 inches */ 56740201Skarels } 56840201Skarels movepending = None; 56940201Skarels cX = dX; 57040201Skarels cY = dY; 57133295Skarels 57240201Skarels if (!NoTitle) { 57340201Skarels if (Gaudy) { 57440201Skarels OUTstr(UsersHeader); 575*40521Skarels if (Header2) 576*40521Skarels OUTstr(Header2); 577*40521Skarels else 578*40521Skarels OUTstr(Header); 57940201Skarels fprintf (OutFile, "[%s](%d)Gaudy\n", FileDate, ++Page); 58040201Skarels cX = cY = 0; /* force moveto here */ 58140201Skarels } else { 58240201Skarels SetFont (HeaderFont); 58340201Skarels fprintf (OutFile, "%ld %ld ", cX, cY); 58440201Skarels movepending = AbsXY; 58540201Skarels if (UsersHeader) { 58640201Skarels if (*UsersHeader == 0) { 58740201Skarels fprintf (OutFile, "()B\n"); 58840201Skarels movepending = None; 58940201Skarels showpending = FALSE; 59040201Skarels } else 59140201Skarels ShowStr (UsersHeader); 59240201Skarels } else { 59340201Skarels VOIDC sprintf (header, "%s %s %d", 59440201Skarels Header? Header : " ", FileDate, ++Page); 59540201Skarels 59640201Skarels ShowStr (header); 59740201Skarels } 59840201Skarels FlushShow (); 59933295Skarels } 60040201Skarels dX = lX = lX + crX * 2; 60140201Skarels dY = lY = lY + crY * 2; 60240201Skarels } else { 60340201Skarels /* fake it to force a moveto */ 60440201Skarels cX = cY = 0; 60533295Skarels } 60640201Skarels if (TwoColumn) 60740201Skarels maxX = maxX / 2 - BSWidth; 60840201Skarels else 60940201Skarels maxX -= ((long) (UperInch * 0.3)); 61040201Skarels LineMax = (lY - minY) / (-crY); 61140201Skarels if ((Lines <= 0) || (Lines > LineMax)) 61240201Skarels Lines = LinesLeft = LineMax; 61340201Skarels else 61440201Skarels LinesLeft = Lines; 61540201Skarels SetFont (OldFont); 61633295Skarels } 61733295Skarels 61840201Skarels private VOID 61940201Skarels ClosePage () 62040201Skarels { 62140201Skarels FlushShow (); 62240201Skarels if (!pagepending) 62340201Skarels fprintf (OutFile, "EndPage\n"); 62440201Skarels pagepending = TRUE; 62533295Skarels } 62633295Skarels 62733295Skarels /* skip to a new page */ 62840201Skarels private VOID 62940201Skarels PageEject () 63040201Skarels { 63140201Skarels if (TwoColumn && FirstCol) { 63240201Skarels FirstCol = FALSE; 63340201Skarels if (Rotated) { 63440201Skarels lY = dY = PageLength - (UperHLine * 3) / 2; 63540201Skarels lX = dX = Xoffset + TruePageLength / 2; 63640201Skarels maxX = TruePageLength - UperInch * 0.3; 63740201Skarels } else { 63840201Skarels lY = dY = PageLength - UperHLine; 63940201Skarels lX = dX = Xoffset + TruePageWidth / 2; 64040201Skarels maxX = TruePageWidth - UperInch * 0.3; 64140201Skarels } 64240201Skarels if (!NoTitle) { 64340201Skarels dX = lX = lX + crX * 2; 64440201Skarels dY = lY = lY + crY * 2; 64540201Skarels } 64640201Skarels } else 64740201Skarels ClosePage (); 64840201Skarels LinesLeft = Lines; 64940201Skarels SeenText = FALSE; 65033295Skarels } 65133295Skarels 65240201Skarels private VOID 65340201Skarels CommentHeader () 65440201Skarels { 65540201Skarels long clock; 65640201Skarels struct passwd *pswd; 65740201Skarels char hostname[40]; 65840201Skarels 65940201Skarels /* copy the file, prepending a new comment header */ 66040201Skarels fprintf (OutFile, "%%!%s\n", COMMENTVERSION); 66140201Skarels fprintf (OutFile, "%%%%Creator: "); 66240201Skarels pswd = getpwuid ((int) getuid ()); 66340201Skarels VOIDC gethostname (hostname, (int) sizeof hostname); 66440201Skarels 66540201Skarels fprintf (OutFile, "%s:%s (%s)\n", hostname, pswd->pw_name, pswd->pw_gecos); 66640201Skarels fprintf (OutFile, "%%%%Title: %s\n", (FileName ? FileName : "stdin")); 66740201Skarels fprintf (OutFile, "%%%%CreationDate: %s", (VOIDC time (&clock), ctime (&clock))); 66833295Skarels } 66933295Skarels 67033295Skarels /* Copy the standard input file to the PS file */ 67140201Skarels private VOID 67240201Skarels CopyFile () 67340201Skarels { 67440201Skarels register int c; 67533295Skarels 67640201Skarels col = 1; 67740201Skarels if (OutFile == 0) { 67840201Skarels if (OutOnly) { 67940201Skarels OutFile = PipeOut ? stdout : fopen (OutName, "w"); 68040201Skarels } else { 68140201Skarels VOIDC mktemp (mstrcat (TempName, tempdir, 68240201Skarels ENSCRIPTTEMP, sizeof TempName)); 68340201Skarels VOIDC strcpy (OutName, TempName); 68440201Skarels 68540201Skarels VOIDC umask (077); 68640201Skarels 68740201Skarels OutFile = fopen (TempName, "w"); 68840201Skarels } 68933295Skarels } 69040201Skarels if (OutFile == NULL) { 69140201Skarels fprintf (stderr, "%s: can't create PS file %s\n", prog, TempName); 69240201Skarels exit (1); 69333295Skarels } 69440201Skarels if (!ScannedFonts) { 69540201Skarels ScannedFonts = TRUE; 69640201Skarels ScanFont (); 69733295Skarels } 69840201Skarels if (!Cvted) { 69940201Skarels CommentHeader (); 70040201Skarels if (nf) { 70140201Skarels register struct font *f; 70240201Skarels 70340201Skarels fprintf (OutFile, "%%%%DocumentFonts:"); 70440201Skarels ForAllFonts (f) { 70540201Skarels fprintf (OutFile, " %s", f->name); 70640201Skarels } 70740201Skarels fprintf (OutFile, "\n"); 70840201Skarels } 70940201Skarels /* copy in fixed prolog */ 71040201Skarels if (copyfile (mstrcat (tempstr, libdir, ENSCRIPTPRO, sizeof tempstr), 71140201Skarels OutFile)) { 71240201Skarels fprintf (stderr, "%s: trouble copying prolog file\n", prog); 71340201Skarels exit (1); 71440201Skarels } 71540201Skarels fprintf (OutFile, "StartEnscriptDoc %% end fixed prolog\n"); 71640201Skarels DumpFonts (); 71740201Skarels if (Gaudy) 71840201Skarels fprintf (OutFile, "%s %s InitGaudy\n", 71940201Skarels Rotated ? "10.55" : "8.0", TwoColumn ? "true" : "false"); 72040201Skarels if (PreFeed) { 72140201Skarels fprintf (OutFile, "true DoPreFeed\n"); 72240201Skarels } 72340201Skarels fprintf (OutFile, "%%%%EndProlog\n"); 72433295Skarels } 72540201Skarels Cvted = TRUE; 72633295Skarels 72740201Skarels Page = 0; 72840201Skarels BadChars = 0; /* give each file a clean slate */ 72940201Skarels pagepending = TRUE; 73040201Skarels while ((c = getchar ()) != EOF) 73140201Skarels if ((c > 0177 || c < 0) && (!IgnoreGarbage)) { 73240201Skarels if (BadChars++ > MAXBAD) { /* allow some kruft but 73340201Skarels * not much */ 73440201Skarels fprintf (stderr, "%s: \"%s\" not a text file? Try -g.\n", 73540201Skarels prog, FileName ? FileName : "(stdin)"); 73640201Skarels if (!PipeOut) 73740201Skarels VOIDC unlink (OutName); 73840201Skarels 73940201Skarels exit (1); 74040201Skarels } 74140201Skarels } else if (c >= ' ') { 74240201Skarels if (pagepending) 74340201Skarels InitPage (); 74440201Skarels ShowChar (c); 74540201Skarels col++; 74640201Skarels } else 74740201Skarels switch (c) { 74840201Skarels case 010: /* backspace */ 74940201Skarels dX -= BSWidth; 75033295Skarels break; 75140201Skarels case 015: /* carriage return ^M */ 75240201Skarels dY = lY; 75340201Skarels dX = lX; 75433295Skarels break; 75540201Skarels case 012: /* linefeed ^J */ 75640201Skarels if (pagepending) 75740201Skarels InitPage (); 75840201Skarels if (dX != lX || dY != lY || !LPTsimulate || SeenText) { 75940201Skarels SeenText = TRUE; 76040201Skarels dY = lY = lY + crY; 76140201Skarels dX = lX = lX + crX; 76240201Skarels } else 76340201Skarels LinesLeft = LineMax; 76440201Skarels if ((dY < minY) || (--LinesLeft <= 0)) 76540201Skarels PageEject (); 76640201Skarels col = 1; 76740201Skarels break; 76840201Skarels case 033: /* escape */ 76940201Skarels switch (c = getchar ()) { 77040201Skarels case '7': /* backup one line */ 77140201Skarels dY = lY = lY - crY; 77240201Skarels dX = lX = lX - crX; 77340201Skarels break; 77440201Skarels case '8': /* backup 1/2 line */ 77540201Skarels dY -= crY / 2; 77640201Skarels dX -= crX / 2; 77740201Skarels break; 77840201Skarels case '9': /* forward 1/2 linefeed */ 77940201Skarels dY += crY / 2; 78040201Skarels dX += crX / 2; 78140201Skarels break; 78240201Skarels case 'F': /* font setting */ 78340201Skarels c = getchar (); 78440201Skarels if ('a' <= c && c <= 'z') 78540201Skarels if (fontindex[c - 'a'] >= 0) 78640201Skarels SetFont (fontindex[c - 'a']); 78740201Skarels else { 78840201Skarels fprintf (stderr, "%s: font '%c' not defined\n", 78940201Skarels prog, c); 79040201Skarels exit (1); 79140201Skarels } 79240201Skarels else { 79340201Skarels fprintf (stderr, "%s: bad font code in file: '%c'\n", 79440201Skarels prog, c); 79540201Skarels exit (1); 79640201Skarels } 79740201Skarels break; 79840201Skarels case 'D': /* date string */ 79940201Skarels VOIDC fgets (DateStr, sizeof(DateStr), stdin); 80040201Skarels FileDate = DateStr; 80140201Skarels break; 80240201Skarels case 'U': /* new "user's" heading */ 80340201Skarels { 80440201Skarels static char header[100]; 80540201Skarels VOIDC fgets (header, sizeof(header), stdin); 80633295Skarels 80740201Skarels UsersHeader = header; 80840201Skarels break; 80940201Skarels } 81040201Skarels case 'H': /* new heading */ 81140201Skarels { 81240201Skarels static char header[100]; 81340201Skarels 81440201Skarels VOIDC fgets (header, sizeof(header), stdin); 81540201Skarels 81640201Skarels ClosePage (); 817*40521Skarels Header2 = header; 81840201Skarels Page = 0; 81940201Skarels break; 82040201Skarels } 82140201Skarels } 82233295Skarels break; 82340201Skarels case '%': /* included PostScript line */ 82440201Skarels { 82540201Skarels char psline[200]; 82640201Skarels VOIDC fgets (psline, sizeof(psline), stdin); 82740201Skarels 82840201Skarels fprintf (OutFile, "%s\n", psline); 82940201Skarels break; 83040201Skarels } 83140201Skarels case 014: /* form feed ^L */ 83240201Skarels PageEject (); 83340201Skarels col = 1; 83440201Skarels break; 83540201Skarels case 011: /* tab ^I */ 83640201Skarels if (pagepending) 83740201Skarels InitPage (); 83840201Skarels col = (col - 1) / 8 * 8 + 9; 83940201Skarels dX = lX + (col - 1) / 8 * TabWidth; 84040201Skarels break; 84140201Skarels default: /* other control character, take your 84240201Skarels * chances */ 84340201Skarels if (pagepending) 84440201Skarels InitPage (); 84540201Skarels ShowChar (c); 84640201Skarels col++; 84740201Skarels } 84840201Skarels ClosePage (); 84933295Skarels } 85033295Skarels 85133295Skarels 85233295Skarels /* 85340201Skarels * close the PS file 85433295Skarels */ 85540201Skarels private VOID 85640201Skarels ClosePS () 85740201Skarels { 85840201Skarels fprintf (OutFile, "%%%%Trailer\n"); 85940201Skarels if (PreFeed) { 86040201Skarels fprintf (OutFile, "false DoPreFeed\n"); 86140201Skarels } 86240201Skarels fprintf (OutFile, "EndEnscriptDoc\nEnscriptJob restore\n"); 86333295Skarels } 86433295Skarels 86533295Skarels 86640201Skarels private VOID 86740201Skarels SetTime (tval) 86840201Skarels long tval; 86940201Skarels { 87040201Skarels struct tm *tp; 87133295Skarels 87240201Skarels if (Gaudy) { 87340201Skarels tp = localtime (&tval); 87440201Skarels VOIDC sprintf (DateStr, "(%02d/%02d/%02d)(%02d:%02d:%02d)", 87540201Skarels tp->tm_year, tp->tm_mon + 1, tp->tm_mday, 87640201Skarels tp->tm_hour, tp->tm_min, tp->tm_sec); 87740201Skarels } else { 87840201Skarels VOIDC strcpy (DateStr, ctime (&tval)); 87933295Skarels 88040201Skarels DateStr[24] = '\0'; /* get rid of newline */ 88140201Skarels } 88240201Skarels 88340201Skarels FileDate = DateStr; 88433295Skarels } 88533295Skarels 88633295Skarels 88733295Skarels 88833295Skarels 889*40521Skarels #define ARGS "12gGBlL:oqrRkKf:F:b:p:J:C:P:#:mhO:s:v" 89033295Skarels 89140201Skarels private VOID ParseArgs (ac, av) 89240201Skarels int ac; 89340201Skarels char **av; 89440201Skarels { 89540201Skarels int argp; 89640201Skarels 89740201Skarels while ((argp = getopt (ac, av, ARGS)) != EOF) { 89840201Skarels debugp ((stderr, "option: %c\n", argp)); 89940201Skarels switch (argp) { 90040201Skarels case '1': 90140201Skarels TwoColumn = FALSE; 90240201Skarels break; 90340201Skarels case '2': 90440201Skarels TwoColumn = TRUE; 90540201Skarels break; 90640201Skarels case 'G': 90740201Skarels Gaudy = TRUE; 90840201Skarels if (UsersHeader == NULL) 90940201Skarels UsersHeader = ""; 91040201Skarels if (Header == NULL) 91140201Skarels Header = ""; 912*40521Skarels DateFont = DefineFont(DATEFONT, DATESZ); 913*40521Skarels PgNumFont = DefineFont(PGNUMFONT, PGNUMSZ); 91440201Skarels break; 91540201Skarels case 'g': 91640201Skarels IgnoreGarbage = TRUE; 91740201Skarels break; 91840201Skarels case 'B': 91940201Skarels NoTitle = TRUE; 92040201Skarels break; 92140201Skarels case 'l': 92240201Skarels LPTsimulate = TRUE; 92340201Skarels NoTitle = TRUE; 92440201Skarels Lines = 66; 92540201Skarels break; 92640201Skarels case 'L': 92740201Skarels Lines = atoi (optarg); 92840201Skarels break; 92940201Skarels case 'o': 93040201Skarels ListOmitted = TRUE; 93140201Skarels break; 93240201Skarels case 'q': 93340201Skarels BeQuiet = TRUE; 93440201Skarels break; 93540201Skarels case 'r': 93640201Skarels Rotated = TRUE; 93740201Skarels break; 93840201Skarels case 'R': 93940201Skarels Rotated = FALSE; 94040201Skarels break; 94140201Skarels case 'k': 94240201Skarels PreFeed = TRUE; 94340201Skarels break; 94440201Skarels case 'K': 94540201Skarels PreFeed = FALSE; 94640201Skarels break; 94740201Skarels case 'f':{ 94840201Skarels register char font = 'r'; 94940201Skarels int *whichfont; 95040201Skarels 95140201Skarels if (*optarg == '-') { 95240201Skarels font = *++optarg; 95340201Skarels optarg++; 95440201Skarels } 95540201Skarels if ((font < 'a') || ('z' < font)) { 95640201Skarels fprintf (stderr, 95740201Skarels "%s: '%c' isn't a valid font designator.\n", 95840201Skarels prog, font); 95940201Skarels exit (1); 96040201Skarels } 96140201Skarels whichfont = &fontindex[font - 'a']; 96240201Skarels if (*whichfont < 0) 96340201Skarels *whichfont = nf++; 96440201Skarels decodefont (optarg, &fonts[*whichfont]); 965*40521Skarels if (font == 'r') 966*40521Skarels SeenFont++; 96740201Skarels } 96840201Skarels break; 96940201Skarels case 'F': 970*40521Skarels if (HeaderFont == -1) 971*40521Skarels HeaderFont = nf++; 97240201Skarels decodefont (optarg, &fonts[HeaderFont]); 97340201Skarels break; 97440201Skarels case 'b': 97540201Skarels UsersHeader = optarg; 97640201Skarels break; 977*40521Skarels case 's': 978*40521Skarels Header2 = optarg; 979*40521Skarels break; 98040201Skarels case 'p': 98140201Skarels OutOnly = TRUE; 98240201Skarels VOIDC strcpy (OutName, optarg); 98340201Skarels 98440201Skarels if (strcmp (OutName, "-") == 0) 98540201Skarels PipeOut = TRUE; 98640201Skarels break; 98740201Skarels case 'h': 98840201Skarels spoolNoBurst = TRUE; 98940201Skarels break; 99040201Skarels /* BSD lpr options processing */ 99140201Skarels case 'm': 99240201Skarels spoolNotify = argp; 99340201Skarels break; 99440201Skarels case '#': 99540201Skarels spoolCopies = optarg; 99640201Skarels break; 99740201Skarels case 'C': 99840201Skarels spoolJobClass = optarg; 99940201Skarels break; 100040201Skarels case 'J': 100140201Skarels spoolJobName = optarg; 100240201Skarels break; 100340201Skarels case 'P': 100440201Skarels PrinterName = optarg; 100540201Skarels break; 100640201Skarels case '?': 100740201Skarels /* bad option */ 100840201Skarels break; 100940201Skarels case 'O': 101040201Skarels Xoffset = atof(optarg) * (double)UperInch; 101140201Skarels if (Xoffset < 0) 101240201Skarels Xoffset = 0; 101340201Skarels break; 1014*40521Skarels case 'v': 1015*40521Skarels Verbose = TRUE; 1016*40521Skarels break; 101740201Skarels default: 101840201Skarels break; 101933295Skarels } 102033295Skarels } 102133295Skarels } 102233295Skarels 102333295Skarels 102433295Skarels /* addarg is used to construct an argv for the spooler */ 102540201Skarels private VOID 102640201Skarels addarg (argv, argstr, argc) 102740201Skarels char **argv; 102840201Skarels char *argstr; 102940201Skarels register int *argc; 103040201Skarels { 103140201Skarels register char *p = (char *) malloc ((unsigned) (strlen (argstr) + 1)); 103240201Skarels VOIDC strcpy (p, argstr); 103340201Skarels 103440201Skarels argv[(*argc)++] = p; 103540201Skarels argv[*argc] = '\0'; 103633295Skarels } 103733295Skarels 103833295Skarels 103940201Skarels private VOID 104040201Skarels SpoolIt () 104140201Skarels { 104240201Skarels char temparg[200]; 104340201Skarels char *argstr[200]; 104440201Skarels int nargs = 0; 104533295Skarels 104633295Skarels 104740201Skarels addarg (argstr, LPR, &nargs); 104840201Skarels /* BSD spooler */ 104940201Skarels if (atoi (spoolCopies) > 1) { 105040201Skarels VOIDC sprintf (temparg, "-#%s", spoolCopies); 105133295Skarels 105240201Skarels addarg (argstr, temparg, &nargs); 105340201Skarels } 105440201Skarels if ((PrinterName == NULL) && ((PrinterName = envget ("PRINTER")) == NULL)) { 105540201Skarels PrinterName = POSTSCRIPTPRINTER; 105640201Skarels } 105740201Skarels VOIDC sprintf (temparg, "-P%s", PrinterName); 105833295Skarels 105940201Skarels addarg (argstr, temparg, &nargs); 106033295Skarels 106140201Skarels if (spoolJobClass) { 106240201Skarels addarg (argstr, "-C", &nargs); 106340201Skarels addarg (argstr, spoolJobClass, &nargs); 106440201Skarels } 106540201Skarels addarg (argstr, "-J", &nargs); 106640201Skarels if (spoolJobName) { 106740201Skarels addarg (argstr, spoolJobName, &nargs); 106840201Skarels } else { 106940201Skarels if (!FileName) 107040201Skarels addarg (argstr, "stdin", &nargs); 107140201Skarels else 107240201Skarels addarg (argstr, FileName, &nargs); 107340201Skarels } 107440201Skarels if (spoolNotify) { 107540201Skarels addarg (argstr, "-m", &nargs); 107640201Skarels } 107740201Skarels if (spoolNoBurst) { 107840201Skarels addarg (argstr, "-h", &nargs); 107940201Skarels } 108040201Skarels /* remove the temporary file after spooling */ 108140201Skarels addarg (argstr, "-r", &nargs); /* should we use a symbolic link too? */ 108240201Skarels addarg (argstr, TempName, &nargs); 108333295Skarels 108433295Skarels #ifdef DEBUG 108540201Skarels { 108640201Skarels int i; 108740201Skarels 108840201Skarels fprintf (stderr, "called spooler with: "); 108940201Skarels for (i = 0; i < nargs; i++) 109040201Skarels fprintf (stderr, "(%s)", argstr[i]); 109140201Skarels fprintf (stderr, "\n"); 109240201Skarels } 109333295Skarels #endif 109433295Skarels 109540201Skarels execvp (LPR, argstr); 109640201Skarels pexit2 (prog, "can't exec spooler", 1); 109733295Skarels } 109833295Skarels 109933295Skarels 110033295Skarels private char *eargv[60]; 110133295Skarels private int eargc = 1; 110233295Skarels 110333295Skarels 110440201Skarels main (argc, argv) 110540201Skarels int argc; 110640201Skarels char **argv; 110740201Skarels { 110840201Skarels register char *p; /* pointer to "ENSCRIPT" in env */ 110933295Skarels 111040201Skarels prog = *argv; /* argv[0] is program name */ 111133295Skarels 111240201Skarels debugp ((stderr, "PL %ld PW %ld TPL %ld TPW %ld\n", PageLength, PageWidth, TruePageLength, TruePageWidth)); 111333295Skarels 111440201Skarels if (signal (SIGINT, int1) == SIG_IGN) { 111540201Skarels VOIDC signal (SIGINT, SIG_IGN); 111640201Skarels VOIDC signal (SIGQUIT, SIG_IGN); 111740201Skarels VOIDC signal (SIGHUP, SIG_IGN); 111840201Skarels VOIDC signal (SIGTERM, SIG_IGN); 111940201Skarels } else { 112040201Skarels VOIDC signal (SIGQUIT, int1); 112140201Skarels VOIDC signal (SIGHUP, int1); 112240201Skarels VOIDC signal (SIGTERM, int1); 112340201Skarels } 112433295Skarels 112540201Skarels { 112640201Skarels register int i; 112733295Skarels 112840201Skarels for (i = 0; i < 26; i++) 112940201Skarels fontindex[i] = -1; 113040201Skarels } 113133295Skarels 113240201Skarels if ((libdir = envget ("PSLIBDIR")) == NULL) 113340201Skarels libdir = LibDir; 113440201Skarels if ((tempdir = envget ("PSTEMPDIR")) == NULL) 113540201Skarels tempdir = TempDir; 113633295Skarels 1137*40521Skarels Roman = CurFont = DefineFont (BODYROMAN, BODYSZ); 113840201Skarels 113940201Skarels /* process args in environment variable ENSCRIPT */ 114040201Skarels if (p = envget ("ENSCRIPT")) { 114140201Skarels while (1) { 114240201Skarels register char quote = ' '; 114340201Skarels 114440201Skarels while (*p == ' ') 114540201Skarels p++; 114640201Skarels if ((*p == '"') || (*p == '\'')) 114740201Skarels quote = *p++; 114840201Skarels eargv[eargc++] = p; 114940201Skarels while ((*p != quote) && (*p != '\0')) 115040201Skarels p++; 115140201Skarels if (*p == '\0') 115240201Skarels break; 115340201Skarels *p++ = '\0'; 115440201Skarels } 115540201Skarels ParseArgs (eargc, eargv); 115640201Skarels if (eargc != optind) { 115740201Skarels fprintf (stderr, "%s: bad environment variable ENSCRIPT \"%s\"\n", 115840201Skarels prog, envget ("ENSCRIPT")); 115940201Skarels exit (1); 116040201Skarels } 116133295Skarels } 116240201Skarels /* process the command line arguments */ 116340201Skarels optind = 1; /* reset getopt global */ 116440201Skarels ParseArgs (argc, argv); 1165*40521Skarels if (!Gaudy) { 1166*40521Skarels if (HeaderFont == -1) 1167*40521Skarels HeaderFont = DefineFont (HEADFONT, HEADSZ); 1168*40521Skarels } else { 1169*40521Skarels if (HeaderFont == -1) 1170*40521Skarels HeaderFont = DefineFont (GHEADFONT, GHEADSZ); 1171*40521Skarels if (SHeaderFont == -1) 1172*40521Skarels SHeaderFont = DefineFont(SHEADFONT, SHEADSZ); 1173*40521Skarels } 117433295Skarels 117540201Skarels /* process non-option args */ 117640201Skarels for (; optind < argc; optind++) { 117740201Skarels FileName = Header = argv[optind]; 117840201Skarels if (freopen (FileName, "r", stdin) == NULL) { 117940201Skarels fprintf (stderr, "%s: can't open %s\n", prog, FileName); 118040201Skarels exit (1); 118140201Skarels } 118240201Skarels VOIDC fstat (fileno (stdin), &S); 118333295Skarels 118440201Skarels SetTime (S.st_mtime); 118540201Skarels CopyFile (); 118640201Skarels VOIDC fclose (stdin); 118740201Skarels 118840201Skarels SeenFile = TRUE; 118933295Skarels } 119040201Skarels if (!SeenFile) { 119140201Skarels FileName = Header = Gaudy ? "" : 0; 119240201Skarels VOIDC fstat (fileno (stdin), &S); 119333295Skarels 119440201Skarels if ((S.st_mode & S_IFMT) == S_IFREG) 119540201Skarels SetTime (S.st_mtime); 119640201Skarels else 119740201Skarels SetTime (time ((long *) 0)); 119840201Skarels CopyFile (); 119940201Skarels } 120040201Skarels if (Cvted) { 120140201Skarels ClosePS (); 120240201Skarels VOIDC fclose (OutFile); 120333295Skarels 120440201Skarels OutFile = 0; 120533295Skarels } 120640201Skarels if (TruncChars && !BeQuiet) 120740201Skarels fprintf (stderr, "%s: %d characters omitted because of long lines.\n", 120840201Skarels prog, TruncChars); 120940201Skarels if (UndefChars && !BeQuiet) 121040201Skarels fprintf (stderr, "%s: %d characters omitted because of incomplete fonts.\n", 121140201Skarels prog, UndefChars); 1212*40521Skarels if (Verbose && (TotalPages > 0)) { 1213*40521Skarels fprintf(stderr,"[ %d page%s * %s cop%s ]\n", 1214*40521Skarels TotalPages, TotalPages > 1 ? "s" : "", 1215*40521Skarels spoolCopies, atoi(spoolCopies) > 1 ? "ies" : "y" ); 121633295Skarels } 1217*40521Skarels if (Cvted && !OutOnly) { 1218*40521Skarels SpoolIt (); /* does an exec */ 121940201Skarels } 122033295Skarels } 122133295Skarels 122233295Skarels 122333295Skarels /* signal catcher */ 122440201Skarels private VOID 122540201Skarels int1 () 122640201Skarels { 122740201Skarels if ((!PipeOut) && (OutName != NULL) && (*OutName != '\0')) { 122840201Skarels VOIDC unlink (OutName); 122940201Skarels } 123040201Skarels exit (1); 123133295Skarels } 1232