]> git.mxchange.org Git - simgear.git/blobdiff - simgear/misc/strutils.cxx
Fix BTG writer for non-included index arrays.
[simgear.git] / simgear / misc / strutils.cxx
index e836a3c44cdbb327e9b239b2c3b8c739c09f1ddb..8bd33b7f507686233140ce7e68ab8a17cf52767b 100644 (file)
 
 #include <ctype.h>
 #include <cstring>
+#include <sstream>
 
 #include "strutils.hxx"
 
-#include <osgDB/FileNameUtils> // 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