Annotation of coherent/d/bin/epson.c, revision 1.1.1.1

1.1       root        1: /*
                      2:  * epson.c
                      3:  * 11/8/90
                      4:  * Epson MX-80 printer driver.
                      5:  * Usage: epson [ - cdfrw8 ] [ -b banner ] [ -in ] [ -o ofile ] [ -sn ] [ file ... ]
                      6:  */
                      7: 
                      8: #include <stdio.h>
                      9: 
                     10: #define        VERSION "1.8"                   /* Version number. */
                     11: #define        ESC     "\033"                  /* ASCII escape */
                     12: #define        USAGE   "Usage: epson [ -cdfrw8 ] [ -b banner] [ -in ] [ -o ofile ] [ -sn ] [ file ... ]\n"
                     13: 
                     14: /* Epson special characters. */
                     15: #define        COMPON  '\017'
                     16: #define COMPOFF        '\222'
                     17: #define FORMFD '\014'
                     18: #define        SELECT  '\021'
                     19: #define        WIDEON  '\016'
                     20: #define        WIDEOFF '\224'
                     21: 
                     22: /* Default output device. */
                     23: #ifdef COHERENT
                     24: #define        OUTFILE "/dev/lp"               /* COHERENT */
                     25: #else
                     26: #define        OUTFILE "prn:"                  /* MS-DOS */
                     27: #endif
                     28: 
                     29: /* Forward. */
                     30: void   fatal();
                     31: void   indent();
                     32: void   process();
                     33: void   usage();
                     34: 
                     35: /* Globals. */
                     36: char   *banner;                        /* banner                       */
                     37: int    cflag;                          /* compressed                   */
                     38: int    dflag;                          /* double struck (default: emphasized) */
                     39: int    eightflag;                      /* eight lines per inch         */
                     40: int    fflag;                          /* suppress formfeed            */
                     41: int    nindent;                        /* indent                       */
                     42: char   *ofile = OUTFILE;               /* output file                  */
                     43: FILE   *ofp;                           /* output FILE                  */
                     44: int    rflag;                          /* Roman (default: italic)      */
                     45: int    spaces = 1;                     /* vertical spaces              */
                     46: int    wflag;                          /* double width                 */
                     47: 
                     48: main(argc, argv) int argc; char *argv[];
                     49: {
                     50:        register int i;
                     51: 
                     52:        /* Process option flags. */
                     53:        while (--argc > 0 && **++argv == '-') {
                     54:                switch (*++*argv) {
                     55:                case 'b':
                     56:                        if (--argc == 0)
                     57:                                usage();
                     58:                        banner = *++argv;
                     59:                        break;
                     60:                case 'c':       ++cflag;                break;
                     61:                case 'd':       ++dflag;                break;
                     62:                case 'f':       ++fflag;                break;
                     63:                case 'i':
                     64:                        nindent = atoi(++*argv);
                     65:                        if (nindent < 0)
                     66:                                fatal("bad -i arg %d", nindent);
                     67:                        break;
                     68:                case 'o':
                     69:                        if (--argc == 0)
                     70:                                usage();
                     71:                        ofile = *++argv;
                     72:                        break;
                     73:                case 'r':       ++rflag;                break;
                     74:                case 's':
                     75:                        spaces = atoi(++*argv);
                     76:                        if (spaces <1 || spaces > 3)
                     77:                                fatal("bad -s arg %d", spaces);
                     78:                        break;
                     79:                case 'w':       ++wflag;                break;
                     80:                case 'V':
                     81:                        fprintf(stderr, "epson: V%s\n", VERSION);
                     82:                        break;
                     83:                case '8':       ++eightflag;            break;
                     84:                default:        usage();                break;
                     85:                }
                     86:        }
                     87: 
                     88:        /* Open output file and initialize Epson. */
                     89:        if ((ofp = fopen(ofile, "w")) == NULL)
                     90:                fatal("cannot open file \"%s\"", ofile);
                     91:        fputs(ESC "@", ofp);
                     92: 
                     93:        /* Print banner if given. */
                     94:        if (banner != NULL) {
                     95:                i = (wflag ? nindent * 2 : cflag ? nindent / 2 : nindent);
                     96:                while (i-- > 0)
                     97:                        fputc(' ', ofp);
                     98:                fputc(WIDEON, ofp);
                     99:                fputs(banner, ofp);
                    100:                fputc(WIDEOFF, ofp);
                    101:                fputc('\n', ofp);
                    102:        }
                    103:        if (cflag)
                    104:                fputc(COMPON, ofp);
                    105:        if (eightflag)
                    106:                fputs(ESC "0" ESC "CX", ofp);
                    107: 
                    108:        /* Process input files. */
                    109:        if (argc == 0)
                    110:                process(NULL);                  /* NULL means stdin */
                    111:        else
                    112:                while (argc-- > 0)
                    113:                        process(*argv++);
                    114: 
                    115:        /* Cleanup and close output file. */
                    116:        if (cflag)
                    117:                fputc(COMPOFF, ofp);
                    118:        if (eightflag)
                    119:                fputs(ESC "2" ESC "CB", ofp);
                    120:        if (wflag)
                    121:                fputc(WIDEOFF, ofp);
                    122:        fputs(ESC "@", ofp);
                    123:        if (fclose(ofp) == EOF)
                    124:                fatal("cannot close file \"%s\"", ofile);
                    125:        exit(0);
                    126: }
                    127: 
                    128: /* Print fatal error message and exit. */
                    129: /* VARARGS */
                    130: void
                    131: fatal(s) char *s;
                    132: {
                    133:        fprintf(stderr, "epson: %r\n", &s);
                    134:        exit(1);
                    135: }
                    136: 
                    137: /* Perform indentation. */
                    138: void
                    139: indent()
                    140: {
                    141:        register int i;
                    142: 
                    143:        if (wflag)
                    144:                fputc(WIDEON, ofp);
                    145:        for (i = nindent; i-- > 0; )
                    146:                fputc(' ', ofp);
                    147: }
                    148: 
                    149: /* Process input file ifp. */
                    150: void
                    151: process(fname) char *fname;
                    152: {
                    153:        register FILE *ifp;
                    154:        register int this, next, i;
                    155: 
                    156:        if (fname == NULL)
                    157:                ifp = stdin;
                    158:        else if ((ifp = fopen(fname, "r")) == NULL)
                    159:                fatal("cannot open file \"%s\"", fname);
                    160:        indent();
                    161:        while ((this = fgetc(ifp)) != EOF) {
                    162:                if (this == '\n') {             /* newline */
                    163:                        for (i = spaces; i-- > 0; )
                    164:                                fputc(this, ofp);
                    165:                        indent();
                    166:                } else if (this == FORMFD) {    /* formfeed */
                    167:                        fputc(this, ofp);
                    168:                        indent();
                    169:                } else if ((next = fgetc(ifp)) != '\b') {
                    170:                        fputc(this, ofp);
                    171:                        ungetc(next, ifp);
                    172:                } else {
                    173:                        /* Next char is backspace, could mean bold or italic. */
                    174:                        if (this == '_' && !rflag) {
                    175:                                /* "_\bx" means italic x. */
                    176:                                fputc(fgetc(ifp) + 0200, ofp);
                    177:                        } else if (!dflag) {
                    178:                                if ((next = fgetc(ifp)) == this) {
                    179:                                        /* "x\bx" means bold x. */
                    180:                                        fputs(ESC "E", ofp);
                    181:                                        fputc(this, ofp);
                    182:                                        fputs(ESC "F", ofp);
                    183:                                } else {
                    184:                                        /* "x\by", print as is. */
                    185:                                        fputc(this, ofp);
                    186:                                        fputc('\b', ofp);
                    187:                                        ungetc(next, ifp);
                    188:                                }
                    189:                        } else {
                    190:                                /* Just print as is... */
                    191:                                fputc(this, ofp);
                    192:                                ungetc(next, ifp);
                    193:                        }
                    194:                }
                    195:        }
                    196:        if (!fflag)
                    197:                fputc(FORMFD, ofp);
                    198:        if (fname != NULL)
                    199:                fclose(ifp);
                    200: }
                    201: 
                    202: /* Print usage message and exit. */
                    203: void
                    204: usage()
                    205: {
                    206:        fprintf(stderr, "Usage:  epson [ -cdfrw8 ] [ -b banner] [ -in ] [ -o ofile ] [ -sn ] [ file ... ]\n");
                    207:        exit(1);
                    208: }
                    209: 
                    210: /* end of epson.c */

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.