home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Club Amiga de Montreal - CAM
/
CAM_CD_1.iso
/
files
/
011.lha
/
IFF
/
iffdump.c
< prev
next >
Wrap
C/C++ Source or Header
|
1986-11-10
|
7KB
|
310 lines
/*
* DECODE IFF formatted files V1.00
*
* COMPILE W/ASTARTUP.OBJ and MY.LIB
*
* iffdump [-vV] file
*
* -v : display a little more information (only for forms and types
* the program knows about)
* -V : display additional hex dump of all sections
*
*
* NOTE: The '-v' flag could use *a lot* of expansion... Since I haven't
* got the latest IFF documentation.
*
*
* NOTE: This program does almost no format checking (e.g. PROP's only
* within LIST's, etc...), it is meant to display the format of
* valid IFF files.
*/
#include "iff.h"
#include <graphics/view.h>
#define MODE_V1 0x01
#define MODE_V2 0x02
extern char *tabstr(), *ltos();
union {
X_BMHD bmhd;
X_CMAP cmap[64];
X_GRAB grab;
X_DEST dest;
X_SPRT sprt;
X_CAMG camg;
X_CRNG crng;
} U;
int Modes;
main(ac, av)
char *av[];
{
int i, j;
char *str;
long fi;
long endpos;
for (j = 0, i = 1; i < ac; ++i) {
str = av[i];
if (*str == '-') {
while (*++str) {
switch(*str) {
case 'v':
Modes |= MODE_V1;
break;
case 'V':
Modes |= MODE_V2;
break;
default:
printf ("'%lc' bad option\n", *str);
}
}
} else {
if (j) {
puts("May specify only one file");
exit(1);
}
j = i;
}
}
if (j == 0) {
puts ("IFFDUMP [-vV] file");
puts ("(c)1986 Matthew Dillon. Public Domain V1.00");
puts ("");
puts ("-v show detail on things the prog. knows about");
puts ("-V show hex dump");
exit(1);
}
fi = xopen(av[j], "r", 8192);
if (fi == NULL) {
puts ("could not open file");
exit(1);
}
endpos = xseek(fi, 0, 1);
xseek(fi, 0, -1);
iffdecode(fi, 0, endpos);
xclose(fi);
if (checkbreak())
puts ("*BREAK*");
}
iffdecode(fi, tab, endpos)
{
long chunk[2];
long curpos, bytes, curend;
long data;
char ok;
char count = 0;
for (;;) {
curpos = xseek(fi, 0, 0);
if (curpos == endpos)
return(1);
if (count++ && tab == 0) {
puts ("Warning: Garbage after IFF-EOF");
return (0);
}
if (curpos + 8 > endpos) {
puts ("Error: Premature End Of File in header");
return(0);
}
xread(fi, chunk, 8);
curpos += 8;
bytes = chunk[1];
curend = curpos + bytes;
printf ("%sCHUNK %s (%8ld)", tabstr(tab), ltos(chunk[0]), bytes);
if (curend > endpos) {
puts ("\nError: Premature End Of File within chunk");
return(0);
}
ok = 0;
switch(chunk[0]) {
case IFF_FILLER:
printf ("A filler chunk\n");
if (Modes & MODE_V2)
hexdump(fi, curpos, bytes, tab);
break;
case IFF_FORM:
case IFF_LIST:
case IFF_CAT:
case IFF_PROP:
xread(fi, &data, 4);
curpos += 4;
bytes -= 4;
printf ("TYPE %s\n", ltos(data));
if (checkbreak())
break;
iffdecode(fi, tab + 4, curend);
if (checkbreak())
break;
break;
default:
ok = 1;
break;
}
if (ok) {
puts ("");
if (Modes & MODE_V1)
decode_sub(fi, tab, chunk[0], bytes);
if (Modes & MODE_V2)
hexdump(fi, curpos, bytes, tab);
}
if (curend & 1) {
printf ("%s(Filler Byte)\n", tabstr(tab));
++curend;
}
xseek(fi, curend, -1);
if (checkbreak())
break;
}
}
decode_sub(fi, tab, name, bytes)
{
int i, j;
tab += 4;
switch (name) {
case ILBM_BMHD:
cs(sizeof(U.bmhd), bytes);
xread(fi, &U.bmhd, sizeof(U.bmhd));
printf ("%s width= %-4ld\n", tabstr(tab), U.bmhd.w);
printf ("%sheight= %-4ld\n", tabstr(tab), U.bmhd.h);
printf ("%splanes= %-4ld\n", tabstr(tab), U.bmhd.planes);
printf ("%s x= %-4ld\n", tabstr(tab), U.bmhd.x);
printf ("%s y= %-4ld\n", tabstr(tab), U.bmhd.y);
printf ("%s mask= x%-2lx\n",tabstr(tab), U.bmhd.masking);
printf ("%s comp= x%-2lx\n",tabstr(tab), U.bmhd.compression);
printf ("%stcolor= %-2ld\n", tabstr(tab), U.bmhd.transparent_color);
printf ("%sxaspct= %-2ld\n", tabstr(tab), U.bmhd.xaspect);
printf ("%syaspct= %-2ld\n", tabstr(tab), U.bmhd.yaspect);
printf ("%s pagew= %-4ld\n", tabstr(tab), U.bmhd.pagewidth);
printf ("%s pageh= %-4ld\n", tabstr(tab), U.bmhd.pageheight);
break;
case ILBM_CMAP:
if (bytes % 3) {
puts ("Expected multiples of 3 bytes for colormap");
break;
}
if (bytes > 32*3) {
puts ("Color map is larger than 32 entries");
break;
}
xread(fi, &U.cmap, bytes);
j = bytes/3;
for (i = 0; i < j; ++i) {
printf ("%scolor %2ld %2lx %2lx %2lx\n",
tabstr(tab), i, U.cmap[i][0], U.cmap[i][1], U.cmap[i][2]);
}
break;
case ILBM_GRAB:
case ILBM_DEST:
case ILBM_SPRT:
puts ("");
break;
case ILBM_CAMG:
xread(fi, &U.camg, sizeof(U.camg));
i = U.camg.vpmodes;
printf ("%sVP MODES = %8lx (", tabstr(tab), i);
if (i & HIRES)
printf("HIRES ");
if (i & SPRITES)
printf("SPRITES ");
if (i & VP_HIDE)
printf("VP_HIDE ");
if (i & HAM)
printf ("HAM ");
if (i & DUALPF)
printf ("DUALPF ");
if (i & GENLOCK_AUDIO)
printf ("GENLOCK_AUDIO ");
if (i & EXTRA_HALFBRITE)
printf ("EXTRA_HALFBRITE ");
if (i & PFBA)
printf ("PFBA ");
if (i & LACE)
printf ("LACE ");
if (i & GENLOCK_VIDEO)
printf ("GENLOCK_VIDEO ");
puts (")");
break;
case ILBM_CRNG:
case ILBM_BODY:
break;
}
}
hexdump(fi, curpos, bytes, tab)
{
long pos;
UBYTE ch;
pos = 0;
xseek(fi, curpos, -1);
while (bytes) {
xread(fi, &ch, 1);
if ((pos & 15) == 0) {
if (checkbreak())
break;
printf("\n%s%5lx ", tabstr(tab+4), pos);
}
printf ("%2lx ", ch);
++pos;
--bytes;
}
puts("");
}
cs(shouldbe, actual)
{
if (shouldbe != actual)
printf ("Expected %ld bytes, got %ld\n", shouldbe, actual);
}
char *
tabstr(tab)
{
static char space[128];
static int lasttab;
static int init = 1;
if (init) {
bset(space + 1, 127, ' ');
init = 0;
}
if (tab != lasttab) {
space[lasttab] = ' ';
space[lasttab = tab] = '\0';
}
return (space);
}
char *
ltos(data)
unsigned long data;
{
static char buf[5];
buf[0] = (data >> 24) & 0xFF;
buf[1] = (data >> 16) & 0xFF;
buf[2] = (data >> 8 ) & 0xFF;
buf[3] = data & 0xFF;
return(buf);
}