diff options
author | Norbert Preining <norbert@preining.info> | 2019-09-02 13:46:59 +0900 |
---|---|---|
committer | Norbert Preining <norbert@preining.info> | 2019-09-02 13:46:59 +0900 |
commit | e0c6872cf40896c7be36b11dcc744620f10adf1d (patch) | |
tree | 60335e10d2f4354b0674ec22d7b53f0f8abee672 /dviware/dvitops/pfbtops.c |
Initial commit
Diffstat (limited to 'dviware/dvitops/pfbtops.c')
-rw-r--r-- | dviware/dvitops/pfbtops.c | 91 |
1 files changed, 91 insertions, 0 deletions
diff --git a/dviware/dvitops/pfbtops.c b/dviware/dvitops/pfbtops.c new file mode 100644 index 0000000000..dd76b81abc --- /dev/null +++ b/dviware/dvitops/pfbtops.c @@ -0,0 +1,91 @@ +/* this translates Adobe fonts in IBM PC format (.pfb) to plain PostScript */ + +static char rcsid[] = "$Header: /usr/jjc/dvitops/RCS/pfbtops.c,v 1.2 90/08/14 13:04:24 jjc Rel $"; + +#include "util.h" + +char *program_name = "pfbtops"; + +int main(argc, argv) +int argc; +char **argv; +{ + int c; + int err; + FILE *fp, *outfp; + char filename[FILENAME_MAX]; + if (argc < 2 || argc > 3) + message(FATAL_ERROR, "usage: pfbtops pfbfile [psfile]"); + if (strlen(filename) > FILENAME_MAX - 5) + message(FATAL_ERROR, "file name too long"); + strcpy(filename, argv[1]); + if (strchr(filename, '.') == NULL) + strcat(filename, ".pfb"); + if ((fp = FOPEN_RB(filename)) == NULL) + message(FATAL_ERROR, "can't open %s", filename); + if (argc == 3) { + if (strlen(filename) > FILENAME_MAX - 5) + message(FATAL_ERROR, "filename too long"); + strcpy(filename, argv[2]); + if (strchr(filename, '.') == NULL) + strcat(filename, ".ps"); + } + else + strcpy(strchr(filename, '.'), ".ps"); + if ((outfp = fopen(filename, "w")) == NULL) + message(FATAL_ERROR, "can't open %s", filename); + for (;;) { + long n; + c = getc(fp); + if (c != 128) + goto bad; + c = getc(fp); + if (c == 3) { + (void)getc(fp); + if (!feof(fp) || ferror(fp)) + goto bad; + fclose(fp); + break; + } + n = (unsigned long)getc(fp); + n |= (unsigned long)getc(fp) << 8; + n |= (unsigned long)getc(fp) << 16; + n |= (unsigned long)getc(fp) << 24; + if (n < 0) + { err =1; goto bad;} + if (c == 1) { + while (n--) { + c = getc(fp); + if (c == '\r') + putc('\n', outfp); + else + putc(c, outfp); + } + if (ferror(fp) || feof(fp)) + { err = 2; goto bad;} + } + else if (c == 2) { + int cols = 0; + putc('\n', outfp); + while (n--) { + static char hexdigits[] = "0123456789ABCDEF"; + c = getc(fp); + if ((cols += 2) > 70) { + putc('\n', outfp); + cols = 0; + } + putc(hexdigits[(unsigned)c >> 4], outfp); + putc(hexdigits[c & 15], outfp); + } + putc('\n', outfp); + if (ferror(fp) || feof(fp)) + {err = 3 ; goto bad;} + } + else + {err = 4 ; goto bad;} + } + exit(history); +bad: + fprintf(stderr,"Error: %d\n",err); + message(FATAL_ERROR, "bad font file"); +} |