string.C
Go to the documentation of this file.00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027 #include "string.H"
00028 #include "OSspecific.H"
00029
00030
00031
00032 const char* const Foam::string::typeName = "string";
00033 int Foam::string::debug(debug::debugSwitch(string::typeName, 0));
00034 const Foam::string Foam::string::null;
00035
00036
00037
00038
00039 Foam::string::size_type Foam::string::count(const char c) const
00040 {
00041 register size_type cCount = 0;
00042
00043 for (const_iterator iter = begin(); iter != end(); ++iter)
00044 {
00045 if (*iter == c)
00046 {
00047 cCount++;
00048 }
00049 }
00050
00051 return cCount;
00052 }
00053
00054
00055
00056 Foam::string& Foam::string::replace
00057 (
00058 const string& oldStr,
00059 const string& newStr,
00060 size_type start
00061 )
00062 {
00063 size_type newStart = start;
00064
00065 if ((newStart = find(oldStr, newStart)) != npos)
00066 {
00067 std::string::replace(newStart, oldStr.size(), newStr);
00068 }
00069
00070 return *this;
00071 }
00072
00073
00074
00075 Foam::string& Foam::string::replaceAll
00076 (
00077 const string& oldStr,
00078 const string& newStr,
00079 size_type start
00080 )
00081 {
00082 if (oldStr.size())
00083 {
00084 size_type newStart = start;
00085
00086 while ((newStart = find(oldStr, newStart)) != npos)
00087 {
00088 std::string::replace(newStart, oldStr.size(), newStr);
00089 newStart += newStr.size();
00090 }
00091 }
00092
00093 return *this;
00094 }
00095
00096
00097
00098 Foam::string& Foam::string::expand()
00099 {
00100 size_type startEnvar = 0;
00101
00102
00103
00104 while
00105 (
00106 (startEnvar = find('$', startEnvar)) != npos
00107 && startEnvar < size()-1
00108 )
00109 {
00110 if (startEnvar == 0 || operator[](startEnvar-1) != '\\')
00111 {
00112
00113 size_type endEnvar = startEnvar;
00114 size_type nd = 0;
00115
00116 if (operator[](startEnvar+1) == '{')
00117 {
00118 endEnvar = find('}', startEnvar);
00119 nd = 1;
00120 }
00121 else
00122 {
00123 iterator iter = begin() + startEnvar + 1;
00124
00125 while (iter != end() && (isalnum(*iter) || *iter == '_'))
00126 {
00127 ++iter;
00128 ++endEnvar;
00129 }
00130 }
00131
00132 if (endEnvar != npos && endEnvar != startEnvar)
00133 {
00134 string enVar = substr
00135 (
00136 startEnvar + 1 + nd,
00137 endEnvar - startEnvar - 2*nd
00138 );
00139
00140 string enVarString = getEnv(enVar);
00141
00142 if (enVarString.size())
00143 {
00144 std::string::replace
00145 (
00146 startEnvar,
00147 endEnvar - startEnvar + 1,
00148 enVarString
00149 );
00150 startEnvar += enVarString.size();
00151 }
00152 else
00153 {
00154
00155
00156 FatalErrorIn("string::expand()")
00157 << "Unknown variable name " << enVar << '.'
00158 << exit(FatalError);
00159 }
00160 }
00161 else
00162 {
00163 break;
00164 }
00165 }
00166 else
00167 {
00168 startEnvar++;
00169 }
00170 }
00171
00172 if (size())
00173 {
00174 if (operator[](0) == '~')
00175 {
00176
00177
00178
00179
00180
00181 word user;
00182 fileName file;
00183
00184 if ((startEnvar = find('/')) != npos)
00185 {
00186 user = substr(1, startEnvar - 1);
00187 file = substr(startEnvar + 1);
00188 }
00189 else
00190 {
00191 user = substr(1);
00192 }
00193
00194
00195
00196
00197 if (user == "OpenFOAM")
00198 {
00199 *this = findEtcFile(file);
00200 }
00201 else
00202 {
00203 *this = home(user)/file;
00204 }
00205 }
00206 else if (operator[](0) == '.')
00207 {
00208
00209 if (size() == 1)
00210 {
00211 *this = cwd();
00212 }
00213 else if (operator[](1) == '/')
00214 {
00215 std::string::replace(0, 1, cwd());
00216 }
00217 }
00218 }
00219
00220 return *this;
00221 }
00222
00223
00224
00225 bool Foam::string::removeRepeated(const char character)
00226 {
00227 bool changed = false;
00228
00229 if (character && find(character) != npos)
00230 {
00231 register string::size_type nChar=0;
00232 iterator iter2 = begin();
00233
00234 register char prev = 0;
00235
00236 for
00237 (
00238 string::const_iterator iter1 = iter2;
00239 iter1 != end();
00240 iter1++
00241 )
00242 {
00243 register char c = *iter1;
00244
00245 if (prev == c && c == character)
00246 {
00247 changed = true;
00248 }
00249 else
00250 {
00251 *iter2 = prev = c;
00252 ++iter2;
00253 ++nChar;
00254 }
00255 }
00256 resize(nChar);
00257 }
00258
00259 return changed;
00260 }
00261
00262
00263
00264 Foam::string Foam::string::removeRepeated(const char character) const
00265 {
00266 string str(*this);
00267 str.removeRepeated(character);
00268 return str;
00269 }
00270
00271
00272
00273 bool Foam::string::removeTrailing(const char character)
00274 {
00275 bool changed = false;
00276
00277 string::size_type nChar = size();
00278 if (character && nChar > 1 && operator[](nChar-1) == character)
00279 {
00280 resize(nChar-1);
00281 changed = true;
00282 }
00283
00284 return changed;
00285 }
00286
00287
00288
00289 Foam::string Foam::string::removeTrailing(const char character) const
00290 {
00291 string str(*this);
00292 str.removeTrailing(character);
00293 return str;
00294 }
00295
00296
00297
Copyright © 2000-2009 OpenCFD Ltd