aboutsummaryrefslogtreecommitdiff
path: root/engines/sci/scicore/script.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'engines/sci/scicore/script.cpp')
-rw-r--r--engines/sci/scicore/script.cpp809
1 files changed, 408 insertions, 401 deletions
diff --git a/engines/sci/scicore/script.cpp b/engines/sci/scicore/script.cpp
index c2d0027fbe..3c2b576eb6 100644
--- a/engines/sci/scicore/script.cpp
+++ b/engines/sci/scicore/script.cpp
@@ -34,455 +34,462 @@
#define END Script_None
-opcode_format formats[128][4]={
- /*00*/
- {Script_None}, {Script_None}, {Script_None}, {Script_None},
- /*04*/
- {Script_None}, {Script_None}, {Script_None}, {Script_None},
- /*08*/
- {Script_None}, {Script_None}, {Script_None}, {Script_None},
- /*0C*/
- {Script_None}, {Script_None}, {Script_None}, {Script_None},
- /*10*/
- {Script_None}, {Script_None}, {Script_None}, {Script_None},
- /*14*/
- {Script_None}, {Script_None}, {Script_None}, {Script_SRelative, END},
- /*18*/
- {Script_SRelative, END}, {Script_SRelative, END}, {Script_SVariable, END}, {Script_None},
- /*1C*/
- {Script_SVariable, END}, {Script_None}, {Script_None}, {Script_Variable, END},
- /*20*/
- {Script_SRelative, Script_Byte, END}, {Script_Variable, Script_Byte, END}, {Script_Variable, Script_Byte, END}, {Script_Variable, Script_SVariable, Script_Byte, END},
- /*24 (24=ret)*/
- {Script_End}, {Script_Byte, END}, {Script_Invalid}, {Script_Invalid},
- /*28*/
- {Script_Variable, END}, {Script_Invalid}, {Script_Byte, END}, {Script_Variable, Script_Byte, END},
- /*2C*/
- {Script_SVariable, END}, {Script_SVariable, Script_Variable, END}, {Script_None}, {Script_Invalid},
- /*30*/
- {Script_None}, {Script_Property, END}, {Script_Property, END}, {Script_Property, END},
- /*34*/
- {Script_Property, END}, {Script_Property, END}, {Script_Property, END}, {Script_Property, END},
- /*38*/
- {Script_Property, END}, {Script_SRelative, END}, {Script_SRelative, END}, {Script_None},
- /*3C*/
- {Script_None}, {Script_None}, {Script_None}, {Script_Invalid},
- /*40-4F*/
- {Script_Global, END}, {Script_Local, END}, {Script_Temp, END}, {Script_Param, END},
- {Script_Global, END}, {Script_Local, END}, {Script_Temp, END}, {Script_Param, END},
- {Script_Global, END}, {Script_Local, END}, {Script_Temp, END}, {Script_Param, END},
- {Script_Global, END}, {Script_Local, END}, {Script_Temp, END}, {Script_Param, END},
- /*50-5F*/
- {Script_Global, END}, {Script_Local, END}, {Script_Temp, END}, {Script_Param, END},
- {Script_Global, END}, {Script_Local, END}, {Script_Temp, END}, {Script_Param, END},
- {Script_Global, END}, {Script_Local, END}, {Script_Temp, END}, {Script_Param, END},
- {Script_Global, END}, {Script_Local, END}, {Script_Temp, END}, {Script_Param, END},
- /*60-6F*/
- {Script_Global, END}, {Script_Local, END}, {Script_Temp, END}, {Script_Param, END},
- {Script_Global, END}, {Script_Local, END}, {Script_Temp, END}, {Script_Param, END},
- {Script_Global, END}, {Script_Local, END}, {Script_Temp, END}, {Script_Param, END},
- {Script_Global, END}, {Script_Local, END}, {Script_Temp, END}, {Script_Param, END},
- /*70-7F*/
- {Script_Global, END}, {Script_Local, END}, {Script_Temp, END}, {Script_Param, END},
- {Script_Global, END}, {Script_Local, END}, {Script_Temp, END}, {Script_Param, END},
- {Script_Global, END}, {Script_Local, END}, {Script_Temp, END}, {Script_Param, END},
- {Script_Global, END}, {Script_Local, END}, {Script_Temp, END}, {Script_Param, END}
+opcode_format formats[128][4] = {
+ /*00*/
+ {Script_None}, {Script_None}, {Script_None}, {Script_None},
+ /*04*/
+ {Script_None}, {Script_None}, {Script_None}, {Script_None},
+ /*08*/
+ {Script_None}, {Script_None}, {Script_None}, {Script_None},
+ /*0C*/
+ {Script_None}, {Script_None}, {Script_None}, {Script_None},
+ /*10*/
+ {Script_None}, {Script_None}, {Script_None}, {Script_None},
+ /*14*/
+ {Script_None}, {Script_None}, {Script_None}, {Script_SRelative, END},
+ /*18*/
+ {Script_SRelative, END}, {Script_SRelative, END}, {Script_SVariable, END}, {Script_None},
+ /*1C*/
+ {Script_SVariable, END}, {Script_None}, {Script_None}, {Script_Variable, END},
+ /*20*/
+ {Script_SRelative, Script_Byte, END}, {Script_Variable, Script_Byte, END}, {Script_Variable, Script_Byte, END}, {Script_Variable, Script_SVariable, Script_Byte, END},
+ /*24 (24=ret)*/
+ {Script_End}, {Script_Byte, END}, {Script_Invalid}, {Script_Invalid},
+ /*28*/
+ {Script_Variable, END}, {Script_Invalid}, {Script_Byte, END}, {Script_Variable, Script_Byte, END},
+ /*2C*/
+ {Script_SVariable, END}, {Script_SVariable, Script_Variable, END}, {Script_None}, {Script_Invalid},
+ /*30*/
+ {Script_None}, {Script_Property, END}, {Script_Property, END}, {Script_Property, END},
+ /*34*/
+ {Script_Property, END}, {Script_Property, END}, {Script_Property, END}, {Script_Property, END},
+ /*38*/
+ {Script_Property, END}, {Script_SRelative, END}, {Script_SRelative, END}, {Script_None},
+ /*3C*/
+ {Script_None}, {Script_None}, {Script_None}, {Script_Invalid},
+ /*40-4F*/
+ {Script_Global, END}, {Script_Local, END}, {Script_Temp, END}, {Script_Param, END},
+ {Script_Global, END}, {Script_Local, END}, {Script_Temp, END}, {Script_Param, END},
+ {Script_Global, END}, {Script_Local, END}, {Script_Temp, END}, {Script_Param, END},
+ {Script_Global, END}, {Script_Local, END}, {Script_Temp, END}, {Script_Param, END},
+ /*50-5F*/
+ {Script_Global, END}, {Script_Local, END}, {Script_Temp, END}, {Script_Param, END},
+ {Script_Global, END}, {Script_Local, END}, {Script_Temp, END}, {Script_Param, END},
+ {Script_Global, END}, {Script_Local, END}, {Script_Temp, END}, {Script_Param, END},
+ {Script_Global, END}, {Script_Local, END}, {Script_Temp, END}, {Script_Param, END},
+ /*60-6F*/
+ {Script_Global, END}, {Script_Local, END}, {Script_Temp, END}, {Script_Param, END},
+ {Script_Global, END}, {Script_Local, END}, {Script_Temp, END}, {Script_Param, END},
+ {Script_Global, END}, {Script_Local, END}, {Script_Temp, END}, {Script_Param, END},
+ {Script_Global, END}, {Script_Local, END}, {Script_Temp, END}, {Script_Param, END},
+ /*70-7F*/
+ {Script_Global, END}, {Script_Local, END}, {Script_Temp, END}, {Script_Param, END},
+ {Script_Global, END}, {Script_Local, END}, {Script_Temp, END}, {Script_Param, END},
+ {Script_Global, END}, {Script_Local, END}, {Script_Temp, END}, {Script_Param, END},
+ {Script_Global, END}, {Script_Local, END}, {Script_Temp, END}, {Script_Param, END}
};
#undef END
-void script_adjust_opcode_formats(int res_version)
-{
- switch (res_version)
- {
- case SCI_VERSION_0:
- case SCI_VERSION_01:
- break;
- case SCI_VERSION_01_VGA:
- case SCI_VERSION_01_VGA_ODD:
- case SCI_VERSION_1_EARLY:
- case SCI_VERSION_1_LATE:
- formats[op_lofsa][0]=Script_Offset;
- formats[op_lofss][0]=Script_Offset;
- break;
- default:
- sciprintf("script_adjust_opcode_formats(): Unknown script version %d\n", res_version);
+void script_adjust_opcode_formats(int res_version) {
+ switch (res_version) {
+ case SCI_VERSION_0:
+ case SCI_VERSION_01:
+ break;
+ case SCI_VERSION_01_VGA:
+ case SCI_VERSION_01_VGA_ODD:
+ case SCI_VERSION_1_EARLY:
+ case SCI_VERSION_1_LATE:
+ formats[op_lofsa][0] = Script_Offset;
+ formats[op_lofss][0] = Script_Offset;
+ break;
+ default:
+ sciprintf("script_adjust_opcode_formats(): Unknown script version %d\n", res_version);
}
}
-
+
int
-script_find_selector(state_t *s, const char *selectorname)
-{
- int i;
- for (i = 0; i < s->selector_names_nr; i++)
- if (strcmp(selectorname, s->selector_names[i]) == 0)
- return i;
-
- sciprintf("Warning: Could not map '%s' to any selector!\n", selectorname);
- return -1;
+script_find_selector(state_t *s, const char *selectorname) {
+ int i;
+ for (i = 0; i < s->selector_names_nr; i++)
+ if (strcmp(selectorname, s->selector_names[i]) == 0)
+ return i;
+
+ sciprintf("Warning: Could not map '%s' to any selector!\n", selectorname);
+ return -1;
}
#define FIND_SELECTOR(_slc_, _slcstr_) map->_slc_ = script_find_selector(s, _slcstr_);
void
-script_map_selectors(state_t *s, selector_map_t *map)
-{
- map->init = script_find_selector(s, "init");
- map->play = script_find_selector(s, "play");
- FIND_SELECTOR(replay, "replay");
- map->x = script_find_selector(s, "x");
- map->y = script_find_selector(s, "y");
- map->z = script_find_selector(s, "z");
- map->priority = script_find_selector(s, "priority");
- map->view = script_find_selector(s, "view");
- map->loop = script_find_selector(s, "loop");
- map->cel = script_find_selector(s, "cel");
- FIND_SELECTOR(brLeft, "brLeft");
- FIND_SELECTOR(brRight, "brRight");
- FIND_SELECTOR(brTop, "brTop");
- FIND_SELECTOR(brBottom, "brBottom");
- FIND_SELECTOR(xStep, "xStep");
- FIND_SELECTOR(yStep, "yStep");
- FIND_SELECTOR(nsBottom, "nsBottom");
- FIND_SELECTOR(nsTop, "nsTop");
- FIND_SELECTOR(nsLeft, "nsLeft");
- FIND_SELECTOR(nsRight, "nsRight");
- FIND_SELECTOR(font, "font");
- FIND_SELECTOR(text, "text");
- FIND_SELECTOR(type, "type");
- FIND_SELECTOR(state, "state");
- FIND_SELECTOR(doit, "doit");
- FIND_SELECTOR(delete_, "delete");
- FIND_SELECTOR(signal, "signal");
- FIND_SELECTOR(underBits, "underBits");
- FIND_SELECTOR(canBeHere, "canBeHere");
- FIND_SELECTOR(client, "client");
- FIND_SELECTOR(dx, "dx");
- FIND_SELECTOR(dy, "dy");
- FIND_SELECTOR(xStep, "xStep");
- FIND_SELECTOR(yStep, "yStep");
- FIND_SELECTOR(b_movCnt, "b-moveCnt");
- FIND_SELECTOR(b_i1, "b-i1");
- FIND_SELECTOR(b_i2, "b-i2");
- FIND_SELECTOR(b_di, "b-di");
- FIND_SELECTOR(b_xAxis, "b-xAxis");
- FIND_SELECTOR(b_incr, "b-incr");
- FIND_SELECTOR(completed, "completed");
- FIND_SELECTOR(illegalBits, "illegalBits");
- FIND_SELECTOR(dispose, "dispose");
- FIND_SELECTOR(prevSignal, "prevSignal");
- FIND_SELECTOR(message, "message");
- FIND_SELECTOR(modifiers, "modifiers");
- FIND_SELECTOR(cue, "cue");
- FIND_SELECTOR(owner, "owner");
- FIND_SELECTOR(handle, "handle");
- FIND_SELECTOR(number, "number");
- FIND_SELECTOR(max, "max");
- FIND_SELECTOR(cursor, "cursor");
- FIND_SELECTOR(claimed, "claimed");
- FIND_SELECTOR(edgeHit, "edgeHit");
- FIND_SELECTOR(wordFail, "wordFail");
- FIND_SELECTOR(syntaxFail, "syntaxFail");
- FIND_SELECTOR(semanticFail, "semanticFail");
- FIND_SELECTOR(cycler, "cycler");
- FIND_SELECTOR(elements, "elements");
- FIND_SELECTOR(lsTop, "lsTop");
- FIND_SELECTOR(lsBottom, "lsBottom");
- FIND_SELECTOR(lsLeft, "lsLeft");
- FIND_SELECTOR(lsRight, "lsRight");
- FIND_SELECTOR(baseSetter, "baseSetter");
- FIND_SELECTOR(who, "who");
- FIND_SELECTOR(distance, "distance");
- FIND_SELECTOR(mover, "mover");
- FIND_SELECTOR(looper, "looper");
- FIND_SELECTOR(isBlocked, "isBlocked");
- FIND_SELECTOR(heading, "heading");
- FIND_SELECTOR(mode, "mode");
- FIND_SELECTOR(caller, "caller");
- FIND_SELECTOR(moveDone, "moveDone");
- FIND_SELECTOR(vol, "vol");
- FIND_SELECTOR(pri, "pri");
- FIND_SELECTOR(min, "min");
- FIND_SELECTOR(sec, "sec");
- FIND_SELECTOR(frame, "frame");
- FIND_SELECTOR(dataInc, "dataInc");
- FIND_SELECTOR(size, "size");
- FIND_SELECTOR(palette, "palette");
- FIND_SELECTOR(moveSpeed, "moveSpeed");
- FIND_SELECTOR(cantBeHere, "cantBeHere");
- FIND_SELECTOR(nodePtr, "nodePtr");
- FIND_SELECTOR(flags, "flags");
- FIND_SELECTOR(points, "points");
+script_map_selectors(state_t *s, selector_map_t *map) {
+ map->init = script_find_selector(s, "init");
+ map->play = script_find_selector(s, "play");
+ FIND_SELECTOR(replay, "replay");
+ map->x = script_find_selector(s, "x");
+ map->y = script_find_selector(s, "y");
+ map->z = script_find_selector(s, "z");
+ map->priority = script_find_selector(s, "priority");
+ map->view = script_find_selector(s, "view");
+ map->loop = script_find_selector(s, "loop");
+ map->cel = script_find_selector(s, "cel");
+ FIND_SELECTOR(brLeft, "brLeft");
+ FIND_SELECTOR(brRight, "brRight");
+ FIND_SELECTOR(brTop, "brTop");
+ FIND_SELECTOR(brBottom, "brBottom");
+ FIND_SELECTOR(xStep, "xStep");
+ FIND_SELECTOR(yStep, "yStep");
+ FIND_SELECTOR(nsBottom, "nsBottom");
+ FIND_SELECTOR(nsTop, "nsTop");
+ FIND_SELECTOR(nsLeft, "nsLeft");
+ FIND_SELECTOR(nsRight, "nsRight");
+ FIND_SELECTOR(font, "font");
+ FIND_SELECTOR(text, "text");
+ FIND_SELECTOR(type, "type");
+ FIND_SELECTOR(state, "state");
+ FIND_SELECTOR(doit, "doit");
+ FIND_SELECTOR(delete_, "delete");
+ FIND_SELECTOR(signal, "signal");
+ FIND_SELECTOR(underBits, "underBits");
+ FIND_SELECTOR(canBeHere, "canBeHere");
+ FIND_SELECTOR(client, "client");
+ FIND_SELECTOR(dx, "dx");
+ FIND_SELECTOR(dy, "dy");
+ FIND_SELECTOR(xStep, "xStep");
+ FIND_SELECTOR(yStep, "yStep");
+ FIND_SELECTOR(b_movCnt, "b-moveCnt");
+ FIND_SELECTOR(b_i1, "b-i1");
+ FIND_SELECTOR(b_i2, "b-i2");
+ FIND_SELECTOR(b_di, "b-di");
+ FIND_SELECTOR(b_xAxis, "b-xAxis");
+ FIND_SELECTOR(b_incr, "b-incr");
+ FIND_SELECTOR(completed, "completed");
+ FIND_SELECTOR(illegalBits, "illegalBits");
+ FIND_SELECTOR(dispose, "dispose");
+ FIND_SELECTOR(prevSignal, "prevSignal");
+ FIND_SELECTOR(message, "message");
+ FIND_SELECTOR(modifiers, "modifiers");
+ FIND_SELECTOR(cue, "cue");
+ FIND_SELECTOR(owner, "owner");
+ FIND_SELECTOR(handle, "handle");
+ FIND_SELECTOR(number, "number");
+ FIND_SELECTOR(max, "max");
+ FIND_SELECTOR(cursor, "cursor");
+ FIND_SELECTOR(claimed, "claimed");
+ FIND_SELECTOR(edgeHit, "edgeHit");
+ FIND_SELECTOR(wordFail, "wordFail");
+ FIND_SELECTOR(syntaxFail, "syntaxFail");
+ FIND_SELECTOR(semanticFail, "semanticFail");
+ FIND_SELECTOR(cycler, "cycler");
+ FIND_SELECTOR(elements, "elements");
+ FIND_SELECTOR(lsTop, "lsTop");
+ FIND_SELECTOR(lsBottom, "lsBottom");
+ FIND_SELECTOR(lsLeft, "lsLeft");
+ FIND_SELECTOR(lsRight, "lsRight");
+ FIND_SELECTOR(baseSetter, "baseSetter");
+ FIND_SELECTOR(who, "who");
+ FIND_SELECTOR(distance, "distance");
+ FIND_SELECTOR(mover, "mover");
+ FIND_SELECTOR(looper, "looper");
+ FIND_SELECTOR(isBlocked, "isBlocked");
+ FIND_SELECTOR(heading, "heading");
+ FIND_SELECTOR(mode, "mode");
+ FIND_SELECTOR(caller, "caller");
+ FIND_SELECTOR(moveDone, "moveDone");
+ FIND_SELECTOR(vol, "vol");
+ FIND_SELECTOR(pri, "pri");
+ FIND_SELECTOR(min, "min");
+ FIND_SELECTOR(sec, "sec");
+ FIND_SELECTOR(frame, "frame");
+ FIND_SELECTOR(dataInc, "dataInc");
+ FIND_SELECTOR(size, "size");
+ FIND_SELECTOR(palette, "palette");
+ FIND_SELECTOR(moveSpeed, "moveSpeed");
+ FIND_SELECTOR(cantBeHere, "cantBeHere");
+ FIND_SELECTOR(nodePtr, "nodePtr");
+ FIND_SELECTOR(flags, "flags");
+ FIND_SELECTOR(points, "points");
}
int
-sci_hexdump(byte *data, int length, int offsetplus)
-{
- char tempstr[40];
- int i;
- for (i = 0; i < length; i+= 8) {
- int j;
-
- sprintf(tempstr, "%04x: ", i + offsetplus);
- for (j = 0; j < MIN(8, length - i); j++)
- sprintf(tempstr + 6 + (j*3) + (j > 3), "%02x ", data[i+j]);
- for (j = 0; j < MIN(8, length - i); j++) {
- int thechar;
- thechar = data[i+j];
- sprintf(tempstr + 31 + j, "%c",
- ((thechar < ' ') || (thechar > 127))? '.' : thechar );
- }
-
- for (j = 0; j < 38; j++)
- if (!tempstr[j])
- tempstr[j] = ' '; /* get rid of sprintf's \0s */
-
- sciprintf("%s\n", tempstr);
- }
- return 0;
+sci_hexdump(byte *data, int length, int offsetplus) {
+ char tempstr[40];
+ int i;
+ for (i = 0; i < length; i += 8) {
+ int j;
+
+ sprintf(tempstr, "%04x: ", i + offsetplus);
+ for (j = 0; j < MIN(8, length - i); j++)
+ sprintf(tempstr + 6 + (j*3) + (j > 3), "%02x ", data[i+j]);
+ for (j = 0; j < MIN(8, length - i); j++) {
+ int thechar;
+ thechar = data[i+j];
+ sprintf(tempstr + 31 + j, "%c",
+ ((thechar < ' ') || (thechar > 127)) ? '.' : thechar);
+ }
+
+ for (j = 0; j < 38; j++)
+ if (!tempstr[j])
+ tempstr[j] = ' '; /* get rid of sprintf's \0s */
+
+ sciprintf("%s\n", tempstr);
+ }
+ return 0;
}
static void
-script_dump_object(char *data, int seeker, int objsize, char **snames, int snames_nr)
-{
- int selectors, overloads, selectorsize;
- int species = getInt16((unsigned char *) data + 8 + seeker);
- int superclass = getInt16((unsigned char *) data + 10 + seeker);
- int namepos = getInt16((unsigned char *) data + 14 + seeker);
- int i = 0;
+script_dump_object(char *data, int seeker, int objsize, char **snames, int snames_nr) {
+ int selectors, overloads, selectorsize;
+ int species = getInt16((unsigned char *) data + 8 + seeker);
+ int superclass = getInt16((unsigned char *) data + 10 + seeker);
+ int namepos = getInt16((unsigned char *) data + 14 + seeker);
+ int i = 0;
- sciprintf("Object\n");
+ sciprintf("Object\n");
- sci_hexdump((unsigned char *) data + seeker, objsize -4, seeker);
- /*-4 because the size includes the two-word header */
+ sci_hexdump((unsigned char *) data + seeker, objsize - 4, seeker);
+ /*-4 because the size includes the two-word header */
- sciprintf("Name: %s\n", namepos? ((char *)(data + namepos)) : "<unknown>");
- sciprintf("Superclass: %x\n", superclass);
- sciprintf("Species: %x\n", species);
- sciprintf("-info-:%x\n", getInt16((unsigned char *) data + 12 + seeker) & 0xffff);
+ sciprintf("Name: %s\n", namepos ? ((char *)(data + namepos)) : "<unknown>");
+ sciprintf("Superclass: %x\n", superclass);
+ sciprintf("Species: %x\n", species);
+ sciprintf("-info-:%x\n", getInt16((unsigned char *) data + 12 + seeker) & 0xffff);
- sciprintf("Function area offset: %x\n", getInt16((unsigned char *) data + seeker + 4));
- sciprintf("Selectors [%x]:\n",
- selectors = (selectorsize = getInt16((unsigned char *) data + seeker + 6)));
+ sciprintf("Function area offset: %x\n", getInt16((unsigned char *) data + seeker + 4));
+ sciprintf("Selectors [%x]:\n",
+ selectors = (selectorsize = getInt16((unsigned char *) data + seeker + 6)));
- seeker += 8;
+ seeker += 8;
- while (selectors--) {
- sciprintf(" [#%03x] = 0x%x\n", i++, getInt16((unsigned char *) data + seeker) & 0xffff);
+ while (selectors--) {
+ sciprintf(" [#%03x] = 0x%x\n", i++, getInt16((unsigned char *) data + seeker) & 0xffff);
- seeker += 2;
- }
+ seeker += 2;
+ }
- sciprintf("Overridden functions: %x\n", selectors =
- overloads = getInt16((unsigned char *) data + seeker));
+ sciprintf("Overridden functions: %x\n", selectors =
+ overloads = getInt16((unsigned char *) data + seeker));
- seeker += 2;
+ seeker += 2;
- if (overloads < 100)
- while (overloads--) {
- int selector = getInt16((unsigned char *) data + (seeker));
+ if (overloads < 100)
+ while (overloads--) {
+ int selector = getInt16((unsigned char *) data + (seeker));
- sciprintf(" [%03x] %s: @", selector & 0xffff,
- (snames && selector >= 0 && selector < snames_nr)? snames[selector] : "<?>");
- sciprintf("%04x\n", getInt16((unsigned char *) data + seeker + selectors*2 + 2) & 0xffff);
+ sciprintf(" [%03x] %s: @", selector & 0xffff,
+ (snames && selector >= 0 && selector < snames_nr) ? snames[selector] : "<?>");
+ sciprintf("%04x\n", getInt16((unsigned char *) data + seeker + selectors*2 + 2) & 0xffff);
- seeker += 2;
- }
+ seeker += 2;
+ }
}
static void
-script_dump_class(char *data, int seeker, int objsize, char **snames, int snames_nr)
-{
- int selectors, overloads, selectorsize;
- int species = getInt16((unsigned char *) data + 8 + seeker);
- int superclass = getInt16((unsigned char *) data + 10 + seeker);
- int namepos = getInt16((unsigned char *) data + 14 + seeker);
+script_dump_class(char *data, int seeker, int objsize, char **snames, int snames_nr) {
+ int selectors, overloads, selectorsize;
+ int species = getInt16((unsigned char *) data + 8 + seeker);
+ int superclass = getInt16((unsigned char *) data + 10 + seeker);
+ int namepos = getInt16((unsigned char *) data + 14 + seeker);
- sciprintf("Class\n");
+ sciprintf("Class\n");
- sci_hexdump((unsigned char *) data + seeker, objsize -4, seeker);
+ sci_hexdump((unsigned char *) data + seeker, objsize - 4, seeker);
- sciprintf("Name: %s\n", namepos? ((char *)data + namepos) : "<unknown>");
- sciprintf("Superclass: %x\n", superclass);
- sciprintf("Species: %x\n", species);
- sciprintf("-info-:%x\n", getInt16((unsigned char *) data + 12 + seeker) & 0xffff);
+ sciprintf("Name: %s\n", namepos ? ((char *)data + namepos) : "<unknown>");
+ sciprintf("Superclass: %x\n", superclass);
+ sciprintf("Species: %x\n", species);
+ sciprintf("-info-:%x\n", getInt16((unsigned char *) data + 12 + seeker) & 0xffff);
- sciprintf("Function area offset: %x\n", getInt16((unsigned char *) data + seeker + 4));
- sciprintf("Selectors [%x]:\n",
- selectors = (selectorsize = getInt16((unsigned char *) data + seeker + 6)));
+ sciprintf("Function area offset: %x\n", getInt16((unsigned char *) data + seeker + 4));
+ sciprintf("Selectors [%x]:\n",
+ selectors = (selectorsize = getInt16((unsigned char *) data + seeker + 6)));
- seeker += 8;
- selectorsize <<= 1;
+ seeker += 8;
+ selectorsize <<= 1;
- while (selectors--) {
- int selector = getInt16((unsigned char *) data + (seeker) + selectorsize);
+ while (selectors--) {
+ int selector = getInt16((unsigned char *) data + (seeker) + selectorsize);
- sciprintf(" [%03x] %s = 0x%x\n", 0xffff & selector,
- (snames && selector >= 0 && selector < snames_nr)? snames[selector] : "<?>",
- getInt16((unsigned char *) data + seeker) & 0xffff);
+ sciprintf(" [%03x] %s = 0x%x\n", 0xffff & selector,
+ (snames && selector >= 0 && selector < snames_nr) ? snames[selector] : "<?>",
+ getInt16((unsigned char *) data + seeker) & 0xffff);
- seeker += 2;
- }
+ seeker += 2;
+ }
- seeker += selectorsize;
+ seeker += selectorsize;
- sciprintf("Overloaded functions: %x\n", selectors =
- overloads = getInt16((unsigned char *) data + seeker));
+ sciprintf("Overloaded functions: %x\n", selectors =
+ overloads = getInt16((unsigned char *) data + seeker));
- seeker += 2;
+ seeker += 2;
- while (overloads--) {
- int selector = getInt16((unsigned char *) data + (seeker));
- fprintf(stderr,"selector=%d; snames_nr =%d\n", selector, snames_nr);
- sciprintf(" [%03x] %s: @", selector & 0xffff,
- (snames && selector >= 0 && selector < snames_nr)?
- snames[selector] : "<?>");
- sciprintf("%04x\n", getInt16((unsigned char *) data + seeker + selectors*2 + 2) & 0xffff);
+ while (overloads--) {
+ int selector = getInt16((unsigned char *) data + (seeker));
+ fprintf(stderr, "selector=%d; snames_nr =%d\n", selector, snames_nr);
+ sciprintf(" [%03x] %s: @", selector & 0xffff,
+ (snames && selector >= 0 && selector < snames_nr) ?
+ snames[selector] : "<?>");
+ sciprintf("%04x\n", getInt16((unsigned char *) data + seeker + selectors*2 + 2) & 0xffff);
- seeker += 2;
- }
+ seeker += 2;
+ }
}
void
-script_dissect(resource_mgr_t *resmgr, int res_no, char **snames, int snames_nr)
-{
- int objectctr[11] = {0,0,0,0,0,0,0,0,0,0,0};
- unsigned int _seeker = 0;
- resource_t *script = scir_find_resource(resmgr, sci_script, res_no, 0);
- word_t **words;
- int word_count;
-
- if (!script) {
- sciprintf("Script not found!\n");
- return;
- }
-
- words=vocab_get_words (resmgr, &word_count);
-
- while (_seeker < script->size) {
- int objtype = getInt16(script->data + _seeker);
- int objsize;
- unsigned int seeker = _seeker + 4;
-
- if (!objtype) {
- sciprintf("End of script object (#0) encountered.\n");
- sciprintf("Classes: %i, Objects: %i, Export: %i,\n Var: %i (all base 10)",
- objectctr[6], objectctr[1], objectctr[7], objectctr[10]);
- /*vocabulary_free_snames(snames);*/
- vocab_free_words (words, word_count);
- return;
- }
-
- sciprintf("\n");
-
- objsize = getInt16(script->data + _seeker + 2);
-
- sciprintf("Obj type #%x, size 0x%x: ", objtype, objsize);
-
- _seeker += objsize;
-
- objectctr[objtype]++;
-
- switch (objtype) {
- case sci_obj_object:
- script_dump_object ((char *) script->data, seeker, objsize, snames, snames_nr);
- break;
-
- case sci_obj_code: {
- sciprintf("Code\n");
- sci_hexdump(script->data + seeker, objsize -4, seeker);
- };
- break;
-
- case 3: {
- sciprintf("<unknown>\n");
- sci_hexdump(script->data + seeker, objsize -4, seeker);
- };
- break;
-
- case sci_obj_said: {
- sciprintf("Said\n");
- sci_hexdump(script->data + seeker, objsize -4, seeker);
-
- sciprintf ("%04x: ", seeker);
- while (seeker < _seeker)
- {
- unsigned char nextitem=script->data [seeker++];
- if (nextitem == 0xFF)
- sciprintf ("\n%04x: ", seeker);
- else if (nextitem >= 0xF0)
- {
- switch (nextitem)
- {
- case 0xf0: sciprintf(", "); break;
- case 0xf1: sciprintf("& "); break;
- case 0xf2: sciprintf("/ "); break;
- case 0xf3: sciprintf("( "); break;
- case 0xf4: sciprintf(") "); break;
- case 0xf5: sciprintf("[ "); break;
- case 0xf6: sciprintf("] "); break;
- case 0xf7: sciprintf("# "); break;
- case 0xf8: sciprintf("< "); break;
- case 0xf9: sciprintf("> "); break;
- }
- }
- else {
- nextitem = nextitem << 8 | script->data [seeker++];
- sciprintf ("%s[%03x] ", vocab_get_any_group_word (nextitem, words, word_count), nextitem);
- }
- }
- sciprintf ("\n");
- }
- break;
-
- case sci_obj_strings: {
- sciprintf("Strings\n");
- while (script->data [seeker])
- {
- sciprintf ("%04x: %s\n", seeker, script->data+seeker);
- seeker += strlen ((char *) script->data+seeker)+1;
- }
- seeker++; /* the ending zero byte */
- };
- break;
-
- case sci_obj_class:
- script_dump_class ((char *) script->data, seeker, objsize, snames, snames_nr);
- break;
-
- case sci_obj_exports: {
- sciprintf("Exports\n");
- sci_hexdump((unsigned char *) script->data + seeker, objsize -4, seeker);
- };
- break;
-
- case sci_obj_pointers: {
- sciprintf("Pointers\n");
- sci_hexdump(script->data + seeker, objsize -4, seeker);
- };
- break;
-
- case 9: {
- sciprintf("<unknown>\n");
- sci_hexdump(script->data + seeker, objsize -4, seeker);
- };
- break;
-
- case sci_obj_localvars: {
- sciprintf("Local vars\n");
- sci_hexdump(script->data + seeker, objsize -4, seeker);
- };
- break;
-
- default:
- sciprintf("Unsupported!\n");
- return;
- }
-
- }
-
- sciprintf("Script ends without terminator\n");
-
- /*vocabulary_free_snames(snames);*/
+script_dissect(resource_mgr_t *resmgr, int res_no, char **snames, int snames_nr) {
+ int objectctr[11] = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0};
+ unsigned int _seeker = 0;
+ resource_t *script = scir_find_resource(resmgr, sci_script, res_no, 0);
+ word_t **words;
+ int word_count;
+
+ if (!script) {
+ sciprintf("Script not found!\n");
+ return;
+ }
+
+ words = vocab_get_words(resmgr, &word_count);
+
+ while (_seeker < script->size) {
+ int objtype = getInt16(script->data + _seeker);
+ int objsize;
+ unsigned int seeker = _seeker + 4;
+
+ if (!objtype) {
+ sciprintf("End of script object (#0) encountered.\n");
+ sciprintf("Classes: %i, Objects: %i, Export: %i,\n Var: %i (all base 10)",
+ objectctr[6], objectctr[1], objectctr[7], objectctr[10]);
+ /*vocabulary_free_snames(snames);*/
+ vocab_free_words(words, word_count);
+ return;
+ }
+
+ sciprintf("\n");
+
+ objsize = getInt16(script->data + _seeker + 2);
+
+ sciprintf("Obj type #%x, size 0x%x: ", objtype, objsize);
+
+ _seeker += objsize;
+
+ objectctr[objtype]++;
+
+ switch (objtype) {
+ case sci_obj_object:
+ script_dump_object((char *) script->data, seeker, objsize, snames, snames_nr);
+ break;
+
+ case sci_obj_code: {
+ sciprintf("Code\n");
+ sci_hexdump(script->data + seeker, objsize - 4, seeker);
+ };
+ break;
+
+ case 3: {
+ sciprintf("<unknown>\n");
+ sci_hexdump(script->data + seeker, objsize - 4, seeker);
+ };
+ break;
+
+ case sci_obj_said: {
+ sciprintf("Said\n");
+ sci_hexdump(script->data + seeker, objsize - 4, seeker);
+
+ sciprintf("%04x: ", seeker);
+ while (seeker < _seeker) {
+ unsigned char nextitem = script->data [seeker++];
+ if (nextitem == 0xFF)
+ sciprintf("\n%04x: ", seeker);
+ else if (nextitem >= 0xF0) {
+ switch (nextitem) {
+ case 0xf0:
+ sciprintf(", ");
+ break;
+ case 0xf1:
+ sciprintf("& ");
+ break;
+ case 0xf2:
+ sciprintf("/ ");
+ break;
+ case 0xf3:
+ sciprintf("( ");
+ break;
+ case 0xf4:
+ sciprintf(") ");
+ break;
+ case 0xf5:
+ sciprintf("[ ");
+ break;
+ case 0xf6:
+ sciprintf("] ");
+ break;
+ case 0xf7:
+ sciprintf("# ");
+ break;
+ case 0xf8:
+ sciprintf("< ");
+ break;
+ case 0xf9:
+ sciprintf("> ");
+ break;
+ }
+ } else {
+ nextitem = nextitem << 8 | script->data [seeker++];
+ sciprintf("%s[%03x] ", vocab_get_any_group_word(nextitem, words, word_count), nextitem);
+ }
+ }
+ sciprintf("\n");
+ }
+ break;
+
+ case sci_obj_strings: {
+ sciprintf("Strings\n");
+ while (script->data [seeker]) {
+ sciprintf("%04x: %s\n", seeker, script->data + seeker);
+ seeker += strlen((char *) script->data + seeker) + 1;
+ }
+ seeker++; /* the ending zero byte */
+ };
+ break;
+
+ case sci_obj_class:
+ script_dump_class((char *) script->data, seeker, objsize, snames, snames_nr);
+ break;
+
+ case sci_obj_exports: {
+ sciprintf("Exports\n");
+ sci_hexdump((unsigned char *) script->data + seeker, objsize - 4, seeker);
+ };
+ break;
+
+ case sci_obj_pointers: {
+ sciprintf("Pointers\n");
+ sci_hexdump(script->data + seeker, objsize - 4, seeker);
+ };
+ break;
+
+ case 9: {
+ sciprintf("<unknown>\n");
+ sci_hexdump(script->data + seeker, objsize - 4, seeker);
+ };
+ break;
+
+ case sci_obj_localvars: {
+ sciprintf("Local vars\n");
+ sci_hexdump(script->data + seeker, objsize - 4, seeker);
+ };
+ break;
+
+ default:
+ sciprintf("Unsupported!\n");
+ return;
+ }
+
+ }
+
+ sciprintf("Script ends without terminator\n");
+
+ /*vocabulary_free_snames(snames);*/
}