MCPcopy Create free account
hub / github.com/apache/trafficserver / evaluate

Method evaluate

plugins/esi/lib/Expression.cc:165–245  ·  view source on GitHub ↗

Source from the content-addressed store, hash-verified

163}
164
165bool
166Expression::evaluate(const char *expr, int expr_len /* = -1 */)
167{
168 Utils::trimWhiteSpace(expr, expr_len);
169 if (!expr_len) {
170 Dbg(dbg_ctl, "[%s] Returning false for empty expression", __FUNCTION__);
171 return false;
172 }
173 Operator op = OP_EQ; // stupid initialized checking, make gcc happy
174 const char *subexpr;
175 int subexpr_len;
176 string lhs, rhs;
177 bool retval = false;
178 int sep = _findOperator(expr, expr_len, op);
179
180 if (sep == -1) {
181 retval = _evalSimpleExpr(expr, expr_len);
182 } else if (_isBinaryOperator(op)) {
183 subexpr = expr;
184 subexpr_len = sep;
185 lhs = expand(subexpr, subexpr_len);
186 Dbg(dbg_ctl, "[%s] LHS [%.*s] expanded to [%.*s]", __FUNCTION__, subexpr_len, subexpr, int(lhs.size()), lhs.data());
187 subexpr = expr + sep + OPERATOR_STRINGS[op].str_len;
188 subexpr_len = expr_len - subexpr_len - OPERATOR_STRINGS[op].str_len;
189 rhs = expand(subexpr, subexpr_len);
190 Dbg(dbg_ctl, "[%s] RHS [%.*s] expanded to [%.*s]", __FUNCTION__, subexpr_len, subexpr, int(rhs.size()), rhs.data());
191 double lhs_numerical = 0;
192 double rhs_numerical = 0;
193 bool are_numerical = _convert(lhs, lhs_numerical);
194 are_numerical = are_numerical ? _convert(rhs, rhs_numerical) : false;
195 switch (op) {
196 case OP_EQ:
197 retval = are_numerical ? (lhs_numerical == rhs_numerical) : (lhs == rhs);
198 break;
199 case OP_NEQ:
200 retval = are_numerical ? (lhs_numerical != rhs_numerical) : (lhs != rhs);
201 break;
202 case OP_OR:
203 retval = are_numerical ? (lhs_numerical || rhs_numerical) : (lhs.size() || rhs.size());
204 break;
205 case OP_AND:
206 retval = are_numerical ? (lhs_numerical && rhs_numerical) : (lhs.size() && rhs.size());
207 break;
208 default:
209 if (lhs.empty() || rhs.empty()) {
210 // one of the sides expanded to nothing; invalid comparison
211 Dbg(dbg_ctl, "[%s] LHS/RHS empty. Cannot evaluate comparisons", __FUNCTION__);
212 retval = false;
213 } else {
214 switch (op) {
215 case OP_LT:
216 retval = are_numerical ? (lhs_numerical < rhs_numerical) : (lhs < rhs);
217 break;
218 case OP_GT:
219 retval = are_numerical ? (lhs_numerical > rhs_numerical) : (lhs > rhs);
220 break;
221 case OP_LTEQ:
222 retval = are_numerical ? (lhs_numerical <= rhs_numerical) : (lhs <= rhs);

Callers 2

_handleChooseMethod · 0.45
vars_test.ccFile · 0.45

Calls 5

trimWhiteSpaceFunction · 0.85
expandFunction · 0.50
sizeMethod · 0.45
dataMethod · 0.45
emptyMethod · 0.45

Tested by

no test coverage detected