Annotation of coherent/b/bin/PSfont.c, revision 1.1.1.1

1.1       root        1: /*
                      2:  * PSfont.c
                      3:  * 5/17/93
                      4:  * Usage: PSfont [ -q ] [ -s ] [ infile [ outfile ] ]
                      5:  * Options:
                      6:  *     -q      Quiet: suppress warning messages.
                      7:  *     -s      Suppress "exitserver" header line.
                      8:  * Expand PostScript font from infile (default: stdin)
                      9:  * in IBM PC compressed binary format (PostScript binary format, .pfb)
                     10:  * to outfile (default: stdout) in downloadable ASCII PostScript (.ps).
                     11:  * Use "-s" when embedding outfile in a PS document,
                     12:  * do not use "-s" when downloading a font permanently.
                     13:  * Reference: "Supporting Downloadable PostScript Language Fonts",
                     14:  * Adobe Technical Note #5040, 3/31/92, section 3.3.
                     15:  */
                     16: 
                     17: #if    __STDC__
                     18: #define        __(args)        args
                     19: #else
                     20: #define        __(args)        ()
                     21: #endif
                     22: 
                     23: #define        VERSION "1.2"
                     24: 
                     25: #include <stdio.h>
                     26: 
                     27: /* Manifest constants. */
                     28: #define        NBUF    32              /* offset message buffer size */
                     29: #define        NDATA   32              /* output line binary data items (64 in Adobe PCSEND.EXE) */
                     30: #define        HDRCMT  "%! Adobe PostScript follows...\n"
                     31: #define        HDRSRV  "%%BeginExitServer: 0\n"\
                     32:                "serverdict begin 0 exitserver\n"\
                     33:                "%%EndExitServer\n"
                     34: 
                     35: /* Definitions for binary segment header byte and type bytes. */
                     36: #define        HDRBYTE 128
                     37: #define        ISASCII 1
                     38: #define        ISBDATA 2
                     39: #define        ISEOF   3
                     40: 
                     41: /* Forward. */
                     42: extern int     main    __((int argc, char *argv[]      ));
                     43: extern void    fatal   __((char *fmt, ...              ));
                     44: extern long    getlong __((void                        ));
                     45: extern void    process __((void                        ));
                     46: extern void    usage   __((void                        ));
                     47: extern void    warning __((char *fmt, ...              ));
                     48: extern int     xgetc   __((void                        ));
                     49: extern FILE    *xopen  __((char *name, char *mode      ));
                     50: 
                     51: /* Global. */
                     52: FILE   *ifp = stdin;                   /* input FILE           */
                     53: FILE   *ofp = stdout;                  /* output FILE          */
                     54: int    qflag;                          /* no warnings          */
                     55: int    sflag;                          /* no exitserver line   */
                     56: 
                     57: int
                     58: main(argc, argv) int argc; char *argv[];
                     59: {
                     60:        register char *s;
                     61: 
                     62:        while (argc > 1 && argv[1][0] == '-') {
                     63:                for (s = &argv[1][1]; *s != '\0'; ++s) {
                     64:                        switch(*s) {
                     65:                        case 'q':       ++qflag;        break;
                     66:                        case 's':       ++sflag;        break;
                     67:                        case 'V':
                     68:                                fprintf(stderr, "PSfont: V" VERSION "\n");
                     69:                                break;
                     70:                        default:
                     71:                                usage();
                     72:                                break;
                     73:                        }
                     74:                }
                     75:                --argc;
                     76:                ++argv;
                     77:        }
                     78:        if (argc > 3)
                     79:                usage();
                     80:        if (argc > 2)
                     81:                ofp = xopen(argv[2], "w");
                     82:        if (argc > 1)
                     83:                ifp = xopen(argv[1], "rb");
                     84:        process();
                     85:        if (ifp != stdin)
                     86:                fclose(ifp);
                     87:        if (ofp != stdout)
                     88:                fclose(ofp);
                     89:        exit(0);
                     90: }
                     91: 
                     92: /* Print a fatal error message and die. */
                     93: /* VARARGS */
                     94: void
                     95: fatal(fmt) char *fmt;
                     96: {
                     97:        fprintf(stderr, "PSfont: %r\n", &fmt);
                     98:        exit(1);
                     99: }
                    100: 
                    101: /* Read a four-byte long in Intel byte order. */
                    102: long
                    103: getlong()
                    104: {
                    105:        register long l;
                    106: 
                    107:        l = xgetc();
                    108:        l |= (xgetc() << 8);
                    109:        l |= (xgetc() << 16);
                    110:        l |= (xgetc() << 24);
                    111:        return l;
                    112: }
                    113: 
                    114: /*
                    115:  * Process a compressed binary font file.
                    116:  * The input file is a series of records, each starting with HDRBYTE (0x80).
                    117:  * The next byte of each record is either ISASCII, ISBDATA or ISEOF.
                    118:  * ISASCII records have a 4-byte length followed by length ASCII bytes.
                    119:  * ISBDATA records have a 4-byte length followed by length binary bytes.
                    120:  * ISEOF indicates the end of the input data, it should be followed
                    121:  * by EOF but in practice there are sometimes extraneous trailing bytes.
                    122:  * The output file contains a header comment,
                    123:  * an "exitserver" line if not -s,
                    124:  * and the input data, with binary converted to hex ASCII.
                    125:  * ASCII CR gets translated to NL for the benefit of other programs
                    126:  * which may want to edit the PS output.
                    127:  */
                    128: void
                    129: process()
                    130: {
                    131:        register long length;
                    132:        register int c, i, type, count;
                    133:        char buf[NBUF];
                    134: 
                    135:        fputs(HDRCMT, ofp);             /* write header comment */
                    136:        if (!sflag)
                    137:                fputs(HDRSRV, ofp);     /* cf. Red Book, 2nd Ed., 3.7.7, pp. 70 ff. */
                    138:        for (;;) {
                    139:                if ((c = xgetc()) != HDRBYTE) {
                    140:                        if (ifp != stdin)
                    141:                                sprintf(buf, "offset %ld: ", ftell(ifp));
                    142:                        else
                    143:                                buf[0] = '\0';
                    144:                        fatal("%sbad header byte, expected 0x%X, read 0x%X",
                    145:                                buf, HDRBYTE, c);
                    146:                }
                    147:                if ((type = xgetc()) == ISEOF)
                    148:                        break;
                    149:                else if (type != ISASCII && type != ISBDATA)
                    150:                        fatal("unexpected type byte 0x%X", type);
                    151:                length = getlong();
                    152:                if (type == ISASCII) {
                    153:                        /* Copy ASCII data.  Convert CR to NL. */
                    154:                        while (length--) {
                    155:                                if ((c = xgetc()) == '\r')
                    156:                                        c = '\n';
                    157:                                putc(c, ofp);
                    158:                        }
                    159:                } else {
                    160:                        /* Expand binary data. */
                    161:                        for (; length > 0; length -= count) {
                    162:                                count = (length > NDATA) ? NDATA : length;
                    163:                                for (i = 0; i < count; i++)
                    164:                                        fprintf(ofp, "%02X", xgetc());
                    165:                                putc('\n', ofp);
                    166:                        }
                    167:                }
                    168:        }
                    169:        putc('\n', ofp);
                    170:        if (getc(ifp) != EOF)
                    171:                warning("extra data after input file EOF indicator ignored");
                    172: }
                    173: 
                    174: /* Print a fatal usage message and die. */
                    175: void
                    176: usage()
                    177: {
                    178:        fprintf(stderr,
                    179:                "Usage: PSfont [ -q ] [ -s ] [ infile [ outfile ] ]\n"
                    180:                "Options:\n"
                    181:                "\t-q\tQuiet: suppress warning messages.\n"
                    182:                "\t-s\tSuppress \"serverdict ... exitserver\" line in header\n"
                    183:                );
                    184:        exit(1);
                    185: }
                    186: 
                    187: /* Print a nonfatal warning message. */
                    188: /* VARARGS */
                    189: void
                    190: warning(fmt) char *fmt;
                    191: {
                    192:        if (!qflag)
                    193:                fprintf(stderr, "PSfont: warning: %r\n", &fmt);
                    194: }
                    195: 
                    196: /* Read a character and return it, die on EOF. */
                    197: int
                    198: xgetc()
                    199: {
                    200:        register int c;
                    201: 
                    202:        if ((c = getc(ifp)) == EOF)
                    203:                fatal("unexpected EOF");
                    204:        return c & 0xFF;
                    205: }
                    206: 
                    207: /* Open a file, die on failure. */
                    208: FILE *
                    209: xopen(name, mode) register char *name, *mode;
                    210: {
                    211:        register FILE *fp;
                    212: 
                    213:        if ((fp = fopen(name, mode)) == NULL)
                    214:                fatal("cannot open file \"%s\"", name);
                    215:        return fp;
                    216: }
                    217: 
                    218: /* end of PSfont.c */

unix.superglobalmegacorp.com

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