From 1cf9f616ecf1f4791e6f16f7bc68a83ea6aa9106 Mon Sep 17 00:00:00 2001 From: Celtic Minstrel Date: Mon, 7 Mar 2016 14:12:02 -0500 Subject: [PATCH] Formula engine: Substring function now accepts negative size This results in counting backwards from the given offset. Size of 1 and -1 have the same effect. --- src/formula_function.cpp | 18 +++--------------- src/tests/test_formula_function.cpp | 14 +++++++++++--- 2 files changed, 14 insertions(+), 18 deletions(-) diff --git a/src/formula_function.cpp b/src/formula_function.cpp index 9509b664a883..a745d58d854c 100644 --- a/src/formula_function.cpp +++ b/src/formula_function.cpp @@ -395,31 +395,19 @@ class substring_function if(offset < 0) { offset += result.size(); if(offset < 0) { - WRN_SF << "[substring] Offset '" - << args()[1]->evaluate(variables, fdb).as_int() - << "' results in a negative start in string '" - << result - << "' and is reset at the beginning of the string.\n"; - offset = 0; } } else { if(static_cast(offset) >= result.size()) { - WRN_SF << "[substring] Offset '" << offset - << "' is larger than the size of '" << result - << "' and results in an empty string.\n"; - return variant(std::string()); } } if(args().size() > 2) { - const int size = args()[2]->evaluate(variables, fdb).as_int(); + int size = args()[2]->evaluate(variables, fdb).as_int(); if(size < 0) { - ERR_SF << "[substring] Size is negative an " - << "empty string is returned.\n"; - - return variant(std::string()); + size = -size; + offset = std::max(0, offset - size + 1); } return variant(result.substr(offset, size)); } else { diff --git a/src/tests/test_formula_function.cpp b/src/tests/test_formula_function.cpp index 8221cab65e04..3709ebcec891 100644 --- a/src/tests/test_formula_function.cpp +++ b/src/tests/test_formula_function.cpp @@ -73,12 +73,10 @@ BOOST_AUTO_TEST_CASE(test_formula_function_substring) .evaluate().as_string() , ""); - lg::set_log_domain_severity("scripting/formula", lg::err.get_severity() - 1); // Don't log anything - BOOST_CHECK_EQUAL( game_logic::formula("substring('hello world', 0, -1)") .evaluate().as_string() - , ""); + , "h"); lg::set_log_domain_severity("scripting/formula", lg::debug); @@ -97,6 +95,16 @@ BOOST_AUTO_TEST_CASE(test_formula_function_substring) .evaluate().as_string() , "ello worl"); + BOOST_CHECK_EQUAL( + game_logic::formula("substring('hello world', -1, -5)") + .evaluate().as_string() + , "world"); + + BOOST_CHECK_EQUAL( + game_logic::formula("substring('hello world', 4, -5)") + .evaluate().as_string() + , "hello"); + } BOOST_AUTO_TEST_CASE(test_formula_function_length)