00001
00002
00003
00004
00005
00006
00007
00008
00009 #include <iostream>
00010 #include <fstream>
00011
00012
00013
00014 #include <boost/filesystem/operations.hpp>
00015 #include <boost/tokenizer.hpp>
00016 #include <boost/regex.hpp>
00017 #include <boost/algorithm/string.hpp>
00018 #include <boost/format.hpp>
00019
00020
00021
00022 #include "ParserUtils.h"
00023 #include "ParserGrammar.h"
00024
00025 namespace fs = boost::filesystem;
00026 using namespace std;
00027
00028
00039
00040 StatusCode Gaudi::Parsers::parse
00041 ( Gaudi::Parsers::Parser parser ,
00042 const std::string& fileName ,
00043 std::vector<Gaudi::Parsers::Message>& msgs )
00044 {
00045 StatusCode res = parser.parse(fileName);
00046 msgs = parser.messages();
00047 return res;
00048 }
00049
00050 StatusCode Gaudi::Parsers::parse
00051 ( const string& filename,
00052 const vector<string>& searchPath,
00053 Gaudi::Parsers::Catalogue& catalogue,
00054 std::vector<std::string>& included,
00055 vector<Gaudi::Parsers::Message>& msgs)
00056 {
00057 return parse
00058 ( Gaudi::Parsers::Parser(catalogue, included, searchPath) ,
00059 filename , msgs ) ;
00060 }
00061
00062 StatusCode Gaudi::Parsers::parse
00063 ( const string& filename,
00064 const string& searchPath,
00065 Gaudi::Parsers::Catalogue& catalogue,
00066 std::vector<std::string>& included,
00067 vector<Gaudi::Parsers::Message>& msgs)
00068 {
00069 return parse
00070 ( Gaudi::Parsers::Parser (catalogue , included, searchPath ) ,
00071 filename , msgs ) ;
00072 }
00073
00074 StatusCode Gaudi::Parsers::parse
00075 ( const string& filename,
00076 Gaudi::Parsers::Catalogue& catalogue,
00077 std::vector<std::string>& included,
00078 vector<Gaudi::Parsers::Message>& msgs){
00079 return parse
00080 (Gaudi::Parsers::Parser(catalogue,included),filename,msgs);
00081 }
00082
00083 StatusCode Gaudi::Parsers::Utils::getEnv
00084 ( const std::string& envName , std::string& envValue )
00085 {
00086 char* envch = getenv(envName.c_str());
00087 if(envch==NULL) { return StatusCode::FAILURE; }
00088 envValue = envch;
00089 return StatusCode::SUCCESS;
00090 }
00091
00092 std::string
00093 Gaudi::Parsers::Utils::removeEnvironment(const std::string& input){
00094 std::string result=input;
00095
00096 const char* re = "\\$(([A-Za-z0-9_]+)|\\(([A-Za-z0-9_]+)\\))";
00097 std::string::const_iterator start, end;
00098 boost::regex expression(re);
00099 start = input.begin();
00100 end = input.end();
00101 boost::match_results<std::string::const_iterator> what;
00102 boost::match_flag_type flags = boost::match_default;
00103 while ( boost::regex_search(start, end, what, expression, flags ) )
00104 {
00105 std::string var,env;
00106 std::string matched(what[0].first,what[0].second);
00107 std::string v1(what[2].first,what[2].second);
00108 std::string v2(what[3].first,what[3].second);
00109
00110 if ( v1.length()>0){ var = v1; }
00111 else { var = v2; }
00112
00113 StatusCode ok = getEnv(var, env);
00114 if(ok.isSuccess())
00115 { boost::algorithm::replace_first(result,matched, env); }
00116 start = what[0].second;
00117
00118 flags |= boost::match_prev_avail;
00119 flags |= boost::match_not_bob;
00120 }
00121 return result;
00122 }
00123
00124 StatusCode Gaudi::Parsers::Utils::searchFile
00125 ( const std::string& fileInput ,
00126 bool addCurrent ,
00127 const std::vector<std::string>& dirs ,
00128 std::string& fileOutput )
00129 {
00130 std::string result;
00131 try {
00132 fs::path givenPath(removeEnvironment(fileInput),fs::native);
00133
00134 fs::path currentPath = givenPath;
00135 std::vector<std::string> sdirs = dirs;
00136 if(addCurrent){
00137 sdirs.insert(sdirs.begin(),
00138 fs::initial_path().native_directory_string());
00139 }
00140 std::vector<std::string>::const_iterator current =
00141 sdirs.begin(),end=sdirs.end();
00142 while(1) {
00143 if(fs::exists(currentPath)) {
00144 fileOutput = currentPath.native_directory_string();
00145 return StatusCode::SUCCESS;
00146 }
00147 if(current!=end) {
00148 std::string _n = *current;
00149 currentPath = fs::path(_n, fs::native)/givenPath;
00150 }else{
00151 return StatusCode::FAILURE;
00152 }
00153 ++current;
00154 }
00155 }catch(...) {}
00156 return StatusCode::FAILURE;
00157 }
00158
00159 StatusCode Gaudi::Parsers::Utils::readFile
00160 (const std::string& name , std::string& result)
00161 {
00162 std::ifstream in(name.c_str());
00163 if (!in.is_open()) { return StatusCode::FAILURE; }
00164 char c;
00165 while (!in.get(c).eof()) { result += c; }
00166 return StatusCode::SUCCESS;
00167 }
00168
00169 bool Gaudi::Parsers::Utils::isWin()
00170 {
00171 #ifdef _WIN32
00172 return true;
00173 #else
00174 return false;
00175 #endif
00176 }
00177
00178 std::string Gaudi::Parsers::Utils::pathSeparator()
00179 { return Gaudi::Parsers::Utils::isWin()?";":":"; }
00180
00181 std::vector<std::string> Gaudi::Parsers::Utils::extractPath
00182 ( const std::string& input, bool removeEnv )
00183 {
00184 std::string in = removeEnv?removeEnvironment(input):input;
00185 std::string separator = ","+pathSeparator();
00186 typedef boost::tokenizer<boost::char_separator<char> > Tokenizer;
00187 std::vector<std::string> result;
00188 Tokenizer tok(in, boost::char_separator<char>(separator.c_str()));
00189 Tokenizer::iterator it =tok.begin();
00190 while(it!=tok.end())
00191 {
00192 if(it->length()>0){ result.push_back(*it); }
00193 it++;
00194 }
00195 return result;
00196 }
00197
00198 StatusCode Gaudi::Parsers::Utils::parseValue
00199 ( const string& input ,
00200 std::string& stringResult ,
00201 std::vector<std::string>& vectorResult )
00202 {
00203
00204 typedef
00205 boost::spirit::position_iterator<std::string::const_iterator> IteratorT;
00206
00207 Gaudi::Parsers::ValueGrammar grValue;
00208 Gaudi::Parsers::SkipperGrammar grSkipper;
00209 IteratorT beginpos(input.begin(), input.end(), "");
00210 IteratorT endpos;
00211 boost::tuple<std::string, std::vector<std::string> > result;
00212 boost::spirit::parse_info<IteratorT> info =
00213 boost::spirit::parse
00214 (beginpos, endpos, grValue[var(result)=arg1] ,grSkipper);
00215 if (!info.full){ return StatusCode::FAILURE; }
00216 stringResult = result.get<0>();
00217 vectorResult = result.get<1>();
00218 return StatusCode::SUCCESS;
00219 }
00220
00221
00222
00223
00224
00225