home *** CD-ROM | disk | FTP | other *** search
/ Source Code 1992 March / Source_Code_CD-ROM_Walnut_Creek_March_1992.iso / usenet / altsrcs / 3 / 3332 / pfb2pf.c
Encoding:
C/C++ Source or Header  |  1991-05-16  |  2.4 KB  |  149 lines

  1. /*
  2.  * Copyright (c) 1991 J.T. Conklin (jtc@motcad.PORTAL.COM)  
  3.  * All Rights Reserved.
  4.  *
  5.  * You may copy, distribute, and use this software as long as this
  6.  * copyright statement is not removed.
  7.  * 
  8.  * $Id: pfb2pf.c,v 1.1 1991/05/10 22:58:10 jtc Exp $
  9.  */
  10.  
  11. #include <stdio.h>
  12. #include <stdlib.h>
  13.  
  14. enum
  15. {
  16.   FIND_KEY,
  17.   FIND_TYPE,
  18.   PROC_ASCII,
  19.   PROC_BINARY
  20. } state;
  21.  
  22. char hex[] =
  23. {
  24.   '0', '1', '2', '3', '4', '5', '6', '7',
  25.   '8', '9', 'a', 'b', 'c', 'd', 'e', 'f',
  26. };
  27.  
  28. main()
  29. {
  30.   int c;
  31.   unsigned int i;
  32.   unsigned long length;
  33.   state = FIND_KEY;
  34.   
  35.   for (;;)
  36.     {
  37.       switch (state)
  38.     {
  39.     case FIND_KEY:
  40.       if ((c = getchar ()) == EOF)
  41.         {
  42.           fprintf (stderr, "Unexpected end of file\n");
  43.           exit (1);
  44.         }
  45.       else if (c != 0x80)
  46.         {
  47.           fprintf (stderr, "Expecting key, found 0x%.2x\n", c);
  48.           exit (1);
  49.         }
  50.       else
  51.         {
  52.           state = FIND_TYPE;
  53.         }
  54.       break;
  55.       
  56.     case FIND_TYPE:
  57.       if ((c = getchar ()) == EOF)
  58.         {
  59.           fprintf (stderr, "Unexpected end of file\n");
  60.           exit (1);
  61.         }
  62.       else if (c == '\001')
  63.         {
  64.           state = PROC_ASCII;
  65.         }
  66.       else if (c == '\002')
  67.         {
  68.           state = PROC_BINARY;
  69.         }
  70.       else if (c == '\003')
  71.         {
  72.           exit (0);
  73.         }
  74.       else
  75.         {
  76.           fprintf (stderr, "Unknown section type\n");
  77.           exit (1);
  78.         }
  79.       break;
  80.  
  81.     case PROC_ASCII:
  82.       length = 0;
  83.       for (i = 0; i < 4; i++)
  84.         {
  85.           if ((c = getchar ()) == EOF)
  86.         {
  87.           fprintf (stderr, "Unexpected end of file\n");
  88.           exit (1);
  89.         }
  90.           length |= (c << (8*i));
  91.         }
  92.  
  93.       for (i = 0; i < length; i++)
  94.         {
  95.           if ((c = getchar ()) == EOF)
  96.         {
  97.           fprintf (stderr, "Unexpected end of file in TEXT section\n");
  98.           exit (1);
  99.         }
  100.           else if (c == '\r')
  101.         {
  102.           putchar ('\n');
  103.         }
  104.           else
  105.         {
  106.           putchar (c);
  107.         }
  108.         }
  109.       state = FIND_KEY;
  110.       break;
  111.       
  112.     case PROC_BINARY:
  113.       length = 0;
  114.       for (i = 0; i < 4; i++)
  115.         {
  116.           if ((c = getchar ()) == EOF)
  117.         {
  118.           fprintf (stderr, "Unexpected end of file\n");
  119.           exit (1);
  120.         }
  121.           length |= (c << (8*i));
  122.         }
  123.  
  124.       for (i = 0; i < length; i++)
  125.         {
  126.           if ((c = getchar ()) == EOF)
  127.         {
  128.           fprintf (stderr, "Unexpected end of file in BINARY section\n");
  129.           exit (1);
  130.         }
  131.           else
  132.         {
  133.           putchar (hex[(c & 0xf0) >> 4]);
  134.           putchar (hex[(c & 0x0f)]);
  135.  
  136.           if (i % 32 == 31)
  137.             {
  138.               putchar ('\n');
  139.             }
  140.         }
  141.         }
  142.  
  143.       putchar ('\n');
  144.       state = FIND_KEY;
  145.       break;
  146.     }
  147.     }
  148. }
  149.