ENH: support change of Pstream buffer format via flag modifier

- allows changing the format of the sending OPstream at an arbitrary
  point in the transmission. The information is passed through the
  buffer and the receiving IPstream changes its format accordingly.
  This allows a temporary toggling of ASCII/BINARY mid-stream.
This commit is contained in:
Mark Olesen 2017-11-13 09:21:11 +01:00
parent 24d8c891d7
commit 8f444b7164
2 changed files with 55 additions and 7 deletions

View File

@ -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;
}
}
// 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();

View File

@ -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;
}