static void parse_parameter_list(rapidxml::xml_node<>* node, Parameters& parameters) { if (node != NULL) { std::string name = node->name(); if (name == "parameteritem") { parameter p; parse_parameter(node->first_node(), p); if (! p.name.empty()) { // Copy its description std::vector<parameter>::iterator it = std::find_if(parameters.begin(), parameters.end(), par_by_name(p.name)); if (it != parameters.end()) { it->brief_description = p.brief_description; } else { parameters.push_back(p); } } } else if (name == "param") { // Element of 'templateparamlist.param (.type,.declname,.defname)' parameter p; parse_parameter(node->first_node(), p); // Doxygen handles templateparamlist param's differently: // // Case 1: // <param><type>typename T</type></param> // -> no name, assign type to name, replace typename // // Case 2: // <type>typename</type><declname>T</declname><defname>T</defname> // -> set full type if (p.name.empty()) { // Case 1 p.name = p.type; boost::replace_all(p.name, "typename", ""); boost::trim(p.name); } else { // Case 2 p.fulltype = p.type + " " + p.name; } add_or_set(parameters, p); } parse_parameter_list(node->first_node(), parameters); parse_parameter_list(node->next_sibling(), parameters); } }
static void parse_function(rapidxml::xml_node<>* node, configuration const& config, std::string const& parent, function& f) { if (node != NULL) { std::string name = node->name(); std::string full = parent + "." + name; if (full == ".name") f.name = node->value(); else if (full == ".argsstring") f.argsstring = node->value(); else if (full == ".definition") { f.definition = node->value(); if (! config.skip_namespace.empty()) { boost::replace_all(f.definition, config.skip_namespace, ""); } } else if (full == ".param") { parameter p; parse_parameter(node->first_node(), p); add_or_set(f.parameters, p); } else if (full == ".type") { get_contents(node->first_node(), f.return_type); } else if (full == ".detaileddescription.para.simplesect") { std::string kind = get_attribute(node, "kind"); if (kind == "return") { get_contents(node->first_node(), f.return_description); } /*else if (kind == "param") { get_contents(node->first_node(), f.paragraphs); }*/ } else if (full == ".detaileddescription.para.image") { } parse_function(node->first_node(), config, full, f); parse_function(node->next_sibling(), config, parent, f); } }
bool skiplist_set(struct skiplist *sl, void *key, void *value, void **old) { return add_or_set(sl, 1, key, value, old); }
bool skiplist_add(struct skiplist *sl, void *key, void *value) { return add_or_set(sl, 0, key, value, NULL); }