home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
The Fred Fish Collection 1.5
/
ffcollection-1-5-1992-11.iso
/
ff_disks
/
300-399
/
ff398.lzh
/
HunkFunk
/
HunkFunk.c
< prev
next >
Wrap
C/C++ Source or Header
|
1990-11-01
|
9KB
|
460 lines
/****************************************************************************
*
* HunkFunk.c ---- Source code for HunkFunk Amiga object/binary file
* scanner.
*
* Author -------- Olaf 'Olsen' Barthel, MXM
* Brabeckstrasse 35
* D-3000 Hannover 71
*
* Compiler ------ Aztec 'C' 5.0
*
* Use: CC -so HunkFunk.c
* LN HunkFunk.o -Lc
*
* HunkFunk is © Copyright 1990 by MXM. Source code and executable
* file are both placed in the public domain. A small copy fee
* is okay, but anything which looks, smells or tastes like commercial
* distribution must be registered with the author.
*
****************************************************************************/
#include <libraries/dosextens.h>
#include <functions.h>
/* Hunk identifiers. */
#define HUNK_UNIT 0x03E7 /* Date unit to follow. */
#define HUNK_NAME 0x03E8 /* Define a name. */
#define HUNK_CODE 0x03E9 /* Code block to follow. */
#define HUNK_DATA 0x03EA /* Data block to follow. */
#define HUNK_BSS 0x03EB /* Data block to create. */
#define HUNK_RELOC32 0x03EC /* 32-bit relocation information. */
#define HUNK_RELOC16 0x03ED /* 16-bit relocation information (object files only). */
#define HUNK_RELOC8 0x03EE /* 8-bit relocation information (object files only). */
#define HUNK_EXT 0x03EF /* Extended data (object files only). */
#define HUNK_SYMBOL 0x03F0 /* A name symbol. */
#define HUNK_DEBUG 0x03F1 /* Debug information (compiler/assembler dependent). */
#define HUNK_END 0x03F2 /* End of unit. */
#define HUNK_HEADER 0x03F3 /* Segment header. */
/* Note the gap between HUNK_HEADER and HUNK_OVERLAY. */
#define HUNK_OVERLAY 0x03F5 /* Overlay root node. */
#define HUNK_BREAK 0x03F6 /* End of overlay node. */
#define EXT_DEF 1 /* Symbol definition. */
#define EXT_ABS 2 /* Absolute reference. */
#define EXT_RES 3 /* Same as EXT_DEF? */
#define EXT_REF32 129 /* 32-bit reference. */
#define EXT_COMMON 130 /* 32-bit reference/BSS. */
#define EXT_REF16 131 /* 16-bit reference. */
#define EXT_REF8 132 /* 8-bit reference. */
/* Some simple macros. */
#define ReadLong() Read(FileHandle,&Type,sizeof(ULONG))
#define ReadName(Longs) Read(FileHandle,NameString,sizeof(LONG) * (Longs))
#define SkipLong(Longs) Seek(FileHandle,sizeof(LONG) * (Longs),OFFSET_CURRENT)
#define MakeName(Longs) NameString[Longs * sizeof(LONG)] = 0
/* Unit load types. */
#define TYPE_CHIP 1
#define TYPE_FAST 2
/* Disable the standard ^C handling. */
LONG Chk_Abort(VOID) { return(0); }
VOID _wb_parse(VOID) {}
void
main(int argc,char **argv)
{
BPTR FileHandle;
ULONG Type;
char NameString[257];
LONG i,From,To;
UBYTE PrintFlag;
/* Info? */
if(argc < 2)
{
puts("Usage: HunkFunk <File>");
exit(RETURN_OK);
}
/* Open file to be examined. */
if(!(FileHandle = Open(argv[1],MODE_OLDFILE)))
{
printf("HunkFunk: Couldn't open file \"%s\"!\n",argv[1]);
exit(RETURN_FAIL);
}
/* Scan the file until EOF. */
for(;;)
{
/* End of file? */
if(ReadLong() != sizeof(LONG))
break;
/* User pressed ^C? */
if(SetSignal(NULL,NULL) & SIGBREAKF_CTRL_C)
{
printf("*** Break\a\n");
SetSignal(NULL,SIGBREAKF_CTRL_C);
goto Quit;
}
/* Look which type it is. */
switch(Type & 0xFFFF)
{
case HUNK_UNIT: ReadLong();
if(Type)
ReadName(Type);
MakeName(Type);
printf("HUNK_UNIT \"%s\"\n",NameString);
break;
case HUNK_NAME: ReadLong();
if(Type)
ReadName(Type);
MakeName(Type);
printf("HUNK_NAME \"%s\"\n",NameString);
break;
case HUNK_CODE: ReadLong();
SkipLong(Type);
printf("HUNK_CODE %ld Bytes\n",Type << 2);
break;
case HUNK_DATA: ReadLong();
SkipLong(Type);
printf("HUNK_DATA %ld Bytes\n",Type << 2);
break;
case HUNK_BSS: ReadLong();
printf("HUNK_BSS %ld Bytes\n",Type << 2);
break;
case HUNK_RELOC32: printf("HUNK_RELOC32\n");
for(;;)
{
ReadLong();
if(SetSignal(NULL,NULL) & SIGBREAKF_CTRL_C)
{
printf("*** Break\a\n");
SetSignal(NULL,SIGBREAKF_CTRL_C);
goto Quit;
}
if(Type)
{
SkipLong(1);
SkipLong(Type);
}
else
break;
}
break;
case HUNK_RELOC16: printf("HUNK_RELOC16\n");
for(;;)
{
ReadLong();
if(SetSignal(NULL,NULL) & SIGBREAKF_CTRL_C)
{
printf("*** Break\a\n");
SetSignal(NULL,SIGBREAKF_CTRL_C);
goto Quit;
}
if(Type)
{
SkipLong(1);
SkipLong(Type);
}
else
break;
}
break;
case HUNK_RELOC8: printf("HUNK_RELOC8\n");
for(;;)
{
ReadLong();
if(SetSignal(NULL,NULL) & SIGBREAKF_CTRL_C)
{
printf("*** Break\a\n");
SetSignal(NULL,SIGBREAKF_CTRL_C);
goto Quit;
}
if(Type)
{
SkipLong(1);
SkipLong(Type);
}
else
break;
}
break;
case HUNK_EXT: printf("HUNK_EXT\n");
for(;;)
{
ReadLong();
if(SetSignal(NULL,NULL) & SIGBREAKF_CTRL_C)
{
printf("*** Break\a\n");
SetSignal(NULL,SIGBREAKF_CTRL_C);
goto Quit;
}
if(!Type)
break;
switch((Type >> 24) & 0xFF)
{
case EXT_DEF: printf(" EXT_DEF\n");
break;
case EXT_ABS: printf(" EXT_ABS\n");
break;
case EXT_RES: printf(" EXT_RES\n");
break;
case EXT_REF32: printf(" EXT_REF32\n");
break;
case EXT_COMMON:printf(" EXT_COMMON\n");
break;
case EXT_REF16: printf(" EXT_REF16\n");
break;
case EXT_REF8: printf(" EXT_REF8\n");
break;
default: printf(" EXT_??? (0x%02x)\n",(Type >> 24) & 0xFF);
break;
}
PrintFlag = FALSE;
/* Is it followed by a symbol name? */
if(Type & 0xFFFFFF)
{
ReadName((Type & 0xFFFFFF));
MakeName((Type & 0xFFFFFF));
printf(" %s",NameString);
PrintFlag = TRUE;
}
/* Remember extension type. */
i = (Type >> 24) & 0xFF;
/* Display value of symbol. */
if(i == EXT_DEF || i == EXT_ABS || i == EXT_RES)
{
if(!(Type & 0xFFFFFF))
printf("???");
ReadLong();
printf(" = 0x%08lx",Type);
PrintFlag = TRUE;
}
if(PrintFlag)
printf("\n");
/* Skip relocation information. */
if(i == EXT_REF32 || i == EXT_REF16 || i == EXT_REF8)
{
ReadLong();
SkipLong(Type);
}
/* Display size of common block. */
if(i == EXT_COMMON)
{
ReadLong();
printf(" Size = %ld Bytes\n",Type << 2);
ReadLong();
SkipLong(Type);
}
}
break;
case HUNK_SYMBOL: printf("HUNK_SYMBOL\n");
for(;;)
{
ReadLong();
if(SetSignal(NULL,NULL) & SIGBREAKF_CTRL_C)
{
printf("*** Break\a\n");
SetSignal(NULL,SIGBREAKF_CTRL_C);
goto Quit;
}
if(!Type)
break;
/* Display name. */
ReadName((Type & 0xFFFFFF));
MakeName((Type & 0xFFFFFF));
printf(" %s",NameString);
/* Display value. */
ReadLong();
printf(" = 0x%08lx\n",Type);
}
break;
case HUNK_DEBUG: ReadLong();
SkipLong(Type);
printf("HUNK_DEBUG %ld Bytes\n",Type << 2);
break;
case HUNK_END: printf("HUNK_END\n\n");
break;
case HUNK_HEADER: printf("HUNK_HEADER\n");
for(;;)
{
ReadLong();
if(SetSignal(NULL,NULL) & SIGBREAKF_CTRL_C)
{
printf("*** Break\a\n");
SetSignal(NULL,SIGBREAKF_CTRL_C);
goto Quit;
}
/* Display names of resident libraries. */
if(Type)
{
ReadName(Type);
MakeName(Type);
printf(" Name = %s\n",NameString);
}
else
break;
}
ReadLong();
printf(" Numhunks = %ld (",Type);
ReadLong();
printf("%ld to ",From = Type);
ReadLong();
printf("%ld)\n",To = Type);
/* Display hunk lengths/types. */
for(i = 0 ; i < To - From + 1 ; i++)
{
ReadLong();
printf(" Hunk %03ld = %ld Bytes ",i,(Type & 0x3FFFFFFF) << 2);
if((Type >> 30) == TYPE_CHIP)
printf("CHIP");
if((Type >> 30) == TYPE_FAST)
printf("FAST");
printf("\n");
}
break;
case HUNK_OVERLAY: printf("HUNK_OVERLAY\n");
ReadLong();
/* 8 * Entries + Levels + 1 */
From = Type;
ReadLong();
To = Type - 2;
From -= (To + 1);
printf(" Levels = %ld\n",To);
printf(" Entries = %ld\n",From / 8);
Seek(FileHandle,(From + To + 1) * sizeof(LONG),OFFSET_CURRENT);
break;
case HUNK_BREAK: printf("HUNK_BREAK\n\n");
break;
default: printf("HUNK_??? (0x%04lx) - Aborting!\a\n",Type & 0xFFFF);
goto Quit;
}
}
Quit: Close(FileHandle);
exit(RETURN_OK);
}