From 5bdcece3af51113232f2602703da625816c143d2 Mon Sep 17 00:00:00 2001 From: Mark Olesen Date: Mon, 17 May 2010 12:56:30 +0200 Subject: [PATCH] ENH: allow retention of 'FoamFile' when reading dictionaries - used in expandDictionary --- .../expandDictionary/expandDictionary.C | 11 +- src/OpenFOAM/db/dictionary/dictionary.H | 11 +- src/OpenFOAM/db/dictionary/dictionaryIO.C | 155 ++++++++++-------- 3 files changed, 107 insertions(+), 70 deletions(-) diff --git a/applications/utilities/miscellaneous/expandDictionary/expandDictionary.C b/applications/utilities/miscellaneous/expandDictionary/expandDictionary.C index 08e8f29f24..86b1caec44 100644 --- a/applications/utilities/miscellaneous/expandDictionary/expandDictionary.C +++ b/applications/utilities/miscellaneous/expandDictionary/expandDictionary.C @@ -42,6 +42,12 @@ using namespace Foam; int main(int argc, char *argv[]) { + argList::addNote + ( + "Read the specified dictionary file, expand the macros etc. and write\n" + "the resulting dictionary to standard output." + ); + argList::noBanner(); argList::noParallel(); argList::validArgs.append("inputDict"); @@ -49,9 +55,10 @@ int main(int argc, char *argv[]) const string dictName = args[1]; - Info<<"//\n// expansion of dictionary " << dictName << "\n//\n"; + IOobject::writeBanner(Info) + <<"//\n// " << dictName << "\n//\n"; - dictionary(IFstream(dictName)()).write(Info, false); + dictionary(IFstream(dictName)(), true).write(Info, false); IOobject::writeDivider(Info); diff --git a/src/OpenFOAM/db/dictionary/dictionary.H b/src/OpenFOAM/db/dictionary/dictionary.H index c483aed557..3c3d504353 100644 --- a/src/OpenFOAM/db/dictionary/dictionary.H +++ b/src/OpenFOAM/db/dictionary/dictionary.H @@ -191,10 +191,14 @@ public: Istream& ); - //- Construct top-level dictionary from Istream, reading entries - // until EOF + //- Construct top-level dictionary from Istream, + // reading entries until EOF dictionary(Istream&); + //- Construct top-level dictionary from Istream, + // reading entries until EOF, optionally keeping the header + dictionary(Istream&, const bool keepHeader); + //- Construct as copy given the parent dictionary dictionary(const dictionary& parentDict, const dictionary&); @@ -441,6 +445,9 @@ public: //- Read dictionary from Istream bool read(Istream&); + //- Read dictionary from Istream, optionally keeping the header + bool read(Istream&, const bool keepHeader); + // Write diff --git a/src/OpenFOAM/db/dictionary/dictionaryIO.C b/src/OpenFOAM/db/dictionary/dictionaryIO.C index 1c452bafaf..54d2877da2 100644 --- a/src/OpenFOAM/db/dictionary/dictionaryIO.C +++ b/src/OpenFOAM/db/dictionary/dictionaryIO.C @@ -28,68 +28,6 @@ License #include "inputModeEntry.H" #include "regExp.H" -// * * * * * * * * * * * * * Private Member Functions * * * * * * * * * * * // - -bool Foam::dictionary::read(Istream& is) -{ - if (!is.good()) - { - FatalIOErrorIn("dictionary::read(Istream&, const word&)", is) - << "Istream not OK for reading dictionary " - << exit(FatalIOError); - - return false; - } - - token currToken(is); - if (currToken != token::BEGIN_BLOCK) - { - is.putBack(currToken); - } - - while (!is.eof() && entry::New(*this, is)) - {} - - // Remove the FoamFile header entry if it exists - remove("FoamFile"); - - if (is.bad()) - { - Info<< "dictionary::read(Istream&, const word&) : " - << "Istream not OK after reading dictionary " << name() - << endl; - - return false; - } - - return true; -} - - -bool Foam::dictionary::substituteKeyword(const word& keyword) -{ - word varName = keyword(1, keyword.size()-1); - - // lookup the variable name in the given dictionary - const entry* ePtr = lookupEntryPtr(varName, true, true); - - // if defined insert its entries into this dictionary - if (ePtr != NULL) - { - const dictionary& addDict = ePtr->dict(); - - forAllConstIter(IDLList, addDict, iter) - { - add(iter()); - } - - return true; - } - - return false; -} - - // * * * * * * * * * * * * * * * * Constructors * * * * * * * * * * * * * * // Foam::dictionary::dictionary @@ -118,12 +56,97 @@ Foam::dictionary::dictionary(Istream& is) } +Foam::dictionary::dictionary(Istream& is, const bool keepHeader) +: + dictionaryName(is.name()), + parent_(dictionary::null) +{ + // Reset input mode as this is a "top-level" dictionary + functionEntries::inputModeEntry::clear(); + + read(is, keepHeader); +} + + +// * * * * * * * * * * * * * * * * Selectors * * * * * * * * * * * * * * * * // + Foam::autoPtr Foam::dictionary::New(Istream& is) { return autoPtr(new dictionary(is)); } +// * * * * * * * * * * * * * * Member Functions * * * * * * * * * * * * * * // + +bool Foam::dictionary::read(Istream& is, const bool keepHeader) +{ + if (!is.good()) + { + FatalIOErrorIn("dictionary::read(Istream&, bool)", is) + << "Istream not OK for reading dictionary " + << exit(FatalIOError); + + return false; + } + + token currToken(is); + if (currToken != token::BEGIN_BLOCK) + { + is.putBack(currToken); + } + + while (!is.eof() && entry::New(*this, is)) + {} + + // normally remove the FoamFile header entry if it exists + if (!keepHeader) + { + remove("FoamFile"); + } + + if (is.bad()) + { + Info<< "dictionary::read(Istream&, bool) : " + << "Istream not OK after reading dictionary " << name() + << endl; + + return false; + } + + return true; +} + + +bool Foam::dictionary::read(Istream& is) +{ + return this->read(is, false); +} + + +bool Foam::dictionary::substituteKeyword(const word& keyword) +{ + word varName = keyword(1, keyword.size()-1); + + // lookup the variable name in the given dictionary + const entry* ePtr = lookupEntryPtr(varName, true, true); + + // if defined insert its entries into this dictionary + if (ePtr != NULL) + { + const dictionary& addDict = ePtr->dict(); + + forAllConstIter(IDLList, addDict, iter) + { + add(iter()); + } + + return true; + } + + return false; +} + + // * * * * * * * * * * * * * * Istream Operator * * * * * * * * * * * * * * // Foam::Istream& Foam::operator>>(Istream& is, dictionary& dict) @@ -145,7 +168,7 @@ void Foam::dictionary::write(Ostream& os, bool subDict) const { if (subDict) { - os << nl << indent << token::BEGIN_BLOCK << incrIndent << nl; + os << nl << indent << token::BEGIN_BLOCK << incrIndent << nl; } forAllConstIter(IDLList, *this, iter) @@ -153,12 +176,12 @@ void Foam::dictionary::write(Ostream& os, bool subDict) const const entry& e = *iter; // Write entry - os << e; + os << e; // Add extra new line between entries for "top-level" dictionaries if (!subDict && parent() == dictionary::null && e != *last()) { - os << nl; + os << nl; } // Check stream before going to next entry. @@ -173,7 +196,7 @@ void Foam::dictionary::write(Ostream& os, bool subDict) const if (subDict) { - os << decrIndent << indent << token::END_BLOCK << endl; + os << decrIndent << indent << token::END_BLOCK << endl; } }