00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023 #include <ctype.h>
00024 #include <cstring>
00025
00026 #include "strutils.hxx"
00027
00028 using std::string;
00029 using std::vector;
00030
00031 namespace simgear {
00032 namespace strutils {
00033
00037 static vector<string>
00038 split_whitespace( const string& str, int maxsplit )
00039 {
00040 vector<string> result;
00041 string::size_type len = str.length();
00042 string::size_type i = 0;
00043 string::size_type j;
00044 int countsplit = 0;
00045
00046 while (i < len)
00047 {
00048 while (i < len && isspace((unsigned char)str[i]))
00049 {
00050 ++i;
00051 }
00052
00053 j = i;
00054
00055 while (i < len && !isspace((unsigned char)str[i]))
00056 {
00057 ++i;
00058 }
00059
00060 if (j < i)
00061 {
00062 result.push_back( str.substr(j, i-j) );
00063 ++countsplit;
00064 while (i < len && isspace((unsigned char)str[i]))
00065 {
00066 ++i;
00067 }
00068
00069 if (maxsplit && (countsplit >= maxsplit) && i < len)
00070 {
00071 result.push_back( str.substr( i, len-i ) );
00072 i = len;
00073 }
00074 }
00075 }
00076
00077 return result;
00078 }
00079
00083 vector<string>
00084 split( const string& str, const char* sep, int maxsplit )
00085 {
00086 if (sep == 0)
00087 return split_whitespace( str, maxsplit );
00088
00089 vector<string> result;
00090 int n = std::strlen( sep );
00091 if (n == 0)
00092 {
00093
00094 return result;
00095 }
00096 const char* s = str.c_str();
00097 string::size_type len = str.length();
00098 string::size_type i = 0;
00099 string::size_type j = 0;
00100 int splitcount = 0;
00101
00102 while (i+n <= len)
00103 {
00104 if (s[i] == sep[0] && (n == 1 || std::memcmp(s+i, sep, n) == 0))
00105 {
00106 result.push_back( str.substr(j,i-j) );
00107 i = j = i + n;
00108 ++splitcount;
00109 if (maxsplit && (splitcount >= maxsplit))
00110 break;
00111 }
00112 else
00113 {
00114 ++i;
00115 }
00116 }
00117
00118 result.push_back( str.substr(j,len-j) );
00119 return result;
00120 }
00121
00127 const int LEFTSTRIP = 0;
00128 const int RIGHTSTRIP = 1;
00129 const int BOTHSTRIP = 2;
00130
00131 static string
00132 do_strip( const string& s, int striptype )
00133 {
00134
00135
00136
00137 string::size_type len = s.length();
00138 string::size_type i = 0;
00139 if (striptype != RIGHTSTRIP)
00140 {
00141 while (i < len && isspace(s[i]))
00142 {
00143 ++i;
00144 }
00145 }
00146
00147 string::size_type j = len;
00148 if (striptype != LEFTSTRIP)
00149 {
00150 do
00151 {
00152 --j;
00153 }
00154 while (j >= 1 && isspace(s[j]));
00155 ++j;
00156 }
00157
00158 if (i == 0 && j == len)
00159 {
00160 return s;
00161 }
00162 else
00163 {
00164 return s.substr( i, j - i );
00165 }
00166 }
00167
00168 string
00169 lstrip( const string& s )
00170 {
00171 return do_strip( s, LEFTSTRIP );
00172 }
00173
00174 string
00175 rstrip( const string& s )
00176 {
00177 return do_strip( s, RIGHTSTRIP );
00178 }
00179
00180 string
00181 strip( const string& s )
00182 {
00183 return do_strip( s, BOTHSTRIP );
00184 }
00185
00186 }
00187 }