void Foam::HashPtrTable<T, Key, Hash>::read(Istream& is, const INew& inewt) { is.fatalCheck("HashPtrTable<T, Key, Hash>::read(Istream&, const INew&)"); token firstToken(is); is.fatalCheck ( "HashPtrTable<T, Key, Hash>::read(Istream&, const INew&) : " "reading first token" ); if (firstToken.isLabel()) { label s = firstToken.labelToken(); // Read beginning of contents char delimiter = is.readBeginList("HashPtrTable<T, Key, Hash>"); if (s) { if (2*s > this->tableSize_) { this->resize(2*s); } if (delimiter == token::BEGIN_LIST) { for (label i=0; i<s; i++) { Key key; is >> key; this->insert(key, inewt(key, is).ptr()); is.fatalCheck ( "HashPtrTable<T, Key, Hash>::" "read(Istream&, const INew&) : reading entry" ); } } else { FatalIOErrorIn ( "HashPtrTable<T, Key, Hash>::read(Istream&, const INew&)", is ) << "incorrect first token, '(', found " << firstToken.info() << exit(FatalIOError); } }
Foam::autoPtr<Foam::entry> Foam::entry::New(Istream& is) { is.fatalCheck("entry::New(Istream&)"); keyType keyword; // Get the next keyword and if invalid return false if (!getKeyword(keyword, is)) { return autoPtr<entry>(NULL); } else // Keyword starts entry ... { token nextToken(is); is.putBack(nextToken); if (nextToken == token::BEGIN_BLOCK) { return autoPtr<entry> ( new dictionaryEntry(keyword, dictionary::null, is) ); } else { return autoPtr<entry> ( new primitiveEntry(keyword, is) ); } } }
Foam::dictionaryEntry::dictionaryEntry ( const dictionary& parentDict, Istream& is ) : entry(keyType(is)), dictionary(parentDict, is) { is.fatalCheck ( "dictionaryEntry::dictionaryEntry" "(const dictionary& parentDict, Istream&)" ); }
bool Foam::functionEntry::execute ( const word& functionName, const dictionary& parentDict, primitiveEntry& entry, Istream& is ) { is.fatalCheck ( "functionEntry::execute" "(const word&, const dictionary&, primitiveEntry&, Istream&)" ); if (!executeprimitiveEntryIstreamMemberFunctionTablePtr_) { cerr<<"functionEntry::execute" << "(const word&, const dictionary&, primitiveEntry&, Istream&)" << " not yet initialized, function = " << functionName.c_str() << std::endl; // return true to keep reading anyhow return true; } executeprimitiveEntryIstreamMemberFunctionTable::iterator mfIter = executeprimitiveEntryIstreamMemberFunctionTablePtr_->find(functionName); if (mfIter == executeprimitiveEntryIstreamMemberFunctionTablePtr_->end()) { FatalErrorIn ( "functionEntry::execute" "(const word&, const dictionary&, primitiveEntry&, Istream&)" ) << "Unknown functionEntry '" << functionName << "' in " << is.name() << " near line " << is.lineNumber() << endl << endl << "Valid functionEntries are :" << endl << executeprimitiveEntryIstreamMemberFunctionTablePtr_->toc() << exit(FatalError); } return mfIter()(parentDict, entry, is); }
bool Foam::entry::New(dictionary& parentDict, Istream& is) { is.fatalCheck("entry::New(const dictionary& parentDict, Istream&)"); keyType keyword; // Get the next keyword and if invalid return false if (!getKeyword(keyword, is)) { return false; } else // Keyword starts entry ... { if ( !disableFunctionEntries && keyword[0] == '#' ) // ... Function entry { word functionName = keyword(1, keyword.size()-1); return functionEntry::execute(functionName, parentDict, is); } else if ( !disableFunctionEntries && keyword[0] == '$' ) // ... Substitution entry { token nextToken(is); is.putBack(nextToken); if (keyword.size() > 2 && keyword[1] == token::BEGIN_BLOCK) { // Recursive substitution mode. Replace between {} with // expansion and then let standard variable expansion deal // with rest. string s(keyword(2, keyword.size()-3)); // Substitute dictionary and environment variables. Do not allow // empty substitutions. stringOps::inplaceExpand(s, parentDict, true, false); keyword.std::string::replace(1, keyword.size()-1, s); } if (nextToken == token::BEGIN_BLOCK) { word varName = keyword(1, keyword.size()-1); // lookup the variable name in the given dictionary const entry* ePtr = parentDict.lookupScopedEntryPtr ( varName, true, true ); if (ePtr) { // Read as primitiveEntry const keyType newKeyword(ePtr->stream()); return parentDict.add ( new dictionaryEntry(newKeyword, parentDict, is), false ); } else { FatalIOErrorInFunction(is) << "Attempt to use undefined variable " << varName << " as keyword" << exit(FatalIOError); return false; } } else { parentDict.substituteScopedKeyword(keyword); } return true; } else if ( !disableFunctionEntries && keyword == "include" ) // ... For backward compatibility { return functionEntries::includeEntry::execute(parentDict, is); } else // ... Data entries { token nextToken(is); is.putBack(nextToken); // Deal with duplicate entries bool mergeEntry = false; // See (using exact match) if entry already present entry* existingPtr = parentDict.lookupEntryPtr ( keyword, false, false ); if (existingPtr) { if (functionEntries::inputModeEntry::merge()) { mergeEntry = true; } else if (functionEntries::inputModeEntry::overwrite()) { // clear dictionary so merge acts like overwrite if (existingPtr->isDict()) { existingPtr->dict().clear(); } mergeEntry = true; } else if (functionEntries::inputModeEntry::protect()) { // read and discard the entry if (nextToken == token::BEGIN_BLOCK) { dictionaryEntry dummy(keyword, parentDict, is); } else { primitiveEntry dummy(keyword, parentDict, is); } return true; } else if (functionEntries::inputModeEntry::error()) { FatalIOErrorInFunction(is) << "ERROR! duplicate entry: " << keyword << exit(FatalIOError); return false; } } if (nextToken == token::BEGIN_BLOCK) { return parentDict.add ( new dictionaryEntry(keyword, parentDict, is), mergeEntry ); } else { return parentDict.add ( new primitiveEntry(keyword, parentDict, is), mergeEntry ); } } } }
bool Foam::primitiveEntry::read(const dictionary& dict, Istream& is) { is.fatalCheck ( "primitiveEntry::readData(const dictionary&, Istream&)" ); label blockCount = 0; token currToken; if ( !is.read(currToken).bad() && currToken.good() && currToken != token::END_STATEMENT ) { append(currToken, dict, is); if ( currToken == token::BEGIN_BLOCK || currToken == token::BEGIN_LIST ) { blockCount++; } while ( !is.read(currToken).bad() && currToken.good() && !(currToken == token::END_STATEMENT && blockCount == 0) ) { if ( currToken == token::BEGIN_BLOCK || currToken == token::BEGIN_LIST ) { blockCount++; } else if ( currToken == token::END_BLOCK || currToken == token::END_LIST ) { blockCount--; } append(currToken, dict, is); } } is.fatalCheck ( "primitiveEntry::readData(const dictionary&, Istream&)" ); if (currToken.good()) { return true; } else { return false; } }
void Foam::LPtrList<LListBase, T>::read(Istream& is, const INew& iNew) { is.fatalCheck ( "LPtrList<LListBase, T>::read(Istream&, const INew&)" ); token firstToken(is); is.fatalCheck ( "LPtrList<LListBase, T>::read(Istream&, const INew&) : " "reading first token" ); if (firstToken.isLabel()) { label s = firstToken.labelToken(); // Read beginning of contents char delimiter = is.readBeginList("LPtrList<LListBase, T>"); if (s) { if (delimiter == token::BEGIN_LIST) { for (label i=0; i<s; ++i) { this->append(iNew(is).ptr()); is.fatalCheck ( "LPtrList<LListBase, T>::read(Istream&, const INew&) : " "reading entry" ); } } else { T* tPtr = iNew(is).ptr(); this->append(tPtr); is.fatalCheck ( "LPtrList<LListBase, T>::read(Istream&, const INew&) : " "reading entry" ); for (label i=1; i<s; ++i) { this->append(tPtr->clone().ptr()); } } } // Read end of contents is.readEndList("LPtrList<LListBase, T>"); } else if (firstToken.isPunctuation()) { if (firstToken.pToken() != token::BEGIN_LIST) { FatalIOErrorIn ( "LPtrList<LListBase, T>::read(Istream&, const INew&)", is ) << "incorrect first token, '(', found " << firstToken.info() << exit(FatalIOError); } token lastToken(is); is.fatalCheck("LPtrList<LListBase, T>::read(Istream&, const INew&)"); while ( !( lastToken.isPunctuation() && lastToken.pToken() == token::END_LIST ) ) { is.putBack(lastToken); this->append(iNew(is).ptr()); is >> lastToken; is.fatalCheck ( "LPtrList<LListBase, T>::read(Istream&, const INew&)" ); } } else {
bool Foam::entry::New(dictionary& parentDict, Istream& is) { is.fatalCheck("entry::New(const dictionary& parentDict, Istream&)"); keyType keyword; // Get the next keyword and if invalid return false if (!getKeyword(keyword, is)) { return false; } else // Keyword starts entry ... { if (keyword[0] == '#') // ... Function entry { word functionName = keyword(1, keyword.size()-1); return functionEntry::execute(functionName, parentDict, is); } else if (keyword[0] == '$') // ... Substitution entry { parentDict.substituteKeyword(keyword); return true; } else if (keyword == "include") // ... For backward compatibility { return functionEntries::includeEntry::execute(parentDict, is); } else // ... Data entries { token nextToken(is); is.putBack(nextToken); // Deal with duplicate entries bool mergeEntry = false; // See (using exact match) if entry already present entry* existingPtr = parentDict.lookupEntryPtr ( keyword, false, false ); if (existingPtr) { if (functionEntries::inputModeEntry::merge()) { mergeEntry = true; } else if (functionEntries::inputModeEntry::overwrite()) { // clear dictionary so merge acts like overwrite if (existingPtr->isDict()) { existingPtr->dict().clear(); } mergeEntry = true; } else if (functionEntries::inputModeEntry::protect()) { // read and discard the entry if (nextToken == token::BEGIN_BLOCK) { dictionaryEntry dummy(keyword, parentDict, is); } else { primitiveEntry dummy(keyword, parentDict, is); } return true; } else if (functionEntries::inputModeEntry::error()) { FatalIOErrorIn ( "entry::New(const dictionary& parentDict, Istream&)", is ) << "ERROR! duplicate entry: " << keyword << exit(FatalIOError); return false; } } if (nextToken == token::BEGIN_BLOCK) { return parentDict.add ( new dictionaryEntry(keyword, parentDict, is), mergeEntry ); } else { return parentDict.add ( new primitiveEntry(keyword, parentDict, is), mergeEntry ); } } } }