home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Enigma Amiga Life 109
/
EnigmaAmiga109CD.iso
/
software
/
sviluppo
/
hunkreader
/
src
/
hunkreader.c
< prev
next >
Wrap
C/C++ Source or Header
|
1999-12-27
|
26KB
|
1,024 lines
/*
* [!BGN - MACHINE GENERATED - DO NOT EDIT THIS HEADER]
*
* Program : HunkReader (Executable/Object file hunk viewer)
* Version : 1.6
* File : Work:Source/!WIP/HunkReader/HunkReader.c
* Author : Andrew Bell
* Copyright : Copyright © 1999 Andrew Bell, All rights reserved.
* Created : Saturday 15-Nov-97 08:30:00
* Modified : Tuesday 16-Nov-99 22:37:06
* Comment :
*
* (Generated with StampSource 1.4 by Andrew Bell)
*
* [!END - MACHINE GENERATED - DO NOT EDIT THIS HEADER]
*
*/
/* Created: Sat/15/Nov/1997 */
#define MONTH "December"
#define YEAR "1997-99"
#define EMAIL "andrew.ab2000@bigfoot.com"
#define WWW "http://www.homeusers.prestel.co.uk/ab2000"
/* Maybe one day I'll make this code totally portable. */
/* Includes */
#include <HunkReader_rev.h>
#include <exec/types.h>
#include <exec/execbase.h>
#include <exec/memory.h>
#include <dos/dos.h>
#include <dos/dosextens.h>
#include <dos/doshunks.h>
#include <dos/stdio.h>
#include <clib/exec_protos.h>
#include <clib/dos_protos.h>
#include <pragma/exec_lib.h>
#include <pragma/dos_lib.h>
#pragma header
/* Defines */
#define MASK ( HUNKF_ADVISORY | HUNKF_CHIP | HUNKF_FAST )
#define TEMPLATE "FILE/A,DSYM/S,DREL/S,DEXT/S,STATS/S"
enum
{
ARG_FILE = 0, /* Incoming file */
ARG_DSYM, /* Display symbol tables */
ARG_DREL, /* Display reloc tables */
ARG_DEXT, /* Display ext hunks */
ARG_STATS, /* Display stats */
ARG_AMT /* Array size */
};
/* Prototypes */
void DoErr( void );
void DumpHunks( BPTR );
ULONG MoveForward( BPTR, LONG );
BOOL TestAbort( void );
void BuildFlagString( ULONG, UBYTE *);
LONG MyRead( BPTR FH, APTR Buf, ULONG Length);
UBYTE *Plural( ULONG, UBYTE *, UBYTE *);
void DoHUNK_EXT( BPTR FH );
void DoUNKNOWN( BPTR FH );
void DoHUNK_HEADER( BPTR FH );
void DoHUNK_CODE( BPTR FH );
void DoHUNK_DATA( BPTR FH );
void DoHUNK_BSS( BPTR FH );
void DoHUNK_END( BPTR FH );
void DoHUNK_OVERLAY( BPTR FH);
void DoHUNK_BREAK( BPTR FH );
void DoHUNK_DEBUG( BPTR FH );
void DoHUNK_SYMBOL( BPTR FH );
void DoHUNK_RELOC32( BPTR FH );
void DoHUNK_DREL32( BPTR FH );
void DoHUNK_RELOC32SHORT( BPTR FH );
void DoHUNK_DREL32( BPTR FH );
void DoHUNK_UNIT( BPTR FH );
void DoHUNK_NAME( BPTR FH );
void DoHUNK_EXT( BPTR FH );
/* We let the startup code/linker deal with these */
extern struct ExecBase *SysBase;
extern struct Library *DOSBase;
/* Varables and data */
static UBYTE VerTag[] = VERSTAG;
ULONG aa[ARG_AMT];
ULONG stream[99];
UBYTE TempBuffer[256+4];
/***********************************************************************/
ULONG main( void )
{
struct RDArgs *ArgInfo;
if (SysBase->LibNode.lib_Version < 37)
{
#define BADOSTXT "Sorry, this program requires at least OS 37+\n"
if (DOSBase) Write(Output(), BADOSTXT, sizeof(BADOSTXT) );
return RETURN_FAIL;
}
if (ArgInfo = (struct RDArgs *) ReadArgs(TEMPLATE, (LONG *) &aa, NULL))
{
BPTR InLock;
Printf(VERS " (" DATE "),\n"
"Copyright © " YEAR " Andrew Bell, All rights reserved.\n"
"email: " EMAIL "\n"
" web: " WWW "\n");
if (InLock = Lock( (UBYTE *) aa[ARG_FILE], SHARED_LOCK))
{
struct FileInfoBlock *FIB;
if (FIB = (struct FileInfoBlock *) AllocDosObject(DOS_FIB, NULL))
{
if (Examine(InLock, FIB))
{
if (FIB->fib_DirEntryType < 0)
{
if (FIB->fib_Size)
{
BPTR InHandle;
Printf("\nViewing %s's hunks structure, length %lu bytes.\n\n",
&FIB->fib_FileName, FIB->fib_Size);
if (InHandle = Open( (UBYTE *) aa[ARG_FILE], MODE_OLDFILE))
{
if (SysBase->LibNode.lib_Version >= 40)
{
SetVBuf(InHandle, NULL, BUF_FULL, (64*1024));
}
DumpHunks(InHandle);
Close(InHandle);
} /* Open */
else DoErr();
} /* NULL length check */
else Printf("Subject file is empty!\n");
} /* File/dir check */
else Printf("I need a file, not a directory!\n");
} /* Examine() */
else DoErr();
FreeDosObject(DOS_FIB, FIB);
} /* AllocDosObject() */
else DoErr();
UnLock(InLock);
} /* Lock() */
else DoErr();
FreeArgs(ArgInfo);
} /* ReadArgs() */
else DoErr();
return RETURN_OK;
} /* _main() */
/***********************************************************************/
void DoErr( void )
{
PrintFault(IoErr(), "Error ");
}
/***********************************************************************/
/* Global variables */
BOOL Flag_EOF = FALSE; /* Will equal TRUE if EOF (All OK) */
BOOL Flag_UEOF = FALSE; /* Will equal TRUE if unexpected EOF */
BOOL Flag_Error = FALSE; /* Will equal TRUE if error happened */
BOOL Flag_BadId = FALSE; /* Unknown hunk pop up it's ugly head */
BOOL Flag_Break = FALSE; /* Will equal TRUE if Ctrl+C is hit */
BOOL Flag_NotSup = FALSE; /* Hunk type is not supported */
BOOL FFlag_Exe = FALSE; /* Will equal TRUE if HUNK_HEADER was encontered */
BOOL FFlag_Obj = FALSE; /* Will equal TRUE if HUNK_UNIT was encontered */
ULONG HunkOrgId = NULL; /* Unaltered ID, contains length + bits */
ULONG HunkId = NULL; /* Altered ID, contains length only */
ULONG HunkFlags = NULL; /* Altered ID, contains bits only */
ULONG HunkOffset = NULL;
ULONG HunkCnt = NULL;
/* Zero all of these */
ULONG Cnt_Header = 0; /* */
ULONG Cnt_Code = 0; /* */
ULONG Cnt_Data = 0; /* */
ULONG Cnt_BSS = 0; /* */
ULONG Cnt_End = 0; /* */
ULONG Cnt_Overlay = 0; /* */
ULONG Cnt_Break = 0; /* */
ULONG Cnt_Symbol = 0; /* */
ULONG Cnt_SymbolEnt = 0; /* */
ULONG Cnt_Debug = 0; /* */
ULONG Cnt_Reloc32 = 0; /* */
ULONG Cnt_Reloc32Ent = 0; /* Number of entries */
ULONG Cnt_Reloc32Short = 0; /* */
ULONG Cnt_Reloc32SEnt = 0; /* Number of entries */
ULONG Cnt_DRel32 = 0; /* */
ULONG Cnt_DRel32Ent = 0; /* */
ULONG Cnt_HunksChip = 0; /* */
ULONG Cnt_HunksFast = 0; /* */
ULONG Cnt_HunksPub = 0; /* */
ULONG Cnt_HunksAdv = 0; /* */
ULONG TOTALAlloc = 0;
void DumpHunks( BPTR FH )
{
LONG ReadResult;
do
{
HunkOffset = Seek(FH, 0, OFFSET_CURRENT);
if (HunkOffset == -1)
{
Flag_Error = TRUE; break;
}
if ((ReadResult = Read(FH, &HunkOrgId, 4)) == -1)
{
Flag_Error = TRUE; break;
}
if (ReadResult == NULL)
{
Flag_EOF=TRUE; break;
}
HunkId = HunkOrgId;
HunkFlags = HunkId & MASK; /* extract flag bits from id */
HunkId &= ~MASK; /* remove flag bits from id */
switch(HunkId)
{
case HUNK_HEADER: DoHUNK_HEADER(FH); break;
case HUNK_CODE: DoHUNK_CODE(FH); break;
case HUNK_DATA: DoHUNK_DATA(FH); break;
case HUNK_BSS: DoHUNK_BSS(FH); break;
case HUNK_END: DoHUNK_END(FH); break;
case HUNK_RELOC32: DoHUNK_RELOC32(FH); break;
case HUNK_RELOC32SHORT: DoHUNK_RELOC32SHORT(FH); break;
case HUNK_DREL32: DoHUNK_DREL32(FH); break;
case HUNK_OVERLAY: DoHUNK_OVERLAY(FH); break;
case HUNK_BREAK: DoHUNK_BREAK(FH); break;
case HUNK_DEBUG: DoHUNK_DEBUG(FH); break;
case HUNK_SYMBOL: DoHUNK_SYMBOL(FH); break;
case HUNK_UNIT: DoHUNK_UNIT(FH); break;
case HUNK_NAME: DoHUNK_NAME(FH); break;
case HUNK_EXT: DoHUNK_EXT(FH); break;
default: DoUNKNOWN(FH); break;
}
TestAbort();
}
while( (Flag_EOF == FALSE)
&& (Flag_UEOF == FALSE)
&& (Flag_Error == FALSE)
&& (Flag_BadId == FALSE)
&& (Flag_Break == FALSE)
&& (Flag_NotSup == FALSE) );
Printf("\n");
if (Flag_EOF)
{
Printf("\t\tEnd of file\n\n");
if (aa[ARG_STATS])
{
/* This test does not show all hunks! */
Printf(" Object Type: %s\n"
" Amt Hunks: %lu\n"
" Hunk_Header: %lu\n"
" Hunk_Code: %lu\n"
" Hunk_Data: %lu\n"
" Hunk_BSS: %lu\n"
" Hunk_End: %lu\n"
" Hunk_Overlay: %lu\n"
" Hunk_Break: %lu\n"
" Hunk_Symbol: %lu (total entries: %lu)\n"
" Hunk_Debug: %lu\n"
" Hunk_Reloc32: %lu (total entries: %lu, %lu bytes)\n"
" Hunk_Reloc32Sh: %lu (total entries: %lu, %lu bytes)\n"
" Hunk_DRel32: %lu (total entries: %lu, %lu bytes)\n"
" Hunks > Chip: %lu\n"
" Hunks > Fast: %lu\n"
" Hunks > Public: %lu\n"
" Advisory Hunks: %lu\n"
"\n"
" Amount of memory required to load program, approx: %lu (exe only)\n"
"\n",
(ULONG) (FFlag_Exe ? "Command file" : "Linkable object file"),
HunkCnt,
Cnt_Header,
Cnt_Code,
Cnt_Data,
Cnt_BSS,
Cnt_End,
Cnt_Overlay,
Cnt_Break,
Cnt_Symbol,
Cnt_SymbolEnt,
Cnt_Debug,
Cnt_Reloc32,
Cnt_Reloc32Ent,
Cnt_Reloc32Ent << 2,
Cnt_Reloc32Short,
Cnt_Reloc32SEnt,
Cnt_Reloc32SEnt << 2, /* Use real bytes here */
Cnt_DRel32,
Cnt_DRel32Ent,
Cnt_DRel32Ent << 2,
Cnt_HunksChip,
Cnt_HunksFast,
Cnt_HunksPub,
Cnt_HunksAdv,
TOTALAlloc );
}
}
else if (Flag_UEOF)
Printf("\t\tUnexpected end of file, bad file structure!\n\n");
else if (Flag_Error)
DoErr();
else if (Flag_BadId)
Printf("\t\tEncountered an unknown hunk type!\n");
else if (Flag_NotSup)
Printf("\t\tEncountered an unsupported hunk type!\n");
}
/***********************************************************************/
void DoHUNK_HEADER( BPTR FH )
{
ULONG HunkATInfo[4]; /* Hunk Allocation Table Info */
ULONG HunkASize;
ULONG HunkCnt;
ULONG HunkRange;
ULONG AllocFlags;
Cnt_Header++;
FFlag_Exe = TRUE;
Printf("\n\tOffset: 0x%08lx - 0x%08lx - HUNK_HEADER\n",
HunkOffset, HunkOrgId);
if (MyRead(FH, &HunkATInfo, 4*4)) return; /* Read 4 LONGs */
Printf("\t\tAmt of hunks in alloc table: %lu (%lu to %lu)\n",
HunkATInfo[1], /* Amt */
HunkATInfo[2], /* Rng1 */
HunkATInfo[3] /* Rng2 */ );
HunkRange=(HunkATInfo[3]-HunkATInfo[2])+1; /* (Rng2-Rng1) + 1 */
for (HunkCnt = 0; HunkCnt < HunkRange ; HunkCnt++)
{
if (MyRead(FH, &HunkASize, 4)) return;
AllocFlags = HunkASize & MASK; /* Keep alloc flags */
BuildFlagString(HunkASize, TempBuffer);
if (AllocFlags & HUNKF_ADVISORY) Cnt_HunksAdv++;
else if (AllocFlags & HUNKF_FAST) Cnt_HunksFast++;
else if (AllocFlags & HUNKF_CHIP) Cnt_HunksChip++;
else Cnt_HunksPub++;
HunkASize &= ~MASK; /* remove flags */
TOTALAlloc += (HunkASize << 2);
Printf("\t\tHunk %3lu, length %9lu %s\n",
HunkCnt, HunkASize * 4, &TempBuffer );
if (TestAbort()) return;
}
}
/***********************************************************************/
void DoHUNK_CODE( BPTR FH )
{
ULONG HunkLength;
Cnt_Code++;
Printf("Hnk #%lu\tOffset: 0x%08lx - 0x%08lx - HUNK_CODE\n",
HunkCnt++, HunkOffset, HunkOrgId );
if (MyRead(FH, &HunkLength, 4)) return;
HunkLength *= 4;
BuildFlagString(HunkOrgId, TempBuffer);
Printf("\t\tRead length - %lu %s\n",
HunkLength, (ULONG)TempBuffer );
if (MoveForward(FH, HunkLength)) return;
}
/***********************************************************************/
void DoHUNK_DATA( BPTR FH )
{
ULONG HunkLength;
Cnt_Data++;
Printf("Hnk #%lu\tOffset: 0x%08lx - 0x%08lx - HUNK_DATA\n",
HunkCnt++, HunkOffset, HunkOrgId, &stream);
if (MyRead(FH, &HunkLength, 4)) return; HunkLength *= 4;
BuildFlagString(HunkOrgId, TempBuffer);
Printf("\t\tRead length - %lu %s\n",
HunkLength, TempBuffer );
if (MoveForward(FH, HunkLength)) return;
}
/***********************************************************************/
void DoHUNK_BSS( BPTR FH )
{
ULONG HunkLength;
Cnt_BSS++;
Printf("Hnk #%lu\tOffset: 0x%08lx - 0x%08lx - HUNK_BSS\n",
HunkCnt++, HunkOffset, HunkOrgId );
if (MyRead(FH, &HunkLength, 4)) return; HunkLength*=4;
BuildFlagString(HunkOrgId, TempBuffer);
Printf("\t\tAllocation length - %lu %s\n",
HunkLength, TempBuffer );
}
/***********************************************************************/
void DoHUNK_END( BPTR FH )
{
Cnt_End++;
Printf("\tOffset: 0x%08lx - 0x%08lx - HUNK_END\n",
HunkOffset, HunkOrgId );
}
/***********************************************************************/
void DoHUNK_OVERLAY( BPTR FH )
{
ULONG HunkLength;
Cnt_Overlay++;
Printf("Hnk #%lu\tOffset: 0x%08lx - 0x%08lx - HUNK_OVERLAY\n",
HunkCnt++, HunkOffset, HunkOrgId );
if (MyRead(FH, &HunkLength, 4)) return; HunkLength*=4;
BuildFlagString(HunkOrgId, TempBuffer);
Printf("\t\tLength - %lu %s\n",
HunkLength, TempBuffer );
if (MoveForward(FH, HunkLength+4)) return;
}
/***********************************************************************/
void DoHUNK_BREAK( BPTR FH )
{
Cnt_Break++;
Printf("\tOffset: 0x%08lx - 0x%08lx - HUNK_BREAK\n",
HunkOffset, HunkOrgId );
}
/***********************************************************************/
void DoHUNK_DEBUG( BPTR FH )
{
ULONG HunkLength;
Cnt_Debug++;
Printf("\tOffset: 0x%08lx - 0x%08lx - HUNK_DEBUG\n",
HunkOffset, HunkOrgId, &stream);
if (MyRead(FH, &HunkLength, 4)) return; HunkLength *= 4;
BuildFlagString(HunkOrgId, TempBuffer);
Printf("\t\tLength - %lu\n", HunkLength, TempBuffer );
if (MoveForward(FH, HunkLength)) return;
}
/***********************************************************************/
/* Length, <........>, Offset */
/* TODO: Merge this hunk with HUNK_EXT, because both are identical */
void DoHUNK_SYMBOL( BPTR FH )
{
APTR SymBuf;
ULONG SymCnt,SymLen,SymOffset;
ULONG R1,R2;
Cnt_Symbol++;
Printf("\tOffset: 0x%08lx - 0x%08lx - HUNK_SYMBOL\n",
HunkOffset, HunkOrgId );
for(SymCnt = 0;;)
{
if (MyRead(FH, &SymLen, 4)) return;
if (SymLen == NULL) break;
if (aa[ARG_DSYM])
{
if (SymBuf = (APTR)AllocVec( (SymLen + 1) * 4, MEMF_CLEAR))
{
R1 = MyRead(FH, SymBuf, SymLen*4); /* Read symbol */
R2 = MyRead(FH, &SymOffset, 4); /* Read offset */
Printf( "\t\t[%-30.30s] at 0x%08lx (%lu)\n",
SymBuf, SymOffset, SymOffset );
FreeVec(SymBuf);
if (R1 || R2) return;
}
else
if (MoveForward(FH, (SymLen+1)*4)) return; /* Skip symbol + offset */
}
else
if (MoveForward(FH, (SymLen+1)*4)) return; /* Skip symbol + offset */
if (TestAbort()) return;
SymCnt++;
}
Printf("\t\tContains %lu symbol entr%s\n",
SymCnt, Plural( SymCnt, "y", "ies" ));
Cnt_SymbolEnt += SymCnt;
}
/***********************************************************************/
/* Amount, Hunk, <........> */
void DoHUNK_RELOC32( BPTR FH )
{
ULONG RelocAmt,RelocHunk;
Cnt_Reloc32++;
Printf("\tOffset: 0x%08lx - 0x%08lx - HUNK_RELOC32\n",
HunkOffset, HunkOrgId );
for(;;)
{
if (MyRead(FH, &RelocAmt, 4)) return;
if (RelocAmt == NULL) break; /* End of table? */
if (MyRead(FH, &RelocHunk, 4)) return;
Cnt_Reloc32Ent+=RelocAmt;
Printf("\t\t%lu reference%s to hunk #%lu\n",
RelocAmt, Plural(RelocAmt, "", "s"), RelocHunk );
if (aa[ARG_DREL])
{
while (RelocAmt--)
{
ULONG Rel32;
if (MyRead(FH, &Rel32, 4)) return;
Printf("\t\tRelocate offset 0x%08lx using hunk base #%lu\n",
Rel32, RelocHunk );
if (TestAbort()) return;
}
}
else if (MoveForward(FH, RelocAmt*4)) return;
}
}
/***********************************************************************/
void DoHUNK_DREL32( BPTR FH )
{
UWORD RelocAmt, RelocHunk, RelocEntry;
ULONG POF;
Printf("\tOffset: 0x%08lx - 0x%08lx - HUNK_DREL32\n",
HunkOffset, HunkOrgId );
Cnt_DRel32++;
for(;;)
{
if (MyRead(FH, &RelocAmt, 2)) return;
if (RelocAmt == NULL) break; /* End of table? */
if (MyRead(FH, &RelocHunk, 2)) return;
Cnt_DRel32Ent += RelocAmt;
Printf("\t\t%lu reference%s to hunk #%lu\n",
(ULONG) RelocAmt,
Plural(RelocAmt, "", "s"),
(ULONG) RelocHunk );
stream[1] = RelocHunk;
if (aa[ARG_DREL])
{
while (RelocAmt--)
{
if (MyRead(FH, &RelocEntry, 2)) return;
Printf("\t\tRelocate offset 0x%04lx using hunk base #%lu\n",
(ULONG) RelocEntry, (ULONG) RelocHunk );
if (TestAbort()) return;
}
}
else if (MoveForward(FH, RelocAmt*2)) return;
}
POF = Seek(FH, 0, OFFSET_CURRENT);
/* If we are not on a LONG boundary then align... */
if ((POF >> 2) << 2 != POF)
if (MoveForward(FH, 2)) return; /* Alignment fix */
}
/***********************************************************************/
void DoHUNK_RELOC32SHORT( BPTR FH )
{
UWORD RelocAmt,RelocHunk;
UWORD RelocEntry;
ULONG POF;
Cnt_Reloc32Short++;
Printf("\tOffset: 0x%08lx - 0x%08lx - HUNK_RELOC32SHORT\n",
(ULONG) HunkOffset, (ULONG) HunkOrgId );
for(;;)
{
if (MyRead(FH, &RelocAmt, 2)) return;
if (RelocAmt == NULL) break; /* End of table? */
if (MyRead(FH, &RelocHunk, 2)) return;
Cnt_Reloc32SEnt += RelocAmt;
Printf("\t\t%lu reference%s to hunk #%lu\n",
(ULONG)RelocAmt,
Plural(RelocAmt, "", "s"),
(ULONG)RelocHunk );
stream[1] = RelocHunk;
if (aa[ARG_DREL])
{
while (RelocAmt--)
{
if (MyRead(FH, &RelocEntry, 2)) return;
Printf("\t\tRelocate offset 0x%04lx using hunk base #%lu\n",
(ULONG) RelocEntry, (ULONG) RelocHunk );
if (TestAbort()) return;
}
}
else if (MoveForward(FH, RelocAmt * 2)) return;
}
POF = Seek(FH, 0, OFFSET_CURRENT);
/* If we are not on a LONG boundary then align... */
if ((POF >> 2) << 2 != POF)
if (MoveForward(FH, 2)) return; /* Alignment fix */
}
/***********************************************************************/
void DoHUNK_UNIT( BPTR FH )
{
ULONG NameLen;
APTR NameBuf;
FFlag_Obj = TRUE;
Printf("\tOffset: 0x%08lx - 0x%08lx - HUNK_UNIT\n",
HunkOffset, HunkOrgId );
if (MyRead(FH, &NameLen, 4)) return; /* Get length of name */
if ( NameBuf = (APTR) AllocVec( (NameLen + 1) * 4, MEMF_CLEAR) )
{
if (MyRead(FH, NameBuf, NameLen*4)) return;
Printf("\t\tUnit name: %.40s\n", NameBuf);
FreeVec(NameBuf);
}
else if (MoveForward(FH, NameLen*4)) return;
}
/***********************************************************************/
void DoHUNK_NAME( BPTR FH )
{
ULONG NameLen;
APTR NameBuf;
Printf("\tOffset: 0x%08lx - 0x%08lx - HUNK_NAME\n",
HunkOffset, HunkOrgId );
if (MyRead(FH, &NameLen, 4)) return; /* Get length of name */
if (NameBuf = (APTR) AllocVec((NameLen+1)*4, MEMF_CLEAR))
{
if (MyRead(FH, NameBuf, NameLen*4)) return;
Printf("\t\tHunk name: %.40s\n", NameBuf);
FreeVec(NameBuf);
}
else if (MoveForward(FH, NameLen*4)) return;
}
/***********************************************************************/
#define EXT_NEWCOMMON 4 /* 5? */
void DoHUNK_EXT( BPTR FH )
{
APTR ExtTypeStr;
UBYTE ExtType;
UWORD ExtLen;
ULONG ExtOffset;
ULONG RefCnt;
ULONG ComSize;
APTR ExtSymBuf;
ULONG R1,R2,R3; /* Results, Used for IO error checking */
Printf("\tOffset: 0x%08lx - 0x%08lx - HUNK_EXT\n",
HunkOffset, HunkOrgId );
for (;;)
{
R1 = MyRead(FH, &ExtType, 1); /* Read ext type */
R2 = MoveForward(FH, 1); /* Alignment fix */
R3 = MyRead(FH, &ExtLen, 2); /* Read ext length */
if (R1 || R2 || R3) return;
if (ExtLen == NULL) break; /* End of ext hunk? */
switch(ExtType)
{
case EXT_SYMB: ExtTypeStr = "EXT_SYMB"; goto XDEF;
case EXT_DEF: ExtTypeStr = "EXT_DEF"; goto XDEF;
case EXT_ABS: ExtTypeStr = "EXT_ABS"; goto XDEF;
case EXT_RES: ExtTypeStr = "EXT_RES";
XDEF: /* sym def, XDEF */
if (ExtSymBuf = (APTR)AllocVec((ExtLen+2)*4, MEMF_CLEAR))
{
R1 = MyRead(FH, ExtSymBuf, (ExtLen*4)); /* Read ext symbol */
R2 = MyRead(FH, &ExtOffset, 4); /* Read common size */
if (aa[ARG_DEXT])
{
Printf("\t\t%-14.14s [%-30.30s] = 0x%08lx\n",
(ULONG) ExtTypeStr, (ULONG) ExtSymBuf, ExtOffset );
}
FreeVec(ExtSymBuf);
if (R1 || R2) return;
}
else
{
R1 = MyRead(FH, &ExtOffset, 4); /* Read common size */
R2 = MoveForward(FH, ExtLen*4); /* Skip ext symbol */
if (R1 || R2) return;
}
break;
case EXT_COMMON: ExtTypeStr = "EXT_COMMON";
COMMONREF: /* common ref */
if (ExtSymBuf = (APTR) AllocVec((ExtLen+2)*4, MEMF_CLEAR))
{
R1 = MyRead(FH, ExtSymBuf ,(ExtLen*4)+4); /* Read ext symbol to buffer */
R2 = MyRead(FH, &ComSize, 4); /* Read common size */
R3 = MyRead(FH, &RefCnt, 4); /* Read ref count */
R3 = MoveForward(FH, RefCnt*4); /* Skip reference entries */
if (aa[ARG_DEXT]) /* Does use want to see ext info? */
{
Printf("\t\t%-14.14s [%-30.30s] cs: %lu ref%s: %lu\n",
(ULONG) ExtTypeStr,
(ULONG) ExtSymBuf,
(ULONG) Plural(RefCnt, "", "s"),
ComSize,
RefCnt ); /* Check text bounds */
}
FreeVec(ExtSymBuf);
if (R1 || R2 || R3) return;
}
else /* If unable to alloc sym buf then Seek() */
{
R1 = MoveForward(FH, (ExtLen*4)+8); /* Skip symbol + common size*/
R2 = MoveForward(FH, 4); /* Skip ref count */
R3 = MoveForward(FH, RefCnt*4); /* Skip refs */
if (R1 || R2 || R3) return;
}
break;
case EXT_REF32: ExtTypeStr = "EXT_REF32"; goto XREF;
case EXT_REF16: ExtTypeStr = "EXT_REF16"; goto XREF;
case EXT_REF8: ExtTypeStr = "EXT_REF8"; goto XREF;
case EXT_DEXT32: ExtTypeStr = "EXT_DEXT32"; goto XREF;
case EXT_DEXT16: ExtTypeStr = "EXT_DEXT16"; goto XREF;
case EXT_DEXT8: ExtTypeStr = "EXT_DEXT8"; goto XREF;
case EXT_RELREF32: ExtTypeStr = "EXT_RELREF32"; goto XREF;
case EXT_RELCOMMON: ExtTypeStr = "EXT_RELCOMMON"; goto XREF;
case EXT_ABSREF16: ExtTypeStr = "EXT_ABSREF16"; goto XREF;
case EXT_ABSREF8: ExtTypeStr = "EXT_ABSREF8";
XREF: /* sym ref, XREF */
if (ExtSymBuf = (APTR) AllocVec((ExtLen*4)+4, MEMF_CLEAR))
{
R1 = MyRead(FH, ExtSymBuf, ExtLen*4); /* Read symbol */
R2 = MyRead(FH, &RefCnt, 4); /* Read ref count */
R3 = MoveForward(FH, RefCnt*4); /* Skip references */
if (aa[ARG_DEXT])
{
Printf("\t\t%-14.14s [%-30.30s] ref%s: %lu\n",
(ULONG) ExtTypeStr,
(ULONG) ExtSymBuf,
(ULONG) Plural(RefCnt, "", "s"),
RefCnt ); /* Check text bounds */
}
FreeVec(ExtSymBuf);
if (R1 || R2 || R3) return;
}
else
{
R1 = MoveForward(FH, ExtLen*4); /* Skip symbol */
R2 = MyRead(FH, &RefCnt, 4); /* Get ref count */
R3 = MoveForward(FH, RefCnt*4); /* Skip references */
if (R1 || R2 || R3) return;
}
break;
}
if (TestAbort()) break;
}
}
/***********************************************************************/
void DoUNKNOWN( BPTR FH )
{
Printf("\tOffset: 0x%08lx - 0x%08lx - Unknown hunk!!!\n",
HunkOffset, HunkOrgId );
Flag_BadId = TRUE;
}
/***********************************************************************/
ULONG MoveForward( BPTR FH, LONG Length)
{
LONG Result = Seek(FH, Length, OFFSET_CURRENT);
if (Result == -1)
{
Flag_Error = TRUE;
return(-1);
}
else
return(NULL);
}
/***********************************************************************/
BOOL TestAbort( void )
{
if (CheckSignal(SIGBREAKF_CTRL_C) & SIGBREAKF_CTRL_C)
{
Printf("\n***Break:\n\n");
Flag_Break = TRUE;
return(TRUE);
}
else
return(FALSE);
}
/***********************************************************************/
void BuildFlagString( ULONG Flags, UBYTE *Buf)
{
/* move.b d0,(a3)+ \n rts */
static UWORD putChProc[] = { 0x16c0, 0x4e75 };
stream[0] = (ULONG)"";
stream[1] = (ULONG)"";
stream[2] = (ULONG)"";
Flags &= MASK; /* remove unwanted size */
if (Flags & HUNKF_CHIP)
stream[0] = (ULONG)"[Load to Chip] ";
if (Flags & HUNKF_FAST)
stream[1] = (ULONG)"[Load to Fast] ";
if (Flags & HUNKF_ADVISORY)
stream[2] = (ULONG)"[Advisory]";
RawDoFmt("%s%s%s", &stream, (void *) &putChProc, Buf);
}
/***********************************************************************/
LONG MyRead( BPTR FH, APTR Buf, ULONG Length)
{
LONG Result;
if (!Length) return 0; /* If user passes NULL, then return */
Result = FRead(FH, Buf, Length, 1);
if (Result != 1)
{
Flag_UEOF = TRUE;
return -1; /* Not OK */
}
else
{
return 0; /* OK */
}
}
/***********************************************************************/
UBYTE *Plural( ULONG Val, UBYTE *One, UBYTE *Many)
{
if (Val == 1) return(One); else return(Many);
}