diff options
-rw-r--r-- | engines/sci/engine/scriptconsole.cpp | 173 | ||||
-rw-r--r-- | engines/sci/engine/scriptdebug.cpp | 425 | ||||
-rw-r--r-- | engines/sci/sci.cpp | 4 | ||||
-rw-r--r-- | engines/sci/scicore/sciconsole.h | 11 |
4 files changed, 300 insertions, 313 deletions
diff --git a/engines/sci/engine/scriptconsole.cpp b/engines/sci/engine/scriptconsole.cpp index 1eae635dc3..f894f3f931 100644 --- a/engines/sci/engine/scriptconsole.cpp +++ b/engines/sci/engine/scriptconsole.cpp @@ -34,22 +34,20 @@ namespace Sci { #ifdef SCI_CONSOLE -EngineState *con_gamestate = NULL; - // console commands -static int c_list(EngineState *s); // lists various types of things -static int c_man(EngineState *s); // 'manual page' -static int c_set(EngineState *s); // sets an int variable -static int c_print(EngineState *s); // prints a variable -static int c_size(EngineState *s); // displays the size of a resource -static int c_dump(EngineState *s); // gives a hex dump of a resource -//static int c_objinfo(EngineState *s); // shows some info about one class -//static int c_objmethods(EngineState *s); // Disassembles all methods of a class -static int c_hexgrep(EngineState *s); // Searches a string in one resource or resource class -static int c_selectornames(EngineState *s); // Displays all selector names -static int c_kernelnames(EngineState *s); // Displays all kernel function names -static int c_dissectscript(EngineState *s); // Splits a script into objects and explains them +static int c_list(EngineState *s, const Common::Array<cmd_param_t> &cmdParams); // lists various types of things +static int c_man(EngineState *s, const Common::Array<cmd_param_t> &cmdParams); // 'manual page' +static int c_set(EngineState *s, const Common::Array<cmd_param_t> &cmdParams); // sets an int variable +static int c_print(EngineState *s, const Common::Array<cmd_param_t> &cmdParams); // prints a variable +static int c_size(EngineState *s, const Common::Array<cmd_param_t> &cmdParams); // displays the size of a resource +static int c_dump(EngineState *s, const Common::Array<cmd_param_t> &cmdParams); // gives a hex dump of a resource +//static int c_objinfo(EngineState *s, const Common::Array<cmd_param_t> &cmdParams); // shows some info about one class +//static int c_objmethods(EngineState *s, const Common::Array<cmd_param_t> &cmdParams); // Disassembles all methods of a class +static int c_hexgrep(EngineState *s, const Common::Array<cmd_param_t> &cmdParams); // Searches a string in one resource or resource class +static int c_selectornames(EngineState *s, const Common::Array<cmd_param_t> &cmdParams); // Displays all selector names +static int c_kernelnames(EngineState *s, const Common::Array<cmd_param_t> &cmdParams); // Displays all kernel function names +static int c_dissectscript(EngineState *s, const Common::Array<cmd_param_t> &cmdParams); // Splits a script into objects and explains them struct cmd_mm_entry_t { const char *name; @@ -61,7 +59,7 @@ typedef cmd_mm_entry_t cmd_page_t; // Simple info page struct cmd_command_t { const char *name; const char *description; - int (*command)(EngineState *); + ConCommand command; const char *param; }; @@ -120,9 +118,6 @@ static cmd_mm_struct_t cmd_mm[CMD_MM_ENTRIES]; static int _cmd_initialized = 0; static int _lists_need_sorting = 0; -unsigned int cmd_paramlength; -cmd_param_t *cmd_params; - void _cmd_exit() { int t; @@ -418,13 +413,10 @@ void con_parse(EngineState *s, const char *command) { while (!done) { cmd_command_t *command_todo; int onvar = 1; // currently working on a variable? - unsigned int parammem = 0; - unsigned int i; cdone = 0; pos = 0; - //cmd_params = sci_realloc(cmd_params, parammem); - cmd_paramlength = 0; + Common::Array<cmd_param_t> cmdParams; while (*cmd == ' ') cmd++; @@ -451,10 +443,9 @@ void con_parse(EngineState *s, const char *command) { default: if (!onvar) { onvar = 1; - if (cmd_paramlength == parammem) - cmd_params = (cmd_param_t*)sci_realloc(cmd_params, sizeof(cmd_param_t)* (parammem += 8)); - cmd_params[cmd_paramlength].str = cmd + pos; - cmd_paramlength++; + cmd_param_t tmp; + tmp.str = cmd + pos; + cmdParams.push_back(tmp); } break; } @@ -468,7 +459,7 @@ void con_parse(EngineState *s, const char *command) { if (!command_todo) sciprintf("%s: not found\n", cmd); else { - unsigned int minparams; + uint minparams; int need_state = 0; paramt = command_todo->param; @@ -482,10 +473,10 @@ void con_parse(EngineState *s, const char *command) { if ((paramt[0] != 0) && (paramt[strlen(paramt) - 1] == '*')) minparams -= 2; - if (cmd_paramlength < minparams) - sciprintf("%s: needs more than %d parameters\n", cmd, cmd_paramlength); + if (cmdParams.size() < minparams) + sciprintf("%s: needs more than %d parameters\n", cmd, cmdParams.size()); - else if ((cmd_paramlength > strlen(paramt)) && ((strlen(paramt) == 0) || paramt[strlen(paramt) - 1] != '*')) + else if ((cmdParams.size() > strlen(paramt)) && ((strlen(paramt) == 0) || paramt[strlen(paramt) - 1] != '*')) sciprintf("%s: too many parameters", cmd); else { int do_execute = !need_state || s; // /me wants an implication arrow @@ -493,7 +484,7 @@ void con_parse(EngineState *s, const char *command) { int paramtypepos = 0; char *endptr; - for (i = 0; i < cmd_paramlength; i++) { + for (uint i = 0; i < cmdParams.size(); i++) { paramtype = paramt[paramtypepos]; if ((paramt[paramtypepos + 1]) && (paramt[paramtypepos + 1] != '*')) @@ -502,12 +493,11 @@ void con_parse(EngineState *s, const char *command) { switch (paramtype) { // Now turn the parameters into variables of the appropriate types, - // unless they're strings, and store them in the global cmd_params[] - // structure + // unless they're strings, and store them into the cmdParams array case 'a': { - char *oldname = cmd_params[i].str; - if (parse_reg_t(s, oldname, &(cmd_params[i].reg))) { + const char *oldname = cmdParams[i].str; + if (parse_reg_t(s, oldname, &(cmdParams[i].reg))) { sciprintf("%s: '%s' is not an address or object\n", cmd, oldname); do_execute = 0; } @@ -515,9 +505,9 @@ void con_parse(EngineState *s, const char *command) { } case 'i': { - char *orgstr = cmd_params[i].str; + const char *orgstr = cmdParams[i].str; - cmd_params[i].val = strtol(orgstr, &endptr, 0); + cmdParams[i].val = strtol(orgstr, &endptr, 0); if (*endptr != '\0') { do_execute = 0; sciprintf("%s: '%s' is not an int\n", cmd, orgstr); @@ -526,16 +516,16 @@ void con_parse(EngineState *s, const char *command) { break; case 'h': { - char *orgstr = cmd_params[i].str; + const char *orgstr = cmdParams[i].str; - cmd_params[i].val = strtol(orgstr, &endptr, 16); + cmdParams[i].val = strtol(orgstr, &endptr, 16); if (*endptr != '\0') { do_execute = 0; sciprintf("%s: '%s' is not a hex number\n", cmd, orgstr); } - cmd_params[i].val &= 0xff; // Clip hex numbers to 0x00 ... 0xff + cmdParams[i].val &= 0xff; // Clip hex numbers to 0x00 ... 0xff } break; @@ -543,15 +533,16 @@ void con_parse(EngineState *s, const char *command) { break; default: - fprintf(stderr, "Internal error: Heap corruption or prior assertion failed:\n" - "Unknown parameter type '%c' for funtion\n", paramtype); + warning("Internal error: Heap corruption or prior assertion failed: " + "Unknown parameter type '%c' for function", paramtype); } } if (do_execute) { - command_todo->command(s); - } else fprintf(stderr, "Skipping command...\n"); + command_todo->command(s, cmdParams); + } else + fprintf(stderr, "Skipping command...\n"); } } } @@ -559,9 +550,6 @@ void con_parse(EngineState *s, const char *command) { } free(_cmd); - if (cmd_params) - free(cmd_params); - cmd_params = NULL; } /* (unused) @@ -610,7 +598,7 @@ int con_hook_page(const char *name, const char *body) { return 0; } -int con_hook_command(int command(EngineState *), const char *name, const char *param, const char *description) { +int con_hook_command(ConCommand command, const char *name, const char *param, const char *description) { cmd_command_t *cmd = NULL; unsigned int i; @@ -689,7 +677,7 @@ static ResourceType parseResourceType(char *resid) { return res; } -static int c_list_words(EngineState *s) { +static int c_list_words(EngineState *s, const Common::Array<cmd_param_t> &cmdParams) { WordMap words; vocab_get_words(s->resmgr, words); @@ -708,7 +696,7 @@ static int c_list_words(EngineState *s) { return 0; } -int c_list_suffixes(EngineState *s) { +int c_list_suffixes(EngineState *s, const Common::Array<cmd_param_t> &cmdParams) { SuffixList suffixes; char word_buf[256], alt_buf[256]; @@ -786,11 +774,11 @@ static void _cmd_print_page(cmd_mm_entry_t *data, int full) { sciprintf("%s\n", data->name); } -static int c_list(EngineState *s) { +static int c_list(EngineState *s, const Common::Array<cmd_param_t> &cmdParams) { if (_lists_need_sorting) con_sort_all(); - if (cmd_paramlength == 0) { + if (cmdParams.size() == 0) { sciprintf("usage: list [type]\nwhere type is one of the following:\n" "cmds - lists all commands\n" "vars - lists all variables\n" @@ -802,13 +790,13 @@ static int c_list(EngineState *s) { "words - lists all kernel words\n" "suffixes - lists all suffix replacements\n" "[resource] - lists all [resource]s"); - } else if (cmd_paramlength == 1) { + } else if (cmdParams.size() == 1) { const char *mm_subsects[3] = {"cmds", "vars", "docs"}; int mm_found = -1; int i; for (i = 0; i < 3; i++) - if (mm_subsects[i] && !strcmp(mm_subsects[i], cmd_params[0].str)) + if (mm_subsects[i] && !strcmp(mm_subsects[i], cmdParams[0].str)) mm_found = i; if (mm_found >= 0) @@ -820,22 +808,22 @@ static int c_list(EngineState *s) { return 1; } - if (!strcmp("selectors", cmd_params[0].str)) - return c_selectornames(s); - else if (!strcmp("syscalls", cmd_params[0].str)) - return c_kernelnames(s); - else if (!strcmp("suffixes", cmd_params[0].str) || !strcmp("suffices", cmd_params[0].str) || !strcmp("sufficos", cmd_params[0].str)) + if (!strcmp("selectors", cmdParams[0].str)) + return c_selectornames(s, cmdParams); + else if (!strcmp("syscalls", cmdParams[0].str)) + return c_kernelnames(s, cmdParams); + else if (!strcmp("suffixes", cmdParams[0].str) || !strcmp("suffices", cmdParams[0].str) || !strcmp("sufficos", cmdParams[0].str)) // sufficos: Accusative Plural of 'suffix' - return c_list_suffixes(s); - else if (!strcmp("words", cmd_params[0].str)) - return c_list_words(s); - else if (strcmp("restypes", cmd_params[0].str) == 0) { + return c_list_suffixes(s, cmdParams); + else if (!strcmp("words", cmdParams[0].str)) + return c_list_words(s, cmdParams); + else if (strcmp("restypes", cmdParams[0].str) == 0) { for (i = 0; i < kResourceTypeInvalid; i++) sciprintf("%s\n", getResourceTypeName((ResourceType)i)); } else { - ResourceType res = parseResourceType(cmd_params[0].str); + ResourceType res = parseResourceType(cmdParams[0].str); if (res == kResourceTypeInvalid) - sciprintf("Unknown resource type: '%s'\n", cmd_params[0].str); + sciprintf("Unknown resource type: '%s'\n", cmdParams[0].str); else { for (i = 0; i < sci_max_resource_nr[s->resmgr->_sciVersion]; i++) if (s->resmgr->testResource(res, i)) @@ -848,10 +836,10 @@ static int c_list(EngineState *s) { return 0; } -static int c_man(EngineState *s) { +static int c_man(EngineState *s, const Common::Array<cmd_param_t> &cmdParams) { int section = 0; unsigned int i; - char *name = cmd_params[0].str; + char *name = cmdParams[0].str; char *c = strchr(name, '.'); cmd_mm_entry_t *entry = 0; @@ -885,17 +873,17 @@ static int c_man(EngineState *s) { return 0; } -static int c_set(EngineState *s) { - cmd_var_t *var = (cmd_var_t *) cmd_mm_find(cmd_params[0].str, CMD_MM_VAR); +static int c_set(EngineState *s, const Common::Array<cmd_param_t> &cmdParams) { + cmd_var_t *var = (cmd_var_t *)cmd_mm_find(cmdParams[0].str, CMD_MM_VAR); if (var) - *(var->var.intp) = cmd_params[1].val; + *(var->var.intp) = cmdParams[1].val; return 0; } -static int c_print(EngineState *s) { - cmd_var_t *var = (cmd_var_t *) cmd_mm_find(cmd_params[0].str, CMD_MM_VAR); +static int c_print(EngineState *s, const Common::Array<cmd_param_t> &cmdParams) { + cmd_var_t *var = (cmd_var_t *)cmd_mm_find(cmdParams[0].str, CMD_MM_VAR); if (var) sciprintf("%d", *(var->var.intp)); @@ -905,42 +893,42 @@ static int c_print(EngineState *s) { return 0; } -static int c_size(EngineState *s) { - ResourceType res = parseResourceType(cmd_params[0].str); +static int c_size(EngineState *s, const Common::Array<cmd_param_t> &cmdParams) { + ResourceType res = parseResourceType(cmdParams[0].str); if (res == kResourceTypeInvalid) - sciprintf("Resource type '%s' is not valid\n", cmd_params[0].str); + sciprintf("Resource type '%s' is not valid\n", cmdParams[0].str); else { - Resource *resource = s->resmgr->findResource(res, cmd_params[1].val, 0); + Resource *resource = s->resmgr->findResource(res, cmdParams[1].val, 0); if (resource) { sciprintf("Size: %d\n", resource->size); } else - sciprintf("Resource %s.%03d not found\n", cmd_params[0].str, cmd_params[1].val); + sciprintf("Resource %s.%03d not found\n", cmdParams[0].str, cmdParams[1].val); } return 0; } -static int c_dump(EngineState *s) { - ResourceType res = parseResourceType(cmd_params[0].str); +static int c_dump(EngineState *s, const Common::Array<cmd_param_t> &cmdParams) { + ResourceType res = parseResourceType(cmdParams[0].str); if (res == kResourceTypeInvalid) - sciprintf("Resource type '%s' is not valid\n", cmd_params[0].str); + sciprintf("Resource type '%s' is not valid\n", cmdParams[0].str); else { - Resource *resource = s->resmgr->findResource(res, cmd_params[1].val, 0); + Resource *resource = s->resmgr->findResource(res, cmdParams[1].val, 0); if (resource) sci_hexdump(resource->data, resource->size, 0); else - sciprintf("Resource %s.%03d not found\n", cmd_params[0].str, cmd_params[1].val); + sciprintf("Resource %s.%03d not found\n", cmdParams[0].str, cmdParams[1].val); } return 0; } -static int c_hexgrep(EngineState *s) { +static int c_hexgrep(EngineState *s, const Common::Array<cmd_param_t> &cmdParams) { int i, seeklen, resnr, resmax; unsigned char *seekstr = NULL; Resource *script = NULL; - char *dot = strchr(cmd_params[0].str, '.'); + char *dot = strchr(cmdParams[0].str, '.'); ResourceType restype; if (NULL == s) { @@ -948,7 +936,8 @@ static int c_hexgrep(EngineState *s) { return(-1); } - seekstr = (unsigned char *)sci_malloc(seeklen = (cmd_paramlength - 1)); + seeklen = cmdParams.size() - 1; + seekstr = (unsigned char *)sci_malloc(seeklen); if (NULL == seekstr) { fprintf(stderr, "console.c: c_hexgrep(): malloc failed for seekstr\r\n"); @@ -956,7 +945,7 @@ static int c_hexgrep(EngineState *s) { } for (i = 0; i < seeklen; i++) - seekstr[i] = (byte)cmd_params[i + 1].val; + seekstr[i] = (byte)cmdParams[i + 1].val; if (dot) { *dot = 0; @@ -966,9 +955,9 @@ static int c_hexgrep(EngineState *s) { resmax = 999; } - restype = parseResourceType(cmd_params[0].str); + restype = parseResourceType(cmdParams[0].str); if (restype == kResourceTypeInvalid) { - sciprintf("Unknown resource type \"%s\"\n", cmd_params[0].str); + sciprintf("Unknown resource type \"%s\"\n", cmdParams[0].str); free(seekstr); return 1; } @@ -1008,7 +997,7 @@ static int c_hexgrep(EngineState *s) { return 0; } -static int c_selectornames(EngineState * s) { +static int c_selectornames(EngineState *s, const Common::Array<cmd_param_t> &cmdParams) { Common::StringList selectorNames; if (NULL == s) { @@ -1029,7 +1018,7 @@ static int c_selectornames(EngineState * s) { return 0; } -static int c_kernelnames(EngineState * s) { +static int c_kernelnames(EngineState *s, const Common::Array<cmd_param_t> &cmdParams) { Common::StringList knames; if (NULL == s) { @@ -1051,13 +1040,13 @@ static int c_kernelnames(EngineState * s) { return 0; } -static int c_dissectscript(EngineState * s) { +static int c_dissectscript(EngineState *s, const Common::Array<cmd_param_t> &cmdParams) { if (NULL == s) { sciprintf("console.c: c_dissectscript(): NULL passed for parameter s\n"); return -1; } - script_dissect(s->resmgr, cmd_params[0].val, s->_selectorNames); + script_dissect(s->resmgr, cmdParams[0].val, s->_selectorNames); return 0; } diff --git a/engines/sci/engine/scriptdebug.cpp b/engines/sci/engine/scriptdebug.cpp index d8181b93ed..4d90b15d54 100644 --- a/engines/sci/engine/scriptdebug.cpp +++ b/engines/sci/engine/scriptdebug.cpp @@ -252,8 +252,8 @@ static void sci01_song_header_dump(byte *data, int size) { #undef CHECK_FOR_END_ABSOLUTE #undef SONGDATA -int c_sfx_01_header(EngineState *s) { - Resource *song = s->resmgr->findResource(kResourceTypeSound, cmd_params[0].val, 0); +int c_sfx_01_header(EngineState *s, const Common::Array<cmd_param_t> &cmdParams) { + Resource *song = s->resmgr->findResource(kResourceTypeSound, cmdParams[0].val, 0); if (!song) { sciprintf("Doesn't exist\n"); @@ -265,10 +265,10 @@ int c_sfx_01_header(EngineState *s) { return 0; } -int c_sfx_01_track(EngineState *s) { - Resource *song = s->resmgr->findResource(kResourceTypeSound, cmd_params[0].val, 0); +int c_sfx_01_track(EngineState *s, const Common::Array<cmd_param_t> &cmdParams) { + Resource *song = s->resmgr->findResource(kResourceTypeSound, cmdParams[0].val, 0); - int offset = cmd_params[1].val; + int offset = cmdParams[1].val; if (!song) { sciprintf("Doesn't exist\n"); @@ -282,7 +282,7 @@ int c_sfx_01_track(EngineState *s) { const char *(*_debug_get_input)(void) = _debug_get_input_default; -int c_segtable(EngineState *s) { +int c_segtable(EngineState *s, const Common::Array<cmd_param_t> &cmdParams) { uint i; sciprintf(" ---- segment table ----\n"); @@ -543,15 +543,15 @@ int objinfo(EngineState *s, reg_t pos); void song_lib_dump(const songlib_t &songlib, int line); -static int c_songlib_print(EngineState *s) { +static int c_songlib_print(EngineState *s, const Common::Array<cmd_param_t> &cmdParams) { song_lib_dump(s->sound.songlib, __LINE__); return 0; } -static int c_vr(EngineState *s) { - reg_t reg = cmd_params[0].reg; - reg_t reg_end = cmd_paramlength > 1 ? cmd_params[1].reg : NULL_REG; +static int c_vr(EngineState *s, const Common::Array<cmd_param_t> &cmdParams) { + reg_t reg = cmdParams[0].reg; + reg_t reg_end = cmdParams.size() > 1 ? cmdParams[1].reg : NULL_REG; int type_mask = determine_reg_type(s, reg, 1); int filter; int found = 0; @@ -643,18 +643,18 @@ static int c_vr(EngineState *s) { return 0; } -int c_segkill(EngineState *s) { - unsigned int i = 0; +int c_segkill(EngineState *s, const Common::Array<cmd_param_t> &cmdParams) { + uint i = 0; - while (i < cmd_paramlength) { - int nr = cmd_params[i++].val; + while (i < cmdParams.size()) { + int nr = cmdParams[i++].val; s->seg_manager->setLockers(nr, 0, SEG_ID); } return 0; } -static int c_mousepos(EngineState *s) { +static int c_mousepos(EngineState *s, const Common::Array<cmd_param_t> &cmdParams) { sci_event_t event; sciprintf("Click somewhere in the game window...\n"); @@ -666,12 +666,12 @@ static int c_mousepos(EngineState *s) { return 0; } -int c_seginfo(EngineState *s) { +int c_seginfo(EngineState *s, const Common::Array<cmd_param_t> &cmdParams) { uint i = 0; - if (cmd_paramlength) { - while (i < cmd_paramlength) { - int nr = cmd_params[i++].val; + if (cmdParams.size()) { + while (i < cmdParams.size()) { + int nr = cmdParams[i++].val; if (nr < 0 || (uint)nr >= s->seg_manager->_heap.size() || !s->seg_manager->_heap[nr]) { sciprintf("Segment %04x does not exist\n", nr); return 1; @@ -707,17 +707,21 @@ int c_debuginfo(EngineState *s) { return 0; } -int c_step(EngineState *s) { +int c_debuginfo(EngineState *s, const Common::Array<cmd_param_t> &cmdParams) { + return c_debuginfo(s); +} + +int c_step(EngineState *s, const Common::Array<cmd_param_t> &cmdParams) { _debugstate_valid = 0; - if (cmd_paramlength && (cmd_params[0].val > 0)) - _debug_step_running = cmd_params[0].val - 1; + if (cmdParams.size() && (cmdParams[0].val > 0)) + _debug_step_running = cmdParams[0].val - 1; return 0; } #if 0 // TODO Re-implement con:so -int c_stepover(EngineState *s) { +int c_stepover(EngineState *s, const Common::Array<cmd_param_t> &cmdParams) { int opcode, opnumber; if (!_debugstate_valid) { @@ -760,7 +764,7 @@ int c_stepover(EngineState *s) { } #endif -int c_sim_parse(EngineState *s) { +int c_sim_parse(EngineState *s, const Common::Array<cmd_param_t> &cmdParams) { unsigned int i; const char *operators = ",&/()[]#<>"; @@ -769,14 +773,14 @@ int c_sim_parse(EngineState *s) { return 1; } - if (cmd_paramlength == 0) { + if (cmdParams.size() == 0) { s->parser_valid = 0; return 0; } - for (i = 0; i < cmd_paramlength; i++) { + for (i = 0; i < cmdParams.size(); i++) { int flag = 0; - char *token = cmd_params[i].str; + char *token = cmdParams[i].str; if (strlen(token) == 1) {// could be an operator int j = 0; @@ -816,14 +820,14 @@ int c_sim_parse(EngineState *s) { } - s->parser_nodes[cmd_paramlength].type = -1; // terminate + s->parser_nodes[cmdParams.size()].type = -1; // terminate s->parser_valid = 2; return 0; } -int c_classtable(EngineState *s) { +int c_classtable(EngineState *s, const Common::Array<cmd_param_t> &cmdParams) { if (!_debugstate_valid) { sciprintf("Not in debug state\n"); return 1; @@ -837,9 +841,9 @@ int c_classtable(EngineState *s) { return 0; } -int c_viewinfo(EngineState *s) { - int view = cmd_params[0].val; - int palette = cmd_params[1].val; +int c_viewinfo(EngineState *s, const Common::Array<cmd_param_t> &cmdParams) { + int view = cmdParams[0].val; + int palette = cmdParams[1].val; int loops, i; gfxr_view_t *view_pixmaps = NULL; @@ -880,7 +884,7 @@ int c_viewinfo(EngineState *s) { return 0; } -int c_list_sentence_fragments(EngineState *s) { +int c_list_sentence_fragments(EngineState *s, const Common::Array<cmd_param_t> &cmdParams) { if (!s) { sciprintf("Not in debug state\n"); return 1; @@ -933,13 +937,13 @@ enum { _parse_token_number }; -int _parse_getinp(int *i, int *nr) { +int _parse_getinp(int *i, int *nr, const Common::Array<cmd_param_t> &cmdParams) { char *token; - if ((unsigned)*i == cmd_paramlength) + if ((unsigned)*i == cmdParams.size()) return _parse_eoi; - token = cmd_params[(*i)++].str; + token = cmdParams[(*i)++].str; if (!strcmp(token, "(")) return _parse_token_pareno; @@ -955,7 +959,7 @@ int _parse_getinp(int *i, int *nr) { return _parse_token_number; } -int _parse_nodes(EngineState *s, int *i, int *pos, int type, int nr) { +int _parse_nodes(EngineState *s, int *i, int *pos, int type, int nr, const Common::Array<cmd_param_t> &cmdParams) { int nexttk, nextval, newpos, oldpos; if (type == _parse_token_nil) @@ -976,21 +980,21 @@ int _parse_nodes(EngineState *s, int *i, int *pos, int type, int nr) { } s->parser_nodes[oldpos = ++(*pos)].type = PARSE_TREE_NODE_BRANCH; - nexttk = _parse_getinp(i, &nextval); - if ((newpos = s->parser_nodes[oldpos].content.branches[0] = _parse_nodes(s, i, pos, nexttk, nextval)) == -1) + nexttk = _parse_getinp(i, &nextval, cmdParams); + if ((newpos = s->parser_nodes[oldpos].content.branches[0] = _parse_nodes(s, i, pos, nexttk, nextval, cmdParams)) == -1) return -1; - nexttk = _parse_getinp(i, &nextval); - if ((newpos = s->parser_nodes[oldpos].content.branches[1] = _parse_nodes(s, i, pos, nexttk, nextval)) == -1) + nexttk = _parse_getinp(i, &nextval, cmdParams); + if ((newpos = s->parser_nodes[oldpos].content.branches[1] = _parse_nodes(s, i, pos, nexttk, nextval, cmdParams)) == -1) return -1; - if (_parse_getinp(i, &nextval) != _parse_token_parenc) + if (_parse_getinp(i, &nextval, cmdParams) != _parse_token_parenc) sciprintf("Expected ')' at token %d\n", *i); return oldpos; } -int c_set_parse_nodes(EngineState *s) { +int c_set_parse_nodes(EngineState *s, const Common::Array<cmd_param_t> &cmdParams) { int i = 0; int foo, bar; int pos = -1; @@ -1000,8 +1004,8 @@ int c_set_parse_nodes(EngineState *s) { return 1; } - bar = _parse_getinp(&i, &foo); - if (_parse_nodes(s, &i, &pos, bar, foo) == -1) + bar = _parse_getinp(&i, &foo, cmdParams); + if (_parse_nodes(s, &i, &pos, bar, foo, cmdParams) == -1) return 1; vocab_dump_parse_tree("debug-parse-tree", s->parser_nodes); @@ -1010,7 +1014,7 @@ int c_set_parse_nodes(EngineState *s) { // parses with a GNF rule set -int c_parse(EngineState *s) { +int c_parse(EngineState *s, const Common::Array<cmd_param_t> &cmdParams) { ResultWordList words; char *error; char *string; @@ -1020,7 +1024,7 @@ int c_parse(EngineState *s) { return 1; } - string = cmd_params[0].str; + string = cmdParams[0].str; sciprintf("Parsing '%s'\n", string); bool res = vocab_tokenize_string(words, string, s->_parserWords, s->_parserSuffixes, &error); if (res && !words.empty()) { @@ -1049,8 +1053,8 @@ int c_parse(EngineState *s) { return 0; } -int c_save_game(EngineState *s) { - int omit_check = cmd_params[0].str[0] == '_'; +int c_save_game(EngineState *s, const Common::Array<cmd_param_t> &cmdParams) { + int omit_check = cmdParams[0].str[0] == '_'; if (!s) { sciprintf("Not in debug state\n"); @@ -1065,27 +1069,27 @@ int c_save_game(EngineState *s) { if (result) { sciprintf("Game state has %d open file handles.\n", result); - sciprintf("Save to '_%s' to ignore this check.\nGame was NOT saved.\n", cmd_params[0].str); + sciprintf("Save to '_%s' to ignore this check.\nGame was NOT saved.\n", cmdParams[0].str); return 1; } } Common::SaveFileManager *saveFileMan = g_engine->getSaveFileManager(); Common::OutSaveFile *out; - if (!(out = saveFileMan->openForSaving(cmd_params[0].str))) { - sciprintf("Error opening savegame \"%s\" for writing\n", cmd_params[0].str); + if (!(out = saveFileMan->openForSaving(cmdParams[0].str))) { + sciprintf("Error opening savegame \"%s\" for writing\n", cmdParams[0].str); return 0; } // TODO: enable custom descriptions? force filename into a specific format? if (gamestate_save(s, out, "debugging")) { - sciprintf("Saving the game state to '%s' failed\n", cmd_params[0].str); + sciprintf("Saving the game state to '%s' failed\n", cmdParams[0].str); } return 0; } -int c_restore_game(EngineState *s) { +int c_restore_game(EngineState *s, const Common::Array<cmd_param_t> &cmdParams) { EngineState *newstate = NULL; if (!s) { @@ -1095,7 +1099,7 @@ int c_restore_game(EngineState *s) { Common::SaveFileManager *saveFileMan = g_engine->getSaveFileManager(); Common::SeekableReadStream *in; - if (!(in = saveFileMan->openForLoading(cmd_params[0].str))) { + if (!(in = saveFileMan->openForLoading(cmdParams[0].str))) { // found a savegame file newstate = gamestate_restore(s, in); delete in; @@ -1109,14 +1113,14 @@ int c_restore_game(EngineState *s) { s->execution_stack_pos = s->execution_stack_base; return 0; } else { - sciprintf("Restoring gamestate '%s' failed.\n", cmd_params[0].str); + sciprintf("Restoring gamestate '%s' failed.\n", cmdParams[0].str); return 1; } } extern char *old_save_dir; -int c_restart_game(EngineState *s) { +int c_restart_game(EngineState *s, const Common::Array<cmd_param_t> &cmdParams) { unsigned int i; char *deref_save_dir = (char*)kernel_dereference_bulk_pointer(s, s->save_dir_copy, 1); @@ -1126,14 +1130,14 @@ int c_restart_game(EngineState *s) { } old_save_dir = strdup(deref_save_dir); - for (i = 0; i < cmd_paramlength; i++) { - if ((strcmp(cmd_params[0].str, "-r") == 0) || (strcmp(cmd_params[0].str, "--replay") == 0)) + for (i = 0; i < cmdParams.size(); i++) { + if ((strcmp(cmdParams[0].str, "-r") == 0) || (strcmp(cmdParams[0].str, "--replay") == 0)) s->restarting_flags |= SCI_GAME_WAS_RESTARTED_AT_LEAST_ONCE; else - if ((strcmp(cmd_params[0].str, "-p") == 0) || (strcmp(cmd_params[0].str, "--play") == 0)) + if ((strcmp(cmdParams[0].str, "-p") == 0) || (strcmp(cmdParams[0].str, "--play") == 0)) s->restarting_flags &= ~SCI_GAME_WAS_RESTARTED_AT_LEAST_ONCE; else { - sciprintf("Invalid parameter '%s'\n", cmd_params[0].str); + sciprintf("Invalid parameter '%s'\n", cmdParams[0].str); return 1; } } @@ -1148,7 +1152,7 @@ int c_restart_game(EngineState *s) { return 0; } -int c_stack(EngineState *s) { +int c_stack(EngineState *s, const Common::Array<cmd_param_t> &cmdParams) { if (!s) { sciprintf("Not in debug state\n"); return 1; @@ -1161,7 +1165,7 @@ int c_stack(EngineState *s) { ExecStack &xs = s->_executionStack[s->execution_stack_pos]; - for (int i = cmd_params[0].val ; i > 0; i--) { + for (int i = cmdParams[0].val ; i > 0; i--) { if ((xs.sp - xs.fp - i) == 0) sciprintf("-- temp variables --\n"); if (xs.sp - i >= s->stack_base) @@ -1455,8 +1459,8 @@ reg_t disassemble(EngineState *s, reg_t pos, int print_bw_tag, int print_bytecod return retval; } -int c_dumpnodes(EngineState *s) { - int end = MIN<int>(cmd_params[0].val, VOCAB_TREE_NODES); +int c_dumpnodes(EngineState *s, const Common::Array<cmd_param_t> &cmdParams) { + int end = MIN<int>(cmdParams[0].val, VOCAB_TREE_NODES); int i; if (!_debugstate_valid) { @@ -1479,7 +1483,7 @@ int c_dumpnodes(EngineState *s) { static const char *varnames[] = {"global", "local", "temp", "param"}; static const char *varabbrev = "gltp"; -int c_vmvarlist(EngineState *s) { +int c_vmvarlist(EngineState *s, const Common::Array<cmd_param_t> &cmdParams) { int i; for (i = 0;i < 4;i++) { @@ -1492,13 +1496,13 @@ int c_vmvarlist(EngineState *s) { return 0; } -int c_vmvars(EngineState *s) { - const char *vartype_pre = strchr(varabbrev, *cmd_params[0].str); +int c_vmvars(EngineState *s, const Common::Array<cmd_param_t> &cmdParams) { + const char *vartype_pre = strchr(varabbrev, *cmdParams[0].str); int vartype; - int idx = cmd_params[1].val; + int idx = cmdParams[1].val; if (!vartype_pre) { - sciprintf("Invalid variable type '%c'\n", *cmd_params[0].str); + sciprintf("Invalid variable type '%c'\n", *cmdParams[0].str); return 1; } vartype = vartype_pre - varabbrev; @@ -1512,13 +1516,13 @@ int c_vmvars(EngineState *s) { return 1; } - switch (cmd_paramlength) { + switch (cmdParams.size()) { case 2: sciprintf("%s var %d == "PREG"\n", varnames[vartype], idx, PRINT_REG(p_vars[vartype][idx])); break; case 3: - p_vars[vartype][idx] = cmd_params[2].reg; + p_vars[vartype][idx] = cmdParams[2].reg; break; default: @@ -1528,7 +1532,7 @@ int c_vmvars(EngineState *s) { return 0; } -static int c_backtrace(EngineState *s) { +static int c_backtrace(EngineState *s, const Common::Array<cmd_param_t> &cmdParams) { int i; if (!_debugstate_valid) { @@ -1596,7 +1600,7 @@ static int c_backtrace(EngineState *s) { return 0; } -static int c_redraw_screen(EngineState *s) { +static int c_redraw_screen(EngineState *s, const Common::Array<cmd_param_t> &cmdParams) { if (!_debugstate_valid) { sciprintf("Not in debug state\n"); return 1; @@ -1610,7 +1614,7 @@ static int c_redraw_screen(EngineState *s) { return 0; } -static int c_clear_screen(EngineState *s) { +static int c_clear_screen(EngineState *s, const Common::Array<cmd_param_t> &cmdParams) { if (!_debugstate_valid) { sciprintf("Not in debug state\n"); return 1; @@ -1622,7 +1626,7 @@ static int c_clear_screen(EngineState *s) { return 0; } -static int c_visible_map(EngineState *s) { +static int c_visible_map(EngineState *s, const Common::Array<cmd_param_t> &cmdParams) { if (!s) { sciprintf("Not in debug state\n"); return 1; @@ -1633,8 +1637,8 @@ static int c_visible_map(EngineState *s) { if (s->onscreen_console) con_restore_screen(s, s->osc_backup); - if (cmd_params[0].val <= 3) - s->pic_visible_map = cmd_params[0].val; + if (cmdParams[0].val <= 3) + s->pic_visible_map = cmdParams[0].val; c_redraw_screen(s); if (s->onscreen_console) @@ -1643,7 +1647,7 @@ static int c_visible_map(EngineState *s) { return 0; } -static int c_gfx_current_port(EngineState *s) { +static int c_gfx_current_port(EngineState *s, const Common::Array<cmd_param_t> &cmdParams) { if (!_debugstate_valid) { sciprintf("Not in debug state\n"); return 1; @@ -1657,7 +1661,7 @@ static int c_gfx_current_port(EngineState *s) { return 0; } -static int c_gfx_print_port(EngineState *s) { +static int c_gfx_print_port(EngineState *s, const Common::Array<cmd_param_t> &cmdParams) { GfxPort *port; if (!_debugstate_valid) { @@ -1667,9 +1671,9 @@ static int c_gfx_print_port(EngineState *s) { port = s->port; - if (cmd_paramlength > 0) { + if (cmdParams.size() > 0) { if (s->visual) { - port = gfxw_find_port(s->visual, cmd_params[0].val); + port = gfxw_find_port(s->visual, cmdParams[0].val); } else { sciprintf("visual is uninitialized.\n"); return 1; @@ -1684,14 +1688,14 @@ static int c_gfx_print_port(EngineState *s) { return 0; } -static int c_gfx_priority(EngineState *s) { +static int c_gfx_priority(EngineState *s, const Common::Array<cmd_param_t> &cmdParams) { if (!_debugstate_valid) { sciprintf("Not in debug state\n"); return 1; } - if (cmd_paramlength) { - int zone = cmd_params[0].val; + if (cmdParams.size()) { + int zone = cmdParams[0].val; if (zone < 0) zone = 0; if (zone > 15) zone = 15; @@ -1704,7 +1708,7 @@ static int c_gfx_priority(EngineState *s) { return 0; } -static int c_gfx_print_visual(EngineState *s) { +static int c_gfx_print_visual(EngineState *s, const Common::Array<cmd_param_t> &cmdParams) { if (!_debugstate_valid) { sciprintf("Not in debug state\n"); return 1; @@ -1718,7 +1722,7 @@ static int c_gfx_print_visual(EngineState *s) { return 0; } -static int c_gfx_print_dynviews(EngineState *s) { +static int c_gfx_print_dynviews(EngineState *s, const Common::Array<cmd_param_t> &cmdParams) { if (!_debugstate_valid) { sciprintf("Not in debug state\n"); return 1; @@ -1732,7 +1736,7 @@ static int c_gfx_print_dynviews(EngineState *s) { return 0; } -static int c_gfx_print_dropviews(EngineState *s) { +static int c_gfx_print_dropviews(EngineState *s, const Common::Array<cmd_param_t> &cmdParams) { if (!_debugstate_valid) { sciprintf("Not in debug state\n"); return 1; @@ -1746,7 +1750,7 @@ static int c_gfx_print_dropviews(EngineState *s) { return 0; } -static int c_gfx_drawpic(EngineState *s) { +static int c_gfx_drawpic(EngineState *s, const Common::Array<cmd_param_t> &cmdParams) { int flags = 1, default_palette = 0; if (!_debugstate_valid) { @@ -1754,14 +1758,14 @@ static int c_gfx_drawpic(EngineState *s) { return 1; } - if (cmd_paramlength > 1) { - default_palette = cmd_params[1].val; + if (cmdParams.size() > 1) { + default_palette = cmdParams[1].val; - if (cmd_paramlength > 2) - flags = cmd_params[2].val; + if (cmdParams.size() > 2) + flags = cmdParams[2].val; } - gfxop_new_pic(s->gfx_state, cmd_params[0].val, flags, default_palette); + gfxop_new_pic(s->gfx_state, cmdParams[0].val, flags, default_palette); gfxop_clear_box(s->gfx_state, gfx_rect(0, 0, 320, 200)); gfxop_update(s->gfx_state); gfxop_sleep(s->gfx_state, 0); @@ -1773,16 +1777,16 @@ static int c_gfx_drawpic(EngineState *s) { extern GfxWidget *debug_widgets[]; extern int debug_widget_pos; -static int c_gfx_print_widget(EngineState *s) { +static int c_gfx_print_widget(EngineState *s, const Common::Array<cmd_param_t> &cmdParams) { if (!_debugstate_valid) { sciprintf("Not in debug state\n"); return 1; } - if (cmd_paramlength) { + if (cmdParams.size()) { unsigned int i; - for (i = 0; i < cmd_paramlength ; i++) { - int widget_nr = cmd_params[i].val; + for (i = 0; i < cmdParams.size() ; i++) { + int widget_nr = cmdParams[i].val; sciprintf("===== Widget #%d:\n", widget_nr); debug_widgets[widget_nr]->print(0); @@ -1799,8 +1803,8 @@ static int c_gfx_print_widget(EngineState *s) { } #endif -static int c_gfx_show_map(EngineState *s) { - int map = cmd_params[0].val; +static int c_gfx_show_map(EngineState *s, const Common::Array<cmd_param_t> &cmdParams) { + int map = cmdParams[0].val; if (!_debugstate_valid) { sciprintf("Not in debug state\n"); return 1; @@ -1834,11 +1838,11 @@ static int c_gfx_show_map(EngineState *s) { return 0; } -static int c_gfx_draw_cel(EngineState *s) { - int view = cmd_params[0].val; - int loop = cmd_params[1].val; - int cel = cmd_params[2].val; - int palette = cmd_params[3].val; +static int c_gfx_draw_cel(EngineState *s, const Common::Array<cmd_param_t> &cmdParams) { + int view = cmdParams[0].val; + int loop = cmdParams[1].val; + int cel = cmdParams[2].val; + int palette = cmdParams[3].val; if (!s) { sciprintf("Not in debug state!\n"); @@ -1852,8 +1856,8 @@ static int c_gfx_draw_cel(EngineState *s) { return 0; } -static int c_gfx_fill_screen(EngineState *s) { - int col = cmd_params[0].val; +static int c_gfx_fill_screen(EngineState *s, const Common::Array<cmd_param_t> &cmdParams) { + int col = cmdParams[0].val; if (!s) { sciprintf("Not in debug state!\n"); @@ -1870,8 +1874,8 @@ static int c_gfx_fill_screen(EngineState *s) { return 0; } -static int c_gfx_draw_rect(EngineState *s) { - int col = cmd_params[4].val; +static int c_gfx_draw_rect(EngineState *s, const Common::Array<cmd_param_t> &cmdParams) { + int col = cmdParams[4].val; if (!s) { sciprintf("Not in debug state!\n"); @@ -1882,14 +1886,14 @@ static int c_gfx_draw_rect(EngineState *s) { col = 0; gfxop_set_clip_zone(s->gfx_state, gfx_rect_fullscreen); - gfxop_fill_box(s->gfx_state, gfx_rect(cmd_params[0].val, cmd_params[1].val, cmd_params[2].val, cmd_params[3].val), s->ega_colors[col]); + gfxop_fill_box(s->gfx_state, gfx_rect(cmdParams[0].val, cmdParams[1].val, cmdParams[2].val, cmdParams[3].val), s->ega_colors[col]); gfxop_update(s->gfx_state); return 0; } -static int c_gfx_propagate_rect(EngineState *s) { - int map = cmd_params[4].val; +static int c_gfx_propagate_rect(EngineState *s, const Common::Array<cmd_param_t> &cmdParams) { + int map = cmdParams[4].val; rect_t rect; if (!s) { @@ -1902,7 +1906,7 @@ static int c_gfx_propagate_rect(EngineState *s) { gfxop_set_clip_zone(s->gfx_state, gfx_rect_fullscreen); - rect = gfx_rect(cmd_params[0].val, cmd_params[1].val, cmd_params[2].val, cmd_params[3].val); + rect = gfx_rect(cmdParams[0].val, cmdParams[1].val, cmdParams[2].val, cmdParams[3].val); if (map == 1) gfxop_clear_box(s->gfx_state, rect); @@ -1922,12 +1926,12 @@ static int c_gfx_propagate_rect(EngineState *s) { #if 0 // Unreferenced - removed -static int c_gfx_draw_viewobj(EngineState *s) { +static int c_gfx_draw_viewobj(EngineState *s, const Common::Array<cmd_param_t> &cmdParams) { #ifdef __GNUC__ #warning "Re-implement con:gfx_draw_viewobj" #endif #if 0 - HeapPtr pos = (HeapPtr)(cmd_params[0].val); + HeapPtr pos = (HeapPtr)(cmdParams[0].val); int is_view; int x, y, priority; int nsLeft, nsRight, nsBottom, nsTop; @@ -1988,7 +1992,7 @@ static int c_gfx_draw_viewobj(EngineState *s) { } #endif -static int c_gfx_flush_resources(EngineState *s) { +static int c_gfx_flush_resources(EngineState *s, const Common::Array<cmd_param_t> &cmdParams) { if (!_debugstate_valid) { sciprintf("Not in debug state\n"); return 1; @@ -2003,18 +2007,18 @@ static int c_gfx_flush_resources(EngineState *s) { return 0; } -static int c_gfx_update_zone(EngineState *s) { +static int c_gfx_update_zone(EngineState *s, const Common::Array<cmd_param_t> &cmdParams) { if (!_debugstate_valid) { sciprintf("Not in debug state\n"); return 1; } - return s->gfx_state->driver->update(s->gfx_state->driver, gfx_rect(cmd_params[0].val, cmd_params[1].val, cmd_params[2].val, cmd_params[3].val), - Common::Point(cmd_params[0].val, cmd_params[1].val), GFX_BUFFER_FRONT); + return s->gfx_state->driver->update(s->gfx_state->driver, gfx_rect(cmdParams[0].val, cmdParams[1].val, cmdParams[2].val, cmdParams[3].val), + Common::Point(cmdParams[0].val, cmdParams[1].val), GFX_BUFFER_FRONT); } -static int c_disasm_addr(EngineState *s) { - reg_t vpc = cmd_params[0].reg; +static int c_disasm_addr(EngineState *s, const Common::Array<cmd_param_t> &cmdParams) { + reg_t vpc = cmdParams[0].reg; int op_count = 1; int do_bwc = 0; int do_bytes = 0; @@ -2025,16 +2029,16 @@ static int c_disasm_addr(EngineState *s) { s->seg_manager->dereference(vpc, &size); size += vpc.offset; // total segment size - for (i = 1; i < cmd_paramlength; i++) { - if (!scumm_stricmp(cmd_params[i].str, "bwt")) + for (i = 1; i < cmdParams.size(); i++) { + if (!scumm_stricmp(cmdParams[i].str, "bwt")) do_bwc = 1; - else if (!scumm_stricmp(cmd_params[i].str, "bc")) + else if (!scumm_stricmp(cmdParams[i].str, "bc")) do_bytes = 1; - else if (toupper(cmd_params[i].str[0]) == 'C') - op_count = atoi(cmd_params[i].str + 1); + else if (toupper(cmdParams[i].str[0]) == 'C') + op_count = atoi(cmdParams[i].str + 1); else { invalid = 1; - sciprintf("Invalid option '%s'\n", cmd_params[i].str); + sciprintf("Invalid option '%s'\n", cmdParams[i].str); } } @@ -2048,9 +2052,9 @@ static int c_disasm_addr(EngineState *s) { return 0; } -static int c_disasm(EngineState *s) { - Object *obj = obj_get(s, cmd_params[0].reg); - int selector_id = script_find_selector(s, cmd_params[1].str); +static int c_disasm(EngineState *s, const Common::Array<cmd_param_t> &cmdParams) { + Object *obj = obj_get(s, cmdParams[0].reg); + int selector_id = script_find_selector(s, cmdParams[1].str); reg_t addr; if (!obj) { @@ -2063,7 +2067,7 @@ static int c_disasm(EngineState *s) { return 1; } - if (lookup_selector(s, cmd_params[0].reg, selector_id, NULL, &addr) != kSelectorMethod) { + if (lookup_selector(s, cmdParams[0].reg, selector_id, NULL, &addr) != kSelectorMethod) { sciprintf("Not a method."); return 1; } @@ -2075,15 +2079,15 @@ static int c_disasm(EngineState *s) { return 0; } -static int c_sg(EngineState *s) { +static int c_sg(EngineState *s, const Common::Array<cmd_param_t> &cmdParams) { _debug_seeking = _DEBUG_SEEK_GLOBAL; - _debug_seek_special = cmd_params[0].val; + _debug_seek_special = cmdParams[0].val; _debugstate_valid = 0; return 0; } -static int c_snk(EngineState *s) { +static int c_snk(EngineState *s, const Common::Array<cmd_param_t> &cmdParams) { int callk_index; char *endptr; @@ -2092,21 +2096,21 @@ static int c_snk(EngineState *s) { return 1; } - if (cmd_paramlength > 0) { + if (cmdParams.size() > 0) { /* Try to convert the parameter to a number. If the conversion stops before end of string, assume that the parameter is a function name and scan the function table to find out the index. */ - callk_index = strtoul(cmd_params [0].str, &endptr, 0); + callk_index = strtoul(cmdParams [0].str, &endptr, 0); if (*endptr != '\0') { callk_index = -1; for (uint i = 0; i < s->_kernelNames.size(); i++) - if (cmd_params [0].str == s->_kernelNames[i]) { + if (cmdParams [0].str == s->_kernelNames[i]) { callk_index = i; break; } if (callk_index == -1) { - sciprintf("Unknown kernel function '%s'\n", cmd_params[0].str); + sciprintf("Unknown kernel function '%s'\n", cmdParams[0].str); return 1; } } @@ -2122,28 +2126,28 @@ static int c_snk(EngineState *s) { return 0; } -static int c_sret(EngineState *s) { +static int c_sret(EngineState *s, const Common::Array<cmd_param_t> &cmdParams) { _debug_seeking = _DEBUG_SEEK_LEVEL_RET; _debug_seek_level = s->execution_stack_pos; _debugstate_valid = 0; return 0; } -static int c_go(EngineState *s) { +static int c_go(EngineState *s, const Common::Array<cmd_param_t> &cmdParams) { _debug_seeking = 0; _debugstate_valid = 0; script_debug_flag = 0; return 0; } -static int c_set_acc(EngineState *s) { - s->r_acc = cmd_params[0].reg; +static int c_set_acc(EngineState *s, const Common::Array<cmd_param_t> &cmdParams) { + s->r_acc = cmdParams[0].reg; return 0; } -static int c_send(EngineState *s) { - reg_t object = cmd_params[0].reg; - char *selector_name = cmd_params[1].str; +static int c_send(EngineState *s, const Common::Array<cmd_param_t> &cmdParams) { + reg_t object = cmdParams[0].reg; + char *selector_name = cmdParams[1].str; StackPtr stackframe = s->_executionStack[0].sp; int selector_id; unsigned int i; @@ -2173,36 +2177,36 @@ static int c_send(EngineState *s) { } stackframe[0] = make_reg(0, selector_id); - stackframe[1] = make_reg(0, cmd_paramlength - 2); + stackframe[1] = make_reg(0, cmdParams.size() - 2); - for (i = 2; i < cmd_paramlength; i++) - stackframe[i] = cmd_params[i].reg; + for (i = 2; i < cmdParams.size(); i++) + stackframe[i] = cmdParams[i].reg; - xstack = add_exec_stack_entry(s, fptr, s->_executionStack[0].sp + cmd_paramlength, object, cmd_paramlength - 2, + xstack = add_exec_stack_entry(s, fptr, s->_executionStack[0].sp + cmdParams.size(), object, cmdParams.size() - 2, s->_executionStack[0].sp - 1, 0, object, s->execution_stack_pos, SCI_XS_CALLEE_LOCALS); xstack->selector = selector_id; xstack->type = selector_type == kSelectorVariable ? EXEC_STACK_TYPE_VARSELECTOR : EXEC_STACK_TYPE_CALL; // Now commit the actual function: - xstack = send_selector(s, object, object, stackframe, cmd_paramlength - 2, stackframe); + xstack = send_selector(s, object, object, stackframe, cmdParams.size() - 2, stackframe); - xstack->sp += cmd_paramlength; - xstack->fp += cmd_paramlength; + xstack->sp += cmdParams.size(); + xstack->fp += cmdParams.size(); s->_executionStackPosChanged = true; return 0; } -static int c_resource_id(EngineState *s) { - int id = cmd_params[0].val; +static int c_resource_id(EngineState *s, const Common::Array<cmd_param_t> &cmdParams) { + int id = cmdParams[0].val; sciprintf("%s.%d (0x%x)\n", getResourceTypeName((ResourceType)(id >> 11)), id & 0x7ff, id & 0x7ff); return 0; } -static int c_listclones(EngineState *s) { +static int c_listclones(EngineState *s, const Common::Array<cmd_param_t> &cmdParams) { #if 0 int i, j = 0; @@ -2280,7 +2284,8 @@ static void handle_config_update(const generic_config_flag_t *flags_list, int fl } } -static int c_handle_config_update(const generic_config_flag_t *flags, int flags_nr, const char *subsystem, int *active_options_p) { +static int c_handle_config_update(const generic_config_flag_t *flags, int flags_nr, const char *subsystem, + int *active_options_p, const Common::Array<cmd_param_t> &cmdParams) { unsigned int i; if (!_debugstate_valid) { @@ -2288,11 +2293,11 @@ static int c_handle_config_update(const generic_config_flag_t *flags, int flags_ return 1; } - if (cmd_paramlength == 0) + if (cmdParams.size() == 0) handle_config_update(flags, flags_nr, subsystem, active_options_p, 0); - for (i = 0; i < cmd_paramlength; i++) - handle_config_update(flags, flags_nr, subsystem, active_options_p, cmd_params[i].str); + for (i = 0; i < cmdParams.size(); i++) + handle_config_update(flags, flags_nr, subsystem, active_options_p, cmdParams[i].str); return 0; } @@ -2328,24 +2333,24 @@ void set_debug_mode(EngineState *s, int mode, const char *areas) { free(param); } -int c_debuglog(EngineState *s) { - return c_handle_config_update(SCIk_Debug_Names, SCIk_DEBUG_MODES, "VM and kernel", (int *)&(s->debug_mode)); +int c_debuglog(EngineState *s, const Common::Array<cmd_param_t> &cmdParams) { + return c_handle_config_update(SCIk_Debug_Names, SCIk_DEBUG_MODES, "VM and kernel", (int *)&(s->debug_mode), cmdParams); } #define SFX_DEBUG_MODES 2 #define FROBNICATE_HANDLE(reg) ((reg).segment << 16 | (reg).offset) -static int c_sfx_debuglog(EngineState *s) { +static int c_sfx_debuglog(EngineState *s, const Common::Array<cmd_param_t> &cmdParams) { const generic_config_flag_t sfx_debug_modes[SFX_DEBUG_MODES] = { {"Song activation/deactivation", 's', SFX_DEBUG_SONGS}, {"Song cue polling and delivery", 'c', SFX_DEBUG_CUES} }; - return c_handle_config_update(sfx_debug_modes, SFX_DEBUG_MODES, "sound subsystem", (int *)&(s->sound.debug)); + return c_handle_config_update(sfx_debug_modes, SFX_DEBUG_MODES, "sound subsystem", (int *)&(s->sound.debug), cmdParams); } -static int c_sfx_remove(EngineState *s) { - reg_t id = cmd_params[0].reg; +static int c_sfx_remove(EngineState *s, const Common::Array<cmd_param_t> &cmdParams) { + reg_t id = cmdParams[0].reg; int handle = FROBNICATE_HANDLE(id); if (id.segment) { @@ -2361,7 +2366,7 @@ static int c_sfx_remove(EngineState *s) { #define GFX_DEBUG_MODES 4 -int c_gfx_debuglog(EngineState *s) { +int c_gfx_debuglog(EngineState *s, const Common::Array<cmd_param_t> &cmdParams) { gfx_driver_t *drv = s->gfx_state->driver; const generic_config_flag_t gfx_debug_modes[GFX_DEBUG_MODES] = { { "Mouse Pointer", 'p', GFX_DEBUG_POINTER}, @@ -2370,10 +2375,10 @@ int c_gfx_debuglog(EngineState *s) { { "Basic operations", 'b', GFX_DEBUG_BASIC}, }; - return c_handle_config_update(gfx_debug_modes, GFX_DEBUG_MODES, "graphics subsystem", (int *)&(drv->debug_flags)); + return c_handle_config_update(gfx_debug_modes, GFX_DEBUG_MODES, "graphics subsystem", (int *)&(drv->debug_flags), cmdParams); } -int c_dump_words(EngineState *s) { +int c_dump_words(EngineState *s, const Common::Array<cmd_param_t> &cmdParams) { if (!s) { sciprintf("Not in debug state\n"); return 1; @@ -2392,14 +2397,14 @@ int c_dump_words(EngineState *s) { return 0; } -int c_simkey(EngineState *s) { - _kdebug_cheap_event_hack = cmd_params[0].val; +int c_simkey(EngineState *s, const Common::Array<cmd_param_t> &cmdParams) { + _kdebug_cheap_event_hack = cmdParams[0].val; return 0; } -static int c_is_sample(EngineState *s) { - Resource *song = s->resmgr->findResource(kResourceTypeSound, cmd_params[0].val, 0); +static int c_is_sample(EngineState *s, const Common::Array<cmd_param_t> &cmdParams) { + Resource *song = s->resmgr->findResource(kResourceTypeSound, cmdParams[0].val, 0); SongIterator *songit; Audio::AudioStream *data; @@ -2429,14 +2434,14 @@ static int c_is_sample(EngineState *s) { return 0; } -int c_simsoundcue(EngineState *s) { - _kdebug_cheap_soundcue_hack = cmd_params[0].val; +int c_simsoundcue(EngineState *s, const Common::Array<cmd_param_t> &cmdParams) { + _kdebug_cheap_soundcue_hack = cmdParams[0].val; return 0; } #define ASSERT_PARAMS(number) \ - if (cmd_paramlength <= number) {\ + if (cmdParams.size() <= number) {\ sciprintf("Operation '%s' needs %d parameters\n", op, number); \ return 1;\ } @@ -2562,20 +2567,20 @@ int objinfo(EngineState *s, reg_t pos) { return 0; } -int c_vo(EngineState *s) { - return objinfo(s, cmd_params[0].reg); +int c_vo(EngineState *s, const Common::Array<cmd_param_t> &cmdParams) { + return objinfo(s, cmdParams[0].reg); } -int c_obj(EngineState *s) { +int c_obj(EngineState *s, const Common::Array<cmd_param_t> &cmdParams) { return objinfo(s, *p_objp); } -int c_accobj(EngineState *s) { +int c_accobj(EngineState *s, const Common::Array<cmd_param_t> &cmdParams) { return objinfo(s, s->r_acc); } -int c_shownode(EngineState *s) { - reg_t addr = cmd_params[0].reg; +int c_shownode(EngineState *s, const Common::Array<cmd_param_t> &cmdParams) { + reg_t addr = cmdParams[0].reg; return show_node(s, addr); } @@ -2601,7 +2606,7 @@ static Breakpoint *bp_alloc(EngineState *s) { return bp; } -int c_bpx(EngineState *s) { +int c_bpx(EngineState *s, const Common::Array<cmd_param_t> &cmdParams) { Breakpoint *bp; /* Note: We can set a breakpoint on a method that has not been loaded yet. @@ -2611,26 +2616,26 @@ int c_bpx(EngineState *s) { bp = bp_alloc(s); bp->type = BREAK_SELECTOR; - bp->data.name = (char *)sci_malloc(strlen(cmd_params [0].str) + 1); - strcpy(bp->data.name, cmd_params [0].str); + bp->data.name = (char *)sci_malloc(strlen(cmdParams [0].str) + 1); + strcpy(bp->data.name, cmdParams [0].str); s->have_bp |= BREAK_SELECTOR; return 0; } -int c_bpe(EngineState *s) { +int c_bpe(EngineState *s, const Common::Array<cmd_param_t> &cmdParams) { Breakpoint *bp; bp = bp_alloc(s); bp->type = BREAK_EXPORT; - bp->data.address = (cmd_params [0].val << 16 | cmd_params [1].val); + bp->data.address = (cmdParams [0].val << 16 | cmdParams [1].val); s->have_bp |= BREAK_EXPORT; return 0; } -int c_bplist(EngineState *s) { +int c_bplist(EngineState *s, const Common::Array<cmd_param_t> &cmdParams) { Breakpoint *bp; int i = 0; int bpdata; @@ -2655,7 +2660,7 @@ int c_bplist(EngineState *s) { return 0; } -int c_bpdel(EngineState *s) { +int c_bpdel(EngineState *s, const Common::Array<cmd_param_t> &cmdParams) { Breakpoint *bp, *bp_next, *bp_prev; int i = 0, found = 0; int type; @@ -2663,13 +2668,13 @@ int c_bpdel(EngineState *s) { // Find breakpoint with given index bp_prev = NULL; bp = s->bp_list; - while (bp && i < cmd_params [0].val) { + while (bp && i < cmdParams [0].val) { bp_prev = bp; bp = bp->next; i++; } if (!bp) { - sciprintf("Invalid breakpoint index %i\n", cmd_params [0].val); + sciprintf("Invalid breakpoint index %i\n", cmdParams [0].val); return 1; } @@ -2698,7 +2703,7 @@ int c_bpdel(EngineState *s) { return 0; } -int c_gnf(EngineState *s) { +int c_gnf(EngineState *s, const Common::Array<cmd_param_t> &cmdParams) { if (!s) { sciprintf("Not in debug state\n"); return 1; @@ -2709,15 +2714,15 @@ int c_gnf(EngineState *s) { return 0; } -int c_se(EngineState *s) { +int c_se(EngineState *s, const Common::Array<cmd_param_t> &cmdParams) { stop_on_event = 1; _debugstate_valid = script_debug_flag = script_error_flag = 0; return 0; } -int c_type(EngineState *s) { - int t = determine_reg_type(s, cmd_params[0].reg, 1); +int c_type(EngineState *s, const Common::Array<cmd_param_t> &cmdParams) { + int t = determine_reg_type(s, cmdParams[0].reg, 1); int invalid = t & KSIG_INVALID; switch (t & ~KSIG_INVALID) { @@ -2750,17 +2755,17 @@ int c_type(EngineState *s) { return 0; } -int c_statusbar(EngineState *s) { +int c_statusbar(EngineState *s, const Common::Array<cmd_param_t> &cmdParams) { if (!s) { sciprintf("Not in debug state\n"); return 1; } - s->titlebar_port->_color = s->ega_colors[cmd_params[0].val]; - s->titlebar_port->_bgcolor = s->ega_colors[cmd_params[1].val]; + s->titlebar_port->_color = s->ega_colors[cmdParams[0].val]; + s->titlebar_port->_bgcolor = s->ega_colors[cmdParams[1].val]; - s->status_bar_foreground = cmd_params[0].val; - s->status_bar_background = cmd_params[1].val; + s->status_bar_foreground = cmdParams[0].val; + s->status_bar_background = cmdParams[1].val; sciw_set_status_bar(s, s->titlebar_port, s->_statusBarText, s->status_bar_foreground, s->status_bar_background); gfxop_update(s->gfx_state); @@ -2768,7 +2773,7 @@ int c_statusbar(EngineState *s) { return 0; } -int c_sci_version(EngineState *s) { +int c_sci_version(EngineState *s, const Common::Array<cmd_param_t> &cmdParams) { if (!s) { sciprintf("Not in debug state\n"); return 1; @@ -2780,8 +2785,8 @@ int c_sci_version(EngineState *s) { return 0; } -// int c_sleep(EngineState *s) { -// sleep(cmd_params[0].val); +// int c_sleep(EngineState *s, const Common::Array<cmd_param_t> &cmdParams) { +// sleep(cmdParams[0].val); // // return 0; // } @@ -2791,8 +2796,8 @@ static void _print_address(void * _, reg_t addr) { sciprintf(" "PREG"\n", PRINT_REG(addr)); } -static int c_gc_show_reachable(EngineState *s) { - reg_t addr = cmd_params[0].reg; +static int c_gc_show_reachable(EngineState *s, const Common::Array<cmd_param_t> &cmdParams) { + reg_t addr = cmdParams[0].reg; MemObject *mobj = GET_SEGMENT_ANY(*s->seg_manager, addr.segment); if (!mobj) { @@ -2806,8 +2811,8 @@ static int c_gc_show_reachable(EngineState *s) { return 0; } -static int c_gc_show_freeable(EngineState *s) { - reg_t addr = cmd_params[0].reg; +static int c_gc_show_freeable(EngineState *s, const Common::Array<cmd_param_t> &cmdParams) { + reg_t addr = cmdParams[0].reg; MemObject *mobj = GET_SEGMENT_ANY(*s->seg_manager, addr.segment); if (!mobj) { @@ -2821,8 +2826,8 @@ static int c_gc_show_freeable(EngineState *s) { return 0; } -static int c_gc_normalise(EngineState *s) { - reg_t addr = cmd_params[0].reg; +static int c_gc_normalise(EngineState *s, const Common::Array<cmd_param_t> &cmdParams) { + reg_t addr = cmdParams[0].reg; MemObject *mobj = GET_SEGMENT_ANY(*s->seg_manager, addr.segment); if (!mobj) { @@ -2836,13 +2841,13 @@ static int c_gc_normalise(EngineState *s) { return 0; } -static int c_gc(EngineState *s) { +static int c_gc(EngineState *s, const Common::Array<cmd_param_t> &cmdParams) { run_gc(s); return 0; } -static int c_gc_list_reachable(EngineState *s) { +static int c_gc_list_reachable(EngineState *s, const Common::Array<cmd_param_t> &cmdParams) { reg_t_hash_map *use_map = find_all_used_references(s); sciprintf("Reachable references (normalised):\n"); diff --git a/engines/sci/sci.cpp b/engines/sci/sci.cpp index 9c799f7fd7..855803c889 100644 --- a/engines/sci/sci.cpp +++ b/engines/sci/sci.cpp @@ -43,7 +43,7 @@ namespace Sci { extern gfx_driver_t gfx_driver_scummvm; -int c_quit(EngineState *s) { +int c_quit(EngineState *s, const Common::Array<cmd_param_t> &cmdParams) { script_abort_flag = 1; // Terminate VM _debugstate_valid = 0; _debug_seeking = 0; @@ -51,7 +51,7 @@ int c_quit(EngineState *s) { return 0; } -int c_die(EngineState *s) { +int c_die(EngineState *s, const Common::Array<cmd_param_t> &cmdParams) { exit(0); // return 0; } diff --git a/engines/sci/scicore/sciconsole.h b/engines/sci/scicore/sciconsole.h index dc8d0abd3f..eca3474390 100644 --- a/engines/sci/scicore/sciconsole.h +++ b/engines/sci/scicore/sciconsole.h @@ -52,15 +52,8 @@ union cmd_param_t { reg_t reg; }; -/** The number of parameters passed to a function called from the parser */ -extern unsigned int cmd_paramlength; - -/** The parameters passed to a function called by the parser */ -extern cmd_param_t *cmd_params; - -/** The game state as used by some of the console commands */ -extern struct EngineState *con_gamestate; +typedef int (*ConCommand)(EngineState *s, const Common::Array<cmd_param_t> &cmdParams); /*** FUNCTION DEFINITIONS ***/ @@ -98,7 +91,7 @@ void con_parse(EngineState *s, const char *command); */ -int con_hook_command(int command(EngineState *s), const char *name, const char *param, const char *description); +int con_hook_command(ConCommand command, const char *name, const char *param, const char *description); /* Adds a command to the parser's command list ** Parameters: command: The command to add ** name: The command's name |