aboutsummaryrefslogtreecommitdiff
path: root/saga/expr.cpp
diff options
context:
space:
mode:
authorTorbjörn Andersson2004-12-03 19:15:44 +0000
committerTorbjörn Andersson2004-12-03 19:15:44 +0000
commitc64c7eb4d4edd087031603df446abf271f616480 (patch)
treedcd747faca1c7f8d8fc0a9ba42a1bf1d076e83a7 /saga/expr.cpp
parent2cfdcb5a59dec0e66e81dc91be142224156de473 (diff)
downloadscummvm-rg350-c64c7eb4d4edd087031603df446abf271f616480.tar.gz
scummvm-rg350-c64c7eb4d4edd087031603df446abf271f616480.tar.bz2
scummvm-rg350-c64c7eb4d4edd087031603df446abf271f616480.zip
First pass at migrating from the old Reinherit console to the ScummVM
console. Some things are likely to have broken. For instance, I believe the old console was could be visible during gameplay, while ScummVM's is modal. So any place where we output something to the console during gameplay should probably be removed. Some things I've stubbed out. Basically any code that registers a variable. Most of the debugging commands are untested. Syntax may have changed because of different command-line parsing. (I never actually used the old console, so I don't know for sure. :-) Actually, I'm not that interested in reproducing the old console commands faithfully. What we should do now is to make the immediately useful console stuff work. Anything that remains unimplemented should probably be removed. svn-id: r15976
Diffstat (limited to 'saga/expr.cpp')
-rw-r--r--saga/expr.cpp390
1 files changed, 0 insertions, 390 deletions
diff --git a/saga/expr.cpp b/saga/expr.cpp
deleted file mode 100644
index ea744a1c4f..0000000000
--- a/saga/expr.cpp
+++ /dev/null
@@ -1,390 +0,0 @@
-/* ScummVM - Scumm Interpreter
- * Copyright (C) 2004 The ScummVM project
- *
- * The ReInherit Engine is (C)2000-2003 by Daniel Balsom.
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU General Public License
- * as published by the Free Software Foundation; either version 2
- * of the License, or (at your option) any later version.
-
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
-
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
- *
- * $Header$
- *
- */
-
-// Expression parsing module, and string handling functions
-
-// EXPR_ParseArgs() lifted wholesale from SDL win32 initialization code by Sam Lantinga
-
-#include "saga/saga.h"
-#include "saga/cvar_mod.h"
-#include "saga/expr.h"
-
-namespace Saga {
-
-static const char *EXPR_ErrMsg[] = {
- "Invalid error state.",
- "No Error",
- "Memory allocation failed",
- "Illegal variable name",
- "Expected \'=\' or \'(\' in expression",
- "Expected \'(\' in function call",
- "Illegal \'(\', identifier is not function",
- "Expected a value to assign",
- "Unterminated string literal",
- "Unmatched parenthesis in function call",
- "Error reading value string",
- "Expected a number or boolean",
- "Unknown variable or function"
-};
-
-enum EXPR_Errors {
- EXERR_ASSERT,
- EXERR_NONE,
- EXERR_MEM,
- EXERR_ILLEGAL,
- EXERR_EXPR,
- EXERR_FUNC,
- EXERR_NOTFUNC,
- EXERR_RVALUE,
- EXERR_LITERAL,
- EXERR_PAREN,
- EXERR_STRING,
- EXERR_NUMBER,
- EXERR_NOTFOUND
-};
-
-static enum EXPR_Errors EXPR_ErrorState;
-
-// Returns the appropriate expression parser error string given an error code.
-int EXPR_GetError(const char **err_str) {
- *err_str = EXPR_ErrMsg[EXPR_ErrorState];
- return EXPR_ErrorState;
-}
-
-// Parses an interactive expression.
-// Sets 'expCVAR' to the cvar/cfunction identifier input by the user, and
-// 'rvalue' to the corresponding rvalue ( in an expression ) or argument string
-// ( in a function call ).
-//
-// Memory pointed to by rvalue after return must be explicitly freed by the
-// caller.
-int EXPR_Parse(const char **exp_pp, int *len, CVAR_P *expCVAR, char **rvalue) {
- int i;
- int in_char;
- int equ_offset = 0;
- int rvalue_offset;
-
- char *lvalue_str;
- int lvalue_len;
- char *rvalue_str;
- int rvalue_len;
-
- const char *scan_p;
- int scan_len;
- const char *expr_p;
- int expr_len;
- int test_char = '\0';
- int have_func = 0;
-
- CVAR_P lvalue_cvar;
-
- expr_p = *exp_pp;
- expr_len = strlen(*exp_pp);
- scan_p = *exp_pp;
- scan_len = expr_len;
-
- //*lvalue = NULL;
- *rvalue = NULL;
-
- EXPR_ErrorState = EXERR_ASSERT;
-
- for (i = 0; i <= scan_len; i++, scan_p++) {
- in_char = *scan_p;
- if ((i == 0) && isdigit(in_char)) {
- // First character of a valid identifier cannot be a digit
- EXPR_ErrorState = EXERR_ILLEGAL;
- return FAILURE;
- }
-
- // If we reach a character that isn't valid in an identifier...
- if ((!isalnum(in_char)) && ((in_char != '_'))) {
-
- // then eat remaining whitespace, if any
- equ_offset = strspn(scan_p, EXPR_WHITESPACE);
- test_char = scan_p[equ_offset];
- // and test for the only valid characters after an identifier
- if ((test_char != '=') && (test_char != '\0') && (test_char != '(')) {
- if ((equ_offset == 0) && ((scan_p - expr_p) != expr_len)) {
- EXPR_ErrorState = EXERR_ILLEGAL;
- } else {
- EXPR_ErrorState = EXERR_EXPR;
- }
- return FAILURE;
- }
- break;
- }
- }
-
- lvalue_len = (scan_p - expr_p);
- lvalue_str = (char *)malloc(lvalue_len + 1);
-
- if (lvalue_str == NULL) {
- EXPR_ErrorState = EXERR_MEM;
- return FAILURE;
- }
-
- strncpy(lvalue_str, expr_p, lvalue_len);
- lvalue_str[lvalue_len] = 0;
-
- // We now have the lvalue, so attempt to find it
- lvalue_cvar = CVAR_Find(lvalue_str);
- if (lvalue_cvar == NULL) {
- EXPR_ErrorState = EXERR_NOTFOUND;
- return FAILURE;
- }
- if (lvalue_str) {
- free(lvalue_str);
- lvalue_str = NULL;
- }
-
- // Skip parsed character, if any
- scan_p += equ_offset + 1;
- scan_len = (scan_p - expr_p);
-
- // Check if the 'cvar' is really a function
- have_func = CVAR_IsFunc(lvalue_cvar);
-
- if (test_char == '(') {
- if (have_func) {
- rvalue_str = EXPR_ReadString(&scan_p, &rvalue_len, ')');
- if (rvalue_str != NULL) {
- // Successfully read string
- //CON_Print("Read function parameters \"%s\".", rvalue_str);
- *expCVAR = lvalue_cvar;
- *rvalue = rvalue_str;
-
- scan_len = (scan_p - expr_p);
-
- *exp_pp = scan_p;
- *len -= scan_len;
-
- EXPR_ErrorState = EXERR_NONE;
- return SUCCESS;
- } else {
- EXPR_ErrorState = EXERR_PAREN;
- return FAILURE;
- }
- } else {
- EXPR_ErrorState = EXERR_NOTFUNC;
- return FAILURE;
- }
- }
-
- // Eat more whitespace
- rvalue_offset = strspn(scan_p, EXPR_WHITESPACE);
-
- if (rvalue_offset + i == expr_len) {
- // Only found single lvalue
- *expCVAR = lvalue_cvar;
- *exp_pp = scan_p;
- *len -= scan_len;
- return SUCCESS;
- }
-
- scan_p += rvalue_offset;
- scan_len = (scan_p - expr_p) + 1;
-
- in_char = *scan_p;
- in_char = toupper(in_char);
-
- switch (in_char) {
- case '\"':
- scan_p++;
- scan_len--;
- rvalue_str = EXPR_ReadString(&scan_p, &rvalue_len, '\"');
- if (rvalue_str != NULL) {
- // Successfully read string
- break;
- } else {
- EXPR_ErrorState = EXERR_LITERAL;
- return FAILURE;
- }
- break;
-
-#if 0
- case 'Y': // Y[es]
- case 'T': // T[rue]
- break;
- case 'N': // N[o]
- case 'F': // F[alse]
- break;
-#endif
- default:
-
- if (isdigit(in_char) || (in_char == '-') || (in_char == '+')) {
- rvalue_str = EXPR_ReadString(&scan_p, &rvalue_len, 0);
- if (rvalue_str != NULL) {
- // Successfully read string
- break;
- } else {
- EXPR_ErrorState = EXERR_STRING;
- return FAILURE;
- }
- } else {
- EXPR_ErrorState = EXERR_NUMBER;
- return FAILURE;
- }
- break;
- }
-
- *expCVAR = lvalue_cvar;
- *rvalue = rvalue_str;
-
- scan_len = (scan_p - expr_p);
-
- *exp_pp = scan_p;
- *len -= scan_len;
-
- EXPR_ErrorState = EXERR_NONE;
- return SUCCESS;
-
-}
-
-// Reads in a string of characters from '*string_p' until 'term_char' is
-// encountered. If 'term_char' == 0, the function reads characters until
-// whitespace is encountered.
-// Upon reading a string, the function modifies *string_p and len based on
-// the number of characters read.
-char *EXPR_ReadString(const char **string_p, int *len, int term_char) {
- int string_len;
- char *str_p = NULL;
- char *term_p;
- const char *scan_p;
- int in_char;
-
- if (term_char > 0) {
- term_p = (char *)strchr(*string_p, term_char);
- if (term_p == NULL) {
- return NULL;
- }
-
- string_len = (int)(term_p - *string_p);
- str_p = (char *)malloc(string_len + 1);
-
- if (str_p == NULL) {
- return NULL;
- }
-
- strncpy(str_p, *string_p, string_len);
- str_p[string_len] = 0;
-
- *string_p += (string_len + 1); /* Add 1 for terminating char */
- *len -= (string_len + 1);
- } else {
- scan_p = *string_p;
- string_len = 0;
-
- while (scan_p) {
- in_char = *scan_p++;
- if (!isspace(in_char)) {
- string_len++;
- } else if (string_len) {
- str_p = (char *)malloc(string_len + 1);
- if (str_p == NULL) {
- return NULL;
- }
-
- strncpy(str_p, *string_p, string_len);
- str_p[string_len] = 0;
- *string_p += string_len;
- *len -= string_len;
- break;
- } else {
- return NULL;
- }
- }
-
- }
-
- return str_p;
-}
-
-// Parses the string 'cmd_str' into argc/argv format, returning argc.
-// The resulting argv pointers point into the 'cmd_str' string, so any argv
-// entries should not be used after cmd_str is deallocated.
-//
-// Memory pointed to by expr_argv must be explicitly freed by the caller.
-int EXPR_GetArgs(char *cmd_str, char ***expr_argv) {
- int expr_argc;
-
- expr_argc = EXPR_ParseArgs(cmd_str, NULL);
- *expr_argv = (char **)malloc((expr_argc + 1) * sizeof(**expr_argv));
-
- if (expr_argv == NULL) {
- return FAILURE;
- }
-
- EXPR_ParseArgs(cmd_str, *expr_argv);
-
- return expr_argc;
-}
-
-int EXPR_ParseArgs(char *cmd_str, char **argv) {
- char *bufp;
- int argc;
-
- argc = 0;
- for (bufp = cmd_str; *bufp;) {
- // Skip leading whitespace
- while (isspace(*bufp)) {
- ++bufp;
- }
- // Skip over argument
- if (*bufp == '"') {
- ++bufp;
- if (*bufp) {
- if (argv) {
- argv[argc] = bufp;
- }
- ++argc;
- }
- // Skip over word
- while (*bufp && (*bufp != '"')) {
- ++bufp;
- }
- } else {
- if (*bufp) {
- if (argv) {
- argv[argc] = bufp;
- }
- ++argc;
- }
- // Skip over word
- while (*bufp && !isspace(*bufp)) {
- ++bufp;
- }
- }
- if (*bufp) {
- if (argv) {
- *bufp = '\0';
- }
- ++bufp;
- }
- }
- if (argv) {
- argv[argc] = NULL;
- }
- return (argc);
-}
-
-} // End of namespace Saga