aboutsummaryrefslogtreecommitdiff
path: root/engines/glk/quest/geas_util.cpp
diff options
context:
space:
mode:
authorPaul Gilbert2019-07-20 14:58:39 -0700
committerPaul Gilbert2019-09-29 15:08:52 -0700
commit255f2b4c82867b3c113743d02cf91b91a15176bd (patch)
tree6157bd018d16aa066d22cdc53926fe4c17da0491 /engines/glk/quest/geas_util.cpp
parent6d6dd2ed62b08a89b15982160ef79faef340d524 (diff)
downloadscummvm-rg350-255f2b4c82867b3c113743d02cf91b91a15176bd.tar.gz
scummvm-rg350-255f2b4c82867b3c113743d02cf91b91a15176bd.tar.bz2
scummvm-rg350-255f2b4c82867b3c113743d02cf91b91a15176bd.zip
GLK: QUEST: Initial subengine commit
Diffstat (limited to 'engines/glk/quest/geas_util.cpp')
-rw-r--r--engines/glk/quest/geas_util.cpp245
1 files changed, 245 insertions, 0 deletions
diff --git a/engines/glk/quest/geas_util.cpp b/engines/glk/quest/geas_util.cpp
new file mode 100644
index 0000000000..bc5eaac177
--- /dev/null
+++ b/engines/glk/quest/geas_util.cpp
@@ -0,0 +1,245 @@
+/* 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.
+ *
+ */
+
+#include "glk/quest/geas_util.h"
+#include "glk/quest/geas_file.h"
+#include "glk/quest/streams.h"
+#include "glk/quest/string.h"
+
+namespace Glk {
+namespace Quest {
+
+int eval_int(String s) {
+ cerr << "eval_int (" << s << ")" << endl;
+
+ uint index = 0, index2;
+ String tmp;
+ while (index < s.length() && Common::isSpace(s[index])) {
+ cerr << " index == " << index << endl;
+ index ++;
+ }
+ if (index == s.length() || !Common::isDigit(s[index])) {
+ cerr << "Failed to match, returning 0" << endl;
+ return 0;
+ }
+ for (index2 = index; index2 < s.length() && Common::isDigit(s[index2]); index2 ++) {
+ cerr << " index2 == " << index2 << endl;
+ }
+ //;
+ tmp = s.substr(index, index2 - index);
+ cerr << "tmp == < " << tmp << ">" << endl;
+
+ //cerr << "index == " << index << ", index2 == " << index2
+ // << ", tmp == " << tmp << endl;
+
+ int arg1 = atoi(tmp.c_str());
+ cerr << "arg1 == " << arg1 << endl;
+ index = index2;
+ while (index < s.length() && Common::isSpace(s[index]))
+ ++ index;
+ if (index == s.length())
+ return arg1;
+
+ //cerr << "index == " << index << ", s.length() == " << s.length() << endl;
+
+ char symbol = s[index];
+
+ //cerr << "symbol == " << symbol << "; find --> "
+ // << String("+-*/").find (symbol) << endl;
+
+ if (String("+-*/").find(symbol) == String::npos)
+ return arg1;
+
+ ++ index;
+ while (index < s.length() && Common::isSpace(s[index]))
+ ++ index;
+ if (index == s.length() || ! Common::isDigit(s[index])) {
+ if (symbol == '*')
+ return 0;
+ return arg1;
+ }
+ index2 = index + 1;
+ while (index2 < s.length() && Common::isDigit(s[index2]))
+ ++ index2;
+ tmp = s.substr(index, index2 - index);
+ int arg2 = atoi(tmp.c_str());
+
+ switch (symbol) {
+ case '+':
+ return arg1 + arg2;
+ case '-':
+ return arg1 - arg2;
+ case '*':
+ return arg1 * arg2;
+ case '/':
+ return arg1 / arg2;
+ // TODO: division should use accountant's round
+ }
+ return 0;
+}
+
+String trim_braces(String s) {
+ if (s.length() > 1 && s[0] == '[' && s[s.length() - 1] == ']')
+ return s.substr(1, s.length() - 2);
+ else
+ return s;
+}
+
+bool is_param(String s) {
+ return s.length() > 1 && s[0] == '<' && s[s.length() - 1] == '>';
+}
+
+String param_contents(String s) {
+ //cerr << "param_contents (" << s << ")" << endl;
+ assert(is_param(s));
+ return s.substr(1, s.length() - 2);
+}
+
+String nonparam(String type, String var) {
+ return "Non-parameter for " + type + " in \"" + var + "\"";
+}
+
+//ostream &operator << (ostream &o, const GeasBlock &gb) { return o; }
+//String trim (String s, trim_modes) { return s; }
+
+String string_geas_block(const GeasBlock &gb) {
+ ostringstream oss;
+ oss << gb; // temporary removed TODO
+ return oss.str();
+}
+
+
+bool starts_with(String a, String b) {
+ return (a.length() >= b.length()) && (a.substr(0, b.length()) == b);
+}
+bool ends_with(String a, String b) {
+ return (a.length() >= b.length()) &&
+ (a.substr(a.length() - b.length(), b.length()) == b);
+}
+
+bool starts_with_i(String a, String b) {
+ return (a.length() >= b.length()) && ci_equal(a.substr(0, b.length()), b);
+ // return starts_with (lcase(a), lcase(b));
+}
+bool ends_with_i(String a, String b) {
+ return (a.length() >= b.length()) &&
+ ci_equal(a.substr(a.length() - b.length(), b.length()), b);
+ //return ends_with (lcase(a), lcase(b));
+}
+
+String pcase(String s) {
+ if (s.length() == 0)
+ return s;
+ if (Common::isLower(s[0]))
+ s[0] = toupper(s[0]);
+ return s;
+}
+
+String ucase(String s) {
+ for (uint i = 0; i < s.length(); i ++)
+ s[i] = toupper(s[i]);
+ return s;
+}
+
+// There's a good chance s is already all-lowercase, in which case
+// the test will avoid making a copy
+String lcase(String s) {
+ for (uint i = 0; i < s.length(); i ++)
+ if (Common::isUpper(s[i]))
+ s[i] = tolower(s[i]);
+ return s;
+}
+
+Common::Array<String> split_param(String s) {
+ Common::Array<String> rv;
+ uint c1 = 0, c2;
+
+ for (;;) {
+ c2 = s.find(';', c1);
+ if (c2 == -1) {
+ rv.push_back(s.substr(c1).trim());
+ return rv;
+ }
+ rv.push_back(s.substr(c1, c2 - c1).trim());
+ c1 = c2 + 1;
+ }
+}
+
+Common::Array<String> split_f_args(String s) {
+ Common::Array<String> rv = split_param(s);
+ for (uint i = 0; i < rv.size(); i ++) {
+ String tmp = rv[i];
+ if (tmp[0] == '_')
+ rv[i][0] = ' ';
+ if (tmp[tmp.length() - 1] == '_')
+ rv[i][tmp.length() - 1] = ' ';
+ }
+ return rv;
+}
+
+void show_split(String s) {
+ Common::Array<String> tmp = split_param(s);
+ cerr << "Splitting <" << s << ">: ";
+ for (uint i = 0; i < tmp.size(); i ++)
+ cerr << "<" << tmp[i] << ">, ";
+ cerr << "\n";
+}
+
+Logger::Nullstreambuf Logger::cnull;
+
+Logger::Logger() : logfilestr_(NULL) { //, cerrbuf_(NULL) {
+/*
+ cerr.flush();
+
+ const char *const logfile = getenv("GEAS_LOGFILE");
+ if (logfile) {
+ ofstream *filestr = new ofstream(logfile);
+ if (filestr->fail())
+ delete filestr;
+ else {
+ logfilestr_ = filestr;
+ cerrbuf_ = cerr.rdbuf(filestr->rdbuf());
+ }
+ }
+
+ if (!cerrbuf_)
+ cerrbuf_ = cerr.rdbuf(&cnull);
+ */
+}
+
+Logger::~Logger() {
+ /*
+ cerr.flush();
+
+ cerr.rdbuf(cerrbuf_);
+ cerrbuf_ = NULL;
+
+ if (logfilestr_) {
+ logfilestr_->close();
+ delete logfilestr_;
+ logfilestr_ = NULL;
+ }
+ */
+}
+
+} // End of namespace Quest
+} // End of namespace Glk