home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Club Amiga de Montreal - CAM
/
CAM_CD_1.iso
/
files
/
029.lha
/
StructureBrowser
/
sb.c
< prev
next >
Wrap
C/C++ Source or Header
|
1987-04-02
|
7KB
|
250 lines
/* The Transactor Structure Browser (SB) V1.0
* From Transactor Magazine, Volume 7, Issue 6
*
* By Nick Sullivan and Chris Zamara (AHA!) (c) 1986
*
* SB displays system structures via pointers found
* in other structures. You start from IntuitionBase.
*
* Structures implemented in V1.0:
* IntuitionBase, Window, Screen, RastPort, BitMap, Gadget
*
* Usage is through Intuition, clicking on a structure member
* names to display info or a new structure.
*
* ***** THIS PROGRAM MAY BE FREELY DISTRIBUTED *****
*/
/* include not needed for Aztec C using provided makefile */
/* I keep all the files in directory sb on df1:
* To keep the system happy, I 'ASSIGN SB: DF1:SB' then 'CD SB:'. GG.
*/
#include "sb:sb.h"
#define MIN(x,y) ((x)<(y)?(x):(y))
#define FLAGFIELDS 4
extern struct IntuitionBase *IntuitionBase;
extern struct IntuiText ChoiceText[], BackIText;
APTR OpenLibrary ();
int level = 0; /* current level of nesting */
static char textlines[MAXGADG + 1][80];
extern void PrIntuiBase(), HexLine();
void main()
{
int choice = -1;
SetupGadg();
OpenStuff(); /* open intuition library & window */
while (choice) {
putHeader("Choose a library structure", NULL);
ChoiceText[0].IText = (UBYTE *)" Intuition struct Library";
BackIText.IText = (UBYTE *)" Quit Program";
switch (choice = GetChoice(1)) {
case 1:
PrIntuiBase ("The IntuitionBase structure", IntuitionBase);
break;
}
}
CloseOut();
}
void PrIntuiBase (string, IBase) char *string; struct IntuitionBase *IBase;
{
static struct StructData structdata[] = {
{ "(LibMode", "struct Library)", 0, SZ(Library) },
{ "(ViewLord", "struct View)", 0, SZ(View) },
{ " ActiveWindow", "struct Window *", 5, PTRSIZE },
{ " ActiveScreen", "struct Screen *", 5, PTRSIZE },
{ " FirstScreen", "struct Screen *", 5, PTRSIZE }
};
int sum, choice = -1;
level++;
while (choice) {
sum = SetOptionText(string, structdata, (APTR)IBase, DATASIZE, 0);
switch (choice = GetChoice(DATASIZE)) {
case 3:
if (IBase->ActiveWindow)
PrWindow("The currently active window", IBase->ActiveWindow);
break;
case 4:
PrScreen("The currently active screen", IBase->ActiveScreen);
break;
case 5:
PrScreen("The first screen on Intuition's list", IBase->FirstScreen);
break;
}
}
level--;
}
void put (option, stuff, base, offset)
int option; struct StructData *stuff; char *base; int offset;
{
register long lnum;
register int inum;
char buf[40];
int i;
sprintf(textlines[option], "%-16s%-24s", stuff->membername, stuff->membertype);
switch (stuff->printtype) {
case 0: /* don't print anything */
buf[0] = '\0';
break;
case 1: /* print a long */
lnum = *(long *)(base + offset);
sprintf(buf, "$%8lx %0ld", lnum, lnum);
break;
case 2: /* print an int */
inum = *(short *)(base + offset);
sprintf(buf, "$%8x %10d", inum, inum);
break;
case 3: /* print a byte */
inum = *(base + offset);
sprintf(buf, "$%8x %10d", inum, inum);
break;
case 4: /* print a string */
if (!(lnum = *(long *)(base + offset) ))
sprintf(buf, "NULL");
else {
for (i = 0; i < 30 && *((char *)lnum + i); i++)
buf[i + 1] = *((char *)lnum + i);
buf[0] = buf[i + 1] = '\"';
buf[i + 2] = '\0';
if (*((char *)lnum + i))
strcat(buf, "...");
}
break;
case 5: /* print a pointer */
if (!(lnum = *(long *)(base + offset) ))
sprintf(buf, "NULL");
else
sprintf(buf, "$%8lx %10ld", lnum, lnum);
break;
case 11: /* print a long */
lnum = *(long *)(base + offset);
sprintf(buf, "$%8lx %10lu", lnum, lnum);
break;
case 12: /* print an int */
inum = *(short *)(base + offset);
sprintf(buf, "$%8x %10u", inum, inum);
break;
case 13: /* print a byte */
inum = *(base + offset);
sprintf(buf, "$%8x %10u", inum, inum);
break;
}
strcat(textlines[option], buf);
ChoiceText[option].IText = (UBYTE *)textlines[option];
}
void FlagPrint(string, names, flags)
char *string, **names; ULONG flags;
{
int i, line, fields = FLAGFIELDS;
char buf[32];
SetBackText(1); /* 'prev level' */
for (i = 0; i < 8; i++) {
strcpy(textlines[i], "-");
ChoiceText[i].IText = (UBYTE *)textlines[i];
}
putHeader(string, NULL);
for (i = line = 0; i < 32; i++) {
if ((flags & (1L << i)) && names[i]) {
sprintf(buf, "%-19s", names[i]);
strcat(textlines[line], buf);
if (!--fields) {
ChoiceText[line].IText = (UBYTE *)textlines[line];
line++;
fields = FLAGFIELDS;
}
}
}
if (fields < FLAGFIELDS)
ChoiceText[line].IText = (UBYTE *)textlines[line];
while (GetChoice(line + 1))
;
}
void HexDump(string, address, unit, size)
char *address, *string; int unit; long size;
{
int line = 0, c;
char *buf[80];
BackIText.IText = (UBYTE *)" Exit Hex Dump ";
if (size == -1)
size = 0x7ffff;
do {
sprintf(buf, "%s from %lx (%ld)", string, address, address);
putHeader(buf, NULL);
if (line == MAXGADG)
line = 0;
while (line < MAXGADG && size > 0) {
HexLine(address, unit, line++, size);
size -= 16;
address += 16;
}
c = GetChoice(size > 0 ? MAXGADG + 1 : line);
} while (size > 0 && c == MOREGADG);
}
void HexLine (address, unit, line, size)
UBYTE *address; int unit, line; long size;
{
USHORT i, j;
char buf[80];
static char hexdigit[] = "0123456789ABCDEF";
sprintf(textlines[line], "-%6lx: ", address);
for (i = 0; i < MIN(size, 16); i += unit) {
switch (unit) {
case BYTESIZE:
j = *(address + i);
sprintf(buf, "%c%c ", hexdigit[j / 16], hexdigit[j % 16]);
break;
case INTSIZE:
sprintf(buf, "%04x ", *(short *)(address + i));
break;
case PTRSIZE:
sprintf(buf, "%08lx ", *(long *)(address + i));
break;
}
strcat(textlines[line], buf);
}
ChoiceText[line].IText = (UBYTE *)textlines[line];
}
int SetOptionText (hdrtext, data, object, size, offset)
char *hdrtext;
struct StructData *data;
APTR object;
int size, offset;
{
int i, sum;
SetBackText( offset ? 1 : 0);
putHeader(hdrtext, object);
for (i = sum = 0; i < size; i++) {
put(i, &data[i], object, sum + offset);
sum += data[i].datasize;
}
return (sum + offset);
}
void PrString(heading, string) char *heading, *string;
{
char *newstring, *malloc();
putHeader(heading, NULL);
newstring = malloc(strlen(string) + 1);
*newstring = '-';
strcpy(newstring + 1, string);
ChoiceText[0].IText = (UBYTE *)newstring;
GetChoice(1);
free(newstring);
}