#include <QString>
+#include <cmath>
#include <cstdio>
#include <cstring>
#include <algorithm>
+#include <iomanip>
+#include <sstream>
#include <typeinfo>
using namespace std;
}
+int count_bin_chars(string const & str)
+{
+ QString const qstr = toqstr(str).simplified();
+ int count = 0;
+ QString::const_iterator cit = qstr.begin();
+ QString::const_iterator end = qstr.end();
+ for (; cit != end; ++cit) {
+ switch (cit->category()) {
+ case QChar::Separator_Line:
+ case QChar::Separator_Paragraph:
+ case QChar::Other_Control:
+ case QChar::Other_Format:
+ case QChar::Other_Surrogate:
+ case QChar::Other_PrivateUse:
+ case QChar::Other_NotAssigned:
+ ++count;
+ break;
+ default:
+ break;
+ }
+ }
+ return count;
+}
+
+
docstring const trim(docstring const & a, char const * p)
{
LASSERT(p, return a);
size_t i = a.find(delim);
if (i == a.length() - 1) {
piece = a.substr(0, i);
- } else if (i != String::npos) {
- piece = a.substr(0, i);
- tmp = a.substr(i + 1);
} else if (i == 0) {
piece.erase();
tmp = a.substr(i + 1);
+ } else if (i != String::npos) {
+ piece = a.substr(0, i);
+ tmp = a.substr(i + 1);
} else {
piece = a;
}
return tmp;
}
+
+// FIXME: why is this specialization needed?
template<typename Char> inline
docstring const doSplit(docstring const & a, docstring & piece, Char delim)
{
size_t i = a.find(delim);
if (i == a.length() - 1) {
piece = a.substr(0, i);
- } else if (i != docstring::npos) {
- piece = a.substr(0, i);
- tmp = a.substr(i + 1);
} else if (i == 0) {
piece.erase();
tmp = a.substr(i + 1);
+ } else if (i != docstring::npos) {
+ piece = a.substr(0, i);
+ tmp = a.substr(i + 1);
} else {
piece = a;
}
}
+#ifdef _MSC_VER
+// Replacement for C99 function lround()
+double round(double x)
+{
+ if (x < 0)
+ return ceil(x - 0.5);
+ else
+ return floor(x + 0.5);
+}
+#endif
+
+
+std::string formatFPNumber(double x)
+{
+ // Need manual tweaking, QString::number(x, 'f', 16) does not work either
+ ostringstream os;
+ os << std::fixed;
+ // Prevent outputs of 23.4200000000000017 but output small numbers
+ // with at least 6 significant digits.
+ double const logarithm = log10(fabs(x));
+ os << std::setprecision(max(6 - static_cast<int>(round(logarithm)), 0)) << x;
+ string result = os.str();
+ if (result.find('.') != string::npos) {
+ result = rtrim(result, "0");
+ if (result[result.length()-1] == '.')
+ result = rtrim(result, ".");
+ }
+ return result;
+}
+
+
template<>
docstring bformat(docstring const & fmt, int arg1)
{
LATTEST(contains(fmt, from_ascii("%1$s")));
LATTEST(contains(fmt, from_ascii("%2$s")));
docstring str = subst(fmt, from_ascii("%1$s"), from_ascii(arg1));
- str = subst(fmt, from_ascii("%2$s"), arg2);
+ str = subst(str, from_ascii("%2$s"), arg2);
return subst(str, from_ascii("%%"), from_ascii("%"));
}