load("xml/index.xml"); $xpath = new DOMXPath($doc); $entries = $xpath->evaluate("//compound[@kind]", $doc); for ($i = 0; $i < $entries->length; $i++) { $kind = $entries->item($i)->getAttribute("kind"); $refid = $entries->item($i)->getAttribute("refid"); $name = $entries->item($i)->childNodes->item(0)->nodeValue; if($kind == "class") { $classes[$name] = array(); $class_doc = new DOMDocument(); $class_doc->load("xml/$refid.xml"); $class_xpath = new DOMXPath($class_doc); //Check from which classes this one inherits $class_inherits = $class_xpath->evaluate("//inheritancegraph", $class_doc); if($class_inherits->length > 0) { $class_implements = $class_xpath->evaluate("node", $class_inherits->item(0)); for($implement=0; $implement<$class_implements->length; $implement++) { if($class_implements->item($implement)->childNodes->item(1)->nodeValue != $name) $classes[$name]["_implements"][] = $class_implements->item($implement)->childNodes->item(1)->nodeValue; } } //Get the member functions of the class $class_member = $class_xpath->evaluate("//memberdef", $class_doc); for($member=0; $member<$class_member->length; $member++) { //Class functions if($class_member->item($member)->getAttribute("kind") == "function") { $function_name = $class_xpath->evaluate("name", $class_member->item($member))->item(0)->nodeValue; //skip destructor if($function_name{0} == "~") continue; //Check if member is constant if($class_member->item($member)->getAttribute("const") == "yes" && !in_array($function_name, $classes[$name]["_const"])) $classes[$name]["_const"][] = $function_name; //Check if member is static if($class_member->item($member)->getAttribute("static") == "yes" && !in_array($function_name, $classes[$name]["_static"])) $classes[$name]["_static"][] = $function_name; //Check if member is virtual if($class_member->item($member)->getAttribute("virt") == "virtual" && !in_array($function_name, $classes[$name]["_pure_virtual"])) $classes[$name]["_pure_virtual"][] = $function_name; //Retrieve member type $function_type = str_replace(array(" *", " &"), array("*", "&"), $class_xpath->evaluate("type", $class_member->item($member))->item(0)->nodeValue); //Initialize arrays that will store parameters $parameters_type = array(); $parameters_required = array(); $parameters_values = array(); //Store member type as the first element of parameters array $parameters_type[] = $function_type; $parameters_required[] = true; $parameters_values[] = null; //Check all member parameters $function_parameters = $class_xpath->evaluate("param", $class_member->item($member)); if($function_parameters->length > 0) { for($parameter=0; $parameter<$function_parameters->length; $parameter++) { $parameters_type[] = str_replace(array(" *", " &"), array("*", "&"), $class_xpath->evaluate("type", $function_parameters->item($parameter))->item(0)->nodeValue); if($class_xpath->evaluate("defval", $function_parameters->item($parameter))->length > 0) { $parameters_values[] = $class_xpath->evaluate("defval", $function_parameters->item($parameter))->item(0)->nodeValue; } else { $parameters_required[] = true; $parameters_values[] = null; } } } $classes[$name][$function_name][] = $parameters_type; $classes[$name][$function_name][] = array($parameters_required, $parameters_values); } //Class enumerations elseif($class_member->item($member)->getAttribute("kind") == "enum") { $enum_name = $class_xpath->evaluate("name", $class_member->item($member))->item(0)->nodeValue; //Skip badly referenced enums if($enum_name{0} == "@") continue; if(!isset($enums[$name])) $enums[0][$name] = array(); $enums[0][$name][$enum_name] = array(); $enum_values = $class_xpath->evaluate("enumvalue", $class_member->item($member)); for($enum_value=0; $enum_value<$enum_values->length; $enum_value++) { $enums[0][$name][$enum_name][] = $class_xpath->evaluate("name", $enum_values->item($enum_value))->item(0)->nodeValue; } } //Store not handled members of the class else { $class_not_handle[$class_member->item($member)->getAttribute("kind")] = true; } } } elseif($kind == "file") { $file_doc = new DOMDocument(); $file_doc->load("xml/$refid.xml"); $file_xpath = new DOMXPath($file_doc); $file_members = $file_xpath->evaluate("//memberdef", $file_doc); for($member=0; $member<$file_members->length; $member++) { //Store file constant macro definitions if($file_members->item($member)->getAttribute("kind") == "define") { $define_name = $file_xpath->evaluate("name", $file_members->item($member))->item(0)->nodeValue; //Skip macro function defines if($file_xpath->evaluate("param", $file_members->item($member))->length > 0) { continue; } //Skip defines used for compiler if($define_name{0} == "_" && $define_name{1} == "_") { continue; } $defines[$define_name] = true; } //Store global enumerations elseif($file_members->item($member)->getAttribute("kind") == "enum") { $enum_name = $file_xpath->evaluate("name", $file_members->item($member))->item(0)->nodeValue; //Skip badly referenced enums if($enum_name{0} == "@") continue; if(!isset($enums[0])) $enums[1] = array(); $enums[1][$enum_name] = array(); $enum_values = $file_xpath->evaluate("enumvalue", $file_members->item($member)); for($enum_value=0; $enum_value<$enum_values->length; $enum_value++) { $enums[1][$enum_name][] = $file_xpath->evaluate("name", $enum_values->item($enum_value))->item(0)->nodeValue; } } //Store kinds not handle on the files else { $file_not_handle[$file_members->item($member)->getAttribute("kind")] = true; } } } //Store compound kinds on index.html not handled else { $compound_not_handle[$kind] = true; } } print "Class kinds not handled:\n"; print_r($class_not_handle); print "\n"; print "Compound kinds not handled:\n"; print_r($compound_not_handle); print "\n"; print "File kinds not handled:\n"; print_r($file_not_handle); print "\n"; file_put_contents("classes.dump", serialize($classes)); file_put_contents("enums.dump", serialize($enums)); file_put_contents("consts.dump", serialize($defines)); print "Define constants found: " . count($defines) . "\n"; print "Classes found: " . count($classes) . "\n"; print "Class enumerations found: " . count($enums[0]) . "\n"; print "Global enumerations found: " . count($enums[1]) . "\n"; ?>