#include #include #define ORIENTATION_LANDSCAPE 'l' extern const char *__progname; static const char *preludefile = "/home/mouse/hacks/print/errorpage.ps"; static const char *enscriptdefs = "/home/mouse/hacks/print/enscript.ps"; static char orientation; static char tray; static int Rflag = 0; static const char *fontname = "Courier"; static double fontsize; /* default depends on portrait/landscape */ static double leading = 20; static double margin = 50; static int nlines = 0; struct { const char *envvar; const char **strvar; double *dvar; int *ivar; } config[] = { { "ENSCRIPT_FONT", &fontname, 0, 0 }, { "ENSCRIPT_SIZE", 0, &fontsize, 0 }, { "ENSCRIPT_LEAD", 0, &leading, 0 }, { "ENSCRIPT_LEFT", 0, &margin, 0 }, { "ENSCRIPT_PAGE", 0, 0, &nlines }, { 0 } }; static void flagscan(const char *str) { for (;*str;str++) { switch (*str) { case 'R': Rflag = 1; break; } } } static void copyfile(const char *fn) { FILE *f; int c; f = fopen(fn,"r"); if (f == 0) { fprintf(stderr,"%s: can't open %s\n",__progname,fn); exit(1); } while (1) { c = getc(f); if (c == EOF) break; putchar(c); } fclose(f); } static void doconfig(void) { int i; char *env; for (i=0;config[i].envvar;i++) { env = getenv(config[i].envvar); if (env == 0) continue; if (config[i].strvar) { *config[i].strvar = env; } if (config[i].dvar) { double dv; if (sscanf(env,"%lf",&dv) == 1) { *config[i].dvar = dv; } else { fprintf(stderr,"%s: invalid %s in environment ignored\n", __progname,config[i].envvar); } } if (config[i].ivar) { int iv; if (sscanf(env,"%d",&iv) == 1) { *config[i].ivar = iv; } else { fprintf(stderr,"%s: invalid %s in environment ignored\n", __progname,config[i].envvar); } } } } int main(int, char **); int main(int ac, char **av) { int c; int nc; if (ac != 2) { fprintf(stderr,"Usage: %s [R]\n",__progname); exit(1); } orientation = av[1][0]; tray = av[1][1]; flagscan(&av[1][2]); if (Rflag) { copyfile(preludefile); while (1) { c = getchar(); if (c == EOF) break; putchar(c); } } else { double default_fontsize; double leadfactor; double ysize; default_fontsize = (orientation == ORIENTATION_LANDSCAPE) ? 7.5 : 10; ysize = default_fontsize * 1.2 * 60; fontsize = -1; doconfig(); leadfactor = 1 + (leading / 100); if (fontsize < 0) { if (nlines < 1) { fontsize = default_fontsize; } else { fontsize = ysize / (nlines * leadfactor); } } if (nlines < 1) { nlines = (ysize + .001) / (fontsize * leadfactor); } copyfile(preludefile); printf("/%s findfont %f scalefont setfont\n",fontname,fontsize); printf("/baselineskip %f def\n",fontsize*leadfactor); printf("/nlines %d def\n",nlines); printf("/margin %f def\n",margin); printf("/landscape %s def\n",(orientation==ORIENTATION_LANDSCAPE)?"true":"false"); copyfile(enscriptdefs); nc = 0; while (1) { c = getchar(); if (c == EOF) break; if (c == '\n') { if (nc == 0) printf("("); printf(") line\n"); nc = 0; } else if (c == '\f') { if (nc > 0) printf(") line\n"); nc = 0; printf("formfeed\n"); } else { if (nc == 0) printf("("); nc ++; if (c == '\t') { nc --; do { nc ++; putchar(' '); } while (nc%8); } else if ((c < ' ') || (c > '~')) { if (c < 128) { putchar('^'); putchar(c^64); } else { printf("\\%03o",c); } } else { if ((c == '(') || (c == ')') || (c == '\\')) { putchar('\\'); } putchar(c); } } } if (nc > 0) { printf(") line\n"); } printf("finishjob\n"); } exit(0); }