home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Sound Sensations!
/
sound_sensations.iso
/
misc
/
fileid13
/
gif.c
< prev
next >
Wrap
C/C++ Source or Header
|
1991-01-26
|
10KB
|
338 lines
/**************************************************
*
* GIF.c (GIF module of FileID)
*
* Disassemble GIF file
*
* Copyright(c), 1990 Lloyd B. Eldred
* & Fredrick R Homan
*
**************************************************/
#include <stdio.h>
#include <math.h>
#include <string.h>
typedef unsigned char UBYTE; /* 8 bits unsigned */
typedef unsigned short UWORD; /* 16 bits unsigned */
typedef short WORD; /* 16 bits signed */
typedef long LONG; /* 32 bits signed */
#define TRUE 1
#define FALSE 0
void Gif_PlainText(picfile,PrintFlag)
FILE *picfile;
UBYTE PrintFlag;
{
UBYTE bsize,c1,c2,c3,c4;
UBYTE ccw,cch,tbi,tfi;
char buf[256],coltext[512];
UWORD tgl,tgt;
int width,height,colwidth,tw;
void fi_getc(FILE *,char *);
if (PrintFlag) printf(" Plain Text\n");
fi_getc(picfile,&bsize); /* Block size = 12 ? */
if (fread(buf,12,1,picfile) != 1) {
printf(" Unexpected end of file. (PT-2)\n");
fclose(picfile);
fi_exit();
}
c1 = buf[0];
c2 = buf[1];
c3 = buf[2];
c4 = buf[3];
tgl = (UWORD)(c1 + 256*c2);
tgt = (UWORD)(c3 + 256*c4);
c1 = buf[4];
c2 = buf[5];
c3 = buf[6];
c4 = buf[7];
width = (int)(c1 + 256*c2);
height = (int)(c3 + 256*c4);
ccw = buf[8];
cch = buf[9];
tfi = buf[10];
tbi = buf[11];
colwidth = width / ccw;
if (PrintFlag) printf(" Text left edge : %d\n"
" Text top : %d\n"
" Grid width : %d\n"
" Grid height : %d\n"
" Cell width : %d\n"
" Cell height : %d\n"
" Foreground color : %d\n"
" Background color : %d\n"
,tgl,tgt,width,height,ccw,cch,tfi,tbi);
fi_getc(picfile,&bsize); /* Block size */
if (bsize != 0 && PrintFlag)
printf(" ********** Text reads: **********\n");
while (bsize != 0) {
if (fread(buf, bsize, 1,picfile) != 1) {
fprintf(stderr, "Unexpected end of file. (PT-4)\n");
fclose(picfile);
fi_exit();
}
buf[bsize]='\0';
if (PrintFlag)
for (tw = 0; tw < bsize; tw += colwidth) {
strncpy (coltext, &buf[tw], colwidth);
coltext[colwidth] = '\0';
printf("%s\n",coltext);
}
fi_getc(picfile,&bsize); /* Block size */
} /* end of while() */
if (PrintFlag) printf("\n");
return;
} /* End of Plain Text Section */
void Gif_Application(picfile,PrintFlag)
FILE *picfile;
UBYTE PrintFlag;
{
UBYTE bsize;
char buf[256];
void fi_getc(FILE *,char *);
printf(" Application specific\n");
fi_getc(picfile,&bsize); /* Block size = 11 ? */
if (fread(buf,bsize,1,picfile) != 1) {
printf(" Unexpected end of file. (Appl-2)\n");
fclose(picfile);
fi_exit();
}
/* write Application Identifier */
if (PrintFlag) printf(" Application ID: %8s\n",buf);
fi_getc(picfile,&bsize);
while(bsize != 0){
if (fread(buf,bsize,1,picfile) != 1) {
printf(" Unexpected end of file. (Appl-4)\n");
fclose(picfile);
fi_exit();
}
fi_getc(picfile,&bsize);
} /* end of while */
return;
} /* End of Application Specific Section */
void Gif_Comment(picfile,PrintFlag)
FILE *picfile;
UBYTE PrintFlag;
{
UBYTE bsize;
char buf[256];
void fi_getc(FILE *,char *);
fi_getc(picfile,&bsize); /* Block size */
if (bsize != 0 && PrintFlag) printf(" ********* Text reads: *********\n");
while(bsize != 0){
if (fread(buf, bsize, 1,picfile) != 1) {
fprintf(stderr, "Unexpected end of file. (Com-2)\n");
fclose(picfile);
fi_exit();
}
buf[bsize]='\0';
if (PrintFlag) printf("%s",buf);
fi_getc(picfile,&bsize); /* Block size */
} /* end of while() */
if (PrintFlag) printf("\n");
return;
} /* end of dealing with comment */
void Gif_Image(picfile,PrintFlag)
FILE *picfile;
UBYTE PrintFlag;
{
UBYTE c1,c2,c3,c4,bsize,LZW_size;
char buf[256];
UWORD ilp,itp;
int planes,color,offset,width,height,i;
void fi_getc(FILE *,char *);
if (PrintFlag) printf(" Image Descriptor:\n");
if (fread(buf, 9, 1,picfile) != 1) {
fprintf(stderr, "Unexpected end of file. (I-1)\n");
fclose(picfile);
fi_exit();
}
c1 = buf[0];
c2 = buf[1];
c3 = buf[2];
c4 = buf[3];
ilp = (UWORD)(c1 + 256*c2);
itp = (UWORD)(c3 + 256*c4);
c1 = buf[4];
c2 = buf[5];
c3 = buf[6];
c4 = buf[7];
width = (int)(c1 + 256*c2);
height = (int)(c3 + 256*c4);
if (PrintFlag) printf(" Image left edge: %d\n"
" Image top : %d\n"
" Image width : %d\n"
" Image height : %d\n",ilp,itp,width,height);
c1 = buf[8];
if(PrintFlag){
if(c1 & 0x40)
printf(" Image is interlaced.\n");
else
printf(" Image is not interlaced.\n");
if(c1 & 0x18)
printf(" Uses bits reserved for future"
" expansion as of the GIF89a standard.\n");
}
if(c1 & 0x80){
if(c1 & 0x20)
if(PrintFlag)printf(" Uses Local Color Table (sorted)\n");
else
if(PrintFlag)printf(" Uses Local Color Table (unsorted)\n");
planes =(int)(c1 & 0x07) +1;
color=1;
for(i=0; i<planes ; i++) color = color * 2;
if(PrintFlag) printf(" size: %d colors\n",color);
offset = 3 * color;
/* Skip the Local Color Table */
if (fseek(picfile,offset,1) == -1){
printf(" Unexpected end of file. (I-2)\n");
fclose(picfile);
fi_exit();
}
} /* End of Local Color Table stuff */
else
if (PrintFlag) printf(" Uses Global Color Table.\n");
/* Skip over the actual image data */
fi_getc(picfile,&LZW_size); /* LZW Code Size */
fi_getc(picfile,&bsize); /* Block size */
while(bsize !=0){
if (fseek(picfile,bsize,1) == -1){
printf(" Unexpected end of file. (I-5)\n");
fclose(picfile);
fi_exit();
}
fi_getc(picfile,&bsize); /* Next block size */
} /* End of while() */
return;
} /* End of Image Data */
void Gif_Graphic(picfile,PrintFlag)
FILE *picfile;
UBYTE PrintFlag;
{
UBYTE c1,c2,bsize,fields,trans;
UWORD delay;
int disp;
void fi_getc(FILE *,char *);
if (PrintFlag) printf(" Graphic Control\n");
fi_getc(picfile,&bsize); /* Block size = 4 ? */
while(bsize != 0){
fi_getc(picfile,&fields); /* Packed fields */
if(fields & 0xe0)
if (PrintFlag) printf(" Bits reserved as of GIF89a standard are being used.\n");
disp = (int)(fields & 0x1c)>>2;
if (PrintFlag) {
if(disp == 0)
printf(" No disposal information given for"
" the following graphic.\n");
if(disp == 1)
printf(" Following graphic is not to be"
" disposed of after being displayed.\n");
if(disp == 2)
printf(" The area used by the following graphic"
" is to be restored to the background\n"
" color after being displayed.\n");
if(disp == 3)
printf(" The area used by the following graphic"
" is to be restored to the previous\n"
" image after being displayed.\n");
if(disp >3 && disp <8)
printf(" The area used by the following graphic"
" is to be disposed of in a method\n"
" NOT defined by the GIF89a standard.\n");
}
if(fields & 0x02)
if (PrintFlag) printf(" User Input is expected.\n");
else
if (PrintFlag) printf(" User Input is not expected.\n");
trans = fields & 0x01;
fi_getc(picfile,&c1); /* Delay pt 1 */
fi_getc(picfile,&c2); /* Delay pt 2 */
delay = (UWORD)(c1 + 256*c2);
if(delay != 0)
if (PrintFlag) printf(" Delay time: %d hundreths of a second"
".\n",delay);
fi_getc(picfile,&c1); /* Transparent index */
if((trans) && (PrintFlag)) printf(" Color %d is to be treated as"
" transparent.\n",c1);
fi_getc(picfile,&bsize); /* Next block size */
} /* End of while(bsize != 0) */
return;
} /* end of graphic control section */
void fi_getc(picfile,c)
FILE *picfile;
char *c;
{
if (fread(c, 1, 1,picfile) != 1) {
printf(" Unexpected end of file.\n");
fclose(picfile);
fi_exit();
}
return;
}