| 8829 | } |
| 8830 | |
| 8831 | bool eval_boolean(const xpath_context& c, const xpath_stack& stack) |
| 8832 | { |
| 8833 | switch (_type) |
| 8834 | { |
| 8835 | case ast_op_or: return _left->eval_boolean(c, stack) || _right->eval_boolean(c, stack); |
| 8836 | |
| 8837 | case ast_op_and: return _left->eval_boolean(c, stack) && _right->eval_boolean(c, stack); |
| 8838 | |
| 8839 | case ast_op_equal: return compare_eq(_left, _right, c, stack, equal_to()); |
| 8840 | |
| 8841 | case ast_op_not_equal: return compare_eq(_left, _right, c, stack, not_equal_to()); |
| 8842 | |
| 8843 | case ast_op_less: return compare_rel(_left, _right, c, stack, less()); |
| 8844 | |
| 8845 | case ast_op_greater: return compare_rel(_right, _left, c, stack, less()); |
| 8846 | |
| 8847 | case ast_op_less_or_equal: return compare_rel(_left, _right, c, stack, less_equal()); |
| 8848 | |
| 8849 | case ast_op_greater_or_equal: return compare_rel(_right, _left, c, stack, less_equal()); |
| 8850 | |
| 8851 | case ast_func_starts_with: |
| 8852 | { |
| 8853 | xpath_allocator_capture cr(stack.result); |
| 8854 | |
| 8855 | xpath_string lr = _left->eval_string(c, stack); |
| 8856 | xpath_string rr = _right->eval_string(c, stack); |
| 8857 | |
| 8858 | return starts_with(lr.c_str(), rr.c_str()); |
| 8859 | } |
| 8860 | |
| 8861 | case ast_func_contains: |
| 8862 | { |
| 8863 | xpath_allocator_capture cr(stack.result); |
| 8864 | |
| 8865 | xpath_string lr = _left->eval_string(c, stack); |
| 8866 | xpath_string rr = _right->eval_string(c, stack); |
| 8867 | |
| 8868 | return find_substring(lr.c_str(), rr.c_str()) != 0; |
| 8869 | } |
| 8870 | |
| 8871 | case ast_func_boolean: return _left->eval_boolean(c, stack); |
| 8872 | |
| 8873 | case ast_func_not: return !_left->eval_boolean(c, stack); |
| 8874 | |
| 8875 | case ast_func_true: return true; |
| 8876 | |
| 8877 | case ast_func_false: return false; |
| 8878 | |
| 8879 | case ast_func_lang: |
| 8880 | { |
| 8881 | if (c.n.attribute()) |
| 8882 | return false; |
| 8883 | |
| 8884 | xpath_allocator_capture cr(stack.result); |
| 8885 | |
| 8886 | xpath_string lang = _left->eval_string(c, stack); |
| 8887 | |
| 8888 | for (xml_node n = c.n.node(); n; n = n.parent()) |
no test coverage detected