|
Blender V4.3
|
#include <ctype.h>#include <fenv.h>#include <float.h>#include <math.h>#include <stddef.h>#include <stdio.h>#include <stdlib.h>#include <string.h>#include "MEM_guardedalloc.h"#include "BLI_alloca.h"#include "BLI_expr_pylike_eval.h"#include "BLI_math_base.h"#include "BLI_utildefines.h"Go to the source code of this file.
Classes | |
| struct | ExprOp |
| struct | ExprPyLike_Parsed |
| struct | BuiltinConstDef |
| struct | BuiltinOpDef |
| struct | KeywordTokenDef |
| struct | ExprParseState |
Macros | |
| #define | FAIL_IF(condition) |
Internal Types | |
| enum | eOpCode { OPCODE_CONST , OPCODE_FUNC1 , OPCODE_FUNC2 , OPCODE_FUNC3 , OPCODE_PARAMETER , OPCODE_MIN , OPCODE_MAX , OPCODE_JMP , OPCODE_JMP_ELSE , OPCODE_JMP_OR , OPCODE_JMP_AND , OPCODE_CMP_CHAIN } |
| typedef enum eOpCode | eOpCode |
| typedef double(* | UnaryOpFunc) (double) |
| typedef double(* | BinaryOpFunc) (double, double) |
| typedef double(* | TernaryOpFunc) (double, double, double) |
| typedef struct ExprOp | ExprOp |
Built-In Operations | |
| typedef struct BuiltinConstDef | BuiltinConstDef |
| typedef struct BuiltinOpDef | BuiltinOpDef |
| static BuiltinConstDef | builtin_consts [] |
| static BuiltinOpDef | builtin_ops [] |
| static double | op_negate (double arg) |
| static double | op_mul (double a, double b) |
| static double | op_div (double a, double b) |
| static double | op_add (double a, double b) |
| static double | op_sub (double a, double b) |
| static double | op_radians (double arg) |
| static double | op_degrees (double arg) |
| static double | op_log2 (double a, double b) |
| static double | op_lerp (double a, double b, double x) |
| static double | op_clamp (double arg) |
| static double | op_clamp3 (double arg, double minv, double maxv) |
| static double | op_smoothstep (double a, double b, double x) |
| static double | op_not (double a) |
| static double | op_eq (double a, double b) |
| static double | op_ne (double a, double b) |
| static double | op_lt (double a, double b) |
| static double | op_le (double a, double b) |
| static double | op_gt (double a, double b) |
| static double | op_ge (double a, double b) |
Simple evaluator for a subset of Python expressions that can be computed using purely double precision floating point values.
Supported subset:
The implementation has no global state and can be used multi-threaded.
Definition in file expr_pylike_eval.c.
| #define CHECK_ERROR | ( | condition | ) |
Definition at line 438 of file expr_pylike_eval.c.
Referenced by parse_add(), parse_add_func(), parse_and(), parse_cmp(), parse_cmp_chain(), parse_expr(), parse_mul(), parse_next_token(), parse_not(), parse_or(), and parse_unary().
| #define FAIL_IF | ( | condition | ) |
Referenced by BLI_expr_pylike_eval().
Definition at line 436 of file expr_pylike_eval.c.
Referenced by parse_next_token().
| #define TOKEN_AND MAKE_CHAR2('A', 'N') |
Definition at line 452 of file expr_pylike_eval.c.
Referenced by parse_and().
| #define TOKEN_ELSE MAKE_CHAR2('E', 'L') |
Definition at line 456 of file expr_pylike_eval.c.
Referenced by parse_expr().
| #define TOKEN_EQ MAKE_CHAR2('=', '=') |
Definition at line 451 of file expr_pylike_eval.c.
Referenced by parse_get_cmp_func().
| #define TOKEN_GE MAKE_CHAR2('>', '=') |
Definition at line 448 of file expr_pylike_eval.c.
Referenced by parse_get_cmp_func().
| #define TOKEN_ID MAKE_CHAR2('I', 'D') |
Definition at line 446 of file expr_pylike_eval.c.
Referenced by parse_next_token(), and parse_unary().
| #define TOKEN_IF MAKE_CHAR2('I', 'F') |
Definition at line 455 of file expr_pylike_eval.c.
Referenced by parse_expr().
| #define TOKEN_LE MAKE_CHAR2('<', '=') |
Definition at line 449 of file expr_pylike_eval.c.
Referenced by parse_get_cmp_func().
| #define TOKEN_NE MAKE_CHAR2('!', '=') |
Definition at line 450 of file expr_pylike_eval.c.
Referenced by parse_get_cmp_func().
| #define TOKEN_NOT MAKE_CHAR2('N', 'O') |
Definition at line 454 of file expr_pylike_eval.c.
Referenced by parse_not().
| #define TOKEN_NUMBER MAKE_CHAR2('0', '0') |
Definition at line 447 of file expr_pylike_eval.c.
Referenced by parse_next_token(), and parse_unary().
| #define TOKEN_OR MAKE_CHAR2('O', 'R') |
Definition at line 453 of file expr_pylike_eval.c.
Referenced by parse_or().
Definition at line 81 of file expr_pylike_eval.c.
| typedef struct BuiltinConstDef BuiltinConstDef |
| typedef struct BuiltinOpDef BuiltinOpDef |
| typedef struct ExprOp ExprOp |
| typedef struct ExprParseState ExprParseState |
| typedef struct KeywordTokenDef KeywordTokenDef |
Definition at line 82 of file expr_pylike_eval.c.
Definition at line 80 of file expr_pylike_eval.c.
| enum eOpCode |
| Enumerator | |
|---|---|
| OPCODE_CONST | |
| OPCODE_FUNC1 | |
| OPCODE_FUNC2 | |
| OPCODE_FUNC3 | |
| OPCODE_PARAMETER | |
| OPCODE_MIN | |
| OPCODE_MAX | |
| OPCODE_JMP | |
| OPCODE_JMP_ELSE | |
| OPCODE_JMP_OR | |
| OPCODE_JMP_AND | |
| OPCODE_CMP_CHAIN | |
Definition at line 53 of file expr_pylike_eval.c.
| eExprPyLike_EvalStatus BLI_expr_pylike_eval | ( | struct ExprPyLike_Parsed * | expr, |
| const double * | param_values, | ||
| int | param_values_len, | ||
| double * | r_result ) |
Evaluate the expression with the given parameters. The order and number of parameters must match the names given to parse.
Definition at line 152 of file expr_pylike_eval.c.
References ExprOp::arg, BLI_array_alloca, BLI_expr_pylike_is_valid(), CLAMP_MAX, CLAMP_MIN, ExprOp::dval, EXPR_PYLIKE_DIV_BY_ZERO, EXPR_PYLIKE_FATAL_ERROR, EXPR_PYLIKE_INVALID, EXPR_PYLIKE_MATH_ERROR, EXPR_PYLIKE_SUCCESS, FAIL_IF, ExprOp::ival, ExprPyLike_Parsed::max_stack, OPCODE_CMP_CHAIN, OPCODE_CONST, OPCODE_FUNC1, OPCODE_FUNC2, OPCODE_FUNC3, OPCODE_JMP, OPCODE_JMP_AND, OPCODE_JMP_ELSE, OPCODE_JMP_OR, OPCODE_MAX, OPCODE_MIN, OPCODE_PARAMETER, ExprPyLike_Parsed::ops, and ExprPyLike_Parsed::ops_count.
Referenced by driver_evaluate_simple_expr(), expr_pylike_const_test(), expr_pylike_error_test(), TEST(), TEST(), and verify_eval_result().
| void BLI_expr_pylike_free | ( | struct ExprPyLike_Parsed * | expr | ) |
Free the parsed data; NULL argument is ok.
Definition at line 112 of file expr_pylike_eval.c.
References MEM_freeN(), and NULL.
Referenced by BKE_driver_invalidate_expression(), driver_compile_simple_expr(), and fcurve_free_driver().
| bool BLI_expr_pylike_is_constant | ( | const ExprPyLike_Parsed * | expr | ) |
Definition at line 124 of file expr_pylike_eval.c.
References NULL, ExprOp::opcode, OPCODE_CONST, ExprPyLike_Parsed::ops, and ExprPyLike_Parsed::ops_count.
| bool BLI_expr_pylike_is_using_param | ( | const ExprPyLike_Parsed * | expr, |
| int | index ) |
Definition at line 129 of file expr_pylike_eval.c.
References ExprOp::arg, ExprOp::ival, NULL, ExprOp::opcode, OPCODE_PARAMETER, ExprPyLike_Parsed::ops, and ExprPyLike_Parsed::ops_count.
| bool BLI_expr_pylike_is_valid | ( | const ExprPyLike_Parsed * | expr | ) |
Definition at line 119 of file expr_pylike_eval.c.
References NULL, and ExprPyLike_Parsed::ops_count.
Referenced by BLI_expr_pylike_eval().
| ExprPyLike_Parsed * BLI_expr_pylike_parse | ( | const char * | expression, |
| const char ** | param_names, | ||
| int | param_names_len ) |
Compile the expression and return the result.
Parse the expression for evaluation later. Returns non-NULL even on failure; use is_valid to check.
Definition at line 1057 of file expr_pylike_eval.c.
References BLI_assert, ExprPyLike_Parsed::max_stack, MEM_callocN, MEM_freeN(), MEM_mallocN, ExprPyLike_Parsed::ops, ExprPyLike_Parsed::ops_count, parse_expr(), parse_next_token(), and state.
Referenced by driver_compile_simple_expr_impl(), expr_pylike_const_test(), expr_pylike_parse_fail_test(), parse_for_eval(), TEST(), and TEST().
Definition at line 325 of file expr_pylike_eval.c.
References CLAMP.
Definition at line 331 of file expr_pylike_eval.c.
References CLAMP.
Definition at line 310 of file expr_pylike_eval.c.
References M_PI.
Definition at line 349 of file expr_pylike_eval.c.
References b.
Referenced by parse_get_cmp_func().
Definition at line 374 of file expr_pylike_eval.c.
References b.
Referenced by parse_get_cmp_func().
Definition at line 369 of file expr_pylike_eval.c.
References b.
Referenced by parse_get_cmp_func().
Definition at line 364 of file expr_pylike_eval.c.
References b.
Referenced by parse_get_cmp_func().
Definition at line 320 of file expr_pylike_eval.c.
Definition at line 315 of file expr_pylike_eval.c.
Definition at line 359 of file expr_pylike_eval.c.
References b.
Referenced by parse_get_cmp_func().
Definition at line 354 of file expr_pylike_eval.c.
References b.
Referenced by parse_get_cmp_func().
Definition at line 280 of file expr_pylike_eval.c.
Referenced by parse_unary().
Definition at line 344 of file expr_pylike_eval.c.
Referenced by parse_not().
Definition at line 305 of file expr_pylike_eval.c.
References M_PI.
Definition at line 337 of file expr_pylike_eval.c.
Definition at line 300 of file expr_pylike_eval.c.
References b.
Referenced by bmo_connect_vert_pair_exec(), bmo_contextual_create_exec(), bridge_loop_pair(), and parse_add().
Definition at line 539 of file expr_pylike_eval.c.
References BLI_assert_msg, OPCODE_FUNC1, OPCODE_FUNC2, and OPCODE_FUNC3.
Referenced by parse_unary().
|
static |
Definition at line 880 of file expr_pylike_eval.c.
References CHECK_ERROR, op_add(), op_sub(), OPCODE_FUNC2, parse_add_func(), parse_mul(), parse_next_token(), and state.
Referenced by parse_cmp(), and parse_cmp_chain().
|
static |
Definition at line 555 of file expr_pylike_eval.c.
References ExprOp::arg, BLI_assert, CHECK_ERROR, ExprOp::dval, OPCODE_CONST, OPCODE_FUNC1, OPCODE_FUNC2, OPCODE_FUNC3, parse_add_op(), ExprOp::ptr, result, and state.
Referenced by parse_add(), parse_cmp_chain(), parse_mul(), parse_not(), and parse_unary().
|
static |
Definition at line 525 of file expr_pylike_eval.c.
References parse_add_op(), and state.
Referenced by parse_and(), parse_expr(), and parse_or().
|
static |
Definition at line 510 of file expr_pylike_eval.c.
References CLAMP_MIN, ExprOp::opcode, parse_alloc_ops(), and state.
Referenced by parse_add_func(), parse_add_jump(), parse_cmp_chain(), and parse_unary().
|
static |
Definition at line 497 of file expr_pylike_eval.c.
References count, MEM_reallocN, power_of_2_max_i(), and state.
Referenced by parse_add_op(), and parse_expr().
|
static |
Definition at line 968 of file expr_pylike_eval.c.
References CHECK_ERROR, jump(), OPCODE_JMP_AND, parse_add_jump(), parse_and(), parse_next_token(), parse_not(), parse_set_jump(), state, and TOKEN_AND.
Referenced by parse_and(), and parse_or().
|
static |
Definition at line 942 of file expr_pylike_eval.c.
References CHECK_ERROR, parse_add(), parse_cmp_chain(), parse_get_cmp_func(), parse_next_token(), and state.
Referenced by parse_not().
|
static |
Definition at line 922 of file expr_pylike_eval.c.
References ExprOp::arg, CHECK_ERROR, ExprOp::func2, jump(), OPCODE_CMP_CHAIN, OPCODE_FUNC2, parse_add(), parse_add_func(), parse_add_op(), parse_cmp_chain(), parse_get_cmp_func(), parse_next_token(), parse_set_jump(), and state.
Referenced by parse_cmp(), and parse_cmp_chain().
|
static |
Definition at line 998 of file expr_pylike_eval.c.
References CHECK_ERROR, MEM_freeN(), MEM_mallocN, OPCODE_JMP, OPCODE_JMP_ELSE, parse_add_jump(), parse_alloc_ops(), parse_expr(), parse_next_token(), parse_or(), parse_set_jump(), state, TOKEN_ELSE, and TOKEN_IF.
Referenced by BLI_expr_pylike_parse(), parse_expr(), parse_function_args(), and parse_unary().
|
static |
Definition at line 740 of file expr_pylike_eval.c.
References parse_expr(), parse_next_token(), and state.
Referenced by parse_unary().
|
static |
Definition at line 902 of file expr_pylike_eval.c.
References NULL, op_eq(), op_ge(), op_gt(), op_le(), op_lt(), op_ne(), TOKEN_EQ, TOKEN_GE, TOKEN_LE, and TOKEN_NE.
Referenced by parse_cmp(), and parse_cmp_chain().
|
static |
Definition at line 858 of file expr_pylike_eval.c.
References CHECK_ERROR, op_div(), op_mul(), OPCODE_FUNC2, parse_add_func(), parse_next_token(), parse_unary(), and state.
Referenced by parse_add().
|
static |
Definition at line 633 of file expr_pylike_eval.c.
References CHECK_ERROR, ELEM, keyword_list, MAKE_CHAR2, KeywordTokenDef::name, state, STREQ, KeywordTokenDef::token, token_characters, token_eq_characters, TOKEN_ID, and TOKEN_NUMBER.
Referenced by BLI_expr_pylike_parse(), parse_add(), parse_and(), parse_cmp(), parse_cmp_chain(), parse_expr(), parse_function_args(), parse_mul(), parse_not(), parse_or(), and parse_unary().
|
static |
Definition at line 957 of file expr_pylike_eval.c.
References CHECK_ERROR, op_not(), OPCODE_FUNC1, parse_add_func(), parse_cmp(), parse_next_token(), parse_not(), state, and TOKEN_NOT.
Referenced by parse_and(), and parse_not().
|
static |
Definition at line 983 of file expr_pylike_eval.c.
References CHECK_ERROR, jump(), OPCODE_JMP_OR, parse_add_jump(), parse_and(), parse_next_token(), parse_or(), parse_set_jump(), state, and TOKEN_OR.
Referenced by parse_expr(), and parse_or().
|
static |
Definition at line 532 of file expr_pylike_eval.c.
Referenced by parse_and(), parse_cmp_chain(), parse_expr(), and parse_or().
|
static |
Definition at line 774 of file expr_pylike_eval.c.
References ExprOp::arg, builtin_consts, builtin_ops, CHECK_ERROR, count, ExprOp::dval, ExprOp::ival, BuiltinConstDef::name, BuiltinOpDef::name, op_negate(), opcode_arg_count(), OPCODE_CONST, OPCODE_FUNC1, OPCODE_MAX, OPCODE_MIN, OPCODE_PARAMETER, parse_add_func(), parse_add_op(), parse_expr(), parse_function_args(), parse_next_token(), parse_unary(), state, STREQ, TOKEN_ID, TOKEN_NUMBER, and BuiltinConstDef::value.
Referenced by parse_mul(), and parse_unary().
|
static |
|
static |
Definition at line 400 of file expr_pylike_eval.c.
Referenced by parse_unary().
|
static |
Definition at line 466 of file expr_pylike_eval.c.
Referenced by denoise_func(), merge_func(), and parse_next_token().
|
static |
Definition at line 459 of file expr_pylike_eval.c.
Referenced by parse_next_token().
|
static |
Definition at line 458 of file expr_pylike_eval.c.
Referenced by parse_next_token().