/**
* @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;
}