diff --git a/src/OpenFOAM/db/IOstreams/Pstreams/UIPstream.C b/src/OpenFOAM/db/IOstreams/Pstreams/UIPstream.C index 1ed965b75808740f83c7478261c069efe87766fa..76f9706093821963df3f93e2342cd7979f05ad1c 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 <cctype> +// * * * * * * * * * * * * * * * 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; + } } - char c; + // Read character, return on error + // - with additional handling for special stream flags - // Return on error - if (!read(c)) + char 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 b5c63d0c5760ec928247de88b8f93ef1e80f90ac..6b5a46ed6f2d2f6d75167703583f83f0efe5f1bb 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; }