OpenFOAM logo
The Open Source CFD Toolbox
  Source Guide OpenCFD Solutions Contact OpenFOAM

string.C

Go to the documentation of this file.
00001 /*---------------------------------------------------------------------------*\
00002   =========                 |
00003   \\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox
00004    \\    /   O peration     |
00005     \\  /    A nd           | Copyright (C) 1991-2009 OpenCFD Ltd.
00006      \\/     M anipulation  |
00007 -------------------------------------------------------------------------------
00008 License
00009     This file is part of OpenFOAM.
00010 
00011     OpenFOAM is free software; you can redistribute it and/or modify it
00012     under the terms of the GNU General Public License as published by the
00013     Free Software Foundation; either version 2 of the License, or (at your
00014     option) any later version.
00015 
00016     OpenFOAM is distributed in the hope that it will be useful, but WITHOUT
00017     ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
00018     FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
00019     for more details.
00020 
00021     You should have received a copy of the GNU General Public License
00022     along with OpenFOAM; if not, write to the Free Software Foundation,
00023     Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
00024 
00025 \*---------------------------------------------------------------------------*/
00026 
00027 #include "string.H"
00028 #include "OSspecific.H"
00029 
00030 /* * * * * * * * * * * * * * * Static Member Data  * * * * * * * * * * * * * */
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 // * * * * * * * * * * * * * * * Member Functions  * * * * * * * * * * * * * //
00037 
00038 // Count and return the number of a given character in the string
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 // Replace first occurence of sub-string oldStr with newStr
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 // Replace all occurences of sub-string oldStr with newStr
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 // Expand all occurences of environment variables and initial tilde sequences
00098 Foam::string& Foam::string::expand()
00099 {
00100     size_type startEnvar = 0;
00101 
00102     // Expand $VARS
00103     // Repeat until nothing more is found
00104     while
00105     (
00106         (startEnvar = find('$', startEnvar)) != npos
00107      && startEnvar < size()-1
00108     )
00109     {
00110         if (startEnvar == 0 || operator[](startEnvar-1) != '\\')
00111         {
00112             // Find end of first occurrence
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                     //startEnvar = endEnvar;
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             // Expand initial ~
00177             //   ~/        => home directory
00178             //   ~OpenFOAM => site/user OpenFOAM configuration directory
00179             //   ~user     => home directory for specified user
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             // NB: be a bit lazy and expand ~unknownUser as an
00195             // empty string rather than leaving it untouched.
00196             // otherwise add extra test
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             // Expand initial '.' and './' into cwd
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 // Remove repeated characters returning true if string changed
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 // Return string with repeated characters removed
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 // Remove trailing character returning true if string changed
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 // Return string with trailing character removed
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