/*---------------------------------------------------------------------------*\ ========= | \\ / F ield | OpenFOAM: The Open Source CFD Toolbox \\ / O peration | \\ / A nd | Copyright (C) 2011-2011 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 3 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, see . \*---------------------------------------------------------------------------*/ #include "stringOps.H" #include "OSspecific.H" // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // Foam::string Foam::stringOps::expand ( const string& original, const HashTable& mapping, const char sigil ) { string s(original); return inplaceExpand(s, mapping); } Foam::string& Foam::stringOps::inplaceExpand ( string& s, const HashTable& mapping, const char sigil ) { string::size_type begVar = 0; // Expand $VAR or ${VAR} // Repeat until nothing more is found while ( (begVar = s.find(sigil, begVar)) != string::npos && begVar < s.size()-1 ) { if (begVar == 0 || s[begVar-1] != '\\') { // Find end of first occurrence string::size_type endVar = begVar; string::size_type delim = 0; if (s[begVar+1] == '{') { endVar = s.find('}', begVar); delim = 1; } else { string::iterator iter = s.begin() + begVar + 1; while ( iter != s.end() && (isalnum(*iter) || *iter == '_') ) { ++iter; ++endVar; } } if (endVar != string::npos && endVar != begVar) { string varName = s.substr ( begVar + 1 + delim, endVar - begVar - 2*delim ); HashTable::const_iterator fnd = mapping.find(varName); if (fnd != HashTable::end()) { s.std::string::replace ( begVar, endVar - begVar + 1, *fnd ); begVar += (*fnd).size(); } else { s.std::string::replace ( begVar, endVar - begVar + 1, "" ); } } else { break; } } else { ++begVar; } } return s; } Foam::string Foam::stringOps::expandEnv ( const string& original, const bool recurse, const bool allowEmptyVar ) { string s(original); return inplaceExpandEnv(s, recurse, allowEmptyVar); } // Expand all occurences of environment variables and initial tilde sequences Foam::string& Foam::stringOps::inplaceExpandEnv ( string& s, const bool recurse, const bool allowEmptyVar ) { string::size_type begVar = 0; // Expand $VARS // Repeat until nothing more is found while ( (begVar = s.find('$', begVar)) != string::npos && begVar < s.size()-1 ) { if (begVar == 0 || s[begVar-1] != '\\') { // Find end of first occurrence string::size_type endVar = begVar; string::size_type delim = 0; if (s[begVar+1] == '{') { endVar = s.find('}', begVar); delim = 1; } else { string::iterator iter = s.begin() + begVar + 1; while ( iter != s.end() && (isalnum(*iter) || *iter == '_') ) { ++iter; ++endVar; } } if (endVar != string::npos && endVar != begVar) { string varName = s.substr ( begVar + 1 + delim, endVar - begVar - 2*delim ); string varValue = getEnv(varName); if (varValue.size()) { if (recurse) { varValue.expand(recurse, allowEmptyVar); } s.std::string::replace ( begVar, endVar - begVar + 1, varValue ); begVar += varValue.size(); } else if (allowEmptyVar) { s.std::string::replace ( begVar, endVar - begVar + 1, "" ); } else { FatalErrorIn("string::expand(const bool, const bool)") << "Unknown variable name " << varName << '.' << exit(FatalError); } } else { break; } } else { ++begVar; } } if (!s.empty()) { if (s[0] == '~') { // Expand initial ~ // ~/ => home directory // ~OpenFOAM => site/user OpenFOAM configuration directory // ~user => home directory for specified user word user; fileName file; if ((begVar = s.find('/')) != string::npos) { user = s.substr(1, begVar - 1); file = s.substr(begVar + 1); } else { user = s.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") { s = findEtcFile(file); } else { s = home(user)/file; } } else if (s[0] == '.') { // Expand a lone '.' and an initial './' into cwd if (s.size() == 1) { s = cwd(); } else if (s[1] == '/') { s.std::string::replace(0, 1, cwd()); } } } return s; } Foam::string Foam::stringOps::trimLeft(const string& s) { if (!s.empty()) { string::size_type beg = 0; while (isspace(s[beg])) { ++beg; } if (beg) { return s.substr(beg); } } return s; } Foam::string& Foam::stringOps::inplaceTrimLeft(string& s) { if (!s.empty()) { string::size_type beg = 0; while (isspace(s[beg])) { ++beg; } if (beg) { s.erase(0, beg); } } return s; } Foam::string Foam::stringOps::trimRight(const string& s) { if (!s.empty()) { string::size_type sz = s.size(); while (sz && isspace(s[sz-1])) { --sz; } if (sz < s.size()) { return s.substr(0, sz); } } return s; } Foam::string& Foam::stringOps::inplaceTrimRight(string& s) { if (!s.empty()) { string::size_type sz = s.size(); while (sz && isspace(s[sz-1])) { --sz; } s.resize(sz); } return s; } Foam::string Foam::stringOps::trim(const string& original) { return trimLeft(trimRight(original)); } Foam::string& Foam::stringOps::inplaceTrim(string& s) { inplaceTrimRight(s); inplaceTrimLeft(s); return s; } // ************************************************************************* //