00001 #include <string> 00002 #include <list> 00003 #include <ctype.h> 00004 00005 #include <boost/filesystem/path.hpp> 00006 00007 namespace utilmm { 00008 typedef std::list<std::string> stringlist; 00009 00010 inline stringlist split(std::string const& s, std::string const& sep = " ", bool ignore_empty = true) 00011 { 00012 using std::string; 00013 00014 stringlist l; 00015 string::size_type sep_length = sep.length(); 00016 00017 string::size_type from = 0; 00018 for(;;) 00019 { 00020 string::size_type to = s.find(sep, from); 00021 if (to == string::npos) 00022 { 00023 if (from < s.length() || !ignore_empty) 00024 l.push_back(string(s, from)); 00025 return l; 00026 } 00027 00028 if (to > from || !ignore_empty) 00029 l.push_back(string(s, from, to - from)); 00030 from = to + sep_length; 00031 } 00032 } 00033 00034 inline std::string join(stringlist const& l, std::string const& sep = " ") 00035 { 00036 using std::string; 00037 00038 if (l.empty()) 00039 return ""; 00040 00041 string s = l.front(); 00042 00043 stringlist::const_iterator const end = l.end(); 00044 stringlist::const_iterator it = l.begin(); 00045 for (++it; it != l.end(); ++it) 00046 s += sep + *it; 00047 return s; 00048 } 00049 00050 inline std::string upcase(std::string const& s) 00051 { 00052 using std::string; 00053 string ret(s); 00054 string::iterator it, end = ret.end(); 00055 for (it = ret.begin(); it != ret.end(); ++it) 00056 *it = toupper(*it); 00057 00058 return ret; 00059 } 00060 00061 inline bool starts_with(std::string const& str, std::string const& start) 00062 { return std::string(str, 0, start.length()) == start; } 00063 00064 inline boost::filesystem::path clean_path(std::string str) 00065 { 00066 using std::string; 00067 string::size_type i = str.find("//"); 00068 while (i < str.length()) 00069 { 00070 str = str.erase(i, 1); 00071 i = str.find("//"); 00072 } 00073 00074 boost::filesystem::path p(str); 00075 return p.normalize(); 00076 } 00077 } 00078 00079