/* 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); }