Commit 8f444b71 authored by Mark OLESEN's avatar Mark OLESEN
Browse files

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.
parent 24d8c891
...@@ -29,6 +29,24 @@ License ...@@ -29,6 +29,24 @@ License
#include "token.H" #include "token.H"
#include <cctype> #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 * * * * * * * * * * * // // * * * * * * * * * * * * * Private Member Functions * * * * * * * * * * * //
...@@ -121,20 +139,49 @@ Foam::UIPstream::~UIPstream() ...@@ -121,20 +139,49 @@ Foam::UIPstream::~UIPstream()
Foam::Istream& Foam::UIPstream::read(token& t) Foam::Istream& Foam::UIPstream::read(token& t)
{ {
// Return the put back token if it exists // Return the put back token if it exists
// - with additional handling for special stream flags
if (Istream::getBack(t)) if (Istream::getBack(t))
{
if (t.isFlag())
{
processFlags(*this, t.flagToken());
}
else
{ {
return *this; return *this;
} }
}
char c; // Read character, return on error
// - with additional handling for special stream flags
// Return on error char c;
do
{
if (!read(c)) if (!read(c))
{ {
t.setBad(); t.setBad(); // Error
return *this; 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 // Set the line number of this token to the current stream line number
t.lineNumber() = lineNumber(); t.lineNumber() = lineNumber();
......
...@@ -193,7 +193,8 @@ bool Foam::UOPstream::write(const token& tok) ...@@ -193,7 +193,8 @@ bool Foam::UOPstream::write(const token& tok)
{ {
case token::tokenType::FLAG : case token::tokenType::FLAG :
{ {
// silently consume the flag writeToBuffer(char(token::tokenType::FLAG));
writeToBuffer(char(tok.flagToken()));
return true; return true;
} }
......
Supports Markdown
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment