This is unfont.c in view mode; [Download] [Up]
/* * NOTICE * * Copyright 1988, 1989 by h-three Systems Corporation. * * Permission is hereby granted for this software's free reproduction * and modification for non-commercial purposes, provided that this * notice is retained. Commercial enterprises may give away copies * as part of their products provided that they do so without charge, * that they retain this notice, and that they acknowledge the source * of the software. * * PostScript is a registered trademark of Adobe Systems Incorporated. * IBM is a registered trademark of International Business Machines * Corporation. * * h-three Systems Corporation * 100 Park Drive Suite 204/ P.O. Box 12557 * Research Triangle Park, NC 27709 */ /* modified by Bryan Bayerdorffer 4/91. Simplified code by chopping out * sysV-isms. */ /* * unfont.c * * usage: unfont file * * or * * unfont reads from stdin * * Unpacks IBM PC-format PostScript fonts into a downloadable form. * */ #include <stdio.h> #include <fcntl.h> #include <ctype.h> #define OK 0 #define FAILURE (-1) #define Failed(x) ((x) == FAILURE) #define TRUE 1 #define FALSE 0 typedef char bool; #define STREQ(a,b) (strcmp(a,b) == 0) FILE *fp; /* * used to convert nibbles (n0 is least sig) to ascii-hex */ #define N0(c) hexbyt[((c) & 0x000f)] #define N1(c) N0((c) >> 4) char hexbyt[] = "0123456789ABCDEF"; /* * vars controlled by command line options */ char *infile; char *progname; /* for error() */ char *strchr(), *strrchr(); int mygetc(); void dounfont(); long getcount(); void bintohex(); main(argc, argv) int argc; char **argv; { /* unfont stuff */ if (argv[1]) { if (!(fp = fopen(argv[1], "r"))) { printf("can't open input file '%s'", argv[1]); } infile = argv[1]; dounfont(); fclose(fp); } else { infile = "<stdin>"; fp = stdin; dounfont(); } exit(0); } long getcount(); void dounfont() { register int c; long count; register int i; for (;;) { if ((c = mygetc()) != 0x80) { printf("not a proper font data segment '%s'", infile); printf("foobar char is 0x%x", c); exit(1); } c = mygetc(); switch (c) { case 1: /* get count, output count bytes to stdout */ count = getcount(); for (i=0; i<count; i++) { c = mygetc(); putchar(c == '\r' ? '\n' : c); } break; case 2: /* get count, convert count bytes to hex, output */ /* to stdout */ count = getcount(); bintohex(count); break; case 3: /* reached EOF; next file, please */ return; default: printf("not a valid segment type '%s'", infile); return; } } } /* * getc for error-checking */ int mygetc() { int ch; if ((ch = getc(fp)) == -1) { printf("unexpected eof on input in '%s'", infile); exit(1); } return(ch); } /* * get count of bytes from segment header */ long getcount() { int i; long count = 0; for (i=0; i<4; i++) count += ((long) mygetc()) << (i * 8); return(count); } /* * convert binary to ASCII hex and write it to stdout */ void bintohex(count) long count; { int ch; long i; for (i=0; i<count; i++) { if ((i % 30) == 0) putchar('\n'); ch = mygetc(); putchar(N1(ch)); putchar(N0(ch)); } }
These are the contents of the former NiCE NeXT User Group NeXTSTEP/OpenStep software archive, currently hosted by Netfuture.ch.