diff options
| -rw-r--r-- | engines/glk/archetype/archetype.cpp | 25 | ||||
| -rw-r--r-- | engines/glk/archetype/interpreter.cpp | 5 | ||||
| -rw-r--r-- | engines/glk/archetype/string.cpp | 22 | 
3 files changed, 40 insertions, 12 deletions
| diff --git a/engines/glk/archetype/archetype.cpp b/engines/glk/archetype/archetype.cpp index 8aeafa1172..38eb83fc83 100644 --- a/engines/glk/archetype/archetype.cpp +++ b/engines/glk/archetype/archetype.cpp @@ -433,6 +433,7 @@ void Archetype::eval_expr(ExprTree the_expr, ResultType &result, ContextType &co  			break;  		default: +			result = *the_expr;  			break;  		}  	} else if (the_expr->_kind == OPER) { @@ -645,7 +646,8 @@ void Archetype::eval_expr(ExprTree the_expr, ResultType &result, ContextType &co  				if (the_expr->_data._oper.op_name == OP_LEFTFROM)  					result._data._str.acl_str = MakeNewDynStr(r1._data._str.acl_str->left(r2._data._numeric.acl_int));  				else -					result._data._str.acl_str = MakeNewDynStr(r1._data._str.acl_str->right(r2._data._numeric.acl_int)); +					result._data._str.acl_str = MakeNewDynStr(r1._data._str.acl_str->right( +						r1._data._str.acl_str->size() - r2._data._numeric.acl_int + 1));  			}  			break; @@ -654,7 +656,7 @@ void Archetype::eval_expr(ExprTree the_expr, ResultType &result, ContextType &co  			eval_expr(the_expr->_data._oper.right, r2, context, RVALUE);  			if (convert_to(STR_PTR, r1) && convert_to(STR_PTR, r2)) {  				result._kind = NUMERIC; -				result._data._numeric.acl_int = r2._data._str.acl_str->indexOf(*r1._data._str.acl_str); +				result._data._numeric.acl_int = r2._data._str.acl_str->indexOf(*r1._data._str.acl_str) + 1;  				if (result._data._numeric.acl_int == 0)  					cleanup(result);  			} @@ -712,8 +714,11 @@ bool Archetype::eval_condition(ExprTree the_expr, ContextType &context) {  	undefine(result);  	eval_expr(the_expr, result, context, RVALUE); -	failure = (result._kind == RESERVED) && (result._data._reserved.keyword = RW_UNDEFINED -		|| result._data._reserved.keyword == RW_FALSE || result._data._reserved.keyword == RW_ABSENT); +	failure = (result._kind == RESERVED) && ( +		result._data._reserved.keyword == RW_UNDEFINED || +		result._data._reserved.keyword == RW_FALSE || +		result._data._reserved.keyword == RW_ABSENT +	);  	cleanup(result);  	return !failure; @@ -767,6 +772,8 @@ void Archetype::exec_stmt(StatementPtr the_stmt, ResultType &result, ContextType  		case MESSAGE:  			b = send_message(OP_PASS, the_stmt->_data._expr.expression->_data._msgTextQuote.index,  				context.self, result, context); +			break; +  		default:  			eval_expr(the_stmt->_data._expr.expression, result, context, RVALUE);  			break; @@ -811,8 +818,7 @@ void Archetype::exec_stmt(StatementPtr the_stmt, ResultType &result, ContextType  		if (the_stmt->_kind == ST_WRITE) {  			wrapout("", true); -		} -		else if (the_stmt->_kind == ST_STOP) { +		} else if (the_stmt->_kind == ST_STOP) {  			g_vm->writeln();  			g_vm->writeln();  			error("%f", VERSION_NUM); @@ -826,13 +832,12 @@ void Archetype::exec_stmt(StatementPtr the_stmt, ResultType &result, ContextType  		}  		if (eval_condition(the_stmt->_data._if.condition, context)) {  			if (verbose) -				debug(" Evaluated true; executing then branch"); +				debug(" Evaluated TRUE; executing then branch");  			exec_stmt(the_stmt->_data._if.then_branch, result, context); -		} -		else if (the_stmt->_data._if.else_branch != nullptr) { +		} else if (the_stmt->_data._if.else_branch != nullptr) {  			if (verbose) -				debug(" Evaluated false; executing else branch"); +				debug(" Evaluated FALSE; executing else branch");  			exec_stmt(the_stmt->_data._if.else_branch, result, context);  		}  		break; diff --git a/engines/glk/archetype/interpreter.cpp b/engines/glk/archetype/interpreter.cpp index 0ace84e58a..a9ee1bbb51 100644 --- a/engines/glk/archetype/interpreter.cpp +++ b/engines/glk/archetype/interpreter.cpp @@ -295,6 +295,7 @@ bool result_compare(short comparison, ResultType &r1, ResultType &r2) {  			default:  				break;  			} +			break;  		case IDENT:  			if (r1._data._ident.ident_kind == r2._data._ident.ident_kind) { @@ -380,8 +381,10 @@ void display_result(ResultType &result) {  		break;  	case MESSAGE:  		enclose = "\'"; +		break;  	default:  		enclose = ' '; +		break;  	}  	if (enclose != " ") @@ -401,7 +404,7 @@ void display_expr(ExprTree the_tree) {  			debugN(") ");  		} -		wrapout(Operators[the_tree->_data._oper.op_name], false); +		debugN(Operators[the_tree->_data._oper.op_name]);  		debugN(" (");  		display_expr(the_tree->_data._oper.right);  		debugN(") "); diff --git a/engines/glk/archetype/string.cpp b/engines/glk/archetype/string.cpp index 4db4688a7d..9295ced210 100644 --- a/engines/glk/archetype/string.cpp +++ b/engines/glk/archetype/string.cpp @@ -98,10 +98,30 @@ String String::vformat(const char *fmt, va_list args) {  }  int String::val(int *code) { +	const char *srcP = c_str(); +	int result = 0, sign = 0, idx = 1; + +	if (*srcP == '-') { +		sign = -1; +		++srcP; +		++idx; +	} + +	for (; *srcP; ++srcP, ++idx) { +		if (*srcP < '0' || *srcP > '9') { +			// Invalid character +			if (code) +				*code = idx; +			return result; +		} + +		result = (result * 10) + (*srcP - '0'); +	} +  	if (code)  		*code = 0; -	return atoi(c_str()); +	return result;  }  String String::left(size_t count) const { | 
