#include "copyright.h"
#include "config.h"
#include "db.h"
#include "externs.h"
#include "interface.h"
#include "inst.h"
void disassemble(dbref player, dbref program)
{
inst *curr;
inst *codestart;
int i;
char buf[BUFFER_LEN];
codestart = curr = DBFETCH(program)->sp.program.code;
if (!DBFETCH(program)->sp.program.siz)
{
notify(player, player, "Nothing to disassemble!");
return;
}
for (i = 0; i < DBFETCH(program)->sp.program.siz; i++, curr++)
{
switch(curr->type)
{
case PROG_PRIMITIVE:
if (curr->data.number >= BASE_MIN && curr->data.number <= BASE_MAX)
sprintf(buf, "%d: PRIMITIVE: %s",
i, base_inst[curr->data.number-BASE_MIN]);
else sprintf(buf, "%d: PRIMITIVE: %d", i, curr->data.number);
break;
case PROG_STRING:
sprintf(buf, "%d: STRING: \"%s\"", i, curr->data.string ?
curr->data.string : "");
break;
case PROG_INTEGER:
sprintf(buf, "%d: INTEGER: %ld", i, curr->data.number);
break;
case PROG_FLOAT:
sprintf(buf, "%d: FLOAT: %G", i, curr->data.fnum);
break;
case PROG_ADD:
sprintf(buf, "%d: ADDRESS: %d", i, curr->data.call - codestart);
break;
case PROG_OBJECT:
sprintf(buf, "%d: OBJECT REF: %ld", i, curr->data.number);
break;
case PROG_VAR:
sprintf(buf, "%d: VARIABLE: %ld", i, curr->data.number);
}
notify(player, player, buf);
}
}