utils.cpp
Go to the documentation of this file.
00001 /*
00002  * Copyright (C) 2008, Willow Garage, Inc.
00003  * 
00004  * Redistribution and use in source and binary forms, with or without
00005  * modification, are permitted provided that the following conditions are met:
00006  *   * Redistributions of source code must retain the above copyright notice,
00007  *     this list of conditions and the following disclaimer.
00008  *   * Redistributions in binary form must reproduce the above copyright
00009  *     notice, this list of conditions and the following disclaimer in the
00010  *     documentation and/or other materials provided with the distribution.
00011  *   * Neither the names of Stanford University or Willow Garage, Inc. nor the names of its
00012  *     contributors may be used to endorse or promote products derived from
00013  *     this software without specific prior written permission.
00014  *
00015  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
00016  * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
00017  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
00018  * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
00019  * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
00020  * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
00021  * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
00022  * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
00023  * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
00024  * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
00025  * POSSIBILITY OF SUCH DAMAGE.
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     // Combined into one arg
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     // Space-separated
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           // skip it
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     // Special case: if we're told to look for -l, then also find *.a
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 


rospack
Author(s): Brian Gerkey/gerkey@willowgarage.com, Morgan Quigley/mquigley@cs.stanford.edu
autogenerated on Fri Jan 3 2014 11:51:40