Annotation of coherent/d/bin/epson.c, revision 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.