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   ArgumentParser *argp = new ArgumentParser(argc, argv, "d:v");
00043
00044   const vector<const char *> & items = argp->items();
00045   if ( items.size() == 0 ) {
00046     cout << "Usage: " << argv[0] << " [-d dir] config.xml [config2.xml...]" << endl << endl;
00047   } else {
00048     string dir = ".";
00049     if ( argp->has_arg("d") ) {
00050       dir = argp->arg("d");
00051     }
00052
00053     for ( vector<const char *>::const_iterator i = items.begin(); i != items.end(); ++i) {
00054       string s = *i;
00055       string prefix;
00056       size_t pos;
00057
00058       if ( ( pos = s.find_last_of (".")) != string::npos ) {
00059         prefix = s.substr(0, pos);
00060       } else {
00061         prefix = s;
00062       }
00063       s = prefix;
00064       if ( ( pos = s.find_last_of ("/")) != string::npos ) {
00065         prefix = s.substr(pos + 1);
00066       } else {
00067         prefix = s;
00068       }
00069
00070       if ( ! File::exists( *i ) ) {
00071         cout << "File " << *i << " does not exist" << endl;
00072         continue;
00073       } else if (! File::is_regular( *i ) ) {
00074         cout << *i << " is not a regular file" << endl;
00075         continue;
00076       }
00077
00078       try {
00079         InterfaceParser    *iparse = new InterfaceParser(*i);
00080         iparse->parse();
00081         if ( argp->has_arg("v") ) {
00082           iparse->print();
00083         }
00084
00085         InterfaceDigest    *idigest = new InterfaceDigest(*i);
00086
00087         CppInterfaceGenerator *cppigen = new CppInterfaceGenerator(dir,
00088                                                                    iparse->getInterfaceName(),
00089                                                                    prefix,
00090                                                                    iparse->getInterfaceAuthor(),
00091                                                                    iparse->getInterfaceYear(),
00092                                                                    iparse->getInterfaceCreationDate(),
00093                                                                    iparse->getDataComment(),
00094                                                                    idigest->get_hash(),
00095                                                                    idigest->get_hash_size(),
00096                                                                    iparse->getConstants(),
00097                                                                    iparse->getEnumConstants(),
00098                                                                    iparse->getDataFields(),
00099                                                                    iparse->getPseudoMaps(),
00100                                                                    iparse->getMessages()
00101                                                                    );
00102
00103         ToLuaInterfaceGenerator *toluaigen = new ToLuaInterfaceGenerator(dir,
00104                                                                          iparse->getInterfaceName(),
00105                                                                          prefix,
00106                                                                          iparse->getInterfaceAuthor(),
00107                                                                          iparse->getInterfaceYear(),
00108                                                                          iparse->getInterfaceCreationDate(),
00109                                                                          iparse->getDataComment(),
00110                                                                          idigest->get_hash(),
00111                                                                          idigest->get_hash_size(),
00112                                                                          iparse->getConstants(),
00113                                                                          iparse->getEnumConstants(),
00114                                                                          iparse->getDataFields(),
00115                                                                          iparse->getPseudoMaps(),
00116                                                                          iparse->getMessages()
00117                                                                          );
00118
00119         cppigen->generate();
00120         toluaigen->generate();
00121
00122         delete cppigen;
00123         delete toluaigen;
00124
00125         delete iparse;
00126         delete idigest;
00127       } catch (Exception &e) {
00128         cout << "Generating the interface failed." << endl;
00129         e.print_trace();
00130       }
00131     }
00132   }
00133
00134   delete argp;
00135 }