00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023 #include <interfaces/generator/cpp_generator.h>
00024 #include <interfaces/generator/tolua_generator.h>
00025 #include <interfaces/generator/parser.h>
00026 #include <interfaces/generator/digest.h>
00027 #include <interfaces/generator/exceptions.h>
00028
00029 #include <utils/system/argparser.h>
00030 #include <utils/system/file.h>
00031
00032 #include <iostream>
00033 #include <vector>
00034 #include <string>
00035
00036 using namespace std;
00037 using namespace fawkes;
00038
00039 int
00040 main(int argc, char **argv)
00041 {
00042 ArgumentParser *argp = new ArgumentParser(argc, argv, "hd:v");
00043
00044 const vector<const char *> & items = argp->items();
00045 if ( items.size() == 0 || argp->has_arg("h") ) {
00046 cout << "Fawkes Interface generator - Usage Instructions" << endl
00047 << "===============================================================================" << endl
00048 << "Usage: " << argv[0] << " [-h] [-d dir] [-v] config.xml [config2.xml...]" << endl
00049 << "where [options] is one or more of:" << endl
00050 << " -h These help instructions" << endl
00051 << " -d dir Directory where to write generated files" << endl
00052 << " -v Verbose console output." << endl
00053 << endl;
00054 } else {
00055 string dir = ".";
00056 if ( argp->has_arg("d") ) {
00057 dir = argp->arg("d");
00058 }
00059
00060 for ( vector<const char *>::const_iterator i = items.begin(); i != items.end(); ++i) {
00061 string s = *i;
00062 string prefix;
00063 size_t pos;
00064
00065 if ( ( pos = s.find_last_of (".")) != string::npos ) {
00066 prefix = s.substr(0, pos);
00067 } else {
00068 prefix = s;
00069 }
00070 s = prefix;
00071 if ( ( pos = s.find_last_of ("/")) != string::npos ) {
00072 prefix = s.substr(pos + 1);
00073 } else {
00074 prefix = s;
00075 }
00076
00077 if ( ! File::exists( *i ) ) {
00078 cout << "File " << *i << " does not exist" << endl;
00079 continue;
00080 } else if (! File::is_regular( *i ) ) {
00081 cout << *i << " is not a regular file" << endl;
00082 continue;
00083 }
00084
00085 try {
00086 InterfaceParser *iparse = new InterfaceParser(*i);
00087 iparse->parse();
00088 if ( argp->has_arg("v") ) {
00089 iparse->print();
00090 }
00091
00092 InterfaceDigest *idigest = new InterfaceDigest(*i);
00093
00094 CppInterfaceGenerator *cppigen = new CppInterfaceGenerator(dir,
00095 iparse->getInterfaceName(),
00096 prefix,
00097 iparse->getInterfaceAuthor(),
00098 iparse->getInterfaceYear(),
00099 iparse->getInterfaceCreationDate(),
00100 iparse->getDataComment(),
00101 idigest->get_hash(),
00102 idigest->get_hash_size(),
00103 iparse->getConstants(),
00104 iparse->getEnumConstants(),
00105 iparse->getDataFields(),
00106 iparse->getPseudoMaps(),
00107 iparse->getMessages()
00108 );
00109
00110 ToLuaInterfaceGenerator *toluaigen = new ToLuaInterfaceGenerator(dir,
00111 iparse->getInterfaceName(),
00112 prefix,
00113 iparse->getInterfaceAuthor(),
00114 iparse->getInterfaceYear(),
00115 iparse->getInterfaceCreationDate(),
00116 iparse->getDataComment(),
00117 idigest->get_hash(),
00118 idigest->get_hash_size(),
00119 iparse->getConstants(),
00120 iparse->getEnumConstants(),
00121 iparse->getDataFields(),
00122 iparse->getPseudoMaps(),
00123 iparse->getMessages()
00124 );
00125
00126 cppigen->generate();
00127 toluaigen->generate();
00128
00129 delete cppigen;
00130 delete toluaigen;
00131
00132 delete iparse;
00133 delete idigest;
00134 } catch (Exception &e) {
00135 cout << "Generating the interface failed." << endl;
00136 e.print_trace();
00137 }
00138 }
00139 }
00140
00141 delete argp;
00142 }