diff options
author | Campbell Barton <ideasman42@gmail.com> | 2018-09-19 04:40:40 +0300 |
---|---|---|
committer | Campbell Barton <ideasman42@gmail.com> | 2018-09-19 04:40:40 +0300 |
commit | d44c8ce1cbde053c897cfb25697b558c98e33cd9 (patch) | |
tree | a7db79a33de03f8b3237970de9bc0285c18e386b | |
parent | 3aea5695bbdcf83c5c7769a629e0a2e4db0c85bc (diff) |
Cleanup: BLI_expr_pylike argument ordering
- Order array length after the array.
- Put return argument last.
-rw-r--r-- | source/blender/blenkernel/intern/fcurve.c | 12 | ||||
-rw-r--r-- | source/blender/blenlib/BLI_expr_pylike_eval.h | 7 | ||||
-rw-r--r-- | source/blender/blenlib/intern/expr_pylike_eval.c | 21 | ||||
-rw-r--r-- | tests/gtests/blenlib/BLI_expr_pylike_eval_test.cc | 28 |
4 files changed, 37 insertions, 31 deletions
diff --git a/source/blender/blenkernel/intern/fcurve.c b/source/blender/blenkernel/intern/fcurve.c index ddbe203d1af..7d57e18d672 100644 --- a/source/blender/blenkernel/intern/fcurve.c +++ b/source/blender/blenkernel/intern/fcurve.c @@ -1900,8 +1900,8 @@ ChannelDriver *fcurve_copy_driver(const ChannelDriver *driver) static ExprPyLike_Parsed *driver_compile_simple_expr_impl(ChannelDriver *driver) { /* Prepare parameter names. */ - int num_vars = BLI_listbase_count(&driver->variables); - const char **names = BLI_array_alloca(names, num_vars + 1); + int names_len = BLI_listbase_count(&driver->variables); + const char **names = BLI_array_alloca(names, names_len + 1); int i = 0; names[i++] = "frame"; @@ -1910,14 +1910,14 @@ static ExprPyLike_Parsed *driver_compile_simple_expr_impl(ChannelDriver *driver) names[i++] = dvar->name; } - return BLI_expr_pylike_parse(driver->expression, num_vars + 1, names); + return BLI_expr_pylike_parse(driver->expression, names, names_len + 1); } static bool driver_evaluate_simple_expr(ChannelDriver *driver, ExprPyLike_Parsed *expr, float *result, float time) { /* Prepare parameter values. */ - int num_vars = BLI_listbase_count(&driver->variables); - double *vars = BLI_array_alloca(vars, num_vars + 1); + int vars_len = BLI_listbase_count(&driver->variables); + double *vars = BLI_array_alloca(vars, vars_len + 1); int i = 0; vars[i++] = time; @@ -1928,7 +1928,7 @@ static bool driver_evaluate_simple_expr(ChannelDriver *driver, ExprPyLike_Parsed /* Evaluate expression. */ double result_val; - eExprPyLike_EvalStatus status = BLI_expr_pylike_eval(expr, &result_val, num_vars + 1, vars); + eExprPyLike_EvalStatus status = BLI_expr_pylike_eval(expr, vars, vars_len + 1, &result_val); const char *message; switch (status) { diff --git a/source/blender/blenlib/BLI_expr_pylike_eval.h b/source/blender/blenlib/BLI_expr_pylike_eval.h index b627664cc14..e8311bc43b6 100644 --- a/source/blender/blenlib/BLI_expr_pylike_eval.h +++ b/source/blender/blenlib/BLI_expr_pylike_eval.h @@ -52,9 +52,12 @@ void BLI_expr_pylike_free(struct ExprPyLike_Parsed *expr); bool BLI_expr_pylike_is_valid(struct ExprPyLike_Parsed *expr); bool BLI_expr_pylike_is_constant(struct ExprPyLike_Parsed *expr); ExprPyLike_Parsed *BLI_expr_pylike_parse( - const char *expression, int num_params, const char **param_names); + const char *expression, + const char **param_names, int param_names_len); eExprPyLike_EvalStatus BLI_expr_pylike_eval( - struct ExprPyLike_Parsed *expr, double *result, int num_params, const double *params); + struct ExprPyLike_Parsed *expr, + const double *param_values, int param_values_len, + double *r_result); #ifdef __cplusplus } diff --git a/source/blender/blenlib/intern/expr_pylike_eval.c b/source/blender/blenlib/intern/expr_pylike_eval.c index c80cd505efa..b7c0ee2acb1 100644 --- a/source/blender/blenlib/intern/expr_pylike_eval.c +++ b/source/blender/blenlib/intern/expr_pylike_eval.c @@ -150,9 +150,12 @@ bool BLI_expr_pylike_is_constant(ExprPyLike_Parsed *expr) * Evaluate the expression with the given parameters. * The order and number of parameters must match the names given to parse. */ -eExprPyLike_EvalStatus BLI_expr_pylike_eval(ExprPyLike_Parsed *expr, double *result, int num_params, const double *params) +eExprPyLike_EvalStatus BLI_expr_pylike_eval( + ExprPyLike_Parsed *expr, + const double *param_values, int param_values_len, + double *r_result) { - *result = 0.0; + *r_result = 0.0; if (!BLI_expr_pylike_is_valid(expr)) { return EXPR_PYLIKE_INVALID; @@ -179,8 +182,8 @@ eExprPyLike_EvalStatus BLI_expr_pylike_eval(ExprPyLike_Parsed *expr, double *res stack[sp++] = ops[pc].arg.dval; break; case OPCODE_PARAMETER: - FAIL_IF(sp >= expr->max_stack || ops[pc].arg.ival >= num_params); - stack[sp++] = params[ops[pc].arg.ival]; + FAIL_IF(sp >= expr->max_stack || ops[pc].arg.ival >= param_values_len); + stack[sp++] = param_values[ops[pc].arg.ival]; break; case OPCODE_FUNC1: FAIL_IF(sp < 1); @@ -249,7 +252,7 @@ eExprPyLike_EvalStatus BLI_expr_pylike_eval(ExprPyLike_Parsed *expr, double *res #undef FAIL_IF - *result = stack[0]; + *r_result = stack[0]; /* Detect floating point evaluation errors. */ int flags = fetestexcept(FE_DIVBYZERO | FE_INVALID); @@ -412,7 +415,7 @@ static KeywordTokenDef keyword_list[] = { }; typedef struct SimpleExprParseState { - int param_count; + int param_names_len; const char **param_names; /* Original expression */ @@ -682,7 +685,7 @@ static bool parse_unary(SimpleExprParseState *state) case TOKEN_ID: /* Parameters: search in reverse order in case of duplicate names - the last one should win. */ - for (i = state->param_count - 1; i >= 0; i--) { + for (i = state->param_names_len - 1; i >= 0; i--) { if (STREQ(state->tokenbuf, state->param_names[i])) { parse_add_op(state, OPCODE_PARAMETER, 1)->arg.ival = i; return parse_next_token(state); @@ -931,7 +934,7 @@ static bool parse_expr(SimpleExprParseState *state) * Parse the expression for evaluation later. * Returns non-NULL even on failure; use is_valid to check. */ -ExprPyLike_Parsed *BLI_expr_pylike_parse(const char *expression, int num_params, const char **param_names) +ExprPyLike_Parsed *BLI_expr_pylike_parse(const char *expression, const char **param_names, int param_names_len) { /* Prepare the parser state. */ SimpleExprParseState state; @@ -939,7 +942,7 @@ ExprPyLike_Parsed *BLI_expr_pylike_parse(const char *expression, int num_params, state.cur = state.expr = expression; - state.param_count = num_params; + state.param_names_len = param_names_len; state.param_names = param_names; state.tokenbuf = MEM_mallocN(strlen(expression) + 1, __func__); diff --git a/tests/gtests/blenlib/BLI_expr_pylike_eval_test.cc b/tests/gtests/blenlib/BLI_expr_pylike_eval_test.cc index 3aaf0d3a5c8..51e5b02232b 100644 --- a/tests/gtests/blenlib/BLI_expr_pylike_eval_test.cc +++ b/tests/gtests/blenlib/BLI_expr_pylike_eval_test.cc @@ -14,7 +14,7 @@ extern "C" { static void expr_pylike_parse_fail_test(const char *str) { - ExprPyLike_Parsed *expr = BLI_expr_pylike_parse(str, 0, NULL); + ExprPyLike_Parsed *expr = BLI_expr_pylike_parse(str, NULL, 0); EXPECT_FALSE(BLI_expr_pylike_is_valid(expr)); @@ -23,7 +23,7 @@ static void expr_pylike_parse_fail_test(const char *str) static void expr_pylike_const_test(const char *str, double value, bool force_const) { - ExprPyLike_Parsed *expr = BLI_expr_pylike_parse(str, 0, NULL); + ExprPyLike_Parsed *expr = BLI_expr_pylike_parse(str, NULL, 0); if (force_const) { EXPECT_TRUE(BLI_expr_pylike_is_constant(expr)); @@ -34,7 +34,7 @@ static void expr_pylike_const_test(const char *str, double value, bool force_con } double result; - eExprPyLike_EvalStatus status = BLI_expr_pylike_eval(expr, &result, 0, NULL); + eExprPyLike_EvalStatus status = BLI_expr_pylike_eval(expr, NULL, 0, &result); EXPECT_EQ(status, EXPR_PYLIKE_SUCCESS); EXPECT_EQ(result, value); @@ -44,8 +44,8 @@ static void expr_pylike_const_test(const char *str, double value, bool force_con static ExprPyLike_Parsed *parse_for_eval(const char *str, bool nonconst) { - const char *names[1] = { "x" }; - ExprPyLike_Parsed *expr = BLI_expr_pylike_parse(str, 1, names); + const char *names[1] = {"x"}; + ExprPyLike_Parsed *expr = BLI_expr_pylike_parse(str, names, ARRAY_SIZE(names)); EXPECT_TRUE(BLI_expr_pylike_is_valid(expr)); @@ -59,7 +59,7 @@ static ExprPyLike_Parsed *parse_for_eval(const char *str, bool nonconst) static void verify_eval_result(ExprPyLike_Parsed *expr, double x, double value) { double result; - eExprPyLike_EvalStatus status = BLI_expr_pylike_eval(expr, &result, 1, &x); + eExprPyLike_EvalStatus status = BLI_expr_pylike_eval(expr, &x, 1, &result); EXPECT_EQ(status, EXPR_PYLIKE_SUCCESS); EXPECT_EQ(result, value); @@ -77,7 +77,7 @@ static void expr_pylike_error_test(const char *str, double x, eExprPyLike_EvalSt ExprPyLike_Parsed *expr = parse_for_eval(str, false); double result; - eExprPyLike_EvalStatus status = BLI_expr_pylike_eval(expr, &result, 1, &x); + eExprPyLike_EvalStatus status = BLI_expr_pylike_eval(expr, &x, 1, &result); EXPECT_EQ(status, error); @@ -253,15 +253,15 @@ TEST(expr_pylike, Eval_Ternary1) TEST(expr_pylike, MultipleArgs) { - const char* names[3] = { "x", "y", "x" }; - double values[3] = { 1.0, 2.0, 3.0 }; + const char* names[3] = {"x", "y", "x"}; + double values[3] = {1.0, 2.0, 3.0}; - ExprPyLike_Parsed *expr = BLI_expr_pylike_parse("x*10 + y", 3, names); + ExprPyLike_Parsed *expr = BLI_expr_pylike_parse("x*10 + y", names, ARRAY_SIZE(names)); EXPECT_TRUE(BLI_expr_pylike_is_valid(expr)); double result; - eExprPyLike_EvalStatus status = BLI_expr_pylike_eval(expr, &result, 3, values); + eExprPyLike_EvalStatus status = BLI_expr_pylike_eval(expr, values, 3, &result); EXPECT_EQ(status, EXPR_PYLIKE_SUCCESS); EXPECT_EQ(result, 32.0); @@ -291,10 +291,10 @@ TEST_ERROR(Mixed3, "sqrt(x) + 1 / max(0, x)", 1.0, EXPR_PYLIKE_SUCCESS) TEST(expr_pylike, Error_Invalid) { - ExprPyLike_Parsed *expr = BLI_expr_pylike_parse("", 0, NULL); + ExprPyLike_Parsed *expr = BLI_expr_pylike_parse("", NULL, 0); double result; - EXPECT_EQ(BLI_expr_pylike_eval(expr, &result, 0, NULL), EXPR_PYLIKE_INVALID); + EXPECT_EQ(BLI_expr_pylike_eval(expr, NULL, 0, &result), EXPR_PYLIKE_INVALID); BLI_expr_pylike_free(expr); } @@ -304,7 +304,7 @@ TEST(expr_pylike, Error_ArgumentCount) ExprPyLike_Parsed *expr = parse_for_eval("x", false); double result; - EXPECT_EQ(BLI_expr_pylike_eval(expr, &result, 0, NULL), EXPR_PYLIKE_FATAL_ERROR); + EXPECT_EQ(BLI_expr_pylike_eval(expr, NULL, 0, &result), EXPR_PYLIKE_FATAL_ERROR); BLI_expr_pylike_free(expr); } |