diff options
Diffstat (limited to 'addon/xmlread/main.cpp')
-rw-r--r-- | addon/xmlread/main.cpp | 133 |
1 files changed, 133 insertions, 0 deletions
diff --git a/addon/xmlread/main.cpp b/addon/xmlread/main.cpp new file mode 100644 index 0000000..3f607f4 --- /dev/null +++ b/addon/xmlread/main.cpp @@ -0,0 +1,133 @@ +// --------------------------------------------------------------------------- +// Includes +// --------------------------------------------------------------------------- +#include <util/PlatformUtils.hpp> +#include <parsers/SAXParser.hpp> +#include "strx.h" +#include "saxhandlers.h" +#include "compounddef.h" + +// --------------------------------------------------------------------------- +// Local data +// +// xmlFile +// The path to the file to parser. Set via command line. +// +// --------------------------------------------------------------------------- +static char* xmlFile = 0; + +// --------------------------------------------------------------------------- +// Local helper methods +// --------------------------------------------------------------------------- +static void usage() +{ + cout << "\nUsage: xmlread file.xml\n" + << " Extracts the class hierarchy from a doxygen generated XML file.\n" + << endl; +} + +// recursively display non-root compounds +static void showDerivedCompounds(QList<CompoundDef> *compoundList,int level) +{ + if (compoundList->count()>0) + { + QListIterator<CompoundDef> cli(*compoundList); + CompoundDef *cd; + for (cli.toFirst();(cd=cli.current());++cli) + { + int i; + for (i=0;i<level;i++) cout << " "; + cout << cd->name() << endl; + showDerivedCompounds(cd->derivedCompounds(),level+1); + } + } +} + +// show compound hierarchy +static void showCompoundHierarchy(CompoundSDict *compounds) +{ + CompoundSDictIterator cdi(*compounds); + CompoundDef *cd; + for (cdi.toFirst();(cd=cdi.current());++cdi) + { + if (cd->type()==CompoundDef::Class_t && + cd->baseCompounds()->count()==0) // root compound + { + cout << cd->name() << endl; + showDerivedCompounds(cd->derivedCompounds(),1); + } + } +} + +// --------------------------------------------------------------------------- +// Program entry point +// --------------------------------------------------------------------------- +int main(int argC, char* argV[]) +{ + // Initialize the XML4C2 system + try + { + XMLPlatformUtils::Initialize(); + } + catch (const XMLException& toCatch) + { + cerr << "Error during initialization! :\n" + << StrX(toCatch.getMessage()) << endl; + return 1; + } + + // Check command line and extract arguments. + if (argC!=2) + { + usage(); + return 1; + } + + // Watch for special case help request + if (strcmp(argV[1], "-?") == 0) + { + usage(); + return 0; + } + + // Assume the argument is a file name + xmlFile = argV[1]; + + // + // Create a SAX validating parser object. + // + SAXParser parser; + parser.setDoValidation(TRUE); + + // Create a compound dictionary, where the results will be stored. + // The size of the dictionary is 1009 entries (should be a prime number) + CompoundSDict compounds(1009); + + // + // Create the handler object and install it as the document and error + // handler for the parser. + // + SaxPass1Handlers handler(&compounds); + parser.setDocumentHandler(&handler); + parser.setErrorHandler(&handler); + + // Parse the file and catch any exceptions that propogate out + try + { + parser.parse(xmlFile); + } + catch (const XMLException& toCatch) + { + cerr << "\nFile not found: '" << xmlFile << "'\n" + << "Exception message is: \n" + << StrX(toCatch.getMessage()) + << "\n" << endl; + return -1; + } + + // Show the class hierarchy that we extracted + showCompoundHierarchy(&compounds); + + return 0; +} + |