bool Foam::functionEntries::ifeqEntry::execute ( const bool doIf, DynamicList<filePos>& stack, dictionary& parentDict, Istream& is ) { if (doIf) { evaluate(true, stack, parentDict, is); } else { // Fast-forward to #else token t; while (!is.eof()) { readToken(t, is); if ( t.isWord() && (t.wordToken() == "#if" || t.wordToken() == "#ifeq") ) { stack.append(filePos(is.name(), is.lineNumber())); skipUntil(stack, parentDict, "#endif", is); stack.remove(); } else if (t.isWord() && t.wordToken() == "#else") { break; } else if (t.isWord() && t.wordToken() == "#elif") { // const label lineNo = is.lineNumber(); // Read line string line; dynamic_cast<ISstream&>(is).getLine(line); line += ';'; IStringStream lineStream(line); const primitiveEntry e("ifEntry", parentDict, lineStream); const Switch doIf(e.stream()); if (doIf) { // Info<< "Using #elif " << doIf << " at line " << lineNo // << " in file " << is.name() << endl; break; } } else if (t.isWord() && t.wordToken() == "#endif") { stack.remove(); break; } } if (t.wordToken() == "#else") { // Evaluate until we hit #endif evaluate(false, stack, parentDict, is); } else if (t.wordToken() == "#elif") { // Evaluate until we hit #else or #endif evaluate(true, stack, parentDict, is); } } return true; }