template<typename Range>
inline Range
-parse_name (const Range &path)
+parse_name (const SGPropertyNode *node, const Range &path)
{
typename Range::iterator i = path.begin();
typename Range::iterator max = path.end();
} else if (*i == '[' || *i == '/') {
break;
} else {
- throw string("name may contain only ._- and alphanumeric characters");
+ string err = "'";
+ err.push_back(*i);
+ err.append("' found in propertyname after '"+node->getNameString()+"'");
+ err.append("\nname may contain only ._- and alphanumeric characters");
+ throw err;
}
i++;
}
}
else {
- if (path.begin() == i)
- throw string("name must begin with alpha or '_'");
+ if (path.begin() == i) {
+ string err = "'";
+ err.push_back(*i);
+ err.append("' found in propertyname after '"+node->getNameString()+"'");
+ err.append("\nname must begin with alpha or '_'");
+ throw err;
+ }
}
return Range(path.begin(), i);
}
// Empty name at this point is empty, not root.
if (token.empty())
return find_node_aux(current, ++itr, create, last_index);
- Range name = parse_name(token);
+ Range name = parse_name(current, token);
if (equals(name, "."))
return find_node_aux(current, ++itr, create, last_index);
if (equals(name, "..")) {
}
-const char *
+string
SGPropertyNode::getPath (bool simplify) const
{
- // Calculate the complete path only once.
- if (_parent != 0 && _path.empty()) {
- _path = _parent->getPath(simplify);
- _path += '/';
- _path += getDisplayName(simplify);
+ typedef std::vector<SGConstPropertyNode_ptr> PList;
+ PList pathList;
+ for (const SGPropertyNode* node = this; node->_parent; node = node->_parent)
+ pathList.push_back(node);
+ string result;
+ for (PList::reverse_iterator itr = pathList.rbegin(),
+ rend = pathList.rend();
+ itr != rend;
+ ++itr) {
+ result += '/';
+ result += (*itr)->getDisplayName(simplify);
}
-
- return _path.c_str();
+ return result;
}
props::Type