genom.cc
Go to the documentation of this file.
00001 #include "genom.hh"
00002 
00003 #include <iostream>
00004 
00005 #include "genommodule.hh"
00006 #include "preprocess.hh"
00007 
00008 #include "configset.hh"
00009 
00010 #include <boost/tokenizer.hpp>
00011 
00012 using namespace std;
00013 using namespace boost;
00014 using Typelib::Registry;
00015 
00016 GenomPlugin::GenomPlugin()
00017     : Plugin("genom", "import") {}
00018 
00019 list<string> GenomPlugin::getOptions() const
00020 {
00021     static const char* arguments[] = 
00022     { ":include,I=string:include search path" };
00023     return list<string>(arguments, arguments + 1);
00024 }
00025 
00026 bool GenomPlugin::apply(const OptionList& remaining, const ConfigSet& options, Registry* registry)
00027 {
00028     if (remaining.empty())
00029     {
00030         cerr << "No file found on command line. Aborting" << endl;
00031         return false;
00032     }
00033 
00034     list<string> cppargs;
00035     
00036     string includes = options.getString("include");
00037     if (! includes.empty())
00038     {
00039         // split at ':'
00040         
00041         typedef tokenizer< char_separator<char> >  Splitter;
00042         Splitter splitter(includes, char_separator<char> (":"));
00043         for (Splitter::const_iterator it = splitter.begin(); it != splitter.end(); ++it)
00044             cppargs.push_back("-I" + *it);
00045     }
00046 
00047     string file   = remaining.front();
00048     string i_file = preprocess(file, cppargs);
00049     if (i_file.empty())
00050     {
00051         cerr << "Could not preprocess " << file << ", aborting" << endl;
00052         return false;
00053     }
00054 
00055 
00056     try
00057     {
00058         GenomModule reader(registry);
00059         int old_count = registry -> getCount();
00060 
00061         reader.read(i_file);
00062         cout << "Found " << registry -> getCount() - old_count << " types in " << file << endl;
00063         return true;
00064     }
00065     catch(Typelib::RegistryException& e)
00066     {
00067         cerr << "Error in type management: " << e.toString() << endl;
00068         return false;
00069     }
00070     catch(std::exception& e)
00071     {
00072         cerr << "Error parsing file " << file << ":\n\t"
00073             << typeid(e).name() << endl;
00074         return false;
00075     }
00076 }
00077 


typelib
Author(s): Sylvain Joyeux/sylvain.joyeux@m4x.org
autogenerated on Thu Jan 2 2014 11:38:41