/** * @file string_manip.cpp * std::string helpers * * @remark Copyright 2002 OProfile authors * @remark Read the file COPYING * * @author Philippe Elie * @author John Levon */ #include <sstream> #include <iomanip> #include <cstdlib> #include <cmath> #include "string_manip.h" using namespace std; string erase_to_last_of(string const & str, char ch) { string result = str; string::size_type pos = result.find_last_of(ch); if (pos != string::npos) result.erase(0, pos + 1); return result; } string split(string & s, char c) { string::size_type i = s.find_first_of(c); if (i == string::npos) return string(); string const tail = s.substr(i + 1); s = s.substr(0, i); return tail; } bool is_prefix(string const & s, string const & prefix) { // gcc 2.95 and below don't have this // return s.compare(0, prefix.length(), prefix) == 0; return s.find(prefix) == 0; } vector<string> separate_token(string const & str, char sep) { vector<string> result; string next; for (size_t pos = 0 ; pos != str.length() ; ++pos) { char ch = str[pos]; if (ch == '\\') { if (pos < str.length() - 1 && str[pos + 1] == sep) { ++pos; next += sep; } else { next += '\\'; } } else if (ch == sep) { result.push_back(next); // some stl lacks string::clear() next.erase(next.begin(), next.end()); } else { next += ch; } } if (!next.empty()) result.push_back(next); return result; } string ltrim(string const & str, string const & totrim) { string result(str); return result.erase(0, result.find_first_not_of(totrim)); } string rtrim(string const & str, string const & totrim) { string result(str); return result.erase(result.find_last_not_of(totrim) + 1); } string trim(string const & str, string const & totrim) { return rtrim(ltrim(str, totrim), totrim); } string const format_percent(double value, size_t int_width, size_t fract_width, bool showpos) { ostringstream os; if (value == 0.0) return string(int_width + fract_width, ' ') + "0"; if (showpos) os.setf(ios::showpos); if (fabs(value) > .001) { // os << fixed << value unsupported by gcc 2.95 os.setf(ios::fixed, ios::floatfield); os << setw(int_width + fract_width + 1) << setprecision(fract_width) << value; } else { // os << scientific << value unsupported by gcc 2.95 os.setf(ios::scientific, ios::floatfield); os << setw(int_width + fract_width + 1) // - 3 to count exponent part << setprecision(fract_width - 3) << value; } string formatted = os.str(); if (is_prefix(formatted, "100.")) formatted.erase(formatted.size() - 1); return formatted; } template <> unsigned int op_lexical_cast<unsigned int, string>(string const & str) { char* endptr; // 2.91.66 fix unsigned long ret = 0; ret = strtoul(str.c_str(), &endptr, 0); if (*endptr) throw invalid_argument("op_lexical_cast(\""+ str +"\")"); return ret; }