From 361b8c25c43716b6ac462c002e23fbad562e1a40 Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Tue, 30 Jul 2024 00:34:12 -0400 Subject: [PATCH] use c++11 function to convert strings to numbers --- src/variable.cpp | 42 ++++++++++++++++------------ unittest/commands/test_variables.cpp | 13 ++++++++- 2 files changed, 36 insertions(+), 19 deletions(-) diff --git a/src/variable.cpp b/src/variable.cpp index f308ed6efc..b1aa57732d 100644 --- a/src/variable.cpp +++ b/src/variable.cpp @@ -799,8 +799,8 @@ int Variable::next(int narg, char **arg) fclose(fp); if (strlen(buf) > 0) { - nextindex = atoi(buf); - break; + nextindex = std::stoi(buf); + break; } delay = (int) (1000000*random->uniform()); platform::usleep(delay); @@ -1115,7 +1115,11 @@ double Variable::compute_equal(int ivar) if (ifunc < 0) print_var_error(FLERR,fmt::format("cannot find python function {}",data[ivar][0]),ivar); python->invoke_function(ifunc,data[ivar][1]); - value = atof(data[ivar][1]); + try { + value = std::stod(data[ivar][1]); + } catch (std::exception &e) { + print_var_error(FLERR,"has an invalid value", ivar); + } } eval_in_progress[ivar] = 0; @@ -3555,7 +3559,7 @@ tagint Variable::int_between_brackets(char *&ptr, int varallow) } else { varflag = 0; while (*ptr && *ptr != ']') { - if (!isdigit(*ptr)) + if (!(isdigit(*ptr) || (*ptr == '-') || (*ptr == '+') || (*ptr == '*') || (*ptr == '/'))) error->all(FLERR,"Non digit character between brackets in variable"); ptr++; } @@ -3566,21 +3570,23 @@ tagint Variable::int_between_brackets(char *&ptr, int varallow) *ptr = '\0'; - // evaluate index as floating point variable or as tagint via ATOTAGINT() - - if (varflag) { - char *id = start+2; - int ivar = find(id); - if (ivar < 0) - error->all(FLERR,"Invalid variable name {} in variable formula", id); - - char *var = retrieve(id); - if (var == nullptr) - error->all(FLERR,"Invalid variable evaluation for variable {} in variable formula", id); - index = static_cast (atof(var)); - - } else index = ATOTAGINT(start); + // evaluate index as floating point variable or as tagint via strtoll() + + try { + if (varflag) { + char *id = start+2; + int ivar = find(id); + if (ivar < 0) + error->all(FLERR,"Invalid variable name {} in variable formula", id); + char *var = retrieve(id); + if (var == nullptr) + error->all(FLERR,"Invalid variable evaluation for variable {} in variable formula", id); + index = static_cast(std::stod(var)); + } else index = static_cast(std::stoll(start)); + } catch (std::exception &e) { + error->all(FLERR,"Illegal value in brackets: {}({})", e.what(), start); + } *ptr = ']'; if (index <= 0) diff --git a/unittest/commands/test_variables.cpp b/unittest/commands/test_variables.cpp index 8f2f4ba9d9..2390b1b675 100644 --- a/unittest/commands/test_variables.cpp +++ b/unittest/commands/test_variables.cpp @@ -287,6 +287,7 @@ TEST_F(VariableTest, AtomicSystem) ASSERT_DOUBLE_EQ(variable->compute_equal("f_press[1]"), 0.0); ASSERT_DOUBLE_EQ(variable->compute_equal("c_press"), 0.0); ASSERT_DOUBLE_EQ(variable->compute_equal("c_press[2]"), 0.0); + ASSERT_DOUBLE_EQ(variable->compute_equal("c_press[1+1]"), 0.0); ASSERT_DOUBLE_EQ(variable->compute_equal("1.5+3.25"), 4.75); ASSERT_DOUBLE_EQ(variable->compute_equal("-2.5*1.5"), -3.75); @@ -302,8 +303,18 @@ TEST_F(VariableTest, AtomicSystem) variable->compute_equal("v_self");); TEST_FAILURE(".*ERROR: Variable sum2: Inconsistent lengths in vector-style variable.*", variable->compute_equal("max(v_sum2)");); - TEST_FAILURE("ERROR: Mismatched fix in variable formula.*", + TEST_FAILURE(".*ERROR: Mismatched fix in variable formula.*", variable->compute_equal("f_press");); + TEST_FAILURE(".*ERROR .*Variable formula compute vector is accessed out-of-range.*", + variable->compute_equal("c_press[10]");); + TEST_FAILURE(".*ERROR: Non digit character between brackets in variable.*", + variable->compute_equal("c_press[axy]");); + TEST_FAILURE(".*ERROR: Illegal value in brackets: stoll.*", + variable->compute_equal("c_press[73786976294838206464]");); + TEST_FAILURE(".*ERROR: Index between variable brackets must be positive.*", + variable->compute_equal("c_press[-2]");); + TEST_FAILURE(".*ERROR: Index between variable brackets must be positive.*", + variable->compute_equal("c_press[0]");); } TEST_F(VariableTest, Expressions)