[comp.lang.postscript] Re^3: PostScript downloadable font formats

paul@frcs.UUCP (Paul Nash) (09/22/90)

A while back, I wrote:

>I have managed to copy the resource fork off from MAC to PC-DOS
>format, and am about to knock up some code to pull the resources
>into a suitable PostScript file. This would be (sort of) a DOS
>version of unAdobe.

>If anyone would like a copy (assuming that it all works!), send
>me mail and I will mail you, or, if there is enough interest,
>post to the net.

I have had a few requests, so here goes ...

The Mac Resource format (once it has been copied to a PC with
the DayneFile ``dosmount'' command) contains a number of 
records. The first one is 0x100 bytes long (in all the fonts
that I have got). This is followed by the font itself, which
is spread over a number of records, each of the following 
format:

length:  4 bytes
type:    2 bytes
data:    length-2 bytes

The `type' field is 0x0100 for ASCII data (not translation 
needed) and 0x0200 for hex data (translate into 2-byte
ascii codes). The last record has a length of 2, and
a type of 0x0500.

The program that follows reads the Mac resource once it
has been copied to a PC, and creates a font ready for
downloading. NOTE: This is not the same as the format
that downloadable fonts will come from a supplier in --
they should have the hex section in packed 8-bit hex.

NOTE2: I have tested the program and it seems to work.
However, I have not managed to lay my hands on a PostScribble
printer yet (Tuesday, I hope :-)), so I have not been
able to test the resulting fonts. I can see no reason why
they shouldn't work, though. If there is a problem, I
will post a follow-up immediately.

Your mileage might vary, but it seems to work. If anyone has
any problems, please let me know & I'll try to fix.

-------------------------  CUT HERE  ---------------------------

/*
   An extremely quick and nasty hack to convert the DOS version of a MAC
   resource containing an Adobe font (whew!) copied with ``dosmount'',
   into something that I can download to a laser printer from anything.

   Copyright (c) Flagship, 1990. Use at your own risk.
*/

#include <stdio.h>
#include <stdlib.h>

main ( int argc, char *argv[] )
{
   FILE *inf, *outf;
   int  i;
   char ch;
   
   union LENGTH {
      char c[4];
      long l;
   } length;

   union BIT {
      char c[2];
      int i;
   } bit;

   
   if ( argc != 3 ) {
      fprintf( stderr, "Wrong! UnMac macresource pcfont\n" );
      exit( -1 );
   }
   if ( ( inf = fopen( argv[1], "rb" ) ) == NULL ) {
      fprintf( stderr, "Can't open input %s\n", argv[1] );
      exit( -2 );
   }
   if ( ( outf = fopen( argv[2], "w" ) ) == NULL ) {
      fprintf( stderr, "Can't open output %s\n", argv[2] );
      fclose( inf );
      exit( -2 );
   }

   
   printf( "OK, reading MAC resource %s, writing PC postscript %s\n",
      argv[1], argv[2] );
   fseek( inf, 0x100L, SEEK_SET );	/* skip the first bit */
   while ( 1 == 1 ) {
      for ( i = 3; i >= 0; i-- )
         length.c[i] = (char) fgetc( inf );
      for ( i = 1; i >= 0; i-- )
         bit.c[i] = (char) fgetc( inf );
      printf( "Reading bit 0x%02X, length %i (0x%02X)\n",
	 bit.i, length.l, length.l );
      if ( bit.i == 0x500 || length.l == 2 ) {    /* last record */
	 printf( "Finished!\n" );
	 break;
      }
      if ( length.l < 2 ) {
	 printf( "Fuck off! I can't go _backwards_ ...\n" );
	 exit( -2 );
      }
      length.l -=2;
      i = 0;
      while ( length.l-- > 0 ) {
	 ch = (char) fgetc( inf );
	 if ( bit.i == 256 ) {				/* ascii */
	    if ( ch == '\r' ) fputc( '\n' , outf );
            else fputc( ch, outf );
	 }
	 else if ( bit.i == 512 ) {			/* hex */
	    fprintf( outf, "%02X", ch );
	    if ( ++i > 38 ) {
	       fputc( '\n', outf );
	       i = 0;
	    }
	 }
	 else {
	    printf( "Shit! unknown ``bit'' type -- aborting\n" );
	    exit( -1 );
	 }
      }
      fputc( '\n', outf ); fputc( '\n', outf );
   }
   fclose( inf ); fclose( outf );
   return 0;
}

-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
 Paul Nash			 Flagship Wide Area Networks (Pty) Ltd
  paul@frcs.UUCP			  ...!ddsw1!proxima!frcs!paul