Fawkes API  Fawkes Development Version
main.cpp
00001  
00002 /***************************************************************************
00003  *  main.cpp - Interface generator main app
00004  *
00005  *  Generated: Tue Oct 10 17:42:05 2006
00006  *  Copyright  2006  Tim Niemueller [www.niemueller.de]
00007  *
00008  ****************************************************************************/
00009 
00010 /*  This program is free software; you can redistribute it and/or modify
00011  *  it under the terms of the GNU General Public License as published by
00012  *  the Free Software Foundation; either version 2 of the License, or
00013  *  (at your option) any later version.
00014  *
00015  *  This program is distributed in the hope that it will be useful,
00016  *  but WITHOUT ANY WARRANTY; without even the implied warranty of
00017  *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
00018  *  GNU Library General Public License for more details.
00019  *
00020  *  Read the full text in the LICENSE.GPL file in the doc directory.
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   int rv = 0;
00043   ArgumentParser *argp = new ArgumentParser(argc, argv, "hd:v");
00044 
00045   const vector<const char *> & items = argp->items();
00046   if ( items.size() == 0 || argp->has_arg("h") ) {
00047   cout << "Fawkes Interface generator - Usage Instructions" << endl
00048        << "===============================================================================" << endl
00049        << "Usage: " << argv[0] << " [-h] [-d dir] [-v] config.xml [config2.xml...]" << endl
00050        << "where [options] is one or more of:" << endl
00051        << " -h        These help instructions" << endl
00052        << " -d dir    Directory where to write generated files" << endl
00053        << " -v        Verbose console output." << endl
00054        << endl;
00055   } else {
00056     string dir = ".";
00057     if ( argp->has_arg("d") ) {
00058       dir = argp->arg("d");
00059     }
00060 
00061     for ( vector<const char *>::const_iterator i = items.begin(); i != items.end(); ++i) {
00062       string s = *i;
00063       string prefix;
00064       size_t pos;
00065 
00066       if ( ( pos = s.find_last_of (".")) != string::npos ) {
00067         prefix = s.substr(0, pos);
00068       } else {
00069         prefix = s;
00070       }
00071       s = prefix;
00072       if ( ( pos = s.find_last_of ("/")) != string::npos ) {
00073         prefix = s.substr(pos + 1);
00074       } else {
00075         prefix = s;
00076       }
00077 
00078       if ( ! File::exists( *i ) ) {
00079         cout << "File " << *i << " does not exist" << endl;
00080         continue;
00081       } else if (! File::is_regular( *i ) ) {
00082         cout << *i << " is not a regular file" << endl;
00083         continue;
00084       }
00085 
00086       try {
00087         InterfaceParser    *iparse = new InterfaceParser(*i);
00088         iparse->parse();
00089         if ( argp->has_arg("v") ) {
00090           iparse->print();
00091         }
00092         
00093         InterfaceDigest    *idigest = new InterfaceDigest(*i);
00094 
00095         CppInterfaceGenerator *cppigen = new CppInterfaceGenerator(dir,
00096                                                                    iparse->getInterfaceName(),
00097                                                                    prefix,
00098                                                                    iparse->getInterfaceAuthor(),
00099                                                                    iparse->getInterfaceYear(),
00100                                                                    iparse->getInterfaceCreationDate(),
00101                                                                    iparse->getDataComment(),
00102                                                                    idigest->get_hash(),
00103                                                                    idigest->get_hash_size(),
00104                                                                    iparse->getConstants(),
00105                                                                    iparse->getEnumConstants(),
00106                                                                    iparse->getDataFields(),
00107                                                                    iparse->getPseudoMaps(),
00108                                                                    iparse->getMessages()
00109                                                                    );
00110 
00111         ToLuaInterfaceGenerator *toluaigen = new ToLuaInterfaceGenerator(dir,
00112                                                                          iparse->getInterfaceName(),
00113                                                                          prefix,
00114                                                                          iparse->getInterfaceAuthor(),
00115                                                                          iparse->getInterfaceYear(),
00116                                                                          iparse->getInterfaceCreationDate(),
00117                                                                          iparse->getDataComment(),
00118                                                                          idigest->get_hash(),
00119                                                                          idigest->get_hash_size(),
00120                                                                          iparse->getConstants(),
00121                                                                          iparse->getEnumConstants(),
00122                                                                          iparse->getDataFields(),
00123                                                                          iparse->getPseudoMaps(),
00124                                                                          iparse->getMessages()
00125                                                                          );
00126 
00127         cppigen->generate();
00128         toluaigen->generate();
00129 
00130         delete cppigen;
00131         delete toluaigen;
00132 
00133         delete iparse;
00134         delete idigest;
00135       } catch (Exception &e) {
00136         cout << "Generating the interface failed." << endl;
00137         e.print_trace();
00138         rv = -1;
00139       }
00140     }
00141   }
00142 
00143   delete argp;
00144 
00145   return rv;
00146 }