diff options
| author | 2008-08-07 15:53:58 +0000 | |
|---|---|---|
| committer | 2008-08-07 15:53:58 +0000 | |
| commit | 9df01a28965b68eededf472e609bb2615ab11dcb (patch) | |
| tree | e02609e61b7fd26d2d796122cc1e4b55c51481e6 /src/emu/debug/express.c | |
| parent | 3107dc2dffe23f7e52b4f46d35d8e458c6b663b4 (diff) | |
Added expression validation callback to verify names for CPUs and
memory regions. Extended error codes to report incorrect memory
spaces, memory names, or memory sizes. Added verification callback
to the debugger to validate CPU and memory region names, as well
as verifying that a requested address space exists for a given
CPU.
Added support for oneshot cheats (those with only an "on" script).
They are activated via UI_SELECT in the cheat menu, and pop up a
message when activated. Also added a "Reset All" item in the cheat
menu to reset all cheats back to their default state, and added
support for UI_SELECT on a non-oneshot cheat so that it resets that
cheat to its default value.
Restored previous behavior that allowed popmessage() messages to
overlay menus and other UI.
Diffstat (limited to 'src/emu/debug/express.c')
| -rw-r--r-- | src/emu/debug/express.c | 66 |
1 files changed, 42 insertions, 24 deletions
diff --git a/src/emu/debug/express.c b/src/emu/debug/express.c index f61edda8407..e2d69b2093a 100644 --- a/src/emu/debug/express.c +++ b/src/emu/debug/express.c @@ -518,8 +518,10 @@ static void print_tokens(FILE *out, parsed_expression *expr) forms of memory operators -------------------------------------------------*/ -static int parse_memory_operator(parsed_expression *expr, const char *buffer, token_info *flags) +static EXPRERR parse_memory_operator(parsed_expression *expr, int offset, const char *buffer, token_info *flags) { + const char *startbuffer = buffer; + const char *namestring = NULL; int space = 'p', size; const char *dot; int length; @@ -531,8 +533,10 @@ static int parse_memory_operator(parsed_expression *expr, const char *buffer, to if (dot != NULL) { UINT16 index; - if (!add_expression_string(expr, buffer, dot - buffer, &index)) - return 0; + + namestring = add_expression_string(expr, buffer, dot - buffer, &index); + if (namestring == NULL) + return MAKE_EXPRERR_OUT_OF_MEMORY(offset); *flags |= index << TIN_MEMORY_INDEX_SHIFT; buffer = dot + 1; } @@ -551,7 +555,7 @@ static int parse_memory_operator(parsed_expression *expr, const char *buffer, to /* anything else is invalid */ else - return 0; + return MAKE_EXPRERR_INVALID_TOKEN(offset); /* convert the space to flags */ switch (space) @@ -563,7 +567,7 @@ static int parse_memory_operator(parsed_expression *expr, const char *buffer, to case 'r': *flags |= TIN_MEMORY_RAMWRITE; break; case 'e': *flags |= TIN_MEMORY_EEPROM; break; case 'm': *flags |= TIN_MEMORY_REGION; break; - default: return 0; + default: return MAKE_EXPRERR_INVALID_MEMORY_SPACE(offset + (buffer - startbuffer)); } /* convert the size to flags */ @@ -573,10 +577,20 @@ static int parse_memory_operator(parsed_expression *expr, const char *buffer, to case 'w': *flags |= TIN_MEMORY_WORD; break; case 'd': *flags |= TIN_MEMORY_DWORD; break; case 'q': *flags |= TIN_MEMORY_QWORD; break; - default: return 0; + default: return MAKE_EXPRERR_INVALID_MEMORY_SIZE(offset + (buffer - startbuffer) + length - 1); } - - return 1; + + /* validate the name */ + if (expr->callbacks.valid != NULL) + { + EXPRERR err = (*expr->callbacks.valid)(namestring, (*flags & TIN_MEMORY_SPACE_MASK) >> TIN_MEMORY_SPACE_SHIFT); + if (err == EXPRERR_INVALID_MEMORY_SPACE) + return MAKE_EXPRERR_INVALID_MEMORY_SPACE(offset + (buffer - startbuffer)); + else if (err != EXPRERR_NONE) + return MAKE_EXPRERR(err, offset); + } + + return EXPRERR_NONE; } @@ -598,9 +612,6 @@ static EXPRERR parse_string_into_tokens(const char *stringstart, parsed_expressi parse_token *token = expr->token; const char *string = stringstart; - /* zap expression object */ - memset(expr, 0, sizeof(*expr)); - /* stash the symbol table pointer */ expr->table = table; @@ -826,11 +837,11 @@ static EXPRERR parse_string_into_tokens(const char *stringstart, parsed_expressi if (string[0] == '@') { token_info info; - if (parse_memory_operator(expr, buffer, &info)) - { - SET_TOKEN_INFO(1, TOK_OPERATOR, TVL_MEMORYAT, TIN_PRECEDENCE_2 | info); - break; - } + EXPRERR err = parse_memory_operator(expr, token->offset, buffer, &info); + if (err != EXPRERR_NONE) + return err; + SET_TOKEN_INFO(1, TOK_OPERATOR, TVL_MEMORYAT, TIN_PRECEDENCE_2 | info); + break; } /* empty string is automatically invalid */ @@ -1725,6 +1736,11 @@ EXPRERR expression_evaluate(const char *expression, const symbol_table *table, c parsed_expression temp_expression; EXPRERR exprerr; + /* zap expression object and copy the callbacks */ + memset(&temp_expression, 0, sizeof(temp_expression)); + if (callbacks != NULL) + temp_expression.callbacks = *callbacks; + /* first parse the tokens into the token array in order */ exprerr = parse_string_into_tokens(expression, &temp_expression, table); if (exprerr != EXPRERR_NONE) @@ -1741,10 +1757,6 @@ EXPRERR expression_evaluate(const char *expression, const symbol_table *table, c /* debugging */ print_tokens(stdout, &temp_expression); - /* copy the callbacks */ - if (callbacks != NULL) - temp_expression.callbacks = *callbacks; - /* execute the expression to get the result */ exprerr = execute_tokens(&temp_expression, result); @@ -1764,6 +1776,11 @@ EXPRERR expression_parse(const char *expression, const symbol_table *table, cons parsed_expression temp_expression; EXPRERR exprerr; + /* zap expression object and copy the callbacks */ + memset(&temp_expression, 0, sizeof(temp_expression)); + if (callbacks != NULL) + temp_expression.callbacks = *callbacks; + /* first parse the tokens into the token array in order */ exprerr = parse_string_into_tokens(expression, &temp_expression, table); if (exprerr != EXPRERR_NONE) @@ -1782,10 +1799,6 @@ EXPRERR expression_parse(const char *expression, const symbol_table *table, cons goto cleanup; } - /* copy the callbacks */ - if (callbacks != NULL) - temp_expression.callbacks = *callbacks; - /* copy the final expression and return */ **result = temp_expression; return EXPRERR_NONE; @@ -1862,6 +1875,11 @@ const char *exprerr_to_string(EXPRERR error) case EXPRERR_INVALID_PARAM_COUNT: return "invalid number of parameters"; case EXPRERR_UNBALANCED_QUOTES: return "unbalanced quotes"; case EXPRERR_TOO_MANY_STRINGS: return "too many strings"; + case EXPRERR_INVALID_MEMORY_SIZE: return "invalid memory size (b/w/d/q expected)"; + case EXPRERR_NO_SUCH_MEMORY_SPACE: return "non-existent memory space"; + case EXPRERR_INVALID_MEMORY_SPACE: return "invalid memory space (p/d/i/o/r/m expected)"; + case EXPRERR_INVALID_MEMORY_NAME: return "invalid memory name"; + case EXPRERR_MISSING_MEMORY_NAME: return "missing memory name"; default: return "unknown error"; } } |
