// Calculate the target pointer for a targetable node void CalculateNodeTargetPointer(xmlNode* target, fm::string& pointer) { if (target != NULL) { // The target node should have either a subid or an id if (HasNodeProperty(target, DAE_ID_ATTRIBUTE)) { pointer = ReadNodeId(target); return; } else if (!HasNodeProperty(target, DAE_SID_ATTRIBUTE)) { pointer.clear(); return; } // Generate a list of parent nodes up to the first properly identified parent xmlNodeList traversal; traversal.reserve(16); traversal.push_back(target); xmlNode* current = target->parent; while (current != NULL) { traversal.push_back(current); if (HasNodeProperty(current, DAE_ID_ATTRIBUTE)) break; current = current->parent; } // The top parent should have the ID property FUSStringBuilder builder; intptr_t nodeCount = (intptr_t) traversal.size(); builder.append(ReadNodeId(traversal[nodeCount - 1])); if (builder.empty()) { pointer.clear(); return; } // Build up the target string for (intptr_t i = nodeCount - 2; i >= 0; --i) { xmlNode* node = traversal[i]; fm::string subId = ReadNodeProperty(node, DAE_SID_ATTRIBUTE); if (!subId.empty()) { builder.append('/'); builder.append(subId); } } pointer = builder.ToString(); } else pointer.clear(); }
// Split the target string into its pointer and its qualifier(s) void FUStringConversion::SplitTarget(const fm::string& target, fm::string& pointer, fm::string& qualifier) { size_t splitIndex = target.find_first_of("([."); if (splitIndex != fm::string::npos) { pointer = target.substr(0, splitIndex); qualifier = target.substr(splitIndex); } else { pointer = target; qualifier.clear(); } }