diff options
-rw-r--r-- | gui/eval.cpp | 333 | ||||
-rw-r--r-- | gui/eval.h | 125 |
2 files changed, 0 insertions, 458 deletions
diff --git a/gui/eval.cpp b/gui/eval.cpp deleted file mode 100644 index 716006c108..0000000000 --- a/gui/eval.cpp +++ /dev/null @@ -1,333 +0,0 @@ -/* ScummVM - Graphic Adventure Engine - * - * ScummVM is the legal property of its developers, whose names - * are too numerous to list here. Please refer to the COPYRIGHT - * file distributed with this source distribution. - * - * 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. - * - * $URL$ - * $Id$ - * - */ - -#include "common/system.h" -#include "gui/eval.h" -#include "gui/widget.h" -#include "gui/newgui.h" - -#include "graphics/scaler.h" - -namespace GUI { - -static bool isdelim(char c) { - return strchr(" ;,+-<>/*%^=()", c) != 0 || c == 9 || c == '\n' || !c; -} - -Eval::Eval() { - loadConstants(); -} - -Eval::~Eval() { - _vars.clear(); - _aliases.clear(); -} - -int Eval::eval(const String &input, const String §ion, const String &name, int startpos) { - int result; - - debug(5, "%s=%s", name.c_str(), input.c_str()); - - strncpy(_input, input.c_str(), 256); - _section = section; - _name = name; - _startpos = startpos; - - _pos = 0; - - getToken(); - - if (_tokenType == tString) - return EVAL_STRING_VAR; - - if (!*_token) - exprError(eBadExpr); - - level2(&result); - - debug(5, "Result: %d", result); - - return result; -} - -void Eval::level2(int *result) { - char op; - int hold; - - level3(result); - - while ((op = *_token) == '+' || op == '-') { - getToken(); - level3(&hold); - arith(op, result, &hold); - } -} - -void Eval::level3(int *result) { - char op; - int hold; - - level4(result); - - while ((op = *_token) == '*' || op == '/' || op == '%') { - getToken(); - level4(&hold); - arith(op, result, &hold); - } -} - -void Eval::level4(int *result) { - char op; - - op = 0; - if ((_tokenType == tDelimiter) && (*_token == '+' || *_token == '-')) { - op = *_token; - getToken(); - } - - level5(result); - - if (op) - unary(op, result); -} - -void Eval::level5(int *result) { - if ((*_token == '(') && (_tokenType == tDelimiter)) { - getToken(); - - level2(result); - - if (*_token != ')') - exprError(eUnclosedBracket); - getToken(); - } else { - primitive(result); - } -} - -void Eval::primitive(int *result) { - if (*_token == ')') - exprError(eExtraBracket); - - switch (_tokenType) { - case tVariable: - *result = getVar_(_token); - if (*result == EVAL_UNDEF_VAR) - exprError(eUndefVar); - getToken(); - return; - case tNumber: - *result = atoi(_token); - getToken(); - return; - default: - exprError(eSyntaxError); - } -} - -void Eval::arith(char op, int *r, int *h) { - switch (op) { - case '-': - *r = *r - *h; - break; - case '+': - *r = *r + *h; - break; - case '*': - *r = *r * *h; - break; - case '/': - *r = (*r) / (*h); - break; - case '%': - *r = (*r) % (*h); - break; - } -} - -void Eval::unary(char op, int *r) { - if (op == '-') - *r = -(*r); -} - -void Eval::getToken() { - char *temp; - - _tokenType = tNone; - temp = _token; - - if (_input[_pos] == 0) { - *_token = 0; - _tokenType = tDelimiter; - return; - } - while (isspace(_input[_pos])) - _pos++; - - if (_input[_pos] == '"') { - _pos++; - while (_input[_pos] != '"' && _input[_pos] != '\n') - *temp++ = _input[_pos++]; - - if (_input[_pos] == '\n') - exprError(eMissingQuote); - - _pos++; - *temp = 0; - - _tokenType = tString; - return; - } - - if (isdigit(_input[_pos])) { - while (!isdelim(_input[_pos])) - *temp++ = _input[_pos++]; - *temp = 0; - - _tokenType = tNumber; - return; - } - - if (isalpha(_input[_pos])) { - while (!isdelim(_input[_pos])) - *temp++ = _input[_pos++]; - *temp = 0; - _tokenType = tVariable; - return; - } - - if (!_tokenType && isdelim(_input[_pos])) { - *temp++ = _input[_pos++]; - *temp = 0; - _tokenType = tDelimiter; - } -} - -void Eval::exprError(EvalErrors err) { - static const char *errors[] = { - "Syntax error", - "Extra ')'", - "Missing ')'", - "Bad expression", - "Undefined variable", - "Missing '\"'" - }; - - error("%s in section [%s] expression: \"%s\" start is at: %d near token '%s'", - errors[err], _section.c_str(), _name.c_str(), _pos + _startpos, _token); -} - -struct BuiltinConsts { - const char *name; - int value; -}; - -static const BuiltinConsts builtinConsts[] = { - {"kButtonWidth", GUI::kButtonWidth}, - {"kButtonHeight", GUI::kButtonHeight}, - {"kSliderWidth", GUI::kSliderWidth}, - {"kSliderHeight", GUI::kSliderHeight}, - - {"kBigButtonWidth", GUI::kBigButtonWidth}, - {"kBigButtonHeight", GUI::kBigButtonHeight}, - {"kBigSliderWidth", GUI::kBigSliderWidth}, - {"kBigSliderHeight", GUI::kBigSliderHeight}, - - {"kNormalWidgetSize", GUI::kNormalWidgetSize}, - {"kBigWidgetSize", GUI::kBigWidgetSize}, - - {"kThumbnailWidth", kThumbnailWidth}, - - {"kTextAlignLeft", kTextAlignLeft}, - {"kTextAlignRight", kTextAlignRight}, - {"kTextAlignCenter", kTextAlignCenter}, - - {"kFontStyleBold", Theme::kFontStyleBold}, - {"kFontStyleNormal", Theme::kFontStyleNormal}, - {"kFontStyleItalic", Theme::kFontStyleItalic}, - - {"kFontStyleFixedBold", Theme::kFontStyleFixedBold}, - {"kFontStyleFixedNormal", Theme::kFontStyleFixedNormal}, - {"kFontStyleFixedItalic", Theme::kFontStyleFixedItalic}, - - {"kShadingNone", Theme::kShadingNone}, - {"kShadingDim", Theme::kShadingDim}, - {"kShadingLuminance", Theme::kShadingLuminance}, - - {"false", 0}, - {"true", 1}, - {NULL, 0} -}; - -void Eval::loadConstants() { - int i; - - for (i = 0; builtinConsts[i].name; i++) - _vars[builtinConsts[i].name] = builtinConsts[i].value; -} - -int Eval::getBuiltinVar(const char *s) { - if (!strcmp(s, "w")) - return g_system->getOverlayWidth(); - - if (!strcmp(s, "h")) - return g_system->getOverlayHeight(); - - return EVAL_UNDEF_VAR; -} - -int Eval::getVar_(const Common::String &s, bool includeAliases) { - int val; - - val = getBuiltinVar(s.c_str()); - - if (val != EVAL_UNDEF_VAR) - return val; - - const Common::String *var = &s; - if (includeAliases) { - AliasesMap::const_iterator itera = _aliases.find(s); - if (itera != _aliases.end()) - var = &(itera->_value); - } - - VariablesMap::const_iterator iterv = _vars.find(*var); - if (iterv != _vars.end()) - return iterv->_value; - - return EVAL_UNDEF_VAR; -} - -void Eval::setVar(const String §ion, const String &name, const String &value) { - _vars[name.c_str() + 4] = eval(value, section, name, 0); -} - -void Eval::reset() { - _vars.clear(); - _aliases.clear(); - loadConstants(); -} - -} // end of namespace GUI diff --git a/gui/eval.h b/gui/eval.h deleted file mode 100644 index 47c8313903..0000000000 --- a/gui/eval.h +++ /dev/null @@ -1,125 +0,0 @@ -/* ScummVM - Graphic Adventure Engine - * - * ScummVM is the legal property of its developers, whose names - * are too numerous to list here. Please refer to the COPYRIGHT - * file distributed with this source distribution. - * - * 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. - * - * $URL$ - * $Id$ - * - */ - -#ifndef GUI_EVAL_H -#define GUI_EVAL_H - -#include "common/str.h" -#include "common/hashmap.h" -#include "common/hash-str.h" - -namespace GUI { - -using Common::String; -using Common::HashMap; - -enum { - EVAL_UNDEF_VAR = -13375, - EVAL_STRING_VAR = -13376 -}; - -class Eval { -public: - Eval(); - ~Eval(); - - int eval(const String &input, const String §ion, const String &name, int startpos); - void setVar(const String §ion, const String &name, const String &value); - - void setParent(const String &name); - - void setVar(const String &name, int val) { _vars[name] = val; } - void setStringVar(const String &name, const String &val) { _strings[name] = val; } - void setAlias(const Common::String &name, const String &val) { _aliases[name] = val; } - - int getVar(const Common::String &s) { return getVar_(s); } - int getVar(const Common::String &s, int def) { - int val = getVar_(s); - return (val == EVAL_UNDEF_VAR) ? def : val; - } - - const String &getStringVar(const Common::String &name) { return _strings[name]; } - - uint getNumVars() { return _vars.size(); } - - void reset(); - - char *lastToken() { return _token; } - - typedef HashMap<String, int> VariablesMap; - typedef HashMap<String, String> AliasesMap; - typedef HashMap<String, String> StringsMap; - -private: - enum TokenTypes { - tNone, - tDelimiter, - tVariable, - tNumber, - tString - }; - - enum EvalErrors { - eSyntaxError, - eExtraBracket, - eUnclosedBracket, - eBadExpr, - eUndefVar, - eMissingQuote - }; - - - void getToken(); - void level2(int *); - void level3(int *); - void level4(int *); - void level5(int *); - void primitive(int *); - void arith(char op, int *r, int *h); - void unary(char op, int *r); - void exprError(EvalErrors error); - int getVar_(const Common::String &s, bool includeAliases = true); - int getBuiltinVar(const char *s); - void loadConstants(); - - char _input[256]; - String _section; - String _name; - - int _startpos; - - TokenTypes _tokenType; - int _pos; - - char _token[256]; - - AliasesMap _aliases; - VariablesMap _vars; - StringsMap _strings; -}; - -} // end of namespace GUI - -#endif |