diff --git a/applications/test/string/Test-string.C b/applications/test/string/Test-string.C index 208e1c297f..d660a36240 100644 --- a/applications/test/string/Test-string.C +++ b/applications/test/string/Test-string.C @@ -83,7 +83,8 @@ int main(int argc, char *argv[]) Info<<"camel-case => " << (word("camel") & "case") << nl; for (const auto& s : { " text with \"spaces'", "08/15 value" }) { - Info<<"validated \"" << s << "\" => " << word::validated(s) << nl; + Info<<"validated \"" << s << "\" => " + << word::validated(s, true) << nl; } Info<< nl; diff --git a/applications/test/stringSplit/Make/files b/applications/test/stringSplit/Make/files new file mode 100644 index 0000000000..06bdafe1b2 --- /dev/null +++ b/applications/test/stringSplit/Make/files @@ -0,0 +1,3 @@ +Test-stringSplit.C + +EXE = $(FOAM_USER_APPBIN)/Test-stringSplit diff --git a/applications/test/stringSplit/Make/options b/applications/test/stringSplit/Make/options new file mode 100644 index 0000000000..e69de29bb2 diff --git a/applications/test/stringSplit/Test-stringSplit.C b/applications/test/stringSplit/Test-stringSplit.C new file mode 100644 index 0000000000..9b1208c252 --- /dev/null +++ b/applications/test/stringSplit/Test-stringSplit.C @@ -0,0 +1,81 @@ +/*---------------------------------------------------------------------------*\ + ========= | + \\ / F ield | OpenFOAM: The Open Source CFD Toolbox + \\ / O peration | + \\ / A nd | Copyright (C) 2017 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 . + +Application + Test-stringSplit + +Description + Test string splitting + +\*---------------------------------------------------------------------------*/ + +#include "argList.H" +#include "fileName.H" +#include "stringOps.H" + +using namespace Foam; + +template +void printSplitting(const String& str, const char delimiter) +{ + auto split = stringOps::split(str, delimiter); + + Info<< "string {" << str.size() << " chars} = " << str << nl + << split.size() << " elements {" << split.length() << " chars}" + << nl; + + unsigned i = 0; + for (const auto s : split) + { + Info<< "[" << i++ << "] {" << s.length() << " chars} = " + << s.str() << nl; + } +} + + +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // +// Main program: + +int main(int argc, char *argv[]) +{ + argList::noBanner(); + argList::noParallel(); + + argList args(argc, argv, false, true); + + if (args.size() <= 1 && args.options().empty()) + { + args.printUsage(); + } + + for (label argi=1; argi < args.size(); ++argi) + { + printSplitting(args[argi], '/'); + } + + Info<< "\nEnd\n" << endl; + return 0; +} + + +// ************************************************************************* // diff --git a/applications/utilities/mesh/conversion/fluent3DMeshToFoam/fluent3DMeshToFoam.L b/applications/utilities/mesh/conversion/fluent3DMeshToFoam/fluent3DMeshToFoam.L index ca276a0348..8898cded2c 100644 --- a/applications/utilities/mesh/conversion/fluent3DMeshToFoam/fluent3DMeshToFoam.L +++ b/applications/utilities/mesh/conversion/fluent3DMeshToFoam/fluent3DMeshToFoam.L @@ -221,6 +221,7 @@ redundantBlock {space}({comment}|{unknownPeriodicFace}|{periodicFace endOfSection {space}")"{space} +/* balance "-quoted for editor */ /* ------------------------------------------------------------------------ *\ ----- Exclusive start states ----- @@ -693,7 +694,7 @@ endOfSection {space}")"{space} {lbrac}{label} { Warning << "Found unknown block of type: " - << Foam::string(YYText())(1, YYLeng()-1) << nl + << std::string(YYText()).substr(1, YYLeng()-1) << nl << " on line " << lineNo << endl; yy_push_state(ignoreBlock); diff --git a/applications/utilities/mesh/manipulation/setSet/setSet.C b/applications/utilities/mesh/manipulation/setSet/setSet.C index 4a64e6f801..2f5b6a5cca 100644 --- a/applications/utilities/mesh/manipulation/setSet/setSet.C +++ b/applications/utilities/mesh/manipulation/setSet/setSet.C @@ -903,10 +903,10 @@ int main(int argc, char *argv[]) } // Strip off anything after # - string::size_type i = rawLine.find_first_of("#"); + string::size_type i = rawLine.find('#'); if (i != string::npos) { - rawLine = rawLine(0, i); + rawLine.resize(i); } if (rawLine.empty()) diff --git a/applications/utilities/preProcessing/changeDictionary/changeDictionary.C b/applications/utilities/preProcessing/changeDictionary/changeDictionary.C index ea80da840f..f9be71c75f 100644 --- a/applications/utilities/preProcessing/changeDictionary/changeDictionary.C +++ b/applications/utilities/preProcessing/changeDictionary/changeDictionary.C @@ -254,7 +254,7 @@ bool merge if (key[0] == '~') { - word eraseKey = key(1, key.size()-1); + const word eraseKey = key.substr(1); if (thisDict.remove(eraseKey)) { // Mark thisDict entry as having been match for wildcard @@ -325,7 +325,7 @@ bool merge if (key[0] == '~') { - word eraseKey = key(1, key.size()-1); + const word eraseKey = key.substr(1); // List of indices into thisKeys labelList matches diff --git a/src/OSspecific/POSIX/POSIX.C b/src/OSspecific/POSIX/POSIX.C index d9b2e0b3a4..3a922ed016 100644 --- a/src/OSspecific/POSIX/POSIX.C +++ b/src/OSspecific/POSIX/POSIX.C @@ -88,7 +88,7 @@ static inline bool isBackupName(const Foam::fileName& name) { return false; } - else if (name[name.size()-1] == '~') + else if (name.back() == '~') { return true; } diff --git a/src/OSspecific/POSIX/printStack.C b/src/OSspecific/POSIX/printStack.C index bee02686b3..4031b91d77 100644 --- a/src/OSspecific/POSIX/printStack.C +++ b/src/OSspecific/POSIX/printStack.C @@ -40,12 +40,11 @@ namespace Foam // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // -string pOpen(const string &cmd, label line=0) +string pOpen(const string& cmd, label line=0) { - string res = "\n"; + string res; FILE *cmdPipe = popen(cmd.c_str(), "r"); - if (cmdPipe) { char *buf = nullptr; @@ -54,8 +53,7 @@ string pOpen(const string &cmd, label line=0) for (label cnt = 0; cnt <= line; cnt++) { size_t linecap = 0; - ssize_t linelen; - linelen = ::getline(&buf, &linecap, cmdPipe); + ssize_t linelen = ::getline(&buf, &linecap, cmdPipe); if (linelen < 0) { @@ -65,6 +63,11 @@ string pOpen(const string &cmd, label line=0) if (cnt == line) { res = string(buf); + // Trim trailing newline + if (res.size()) + { + res.resize(res.size()-1); + } break; } } @@ -77,7 +80,7 @@ string pOpen(const string &cmd, label line=0) pclose(cmdPipe); } - return res.substr(0, res.size() - 1); + return res; } diff --git a/src/OpenFOAM/db/IOstreams/Sstreams/ISstream.C b/src/OpenFOAM/db/IOstreams/Sstreams/ISstream.C index 7bd031d87a..4d809900b9 100644 --- a/src/OpenFOAM/db/IOstreams/Sstreams/ISstream.C +++ b/src/OpenFOAM/db/IOstreams/Sstreams/ISstream.C @@ -604,13 +604,14 @@ Foam::Istream& Foam::ISstream::readVariable(string& str) // Read, counting brackets buf[nChar++] = c; + // Also allow '/' between ${...} blocks for slash-scoping of entries while ( get(c) && ( c == token::BEGIN_BLOCK || c == token::END_BLOCK - || word::valid(c) + || word::valid(c) || c == '/' ) ) { @@ -620,7 +621,7 @@ Foam::Istream& Foam::ISstream::readVariable(string& str) buf[errLen] = '\0'; FatalIOErrorInFunction(*this) - << "word '" << buf << "...'\n" + << "variable '" << buf << "...'\n" << " is too long (max. " << maxLen << " characters)" << exit(FatalIOError); @@ -656,7 +657,7 @@ Foam::Istream& Foam::ISstream::readVariable(string& str) buf[errLen] = '\0'; FatalIOErrorInFunction(*this) - << "word '" << buf << "...'\n" + << "variable '" << buf << "...'\n" << " is too long (max. " << maxLen << " characters)" << exit(FatalIOError); diff --git a/src/OpenFOAM/db/dictionary/dictionaryIO.C b/src/OpenFOAM/db/dictionary/dictionaryIO.C index 836add62f9..f1605e50fa 100644 --- a/src/OpenFOAM/db/dictionary/dictionaryIO.C +++ b/src/OpenFOAM/db/dictionary/dictionaryIO.C @@ -130,7 +130,7 @@ bool Foam::dictionary::read(Istream& is) bool Foam::dictionary::substituteKeyword(const word& keyword, bool mergeEntry) { - const word varName = keyword(1, keyword.size()-1); + const word varName = keyword.substr(1); // Lookup the variable name in the given dictionary const entry* ePtr = lookupEntryPtr(varName, true, true); diff --git a/src/OpenFOAM/db/functionObjects/functionObjectList/functionObjectList.C b/src/OpenFOAM/db/functionObjects/functionObjectList/functionObjectList.C index 397262386b..37db0a3067 100644 --- a/src/OpenFOAM/db/functionObjects/functionObjectList/functionObjectList.C +++ b/src/OpenFOAM/db/functionObjects/functionObjectList/functionObjectList.C @@ -210,7 +210,7 @@ bool Foam::functionObjectList::readFunctionObject { if (argLevel == 0) { - funcName = funcNameArgs(start, i - start); + funcName = funcNameArgs.substr(start, i - start); start = i+1; } ++argLevel; @@ -226,7 +226,7 @@ bool Foam::functionObjectList::readFunctionObject Tuple2 ( argName, - funcNameArgs(start, i - start) + funcNameArgs.substr(start, i - start) ) ); namedArg = false; @@ -235,7 +235,10 @@ bool Foam::functionObjectList::readFunctionObject { args.append ( - string::validate(funcNameArgs(start, i - start)) + string::validate + ( + funcNameArgs.substr(start, i - start) + ) ); } start = i+1; @@ -252,7 +255,11 @@ bool Foam::functionObjectList::readFunctionObject } else if (c == '=') { - argName = string::validate(funcNameArgs(start, i - start)); + argName = string::validate + ( + funcNameArgs.substr(start, i - start) + ); + start = i+1; namedArg = true; } diff --git a/src/OpenFOAM/dimensionSet/dimensionSetIO.C b/src/OpenFOAM/dimensionSet/dimensionSetIO.C index 768acc8efc..032555cd25 100644 --- a/src/OpenFOAM/dimensionSet/dimensionSetIO.C +++ b/src/OpenFOAM/dimensionSet/dimensionSetIO.C @@ -140,7 +140,7 @@ void Foam::dimensionSet::tokeniser::splitWord(const word& w) { if (i > start) { - word subWord = w(start, i-start); + const word subWord = w.substr(start, i-start); if (isdigit(subWord[0]) || subWord[0] == token::SUBTRACT) { push(token(readScalar(IStringStream(subWord)()))); @@ -166,7 +166,7 @@ void Foam::dimensionSet::tokeniser::splitWord(const word& w) } if (start < w.size()) { - word subWord = w(start, w.size()-start); + const word subWord = w.substr(start); if (isdigit(subWord[0]) || subWord[0] == token::SUBTRACT) { push(token(readScalar(IStringStream(subWord)()))); @@ -524,9 +524,9 @@ Foam::Istream& Foam::dimensionSet::read do { word symbolPow = nextToken.wordToken(); - if (symbolPow[symbolPow.size()-1] == token::END_SQR) + if (symbolPow.back() == token::END_SQR) { - symbolPow = symbolPow(0, symbolPow.size()-1); + symbolPow.resize(symbolPow.size()-1); continueParsing = false; } @@ -537,8 +537,8 @@ Foam::Istream& Foam::dimensionSet::read size_t index = symbolPow.find('^'); if (index != string::npos) { - word symbol = symbolPow(0, index); - word exp = symbolPow(index+1, symbolPow.size()-index+1); + const word symbol = symbolPow.substr(0, index); + const word exp = symbolPow.substr(index+1); scalar exponent = readScalar(IStringStream(exp)()); dimensionedScalar s; @@ -580,9 +580,9 @@ Foam::Istream& Foam::dimensionSet::read { // Read first five dimensions exponents_[dimensionSet::MASS] = nextToken.number(); - for (int Dimension=1; Dimension> exponents_[Dimension]; + is >> exponents_[d]; } // Read next token diff --git a/src/OpenFOAM/matrices/solution/solution.C b/src/OpenFOAM/matrices/solution/solution.C index 5abac0fa3e..982c3398b6 100644 --- a/src/OpenFOAM/matrices/solution/solution.C +++ b/src/OpenFOAM/matrices/solution/solution.C @@ -76,16 +76,13 @@ void Foam::solution::read(const dictionary& dict) const word& e = entryNames[i]; scalar value = readScalar(relaxDict.lookup(e)); - if (e(0, 1) == "p") + if (e.startsWith("p")) { fieldRelaxDict_.add(e, value); } - else if (e.length() >= 3) + else if (e.startsWith("rho")) { - if (e(0, 3) == "rho") - { - fieldRelaxDict_.add(e, value); - } + fieldRelaxDict_.add(e, value); } } diff --git a/src/OpenFOAM/primitives/strings/lists/SubStrings.H b/src/OpenFOAM/primitives/strings/lists/SubStrings.H new file mode 100644 index 0000000000..3e37fd7edd --- /dev/null +++ b/src/OpenFOAM/primitives/strings/lists/SubStrings.H @@ -0,0 +1,127 @@ +/*---------------------------------------------------------------------------*\ + ========= | + \\ / F ield | OpenFOAM: The Open Source CFD Toolbox + \\ / O peration | + \\ / A nd | Copyright (C) 2017 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 . + +Class + Foam::SubStrings + +Description + Sub-ranges of a string with a structure similar to std::match_results, + but without the underlying regular expression matching. + +\*---------------------------------------------------------------------------*/ + +#ifndef SubStrings_H +#define SubStrings_H + +#include +#include +#include + +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +namespace Foam +{ + +/*---------------------------------------------------------------------------*\ + Class SubStrings Declaration +\*---------------------------------------------------------------------------*/ + +template +class SubStrings +: + public std::vector> +{ +public: + + // Typedefs + + //- The element type + using value_type = + typename std::sub_match; + + //- The const_iterator for the underlying string type + using string_iterator = typename String::const_iterator; + + + // Constructors + + //- Construct null + SubStrings() + {} + + + // Member Functions + + //- The total length of all sub-elements. + // Use size() for the number elements. + std::string::size_type length() const + { + std::string::size_type len = 0; + + for (const auto& elem : *this) + { + len += elem.length(); + } + + return len; + } + + + //- Append sub-string defined by begin/end iterators + void append(string_iterator b, string_iterator e) + { + value_type range; + range.first = b; + range.second = e; + range.matched = true; + + this->push_back(range); + } + + + //- Const reference to the first element, + // for consistency with other OpenFOAM containers + auto first() const -> decltype(this->front()) + { + return this->front(); + } + + + //- Const reference to the last element, + // for consistency with other OpenFOAM containers + auto last() const -> decltype(this->back()) + { + return this->back(); + } + +}; + +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +} // End namespace Foam + +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +#endif + +// ************************************************************************* // diff --git a/src/OpenFOAM/primitives/strings/stringOps/stringOps.H b/src/OpenFOAM/primitives/strings/stringOps/stringOps.H index 66e87623e5..0d7d459f59 100644 --- a/src/OpenFOAM/primitives/strings/stringOps/stringOps.H +++ b/src/OpenFOAM/primitives/strings/stringOps/stringOps.H @@ -30,12 +30,14 @@ Description SourceFiles stringOps.C + stringOpsTemplates.C \*---------------------------------------------------------------------------*/ #ifndef stringOps_H #define stringOps_H #include "string.H" +#include "SubStrings.H" #include "word.H" #include "dictionary.H" #include "HashTable.H" @@ -302,14 +304,21 @@ namespace stringOps Foam::word name(const std::string& fmt, const PrimitiveType& val); -} // End namespace stringOps + //- Split a string into sub-strings at the delimiter character. + // An empty sub-strings are suppressed. + template + Foam::SubStrings split + ( + const StringType& str, + const char delimiter + ); +} // End namespace stringOps // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // } // End namespace Foam - // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // #ifdef NoRepository diff --git a/src/OpenFOAM/primitives/strings/stringOps/stringOpsTemplates.C b/src/OpenFOAM/primitives/strings/stringOps/stringOpsTemplates.C index a8f7030300..1b0aa62e9f 100644 --- a/src/OpenFOAM/primitives/strings/stringOps/stringOpsTemplates.C +++ b/src/OpenFOAM/primitives/strings/stringOps/stringOpsTemplates.C @@ -2,7 +2,7 @@ ========= | \\ / F ield | OpenFOAM: The Open Source CFD Toolbox \\ / O peration | - \\ / A nd | Copyright (C) 2016 OpenCFD Ltd. + \\ / A nd | Copyright (C) 2016-2017 OpenCFD Ltd. \\/ M anipulation | ------------------------------------------------------------------------------- License @@ -65,4 +65,36 @@ Foam::word Foam::stringOps::name } +template +Foam::SubStrings Foam::stringOps::split +( + const StringType& str, + const char delimiter +) +{ + Foam::SubStrings lst; + lst.reserve(20); + + std::string::size_type beg = 0, end = 0; + + while ((end = str.find(delimiter, beg)) != std::string::npos) + { + if (beg < end) + { + // (Non-empty) intermediate element + lst.append(str.cbegin() + beg, str.cbegin() + end); + } + beg = end + 1; + } + + // (Non-empty) trailing element + if (beg < str.size()) + { + lst.append(str.cbegin() + beg, str.cbegin() + str.size()); + } + + return lst; +} + + // ************************************************************************* // diff --git a/src/OpenFOAM/primitives/strings/word/word.H b/src/OpenFOAM/primitives/strings/word/word.H index 0661255341..126d5c08c7 100644 --- a/src/OpenFOAM/primitives/strings/word/word.H +++ b/src/OpenFOAM/primitives/strings/word/word.H @@ -113,9 +113,9 @@ public: inline static bool valid(char c); //- Construct a validated word, in which all invalid characters have - // been stripped out. Normally also prefix any leading digit + // been stripped out. Optionally prefix any leading digit // with '_' to have words that work nicely as dictionary keywords. - static word validated(const std::string& s, const bool prefix=true); + static word validated(const std::string& s, const bool prefix=false); // File-like functions diff --git a/src/combustionModels/FSD/reactionRateFlameAreaModels/reactionRateFlameArea/reactionRateFlameAreaNew.C b/src/combustionModels/FSD/reactionRateFlameAreaModels/reactionRateFlameArea/reactionRateFlameAreaNew.C index 2154d2cc94..83222a222b 100644 --- a/src/combustionModels/FSD/reactionRateFlameAreaModels/reactionRateFlameArea/reactionRateFlameAreaNew.C +++ b/src/combustionModels/FSD/reactionRateFlameAreaModels/reactionRateFlameArea/reactionRateFlameAreaNew.C @@ -34,16 +34,15 @@ Foam::autoPtr Foam::reactionRateFlameArea::New const combustionModel& combModel ) { - word reactionRateFlameAreaType + const word modelType ( dict.lookup("reactionRateFlameArea") ); Info<< "Selecting reaction rate flame area correlation " - << reactionRateFlameAreaType << endl; + << modelType << endl; - auto cstrIter = - dictionaryConstructorTablePtr_->cfind(reactionRateFlameAreaType); + auto cstrIter = dictionaryConstructorTablePtr_->cfind(modelType); if (!cstrIter.found()) { @@ -51,15 +50,13 @@ Foam::autoPtr Foam::reactionRateFlameArea::New ( dict ) << "Unknown reactionRateFlameArea type " - << reactionRateFlameAreaType << nl << nl + << modelType << nl << nl << "Valid reaction rate flame area types :" << endl << dictionaryConstructorTablePtr_->sortedToc() << exit(FatalIOError); } - const label tempOpen = reactionRateFlameAreaType.find('<'); - - const word className = reactionRateFlameAreaType(0, tempOpen); + const word className = modelType.substr(0, modelType.find('<')); return autoPtr (cstrIter()(className, dict, mesh, combModel)); diff --git a/src/combustionModels/psiCombustionModel/psiCombustionModel/psiCombustionModelNew.C b/src/combustionModels/psiCombustionModel/psiCombustionModel/psiCombustionModelNew.C index ca7d0616b8..50e69d177d 100644 --- a/src/combustionModels/psiCombustionModel/psiCombustionModel/psiCombustionModelNew.C +++ b/src/combustionModels/psiCombustionModel/psiCombustionModel/psiCombustionModelNew.C @@ -35,7 +35,7 @@ Foam::combustionModels::psiCombustionModel::New const word& phaseName ) { - const word combModelName + const word modelType ( IOdictionary ( @@ -51,21 +51,21 @@ Foam::combustionModels::psiCombustionModel::New ).lookup("combustionModel") ); - Info<< "Selecting combustion model " << combModelName << endl; + Info<< "Selecting combustion model " << modelType << endl; - auto cstrIter = dictionaryConstructorTablePtr_->cfind(combModelName); + auto cstrIter = dictionaryConstructorTablePtr_->cfind(modelType); if (!cstrIter.found()) { FatalErrorInFunction << "Unknown psiCombustionModel type " - << combModelName << endl << endl - << "Valid combustionModel types :" << endl + << modelType << nl << nl + << "Valid combustionModel types :" << nl << dictionaryConstructorTablePtr_->sortedToc() << exit(FatalError); } - const word className = combModelName(0, combModelName.find('<')); + const word className = modelType.substr(0, modelType.find('<')); return autoPtr ( diff --git a/src/combustionModels/rhoCombustionModel/rhoCombustionModel/rhoCombustionModelNew.C b/src/combustionModels/rhoCombustionModel/rhoCombustionModel/rhoCombustionModelNew.C index f6ffadc0b6..fb03177606 100644 --- a/src/combustionModels/rhoCombustionModel/rhoCombustionModel/rhoCombustionModelNew.C +++ b/src/combustionModels/rhoCombustionModel/rhoCombustionModel/rhoCombustionModelNew.C @@ -35,7 +35,7 @@ Foam::combustionModels::rhoCombustionModel::New const word& phaseName ) { - const word combTypeName + const word modelType ( IOdictionary ( @@ -51,23 +51,21 @@ Foam::combustionModels::rhoCombustionModel::New ).lookup("combustionModel") ); - Info<< "Selecting combustion model " << combTypeName << endl; + Info<< "Selecting combustion model " << modelType << endl; - auto cstrIter = dictionaryConstructorTablePtr_->cfind(combTypeName); + auto cstrIter = dictionaryConstructorTablePtr_->cfind(modelType); if (!cstrIter.found()) { FatalErrorInFunction << "Unknown rhoCombustionModel type " - << combTypeName << endl << endl - << "Valid combustionModel types :" << endl + << modelType << nl << nl + << "Valid combustionModel types :" << nl << dictionaryConstructorTablePtr_->sortedToc() << exit(FatalError); } - const label tempOpen = combTypeName.find('<'); - - const word className = combTypeName(0, tempOpen); + const word className = modelType.substr(0, modelType.find('<')); return autoPtr ( diff --git a/src/conversion/ccm/reader/ccmReader.C b/src/conversion/ccm/reader/ccmReader.C index 9b16f943bf..302e89981d 100644 --- a/src/conversion/ccm/reader/ccmReader.C +++ b/src/conversion/ccm/reader/ccmReader.C @@ -365,7 +365,7 @@ void Foam::ccm::reader::readProblemDescription_boundaryRegion } else { - dict.add(opt, word::validated(str)); + dict.add(opt, word::validated(str, true)); } } @@ -407,7 +407,7 @@ void Foam::ccm::reader::readProblemDescription_boundaryRegion if (!str.empty()) { - dict.add(opt, word::validated(str)); + dict.add(opt, word::validated(str, true)); } } @@ -472,7 +472,7 @@ void Foam::ccm::reader::readProblemDescription_cellTable str = "zone_" + ::Foam::name(Id); } - dict.add(opt, word::validated(str)); + dict.add(opt, word::validated(str, true)); } @@ -484,7 +484,7 @@ void Foam::ccm::reader::readProblemDescription_cellTable if (!str.empty()) { - dict.add(opt, word::validated(str)); + dict.add(opt, word::validated(str, true)); } } diff --git a/src/conversion/fire/FIREMeshReader.C b/src/conversion/fire/FIREMeshReader.C index 9202723531..df5ee05ef7 100644 --- a/src/conversion/fire/FIREMeshReader.C +++ b/src/conversion/fire/FIREMeshReader.C @@ -155,7 +155,7 @@ void Foam::fileFormats::FIREMeshReader::readSelections(ISstream& is) // index starting at 1 const label selId = ++nCellSelections; - cellTable_.setName(selId, word::validated(name)); + cellTable_.setName(selId, word::validated(name, true)); cellTable_.setMaterial(selId, "fluid"); for (label i = 0; i < count; ++i) @@ -170,7 +170,7 @@ void Foam::fileFormats::FIREMeshReader::readSelections(ISstream& is) // index starting at 0 const label selId = nFaceSelections++; - faceNames.append(word::validated(name)); + faceNames.append(word::validated(name, true)); for (label i = 0; i < count; ++i) { diff --git a/src/meshTools/edgeMesh/edgeMeshFormats/nas/NASedgeFormat.C b/src/meshTools/edgeMesh/edgeMeshFormats/nas/NASedgeFormat.C index 7bd0acab4f..7bcc2d3243 100644 --- a/src/meshTools/edgeMesh/edgeMeshFormats/nas/NASedgeFormat.C +++ b/src/meshTools/edgeMesh/edgeMeshFormats/nas/NASedgeFormat.C @@ -74,7 +74,7 @@ bool Foam::fileFormats::NASedgeFormat::read // Check if character 72 is continuation if (line.size() > 72 && line[72] == '+') { - line = line.substr(0, 72); + line.resize(72); while (true) { @@ -87,7 +87,7 @@ bool Foam::fileFormats::NASedgeFormat::read } else { - line += buf.substr(8, buf.size()-8); + line += buf.substr(8); break; } } diff --git a/src/meshTools/edgeMesh/edgeMeshFormats/obj/OBJedgeFormat.C b/src/meshTools/edgeMesh/edgeMeshFormats/obj/OBJedgeFormat.C index 1261b971cf..e0af5e0e76 100644 --- a/src/meshTools/edgeMesh/edgeMeshFormats/obj/OBJedgeFormat.C +++ b/src/meshTools/edgeMesh/edgeMeshFormats/obj/OBJedgeFormat.C @@ -117,9 +117,9 @@ bool Foam::fileFormats::OBJedgeFormat::read(const fileName& filename) string line = this->getLineNoComment(is); // handle continuations - if (line[line.size()-1] == '\\') + if (line.back() == '\\') { - line.substr(0, line.size()-1); + line.resize(line.size()-1); line += this->getLineNoComment(is); } diff --git a/src/regionModels/thermalBaffleModels/derivedFvPatchFields/thermalBaffle/thermalBaffleFvPatchScalarField.C b/src/regionModels/thermalBaffleModels/derivedFvPatchFields/thermalBaffle/thermalBaffleFvPatchScalarField.C index ca1f1511c0..58f7840398 100644 --- a/src/regionModels/thermalBaffleModels/derivedFvPatchFields/thermalBaffle/thermalBaffleFvPatchScalarField.C +++ b/src/regionModels/thermalBaffleModels/derivedFvPatchFields/thermalBaffle/thermalBaffleFvPatchScalarField.C @@ -191,9 +191,8 @@ void thermalBaffleFvPatchScalarField::createPatchMesh() dicts[bottomPatchID].add("inGroups", inGroups); dicts[bottomPatchID].add("sampleMode", mpp.sampleModeNames_[mpp.mode()]); - const label sepPos = coupleGroup.find('_'); - - const word coupleGroupSlave = coupleGroup(0, sepPos) + "_slave"; + const word coupleGroupSlave = + coupleGroup.substr(0, coupleGroup.find('_')) + "_slave"; inGroups[0] = coupleGroupSlave; dicts[topPatchID].add("coupleGroup", coupleGroupSlave); diff --git a/src/sampling/sampledSurface/readers/ensight/ensightSurfaceReader.C b/src/sampling/sampledSurface/readers/ensight/ensightSurfaceReader.C index 2c21271939..38a51d6141 100644 --- a/src/sampling/sampledSurface/readers/ensight/ensightSurfaceReader.C +++ b/src/sampling/sampledSurface/readers/ensight/ensightSurfaceReader.C @@ -186,7 +186,7 @@ void Foam::ensightSurfaceReader::readCase(IFstream& is) // surfaceName.****.fieldName // This is not parser friendly - simply take remainder of buffer label iPos = iss.stdStream().tellg(); - fieldFileName = buffer(iPos, buffer.size() - iPos); + fieldFileName = buffer.substr(iPos); size_t p0 = fieldFileName.find_first_not_of(' '); if (p0 == string::npos) { diff --git a/src/surfMesh/surfaceFormats/nas/NASsurfaceFormat.C b/src/surfMesh/surfaceFormats/nas/NASsurfaceFormat.C index 7f64549e9c..3bcc035188 100644 --- a/src/surfMesh/surfaceFormats/nas/NASsurfaceFormat.C +++ b/src/surfMesh/surfaceFormats/nas/NASsurfaceFormat.C @@ -89,12 +89,12 @@ bool Foam::fileFormats::NASsurfaceFormat::read string line; is.getLine(line); - // Ansa extension - if (line.substr(0, 10) == "$ANSA_NAME") + // ANSA extension + if (line.startsWith("$ANSA_NAME")) { - string::size_type sem0 = line.find (';', 0); - string::size_type sem1 = line.find (';', sem0+1); - string::size_type sem2 = line.find (';', sem1+1); + string::size_type sem0 = line.find(';', 0); + string::size_type sem1 = line.find(';', sem0+1); + string::size_type sem2 = line.find(';', sem1+1); if ( @@ -111,14 +111,11 @@ bool Foam::fileFormats::NASsurfaceFormat::read string rawName; is.getLine(rawName); - if (rawName[rawName.size()-1] == '\r') + if (rawName.back() == '\r') { - rawName = rawName.substr(1, rawName.size()-2); - } - else - { - rawName = rawName.substr(1, rawName.size()-1); + rawName.resize(rawName.size()-1); } + rawName = rawName.substr(1); string::stripInvalid(rawName); ansaName = rawName; @@ -132,11 +129,7 @@ bool Foam::fileFormats::NASsurfaceFormat::read // Hypermesh extension // $HMNAME COMP 1"partName" - if - ( - line.substr(0, 12) == "$HMNAME COMP" - && line.find ('"') != string::npos - ) + if (line.startsWith("$HMNAME COMP") && line.find('"') != string::npos) { label groupId = readLabel ( @@ -165,7 +158,7 @@ bool Foam::fileFormats::NASsurfaceFormat::read // Check if character 72 is continuation if (line.size() > 72 && line[72] == '+') { - line = line.substr(0, 72); + line.resize(72); while (true) { @@ -178,7 +171,7 @@ bool Foam::fileFormats::NASsurfaceFormat::read } else { - line += buf.substr(8, buf.size()-8); + line += buf.substr(8); break; } } diff --git a/src/surfMesh/surfaceFormats/obj/OBJsurfaceFormat.C b/src/surfMesh/surfaceFormats/obj/OBJsurfaceFormat.C index 708f7654e9..692f2ee3bc 100644 --- a/src/surfMesh/surfaceFormats/obj/OBJsurfaceFormat.C +++ b/src/surfMesh/surfaceFormats/obj/OBJsurfaceFormat.C @@ -82,9 +82,9 @@ bool Foam::fileFormats::OBJsurfaceFormat::read string line = this->getLineNoComment(is); // handle continuations - if (line[line.size()-1] == '\\') + if (line.back() == '\\') { - line.substr(0, line.size()-1); + line.resize(line.size()-1); line += this->getLineNoComment(is); } diff --git a/src/surfMesh/surfaceFormats/starcd/STARCDsurfaceFormatCore.C b/src/surfMesh/surfaceFormats/starcd/STARCDsurfaceFormatCore.C index 71b3751c8c..7443771812 100644 --- a/src/surfMesh/surfaceFormats/starcd/STARCDsurfaceFormatCore.C +++ b/src/surfMesh/surfaceFormats/starcd/STARCDsurfaceFormatCore.C @@ -64,7 +64,7 @@ Foam::fileFormats::STARCDsurfaceFormatCore::readInpCellTable if (ctnameRE.match(line, groups)) { const label tableId = atoi(groups[0].c_str()); - const word tableName = word::validated(groups[1]); + const word tableName = word::validated(groups[1], true); if (!tableName.empty()) { diff --git a/src/surfMesh/surfaceFormats/tri/TRIsurfaceFormatCore.C b/src/surfMesh/surfaceFormats/tri/TRIsurfaceFormatCore.C index 97b4112f9b..385ad872ab 100644 --- a/src/surfMesh/surfaceFormats/tri/TRIsurfaceFormatCore.C +++ b/src/surfMesh/surfaceFormats/tri/TRIsurfaceFormatCore.C @@ -87,9 +87,9 @@ bool Foam::fileFormats::TRIsurfaceFormatCore::read string line = this->getLineNoComment(is); // handle continuations ? - // if (line[line.size()-1] == '\\') + // if (line.back() == '\\') // { - // line.substr(0, line.size()-1); + // line.resize(line.size()-1); // line += this->getLineNoComment(is); // } @@ -128,14 +128,14 @@ bool Foam::fileFormats::TRIsurfaceFormatCore::read // ie, instead of having 0xFF, skip 0 and leave xFF to // get read as a word and name it "zoneFF" - char zero; - lineStream >> zero; + char zeroChar; + lineStream >> zeroChar; - word rawName(lineStream); - word name("zone" + rawName(1, rawName.size()-1)); + const word rawName(lineStream); + const word name("zone" + rawName.substr(1)); - HashTable