Go to the documentation of this file.00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028 #include <string>
00029 #include <vector>
00030 #include <boost/algorithm/string.hpp>
00031 #include <boost/tr1/unordered_set.hpp>
00032
00033 namespace rospack
00034 {
00035
00036 void
00037 deduplicate_tokens(const std::string& instring,
00038 bool last,
00039 std::string& outstring)
00040 {
00041 std::vector<std::string> vec;
00042 std::tr1::unordered_set<std::string> set;
00043 boost::split(vec, instring,
00044 boost::is_any_of("\t "),
00045 boost::token_compress_on);
00046 if(last)
00047 std::reverse(vec.begin(), vec.end());
00048 std::vector<std::string> vec_out;
00049 for(std::vector<std::string>::const_iterator it = vec.begin();
00050 it != vec.end();
00051 ++it)
00052 {
00053 if(set.find(*it) == set.end())
00054 {
00055 vec_out.push_back(*it);
00056 set.insert(*it);
00057 }
00058 }
00059 if(last)
00060 std::reverse(vec_out.begin(), vec_out.end());
00061 for(std::vector<std::string>::const_iterator it = vec_out.begin();
00062 it != vec_out.end();
00063 ++it)
00064 {
00065 if(it == vec_out.begin())
00066 outstring.append(*it);
00067 else
00068 outstring.append(std::string(" ") + *it);
00069 }
00070 }
00071
00072 void
00073 parse_compiler_flags(const std::string& instring,
00074 const std::string& token,
00075 bool select,
00076 bool last,
00077 std::string& outstring)
00078 {
00079 std::string intermediate;
00080 std::vector<std::string> result_vec;
00081 boost::split(result_vec, instring,
00082 boost::is_any_of("\t "),
00083 boost::token_compress_on);
00084 for(std::vector<std::string>::const_iterator it = result_vec.begin();
00085 it != result_vec.end();
00086 ++it)
00087 {
00088
00089 if(it->size() > token.size() && it->substr(0,token.size()) == token)
00090 {
00091 if(select)
00092 {
00093 if(intermediate.size())
00094 intermediate.append(" ");
00095 intermediate.append(it->substr(token.size()));
00096 }
00097 }
00098
00099 else if((*it) == token)
00100 {
00101 std::vector<std::string>::const_iterator iit = it;
00102 if(++iit != result_vec.end())
00103 {
00104 if(it->size() >= token.size() && it->substr(0,token.size()) == token)
00105 {
00106
00107 }
00108 else
00109 {
00110 if(select)
00111 {
00112 if(intermediate.size())
00113 intermediate.append(" ");
00114 intermediate.append((*iit));
00115 }
00116 it = iit;
00117 }
00118 }
00119 }
00120
00121 else if(it->size() > 2 &&
00122 (*it)[0] == '/' &&
00123 it->substr(it->size()-2) == ".a")
00124 {
00125 if(select)
00126 {
00127 if(intermediate.size())
00128 intermediate.append(" ");
00129 intermediate.append((*it));
00130 }
00131 }
00132 else if(!select)
00133 {
00134 if(intermediate.size())
00135 intermediate.append(" ");
00136 intermediate.append((*it));
00137 }
00138 }
00139 if(select)
00140 deduplicate_tokens(intermediate, last, outstring);
00141 else
00142 outstring = intermediate;
00143 }
00144
00145 }
00146