diff --git a/src/OpenFOAM/Make/files b/src/OpenFOAM/Make/files index 0f00726bff513ae510b1194fb9492378093ed12b..a2c32b809bfcb8ca1acb68354e0100899ba4df60 100644 --- a/src/OpenFOAM/Make/files +++ b/src/OpenFOAM/Make/files @@ -78,6 +78,7 @@ $(strings)/fileName/fileNameIO.C $(strings)/keyType/keyType.C $(strings)/wordRe/wordRe.C $(strings)/lists/hashedWordList.C +$(strings)/stringOps/stringOps.C primitives/hashes/Hasher/Hasher.C diff --git a/src/OpenFOAM/db/dictionary/functionEntries/codeStream/codeStream.C b/src/OpenFOAM/db/dictionary/functionEntries/codeStream/codeStream.C index 297430715a0302dbe16c034f99c743c82bb02ce9..d91fcce979a2063e5a0e489784f92487a03d972e 100644 --- a/src/OpenFOAM/db/dictionary/functionEntries/codeStream/codeStream.C +++ b/src/OpenFOAM/db/dictionary/functionEntries/codeStream/codeStream.C @@ -31,6 +31,7 @@ License #include "SHA1Digest.H" #include "OSHA1stream.H" #include "codeStreamTools.H" +#include "stringOps.H" #include "dlLibraryTable.H" #include "OSspecific.H" #include "Time.H" @@ -87,19 +88,18 @@ bool Foam::functionEntries::codeStream::execute string codeInclude = ""; if (codeDict.found("codeInclude")) { - codeInclude = codeStreamTools::stripLeading(codeDict["codeInclude"]); + codeInclude = stringOps::trimLeft(codeDict["codeInclude"]); } - string code = codeStreamTools::stripLeading(codeDict["code"]); + string code = stringOps::trimLeft(codeDict["code"]); string codeOptions = ""; if (codeDict.found("codeOptions")) { - codeOptions = codeStreamTools::stripLeading(codeDict["codeOptions"]); + codeOptions = stringOps::trimLeft(codeDict["codeOptions"]); } - // Create name out of contents - + // Create name from the contents SHA1Digest sha; { OSHA1stream os; diff --git a/src/OpenFOAM/db/dictionary/functionEntries/codeStream/codeStream.H b/src/OpenFOAM/db/dictionary/functionEntries/codeStream/codeStream.H index 9357c11a897085593520005a553b264c30c45f8e..6375d1329e4b7b8cc9c20783b4577a360f54827d 100644 --- a/src/OpenFOAM/db/dictionary/functionEntries/codeStream/codeStream.H +++ b/src/OpenFOAM/db/dictionary/functionEntries/codeStream/codeStream.H @@ -84,13 +84,11 @@ SourceFiles namespace Foam { -class ISstream; - namespace functionEntries { /*---------------------------------------------------------------------------*\ - Class codeStream Declaration + Class codeStream Declaration \*---------------------------------------------------------------------------*/ class codeStream diff --git a/src/OpenFOAM/db/dictionary/functionEntries/codeStream/codeStreamTools.C b/src/OpenFOAM/db/dictionary/functionEntries/codeStream/codeStreamTools.C index 1667d2be4e7ceaa90012e46fc2f8315954839c33..337fc177e155fc5122c7960fa13423048e886a64 100644 --- a/src/OpenFOAM/db/dictionary/functionEntries/codeStream/codeStreamTools.C +++ b/src/OpenFOAM/db/dictionary/functionEntries/codeStream/codeStreamTools.C @@ -211,20 +211,6 @@ bool Foam::codeStreamTools::copyFilesContents(const fileName& dir) const } -Foam::string Foam::codeStreamTools::stripLeading(const string& s) -{ - label sz = s.size(); - if (sz > 0 && s[0] == '\n') - { - return s(1, sz-1); - } - else - { - return s; - } -} - - bool Foam::codeStreamTools::writeDigest ( const fileName& dir, diff --git a/src/OpenFOAM/db/dictionary/functionEntries/codeStream/codeStreamTools.H b/src/OpenFOAM/db/dictionary/functionEntries/codeStream/codeStreamTools.H index 9a4f1dff45abe5b2525bb3da2423c40af1797391..d04d2fad5db43c591b52559ac5e7654a261f072a 100644 --- a/src/OpenFOAM/db/dictionary/functionEntries/codeStream/codeStreamTools.H +++ b/src/OpenFOAM/db/dictionary/functionEntries/codeStream/codeStreamTools.H @@ -120,8 +120,6 @@ public: static void* findLibrary(const fileName& libPath); - static string stripLeading(const string&); - static bool writeDigest(const fileName& dir, const SHA1Digest& sha1); static SHA1Digest readDigest(const fileName& dir); static bool upToDate(const fileName& dir, const SHA1Digest& sha1); diff --git a/src/OpenFOAM/primitives/strings/string/string.C b/src/OpenFOAM/primitives/strings/string/string.C index f1c10bc008a6c7f6f6fad21ea102ce8df16b213c..05ad3a5682e96b068114fa958db1132245297c41 100644 --- a/src/OpenFOAM/primitives/strings/string/string.C +++ b/src/OpenFOAM/primitives/strings/string/string.C @@ -96,75 +96,79 @@ Foam::string& Foam::string::replaceAll // Expand all occurences of environment variables and initial tilde sequences Foam::string& Foam::string::expand(const bool recurse, const bool allowEmptyVar) { - size_type startEnvar = 0; + size_type begVar = 0; // Expand $VARS // Repeat until nothing more is found while ( - (startEnvar = find('$', startEnvar)) != npos - && startEnvar < size()-1 + (begVar = find('$', begVar)) != npos + && begVar < size()-1 ) { - if (startEnvar == 0 || operator[](startEnvar-1) != '\\') + if (begVar == 0 || operator[](begVar-1) != '\\') { // Find end of first occurrence - size_type endEnvar = startEnvar; - size_type nd = 0; + size_type endVar = begVar; + size_type delim = 0; - if (operator[](startEnvar+1) == '{') + if (operator[](begVar+1) == '{') { - endEnvar = find('}', startEnvar); - nd = 1; + endVar = find('}', begVar); + delim = 1; } else { - iterator iter = begin() + startEnvar + 1; + iterator iter = begin() + begVar + 1; - while (iter != end() && (isalnum(*iter) || *iter == '_')) + while + ( + iter != end() + && (isalnum(*iter) || *iter == '_') + ) { ++iter; - ++endEnvar; + ++endVar; } } - if (endEnvar != npos && endEnvar != startEnvar) + if (endVar != npos && endVar != begVar) { - string enVar = substr + string varName = substr ( - startEnvar + 1 + nd, - endEnvar - startEnvar - 2*nd + begVar + 1 + delim, + endVar - begVar - 2*delim ); - string enVarString = getEnv(enVar); + string varValue = getEnv(varName); - if (enVarString.size()) + if (varValue.size()) { if (recurse) { - enVarString.expand(recurse, allowEmptyVar); + varValue.expand(recurse, allowEmptyVar); } std::string::replace ( - startEnvar, - endEnvar - startEnvar + 1, - enVarString + begVar, + endVar - begVar + 1, + varValue ); - startEnvar += enVarString.size(); + begVar += varValue.size(); } else if (allowEmptyVar) { std::string::replace ( - startEnvar, - endEnvar - startEnvar + 1, + begVar, + endVar - begVar + 1, "" ); } else { FatalErrorIn("string::expand(const bool, const bool)") - << "Unknown variable name " << enVar << '.' + << "Unknown variable name " << varName << '.' << exit(FatalError); } } @@ -175,7 +179,7 @@ Foam::string& Foam::string::expand(const bool recurse, const bool allowEmptyVar) } else { - startEnvar++; + ++begVar; } } @@ -191,10 +195,10 @@ Foam::string& Foam::string::expand(const bool recurse, const bool allowEmptyVar) word user; fileName file; - if ((startEnvar = find('/')) != npos) + if ((begVar = find('/')) != npos) { - user = substr(1, startEnvar - 1); - file = substr(startEnvar + 1); + user = substr(1, begVar - 1); + file = substr(begVar + 1); } else { @@ -215,7 +219,7 @@ Foam::string& Foam::string::expand(const bool recurse, const bool allowEmptyVar) } else if (operator[](0) == '.') { - // Expand initial '.' and './' into cwd + // Expand a lone '.' and an initial './' into cwd if (size() == 1) { *this = cwd(); diff --git a/src/OpenFOAM/primitives/strings/stringOps/stringOps.C b/src/OpenFOAM/primitives/strings/stringOps/stringOps.C new file mode 100644 index 0000000000000000000000000000000000000000..e3a4d4c8db63dff0bd3a87967ec93ae7930f8544 --- /dev/null +++ b/src/OpenFOAM/primitives/strings/stringOps/stringOps.C @@ -0,0 +1,359 @@ +/*---------------------------------------------------------------------------*\ + ========= | + \\ / 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 <http://www.gnu.org/licenses/>. + +\*---------------------------------------------------------------------------*/ + +#include "stringOps.H" +#include "OSspecific.H" + + +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +Foam::string Foam::stringOps::expand +( + const string& original, + const HashTable<string, word, string::hash>& mapping, + const char sigil +) +{ + string str(original); + return inplaceExpand(str, mapping); +} + + +Foam::string& Foam::stringOps::inplaceExpand +( + string& s, + const HashTable<string, word, string::hash>& 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<string, word, string::hash>::const_iterator fnd = + mapping.find(varName); + + if (fnd != HashTable<string, word, string::hash>::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 str(original); + return inplaceExpandEnv(str, 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) +{ + notImplemented("string stringOps::trimRight(const string&)"); + return s; +} + + +Foam::string& Foam::stringOps::inplaceTrimRight(string& s) +{ + notImplemented("string& stringOps::inplaceTrimRight(string&)"); + return s; +} + + +Foam::string Foam::stringOps::trim(const string& original) +{ + notImplemented("string stringOps::trim(const string&)"); + return original; +} + + +Foam::string& Foam::stringOps::inplaceTrim(string& s) +{ + notImplemented("string& stringOps::inplaceTrim(string&)"); + return s; +} + +// ************************************************************************* // diff --git a/src/OpenFOAM/primitives/strings/stringOps/stringOps.H b/src/OpenFOAM/primitives/strings/stringOps/stringOps.H new file mode 100644 index 0000000000000000000000000000000000000000..d9756a27056067dc224bd5a134800e2a316bd8e6 --- /dev/null +++ b/src/OpenFOAM/primitives/strings/stringOps/stringOps.H @@ -0,0 +1,159 @@ +/*---------------------------------------------------------------------------*\ + ========= | + \\ / 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 <http://www.gnu.org/licenses/>. + +Namespace + Foam::stringOps + +Description + Collection of static functions to do various simple string-related + operations + +SourceFiles + stringOps.C + +\*---------------------------------------------------------------------------*/ +#ifndef stringOps_H +#define stringOps_H + +#include "string.H" +#include "HashTable.H" + +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +namespace Foam +{ + +/*---------------------------------------------------------------------------*\ + Namespace stringOps Declaration +\*---------------------------------------------------------------------------*/ + +namespace stringOps +{ + //- Expand occurences of variables according to the mapping + // Expansion includes: + // -# variables + // - "$VAR", "${VAR}" + // + // \note the leading sigil can be changed to avoid conflicts with other + // string expansions + string expand + ( + const string&, + const HashTable<string, word, string::hash>& mapping, + const char sigil = '$' + ); + + + //- Inplace expand occurences of variables according to the mapping + // Expansion includes: + // -# variables + // - "$VAR", "${VAR}" + // + // \note the leading sigil can be changed to avoid conflicts with other + // string expansions + string& inplaceExpand + ( + string&, + const HashTable<string, word, string::hash>& mapping, + const char sigil = '$' + ); + + + //- Expand initial tildes and all occurences of environment variables + // Expansion includes: + // -# environment variables + // - "$VAR", "${VAR}" + // -# current directory + // - leading "./" : the current directory + // -# tilde expansion + // - leading "~/" : home directory + // - leading "~user" : home directory for specified user + // - leading "~OpenFOAM" : site/user OpenFOAM configuration directory + // + // \sa + // Foam::findEtcFile + string expandEnv + ( + const string&, + const bool recurse=false, + const bool allowEmptyVar = false + ); + + + //- Expand initial tildes and all occurences of environment variables + // Expansion includes: + // -# environment variables + // - "$VAR", "${VAR}" + // -# current directory + // - leading "./" : the current directory + // -# tilde expansion + // - leading "~/" : home directory + // - leading "~user" : home directory for specified user + // - leading "~OpenFOAM" : site/user OpenFOAM configuration directory + // + // \sa + // Foam::findEtcFile + string& inplaceExpandEnv + ( + string&, + const bool recurse=false, + const bool allowEmptyVar = false + ); + + + //- Return string trimmed of leading whitespace + string trimLeft(const string&); + + //- Trim leading whitespace inplace + string& inplaceTrimLeft(string&); + + //- Return string trimmed of trailing whitespace + // NOT IMPLEMENTED + string trimRight(const string&); + + //- Trim trailing whitespace inplace + // NOT IMPLEMENTED + string& inplaceTrimRight(string&); + + //- Return string trimmed of leading and trailing whitespace + // NOT IMPLEMENTED + string trim(const string&); + + //- Trim leading and trailing whitespace inplace + // NOT IMPLEMENTED + string& inplaceTrim(string&); + + + +} // End namespace stringOps + + +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +} // End namespace Foam + +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +#endif + +// ************************************************************************* //