| 5087 | #endif |
| 5088 | |
| 5089 | PUGI__FN xml_node xml_node::first_element_by_path(const char_t* path_, char_t delimiter) const |
| 5090 | { |
| 5091 | xml_node found = *this; // Current search context. |
| 5092 | |
| 5093 | if (!_root || !path_ || !path_[0]) |
| 5094 | return found; |
| 5095 | |
| 5096 | if (path_[0] == delimiter) |
| 5097 | { |
| 5098 | // Absolute path; e.g. '/foo/bar' |
| 5099 | found = found.root(); |
| 5100 | ++path_; |
| 5101 | } |
| 5102 | |
| 5103 | const char_t* path_segment = path_; |
| 5104 | |
| 5105 | while (*path_segment == delimiter) |
| 5106 | ++path_segment; |
| 5107 | |
| 5108 | const char_t* path_segment_end = path_segment; |
| 5109 | |
| 5110 | while (*path_segment_end && *path_segment_end != delimiter) |
| 5111 | ++path_segment_end; |
| 5112 | |
| 5113 | if (path_segment == path_segment_end) |
| 5114 | return found; |
| 5115 | |
| 5116 | const char_t* next_segment = path_segment_end; |
| 5117 | |
| 5118 | while (*next_segment == delimiter) |
| 5119 | ++next_segment; |
| 5120 | |
| 5121 | if (*path_segment == '.' && path_segment + 1 == path_segment_end) |
| 5122 | return found.first_element_by_path(next_segment, delimiter); |
| 5123 | else if (*path_segment == '.' && *(path_segment + 1) == '.' && path_segment + 2 == path_segment_end) |
| 5124 | return found.parent().first_element_by_path(next_segment, delimiter); |
| 5125 | else |
| 5126 | { |
| 5127 | for (xml_node_struct* j = found._root->first_child; j; j = j->next_sibling) |
| 5128 | { |
| 5129 | if (j->name && |
| 5130 | impl::strequalrange(j->name, path_segment, static_cast<size_t>(path_segment_end - path_segment))) |
| 5131 | { |
| 5132 | xml_node subsearch = xml_node(j).first_element_by_path(next_segment, delimiter); |
| 5133 | |
| 5134 | if (subsearch) |
| 5135 | return subsearch; |
| 5136 | } |
| 5137 | } |
| 5138 | |
| 5139 | return xml_node(); |
| 5140 | } |
| 5141 | } |
| 5142 | |
| 5143 | PUGI__FN bool xml_node::traverse(xml_tree_walker& walker) |
| 5144 | { |
nothing calls this directly
no test coverage detected