home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Fresh Fish 8
/
FreshFishVol8-CD2.bin
/
bbs
/
dev
/
mystrip-1.0.lha
/
MYSTRIP
/
MYSTRIP.C
< prev
next >
Wrap
C/C++ Source or Header
|
1994-03-01
|
6KB
|
308 lines
/************************************************/
/*** Strips Symbol_Hunks from AMIGALoadFiles ***/
/*** Quick-and-dirty Version 1.0 010394 ST ***/
/*** This may be copied, distributed, etc. ***/
/*** You may alter this file anyway you want ***/
/************************************************/
#include <dos/doshunks.h>
#include <stdio.h>
#define SL sizeof(long int)
int StripAHunk(FILE *fpin,FILE *fpout); /* Strips a Hunk, to be read from fp, returns*/
/* #of symbols stripped */
int main(argc,argv)
int argc;
char **argv;
{
FILE *fpin,*fpout;
long int s[10];
int n,i,num;
if ((argc!=2)&&(argc!=3))
{
fprintf(stderr,"Usage: %s filein [fileout]\n",argv[0]);
exit(1);
}
if ((fpin=fopen(argv[1],"r"))==NULL)
{
fprintf(stderr, "Can't open %s\n",argv[1]);
exit(1);
}
if (argc==2) /* Use stdout as output */
fpout=stdout;
else
{
if ((fpout=fopen(argv[2],"w"))==NULL)
{
fclose(fpin);
fprintf(stderr,"Can't open %s\n",argv[2]);
exit(1);
}
}
if (fread(s,SL,1,fpin)!=1)
{
inerr: fprintf(stderr,"fread() error\n");
fclose(fpin);
fclose(fpout);
exit(1);
}
if (s[0]!=HUNK_HEADER) /* OOps, not AMIGA Exec */
{
fprintf(stderr,"%s doesn't seem to be AMIGA executable...\n",argv[1]);
exit(1);
}
if (fwrite(s,SL,1,fpout)!=1)
{
outerr: fprintf(stderr,"fwrite() failed\n");
fclose(fpin);
fclose(fpout);
exit(1);
}
/* Read over header */
do
{
if (fread(s,SL,1,fpin)!=1)
goto inerr;
if (fwrite(s,SL,1,fpout)!=1)
goto outerr;
}while (s[0]!=0);
/* Copy lengths */
if (fread(s,SL,3,fpin)!=3)
goto inerr;
if (fwrite(s,SL,3,fpout)!=3)
goto outerr;
n=num=s[2]-s[1]+1;
/* Copy lengths */
for (i=0;i<n;i++)
{
if (fread(s,SL,1,fpin)!=1)
goto inerr;
if (fwrite(s,SL,1,fpout)!=1)
goto outerr;
}
n=0;
for (i=0;i<num;i++)
n+=StripAHunk(fpin,fpout);
if (argc==3)
fclose(fpout);
fclose(fpin);
if (argc==3)
printf("Stripped %d symbols\n",n);
}/* Of main */
int StripAHunk(fin,fout)
FILE *fin;
FILE *fout;
{
int n,i,s[10],num,num2;
if (fread(s,SL,1,fin)!=1)
{
errin: fprintf(stderr,"fread() failed\n");
exit(1);
}
switch(s[0])
{
case HUNK_NAME: /* Skip them */
if (fread(s,SL,1,fin)!=1)
goto errin;
for (n=s[0],i=0;i<n;i++)
{
if (fread(s,SL,1,fin)!=1)
goto errin;
}
return(StripAHunk(fin,fout));
break;
case HUNK_CODE: /* Code HUNKS */
case HUNK_DATA: /* Data HUNKS */
if (fwrite(s,SL,1,fout)!=1)
goto errout;
if (fread(s,SL,1,fin)!=1)
goto errin;
if (fwrite(s,SL,1,fout)!=1)
{
errout: fprintf(stderr,"fwrite() failed\n");
exit(1);
}
/* Copy that hunk */
for (n=s[0],i=0;i<n;i++)
{
if (fread(s,SL,1,fin)!=1)
goto errin;
if (fwrite(s,SL,1,fout)!=1)
goto errout;
}
break;
case HUNK_BSS: /* BSS HUNKS */
if (fwrite(s,SL,1,fout)!=1)
goto errout;
if (fread(s,SL,1,fin)!=1)
goto errin;
if (fwrite(s,SL,1,fout)!=1)
goto errout;
break;
case HUNK_DEBUG: /* Strip */
if (fread(s,SL,1,fin)!=1)
goto errin;
for (n=s[0],i=0;i<n;i++)
{
if (fread(s,SL,1,fin)!=1)
goto errin;
}
break;
default:
fprintf(stderr,"Unknown hunk type %d\n",s[0]);
exit(1);
break;
}/* Of switch */
/* So, now there may be HUNK_END, HUNK_RELOC*,HUNK_SYMBOL,HUNK_DEBUG*/
num=0; /* # symbols stripped */
if (fread(s,SL,1,fin)!=1)
goto errin;
while (1)
{
switch(s[0])
{
case HUNK_END: /* Done */
if (fwrite(s,SL,1,fout)!=1)
goto errout;
return num;
break;
case HUNK_DEBUG: /* Strip */
if (fread(s,SL,1,fin)!=1)
goto errin;
for (n=s[0];i<n;i++)
{
if (fread(s,SL,1,fin)!=1)
goto errin;
}
if (fread(s,SL,1,fin)!=1)
goto errin;
continue;
break;
case HUNK_SYMBOL: /* STRIP */
while (1) /* read symnames and value */
{
if (fread(s,SL,1,fin)!=1)
goto errin;
n=s[0]&0xffffff; /* mask top byte */
if (n==0)
break;
num++; /* One symbol stripped */
for (i=0;i<n;i++)
if (fread(s,SL,1,fin)!=1)
goto errin;
if (fread(s,SL,1,fin)!=1) /* Value */
goto errin;
}/* Of while */
if (fread(s,SL,1,fin)!=1)
goto errin;
continue;
break;
case HUNK_RELOC32: /* rel32, copy it */
if (fwrite(s,SL,1,fout)!=1)
goto errout;
while (1)
{
if (fread(s,SL,1,fin)!=1)
goto errin;
if (fwrite(s,SL,1,fout)!=1)
goto errout;
n=s[0];
if (n==0) /* End reached */
{
break;
}
if (fread(s,SL,1,fin)!=1) /* Hunk num */
goto errin;
if (fwrite(s,SL,1,fout)!=1)
goto errout;
for (i=0;i<n;i++)
{
if (fread(s,SL,1,fin)!=1)
goto errin;
if (fwrite(s,SL,1,fout)!=1)
goto errout;
}
}/* of while */
if (fread(s,SL,1,fin)!=1)
goto errin;
continue;
break;
case HUNK_RELOC32SHORT: /* Short one */
num2=0; /* Length */
while (1)
{
if (fread(s,SL,1,fin)!=1)
goto errin;
if (fwrite(s,SL,1,fout)!=1)
goto errout;
n=s[0];
if (n==0) /* End reached */
break;
if (fread(s,SL,1,fin)!=1) /* HUNK NUM*/
goto errin;
if (fwrite(s,SL,1,fout)!=1)
goto errout;
num2+=n;
for (i=0;i<n;i++)
{
if (fread(s,sizeof(short int),1,fin)!=1)
goto errin;
if (fwrite(s,sizeof(short int),1,fout)!=1)
goto errout;
}
}/* of while */
if (num2&1==1) /* odd # of words , adjust */
{
if (fread(s,sizeof(short int),1,fin)!=1)
goto errin;
if (fwrite(s,sizeof(short int),1,fout)!=1)
goto errout;
}
if (fread(s,SL,1,fin)!=1)
goto errin;
continue;
break;
default:
fprintf(stderr,"Unknown HUNK Type %d\n",s[0]);
exit(1);
}/* Of switch */
}/* Of while */
}/* Of StripAHunk */