mirror of
https://develop.openfoam.com/Development/openfoam.git
synced 2025-11-28 03:28:01 +00:00
Creation of OpenFOAM-dev repository 15/04/2008
This commit is contained in:
299
src/OpenFOAM/primitives/strings/string/string.C
Normal file
299
src/OpenFOAM/primitives/strings/string/string.C
Normal file
@ -0,0 +1,299 @@
|
||||
/*---------------------------------------------------------------------------*\
|
||||
========= |
|
||||
\\ / F ield | OpenFOAM: The Open Source CFD Toolbox
|
||||
\\ / O peration |
|
||||
\\ / A nd | Copyright (C) 1991-2007 OpenCFD Ltd.
|
||||
\\/ M anipulation |
|
||||
-------------------------------------------------------------------------------
|
||||
License
|
||||
This file is part of OpenFOAM.
|
||||
|
||||
OpenFOAM is free software; you can redistribute it and/or modify it
|
||||
under the terms of the GNU General Public License as published by the
|
||||
Free Software Foundation; either version 2 of the License, or (at your
|
||||
option) any later version.
|
||||
|
||||
OpenFOAM is distributed in the hope that it will be useful, but WITHOUT
|
||||
ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
||||
FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
|
||||
for more details.
|
||||
|
||||
You should have received a copy of the GNU General Public License
|
||||
along with OpenFOAM; if not, write to the Free Software Foundation,
|
||||
Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
|
||||
|
||||
\*---------------------------------------------------------------------------*/
|
||||
|
||||
#include "string.H"
|
||||
#include "debug.H"
|
||||
#include "OSspecific.H"
|
||||
|
||||
/* * * * * * * * * * * * * * * Static Member Data * * * * * * * * * * * * * */
|
||||
|
||||
const char* const Foam::string::typeName = "string";
|
||||
int Foam::string::debug(debug::debugSwitch(string::typeName, 0));
|
||||
const Foam::string Foam::string::null;
|
||||
|
||||
// * * * * * * * * * * * * * * * Member Functions * * * * * * * * * * * * * //
|
||||
|
||||
// Count and return the number of a given character in the string
|
||||
Foam::string::size_type Foam::string::count(const char c) const
|
||||
{
|
||||
register size_type cCount=0;
|
||||
|
||||
for
|
||||
(
|
||||
const_iterator iter = begin();
|
||||
iter != end();
|
||||
++iter
|
||||
)
|
||||
{
|
||||
if (*iter == c)
|
||||
{
|
||||
cCount++;
|
||||
}
|
||||
}
|
||||
|
||||
return cCount;
|
||||
}
|
||||
|
||||
|
||||
// Replace first occurence of sub-string oldStr with newStr
|
||||
Foam::string& Foam::string::replace
|
||||
(
|
||||
const string& oldStr,
|
||||
const string& newStr,
|
||||
size_type start
|
||||
)
|
||||
{
|
||||
size_type newStart = start;
|
||||
|
||||
if ((newStart = find(oldStr, newStart)) != npos)
|
||||
{
|
||||
std::string::replace(newStart, oldStr.size(), newStr);
|
||||
}
|
||||
|
||||
return *this;
|
||||
}
|
||||
|
||||
|
||||
// Replace all occurences of sub-string oldStr with newStr
|
||||
Foam::string& Foam::string::replaceAll
|
||||
(
|
||||
const string& oldStr,
|
||||
const string& newStr,
|
||||
size_type start
|
||||
)
|
||||
{
|
||||
if (oldStr.size())
|
||||
{
|
||||
size_type newStart = start;
|
||||
|
||||
while ((newStart = find(oldStr, newStart)) != npos)
|
||||
{
|
||||
std::string::replace(newStart, oldStr.size(), newStr);
|
||||
newStart += newStr.size();
|
||||
}
|
||||
}
|
||||
|
||||
return *this;
|
||||
}
|
||||
|
||||
|
||||
// Expand all occurences of environment variables and initial tilde sequences
|
||||
Foam::string& Foam::string::expand()
|
||||
{
|
||||
size_type startEnvar = 0;
|
||||
|
||||
// Expand $VARS
|
||||
// Repeat until nothing more is found
|
||||
while
|
||||
(
|
||||
(startEnvar = find('$', startEnvar)) != npos
|
||||
&& startEnvar < size()-1
|
||||
)
|
||||
{
|
||||
if (startEnvar == 0 || operator[](startEnvar-1) != '\\')
|
||||
{
|
||||
// Find end of first occurrence
|
||||
size_type endEnvar = startEnvar;
|
||||
size_type nd = 0;
|
||||
|
||||
if (operator[](startEnvar+1) == '{')
|
||||
{
|
||||
endEnvar = find('}', startEnvar);
|
||||
nd = 1;
|
||||
}
|
||||
else
|
||||
{
|
||||
iterator iter = begin() + startEnvar + 1;
|
||||
|
||||
while (iter != end() && (isalnum(*iter) || *iter == '_'))
|
||||
{
|
||||
++iter;
|
||||
++endEnvar;
|
||||
}
|
||||
}
|
||||
|
||||
if (endEnvar != npos && endEnvar != startEnvar)
|
||||
{
|
||||
string enVar = substr
|
||||
(
|
||||
startEnvar + 1 + nd,
|
||||
endEnvar - startEnvar - 2*nd
|
||||
);
|
||||
|
||||
string enVarString = getEnv(enVar);
|
||||
|
||||
if (enVarString.size())
|
||||
{
|
||||
std::string::replace
|
||||
(
|
||||
startEnvar,
|
||||
endEnvar - startEnvar + 1,
|
||||
enVarString
|
||||
);
|
||||
startEnvar += enVarString.size();
|
||||
}
|
||||
else
|
||||
{
|
||||
//startEnvar = endEnvar;
|
||||
|
||||
FatalErrorIn("string::expand()")
|
||||
<< "Unknown variable name " << enVar << '.'
|
||||
<< exit(FatalError);
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
break;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
startEnvar++;
|
||||
}
|
||||
}
|
||||
|
||||
if (size())
|
||||
{
|
||||
// Expand initial '.' and './' into cwd
|
||||
if (operator[](0) == '.')
|
||||
{
|
||||
if (size() == 1 || (size() > 1 && operator[](1) == '/'))
|
||||
{
|
||||
std::string::replace(0, 1, cwd());
|
||||
}
|
||||
}
|
||||
else if (operator[](0) == '~')
|
||||
{
|
||||
// Expand initial ~
|
||||
// ~/ => home directory
|
||||
// ~OpenFOAM => site/user OpenFOAM configuration directory
|
||||
// ~user => home directory for specified user
|
||||
|
||||
word user;
|
||||
fileName file;
|
||||
|
||||
if ((startEnvar = find('/')) != npos)
|
||||
{
|
||||
user = substr(1, startEnvar - 1);
|
||||
file = substr(startEnvar + 1);
|
||||
}
|
||||
else
|
||||
{
|
||||
user = substr(1);
|
||||
}
|
||||
|
||||
// NB: be a bit lazy and expand ~unknownUser as an
|
||||
// empty string rather than leaving it untouched.
|
||||
// otherwise add extra test
|
||||
if (user == "OpenFOAM")
|
||||
{
|
||||
*this = dotFoam(file);
|
||||
}
|
||||
else
|
||||
{
|
||||
*this = home(user)/file;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return *this;
|
||||
}
|
||||
|
||||
|
||||
// Remove repeated characters returning true if string changed
|
||||
bool Foam::string::removeRepeated(const char character)
|
||||
{
|
||||
bool changed = false;
|
||||
|
||||
if (character && find(character) != npos)
|
||||
{
|
||||
register string::size_type nChar=0;
|
||||
iterator iter2 = begin();
|
||||
|
||||
register char prev = 0;
|
||||
|
||||
for
|
||||
(
|
||||
string::const_iterator iter1 = iter2;
|
||||
iter1 != end();
|
||||
iter1++
|
||||
)
|
||||
{
|
||||
register char c = *iter1;
|
||||
|
||||
if (prev == c && c == character)
|
||||
{
|
||||
changed = true;
|
||||
}
|
||||
else
|
||||
{
|
||||
*iter2 = prev = c;
|
||||
++iter2;
|
||||
++nChar;
|
||||
}
|
||||
}
|
||||
resize(nChar);
|
||||
}
|
||||
|
||||
return changed;
|
||||
}
|
||||
|
||||
|
||||
// Return string with repeated characters removed
|
||||
Foam::string Foam::string::removeRepeated(const char character) const
|
||||
{
|
||||
string s(*this);
|
||||
s.removeRepeated(character);
|
||||
return s;
|
||||
}
|
||||
|
||||
|
||||
// Remove trailing character returning true if string changed
|
||||
bool Foam::string::removeTrailing(const char character)
|
||||
{
|
||||
bool changed = false;
|
||||
|
||||
string::size_type nChar = size();
|
||||
if (character && nChar > 1 && operator[](nChar-1) == character)
|
||||
{
|
||||
resize(nChar-1);
|
||||
changed = true;
|
||||
}
|
||||
|
||||
return changed;
|
||||
}
|
||||
|
||||
|
||||
// Return string with trailing character removed
|
||||
Foam::string Foam::string::removeTrailing(const char character) const
|
||||
{
|
||||
string s(*this);
|
||||
s.removeTrailing(character);
|
||||
return s;
|
||||
}
|
||||
|
||||
|
||||
// ************************************************************************* //
|
||||
Reference in New Issue
Block a user