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 >
Wrap
C/C++ Source or Header
|
1994-02-17
|
3KB
|
130 lines
#include <stdio.h>
#include "pic.h"
main(ac, av)
int ac;
char *av[];
{
struct P_FSIG pfsig;
struct WS_PIC_HEADER *picheader;
int crc, num, nb, c, i, w, dogray = 0, wanted = 0;
char *buf, *bp;
extern needmotorolaorder;
if(ac != 1 && ac != 2)
{
fprintf(stderr, "Usage: pictopbm [filenum[g]] <in > out\n");
exit(1);
}
if(ac == 2)
{
wanted = atoi(av[1]);
if(*(av[1] + strlen(av[1]) - 1) == 'g')
dogray = 1;
}
needmotorolaorder = 0;
if(fread(&pfsig, sizeof(pfsig), 1, stdin) != 1 ||
strncmp(pfsig.id, PIC_MAGIC, 4))
{
fprintf(stderr, "Not a PIC file\n");
exit(1);
}
pfsig.count = ShortSwap(pfsig.count);
picheader = (struct WS_PIC_HEADER *)malloc(sizeof(*picheader) * pfsig.count);
for(num = 0; num < pfsig.count; num++)
if(fread(&picheader[num], sizeof(*picheader), 1, stdin) != 1)
{
fprintf(stderr, "Corrupted file at header %d\n", num+1);
exit(1);
}
else
{
picheader[num].crc = ShortSwap(picheader[num].crc);
picheader[num].size.x = ShortSwap(picheader[num].size.x);
picheader[num].size.y = ShortSwap(picheader[num].size.y);
picheader[num].byte_size = ShortSwap(picheader[num].byte_size);
picheader[num].offset = LongSwap(picheader[num].offset);
}
if(pfsig.count > 1 && !wanted)
fprintf(stderr, "Warning, more than 1 file present (%d)\n", pfsig.count);
if(pfsig.count < wanted)
{
fprintf(stderr, "Warning, no %d files present(%d)\n", wanted,pfsig.count);
exit(0);
}
for(num = 0; num < pfsig.count; num++)
{
if(wanted && num != wanted -1)
{
for(i = picheader[num].byte_size; i; i--)
getchar();
continue;
}
if(dogray < 2 )
{
putchar('P');
putchar(dogray ? '2' : '1' );
putchar('\n');
printf("%d %d\n", picheader[num].size.x, picheader[num].size.y);
if(dogray)
printf("%d\n", 2);
buf = (char *)malloc(picheader[num].size.x * picheader[num].size.y);
}
bp = buf;
w = picheader[num].size.x;
crc = 0;
for(nb = 0; nb < picheader[num].byte_size; nb++)
{
c = getchar();
crc = docrc16_1(crc, c);
for(i = 0; i < 8; i++)
{
switch(dogray)
{
case 0:
putchar(c & 1 ? '1' : '0');
putchar(' ');
break;
case 1:
*bp = c & 1 ? 1 : 0;
break;
case 2:
putchar(*bp ? '0' : (c & 1 ? '1' : '2'));
putchar(' ');
break;
}
bp++;
c >>= 1;
if(--w == 0)
{
w = picheader[num].size.x;
if(-w & 8) /* Magic */
{
nb++;
c = getchar();
crc = docrc16_1(crc, c);
}
break;
}
}
if(nb % 4 == 3 && dogray != 1)
putchar('\n');
}
if(crc != picheader[num].crc)
fprintf(stderr, "CRC error: %#x != %#x\n", crc, picheader[num].crc);
if(dogray != 1)
{
if(nb % 4 != 0)
putchar('\n');
break;
}
else
{
dogray++; wanted++;
}
}
return 0;
}