X-Git-Url: https://git.mxchange.org/?a=blobdiff_plain;f=simgear%2Fmisc%2Fstrutils.cxx;h=8bd33b7f507686233140ce7e68ab8a17cf52767b;hb=e4e31be7d43569a92a5d9fa7e784381b66cbd95a;hp=e836a3c44cdbb327e9b239b2c3b8c739c09f1ddb;hpb=bac2ef601d44c419ce802466c849a3f0aec39f1b;p=simgear.git diff --git a/simgear/misc/strutils.cxx b/simgear/misc/strutils.cxx index e836a3c4..8bd33b7f 100644 --- a/simgear/misc/strutils.cxx +++ b/simgear/misc/strutils.cxx @@ -22,13 +22,13 @@ #include #include +#include #include "strutils.hxx" -#include // for convertToLowerCase - using std::string; using std::vector; +using std::stringstream; namespace simgear { namespace strutils { @@ -133,10 +133,9 @@ namespace simgear { static string do_strip( const string& s, int striptype ) { - // if (s.empty()) - // return s; - string::size_type len = s.length(); + if( len == 0 ) // empty string is trivial + return s; string::size_type i = 0; if (striptype != RIGHTSTRIP) { @@ -185,12 +184,81 @@ namespace simgear { return do_strip( s, BOTHSTRIP ); } - string convertToLowerCase(const string& str) - { - // proxy onto osgDB - easy to reimplement here, but let's avoid - // code duplication for the moment. - return osgDB::convertToLowerCase(str); - } + string + rpad( const string & s, string::size_type length, char c ) + { + string::size_type l = s.length(); + if( l >= length ) return s; + string reply = s; + return reply.append( length-l, c ); + } + + string + lpad( const string & s, size_t length, char c ) + { + string::size_type l = s.length(); + if( l >= length ) return s; + string reply = s; + return reply.insert( 0, length-l, c ); + } + + bool + starts_with( const string & s, const string & substr ) + { + return s.find( substr ) == 0; + } + + bool + ends_with( const string & s, const string & substr ) + { + size_t n = s.rfind( substr ); + return (n != string::npos) && (n == s.length() - substr.length()); + } + string simplify(const string& s) + { + string result; // reserve size of 's'? + string::const_iterator it = s.begin(), + end = s.end(); + + // advance to first non-space char - simplifes logic in main loop, + // since we can always prepend a single space when we see a + // space -> non-space transition + for (; (it != end) && isspace(*it); ++it) { /* nothing */ } + + bool lastWasSpace = false; + for (; it != end; ++it) { + char c = *it; + if (isspace(c)) { + lastWasSpace = true; + continue; + } + + if (lastWasSpace) { + result.push_back(' '); + } + + lastWasSpace = false; + result.push_back(c); + } + + return result; + } + + int to_int(const std::string& s, int base) + { + stringstream ss(s); + switch (base) { + case 8: ss >> std::oct; break; + case 16: ss >> std::hex; break; + default: break; + } + + int result; + ss >> result; + return result; + } + } // end namespace strutils + } // end namespace simgear