diff options
| author | Paul Gilbert | 2019-07-20 14:58:39 -0700 | 
|---|---|---|
| committer | Paul Gilbert | 2019-09-29 15:08:52 -0700 | 
| commit | 255f2b4c82867b3c113743d02cf91b91a15176bd (patch) | |
| tree | 6157bd018d16aa066d22cdc53926fe4c17da0491 /engines/glk/quest/geas_util.cpp | |
| parent | 6d6dd2ed62b08a89b15982160ef79faef340d524 (diff) | |
| download | scummvm-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.cpp | 245 | 
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  | 
