10791 {
10792 switch (_type)
10793 {
10796
10798 {
10799 xpath_node na = c.
n;
10800
10802 }
10803
10805 {
10806 xpath_allocator_capture cr(stack.
result);
10807
10809 xpath_node na =
ns.first();
10810
10812 }
10813
10815 {
10816 xpath_node na = c.
n;
10817
10819 }
10820
10822 {
10823 xpath_allocator_capture cr(stack.
result);
10824
10826 xpath_node na =
ns.first();
10827
10829 }
10830
10832 {
10833 xpath_node na = c.
n;
10834
10836 }
10837
10839 {
10840 xpath_allocator_capture cr(stack.
result);
10841
10843 xpath_node na =
ns.first();
10844
10846 }
10847
10850
10852 return _left->eval_string(c, stack);
10853
10856
10858 {
10859 xpath_allocator_capture cr(stack.
temp);
10860
10861 xpath_stack swapped_stack = {stack.
temp, stack.
result};
10862
10863 xpath_string s = _left->eval_string(c, swapped_stack);
10864 xpath_string p = _right->eval_string(c, swapped_stack);
10865
10867
10869 }
10870
10872 {
10873 xpath_allocator_capture cr(stack.
temp);
10874
10875 xpath_stack swapped_stack = {stack.
temp, stack.
result};
10876
10877 xpath_string s = _left->eval_string(c, swapped_stack);
10878 xpath_string p = _right->eval_string(c, swapped_stack);
10879
10881 if (!pos) return xpath_string();
10882
10885
10887 }
10888
10890 {
10891 xpath_allocator_capture cr(stack.
temp);
10892
10893 xpath_stack swapped_stack = {stack.
temp, stack.
result};
10894
10895 xpath_string s = _left->eval_string(c, swapped_stack);
10896 size_t s_length = s.
length();
10897
10898 double first =
round_nearest(_right->eval_number(c, stack));
10899
10900 if (
is_nan(first))
return xpath_string();
10901 else if (first >= static_cast<double>(s_length + 1)) return xpath_string();
10902
10903 size_t pos = first < 1 ? 1 : static_cast<size_t>(first);
10904 assert(1 <= pos && pos <= s_length + 1);
10905
10908
10910 }
10911
10913 {
10914 xpath_allocator_capture cr(stack.
temp);
10915
10916 xpath_stack swapped_stack = {stack.
temp, stack.
result};
10917
10918 xpath_string s = _left->eval_string(c, swapped_stack);
10919 size_t s_length = s.
length();
10920
10921 double first =
round_nearest(_right->eval_number(c, stack));
10922 double last = first +
round_nearest(_right->_next->eval_number(c, stack));
10923
10924 if (
is_nan(first) ||
is_nan(last))
return xpath_string();
10925 else if (first >= static_cast<double>(s_length + 1)) return xpath_string();
10926 else if (first >= last) return xpath_string();
10927 else if (last < 1) return xpath_string();
10928
10929 size_t pos = first < 1 ? 1 : static_cast<size_t>(first);
10930 size_t end = last >= static_cast<double>(s_length + 1) ? s_length + 1 : static_cast<size_t>(last);
10931
10932 assert(1 <= pos && pos <= end && end <= s_length + 1);
10935
10937 }
10938
10940 {
10942
10944 if (!begin) return xpath_string();
10945
10947
10949 }
10950
10952 {
10953 xpath_string s = _left->eval_string(c, stack);
10954
10956 if (!begin) return xpath_string();
10957
10959
10961 }
10962
10964 {
10965 xpath_allocator_capture cr(stack.
temp);
10966
10967 xpath_stack swapped_stack = {stack.
temp, stack.
result};
10968
10969 xpath_string s = _left->eval_string(c, stack);
10970 xpath_string from = _right->eval_string(c, swapped_stack);
10971 xpath_string to = _right->_next->eval_string(c, swapped_stack);
10972
10974 if (!begin) return xpath_string();
10975
10977
10979 }
10980
10982 {
10983 xpath_string s = _left->eval_string(c, stack);
10984
10986 if (!begin) return xpath_string();
10987
10989
10991 }
10992
10994 {
10995 assert(_rettype == _data.variable->type());
10996
10997 if (_rettype == xpath_type_string)
10999
11000
11001 break;
11002 }
11003
11004 default:
11005 ;
11006 }
11007
11008
11009 switch (_rettype)
11010 {
11013
11016
11018 {
11019 xpath_allocator_capture cr(stack.
temp);
11020
11021 xpath_stack swapped_stack = {stack.
temp, stack.
result};
11022
11024 return ns.empty() ? xpath_string() :
string_value(
ns.first(), stack.result);
11025 }
11026
11027 default:
11028 assert(false && "Wrong expression for return type string");
11029 return xpath_string();
11030 }
11031 }
xpath_string eval_string_concat(const xpath_context &c, const xpath_stack &stack)
static xpath_string from_heap_preallocated(const char_t *begin, const char_t *end)
static xpath_string from_const(const char_t *str)
static xpath_string from_heap(const char_t *begin, const char_t *end, xpath_allocator *alloc)
char_t * data(xpath_allocator *alloc)
@ ast_opt_translate_table
@ ast_func_substring_before
@ ast_func_namespace_uri_0
@ ast_func_normalize_space_1
@ ast_func_normalize_space_0
@ ast_func_substring_after
@ ast_func_namespace_uri_1
PUGI__FN const char_t * qualified_name(const xpath_node &node)
PUGI__FN xpath_string convert_number_to_string(double value, xpath_allocator *alloc)
PUGI__FN char_t * normalize_space(char_t *buffer)
PUGI__FN const char_t * namespace_uri(xml_node node)
PUGI__FN char_t * translate_table(char_t *buffer, const unsigned char *table)
PUGI__FN double round_nearest(double value)
PUGI__FN char_t * translate(char_t *buffer, const char_t *from, const char_t *to, size_t to_length)
PUGI__FN bool is_nan(double value)
PUGI__FN const char_t * local_name(const xpath_node &node)