| 7401 | } |
| 7402 | |
| 7403 | bool eval_boolean(const xpath_context& c, const xpath_stack& stack) |
| 7404 | { |
| 7405 | switch (_type) |
| 7406 | { |
| 7407 | case ast_op_or: |
| 7408 | return _left->eval_boolean(c, stack) || _right->eval_boolean(c, stack); |
| 7409 | |
| 7410 | case ast_op_and: |
| 7411 | return _left->eval_boolean(c, stack) && _right->eval_boolean(c, stack); |
| 7412 | |
| 7413 | case ast_op_equal: |
| 7414 | return compare_eq(_left, _right, c, stack, equal_to()); |
| 7415 | |
| 7416 | case ast_op_not_equal: |
| 7417 | return compare_eq(_left, _right, c, stack, not_equal_to()); |
| 7418 | |
| 7419 | case ast_op_less: |
| 7420 | return compare_rel(_left, _right, c, stack, less()); |
| 7421 | |
| 7422 | case ast_op_greater: |
| 7423 | return compare_rel(_right, _left, c, stack, less()); |
| 7424 | |
| 7425 | case ast_op_less_or_equal: |
| 7426 | return compare_rel(_left, _right, c, stack, less_equal()); |
| 7427 | |
| 7428 | case ast_op_greater_or_equal: |
| 7429 | return compare_rel(_right, _left, c, stack, less_equal()); |
| 7430 | |
| 7431 | case ast_func_starts_with: |
| 7432 | { |
| 7433 | xpath_allocator_capture cr(stack.result); |
| 7434 | |
| 7435 | xpath_string lr = _left->eval_string(c, stack); |
| 7436 | xpath_string rr = _right->eval_string(c, stack); |
| 7437 | |
| 7438 | return starts_with(lr.c_str(), rr.c_str()); |
| 7439 | } |
| 7440 | |
| 7441 | case ast_func_contains: |
| 7442 | { |
| 7443 | xpath_allocator_capture cr(stack.result); |
| 7444 | |
| 7445 | xpath_string lr = _left->eval_string(c, stack); |
| 7446 | xpath_string rr = _right->eval_string(c, stack); |
| 7447 | |
| 7448 | return find_substring(lr.c_str(), rr.c_str()) != 0; |
| 7449 | } |
| 7450 | |
| 7451 | case ast_func_boolean: |
| 7452 | return _left->eval_boolean(c, stack); |
| 7453 | |
| 7454 | case ast_func_not: |
| 7455 | return !_left->eval_boolean(c, stack); |
| 7456 | |
| 7457 | case ast_func_true: |
| 7458 | return true; |
| 7459 | |
| 7460 | case ast_func_false: |
no test coverage detected