diff --git a/src/OpenFOAM/db/IOstreams/Pstreams/UIPstream.C b/src/OpenFOAM/db/IOstreams/Pstreams/UIPstream.C index 1ed965b758..76f9706093 100644 --- a/src/OpenFOAM/db/IOstreams/Pstreams/UIPstream.C +++ b/src/OpenFOAM/db/IOstreams/Pstreams/UIPstream.C @@ -29,6 +29,24 @@ License #include "token.H" #include +// * * * * * * * * * * * * * * * Local Functions * * * * * * * * * * * * * * // + +namespace Foam +{ +// Adjust stream format based on the flagMask +inline static void processFlags(Istream& is, int flagMask) +{ + if ((flagMask & token::ASCII)) + { + is.format(IOstream::ASCII); + } + else if ((flagMask & token::BINARY)) + { + is.format(IOstream::BINARY); + } +} +} + // * * * * * * * * * * * * * Private Member Functions * * * * * * * * * * * // @@ -121,19 +139,48 @@ Foam::UIPstream::~UIPstream() Foam::Istream& Foam::UIPstream::read(token& t) { // Return the put back token if it exists + // - with additional handling for special stream flags if (Istream::getBack(t)) { - return *this; + if (t.isFlag()) + { + processFlags(*this, t.flagToken()); + } + else + { + return *this; + } } + // Read character, return on error + // - with additional handling for special stream flags + char c; - - // Return on error - if (!read(c)) + do { - t.setBad(); - return *this; + if (!read(c)) + { + t.setBad(); // Error + return *this; + } + + if (c == token::FLAG) + { + char flagVal; + + if (read(flagVal)) + { + processFlags(*this, flagVal); + } + else + { + t.setBad(); // Error + return *this; + } + } } + while (c == token::FLAG); + // Set the line number of this token to the current stream line number t.lineNumber() = lineNumber(); diff --git a/src/OpenFOAM/db/IOstreams/Pstreams/UOPstream.C b/src/OpenFOAM/db/IOstreams/Pstreams/UOPstream.C index b5c63d0c57..6b5a46ed6f 100644 --- a/src/OpenFOAM/db/IOstreams/Pstreams/UOPstream.C +++ b/src/OpenFOAM/db/IOstreams/Pstreams/UOPstream.C @@ -193,7 +193,8 @@ bool Foam::UOPstream::write(const token& tok) { case token::tokenType::FLAG : { - // silently consume the flag + writeToBuffer(char(token::tokenType::FLAG)); + writeToBuffer(char(tok.flagToken())); return true; }