home *** CD-ROM | disk | FTP | other *** search
/ The Datafile PD-CD 1B / DATAFILE_PDCD1B.iso / _pocketbk / pocketbook / opl / pbm2pic_tg / pbm2pic_tg~ / conv / pictopbm.c < prev    next >
C/C++ Source or Header  |  1994-02-17  |  3KB  |  130 lines

  1. #include <stdio.h>
  2. #include "pic.h"
  3.  
  4. main(ac, av)
  5.   int ac;
  6.   char *av[];
  7. {
  8.   struct P_FSIG pfsig;
  9.   struct WS_PIC_HEADER *picheader;
  10.   int crc, num, nb, c, i, w, dogray = 0, wanted = 0;
  11.   char *buf, *bp;
  12.   extern needmotorolaorder;
  13.  
  14.   if(ac != 1 && ac != 2)
  15.     {
  16.       fprintf(stderr, "Usage: pictopbm [filenum[g]] <in > out\n");
  17.       exit(1);
  18.     }
  19.   if(ac == 2)
  20.     {
  21.       wanted = atoi(av[1]);
  22.       if(*(av[1] + strlen(av[1]) - 1) == 'g')
  23.         dogray = 1;
  24.     }
  25.  
  26.   needmotorolaorder = 0;
  27.   if(fread(&pfsig, sizeof(pfsig), 1, stdin) != 1 ||
  28.      strncmp(pfsig.id, PIC_MAGIC, 4)) 
  29.     {
  30.       fprintf(stderr, "Not a PIC file\n");
  31.       exit(1);
  32.     }
  33.   pfsig.count = ShortSwap(pfsig.count);
  34.  
  35.   picheader = (struct WS_PIC_HEADER *)malloc(sizeof(*picheader) * pfsig.count);
  36.   for(num = 0; num < pfsig.count; num++)
  37.     if(fread(&picheader[num], sizeof(*picheader), 1, stdin) != 1)
  38.       {
  39.     fprintf(stderr, "Corrupted file at header %d\n", num+1);
  40.     exit(1);
  41.       }
  42.     else
  43.       {
  44.     picheader[num].crc      = ShortSwap(picheader[num].crc);
  45.     picheader[num].size.x   = ShortSwap(picheader[num].size.x);
  46.     picheader[num].size.y   = ShortSwap(picheader[num].size.y);
  47.     picheader[num].byte_size = ShortSwap(picheader[num].byte_size);
  48.     picheader[num].offset   = LongSwap(picheader[num].offset);
  49.       }
  50.   if(pfsig.count > 1 && !wanted)
  51.     fprintf(stderr, "Warning, more than 1 file present (%d)\n", pfsig.count);
  52.   if(pfsig.count < wanted)
  53.     {
  54.       fprintf(stderr, "Warning, no %d files present(%d)\n", wanted,pfsig.count);
  55.       exit(0);
  56.     }
  57.   for(num = 0; num < pfsig.count; num++)
  58.     {
  59.       if(wanted && num != wanted -1)
  60.         {
  61.       for(i = picheader[num].byte_size; i; i--)
  62.         getchar();
  63.       continue;
  64.     }
  65.       if(dogray < 2 )
  66.         {
  67.       putchar('P');
  68.       putchar(dogray ? '2' : '1' );
  69.       putchar('\n');
  70.       printf("%d %d\n", picheader[num].size.x, picheader[num].size.y);
  71.       if(dogray)
  72.         printf("%d\n", 2);
  73.       buf = (char *)malloc(picheader[num].size.x * picheader[num].size.y);
  74.         }
  75.       bp = buf;
  76.       w = picheader[num].size.x;
  77.       crc = 0;
  78.       for(nb = 0; nb < picheader[num].byte_size; nb++)
  79.         {
  80.       c = getchar();
  81.       crc = docrc16_1(crc, c);
  82.       for(i = 0; i < 8; i++)
  83.         {
  84.           switch(dogray)
  85.             {
  86.           case 0:
  87.             putchar(c & 1 ? '1' : '0');
  88.             putchar(' ');
  89.             break;
  90.           case 1:
  91.             *bp = c & 1 ? 1 : 0;
  92.             break;
  93.           case 2:
  94.             putchar(*bp ? '0' : (c & 1 ? '1' : '2'));
  95.             putchar(' ');
  96.             break;
  97.         }
  98.           bp++;
  99.           c >>= 1;
  100.           if(--w == 0)
  101.         {
  102.               w = picheader[num].size.x;
  103.           if(-w & 8) /* Magic */
  104.             {
  105.               nb++;
  106.               c = getchar();
  107.               crc = docrc16_1(crc, c);
  108.             }
  109.           break;
  110.         }
  111.         }
  112.       if(nb % 4 == 3 && dogray != 1)
  113.         putchar('\n');
  114.     }
  115.       if(crc != picheader[num].crc)
  116.         fprintf(stderr, "CRC error: %#x != %#x\n", crc, picheader[num].crc);
  117.       if(dogray != 1)
  118.         {
  119.       if(nb % 4 != 0)
  120.         putchar('\n');
  121.       break;
  122.     }
  123.       else
  124.         {
  125.       dogray++; wanted++;
  126.     }
  127.     }
  128.   return 0;
  129. }
  130.