$search
00001 #include "utilmm/configfile/shell_expand.hh" 00002 00003 #include <boost/regex.hpp> 00004 #include <iterator> 00005 #include <sstream> 00006 00007 using namespace std; 00008 using boost::regex; 00009 using boost::smatch; 00010 00011 00012 #include <iostream> 00013 00014 string utilmm::shell_expand(string const& text) 00015 { 00016 static regex const 00017 rx_shellvalue("\\$(\\w+)"); 00018 00019 smatch result; 00020 if (! regex_search(text, result, rx_shellvalue)) 00021 return text; 00022 00023 string::const_iterator last_match; 00024 string::const_iterator const end = text.end(); 00025 00026 ostringstream expanded; 00027 do 00028 { 00029 expanded << result.prefix(); 00030 00031 std::string env_key = result[1]; 00032 char const* env_value = getenv(env_key.c_str()); 00033 if (env_value) 00034 expanded << env_value; 00035 00036 last_match = result.suffix().first; 00037 } while(regex_search(last_match, end, result, rx_shellvalue)); 00038 00039 copy(last_match, end, ostream_iterator<string::value_type>(expanded)); 00040 return expanded.str(); 00041 } 00042